代码更新(接上篇)

为了防止自己忘记,在这保存

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.pylab import rcParams
rcParams['figure.figsize']=20,10
from keras.models import Sequential
from keras.layers import LSTM,Dropout,Dense
import time
import os
from keras.layers.normalization import BatchNormalization
from sklearn.preprocessing import MinMaxScaler
import math
from keras import backend
from sklearn.metrics import explained_variance_score as e_v
from sklearn.model_selection import learning_curve
from math import e

epoch=10
train_len=0.7
rf=0.04
cycle=252
sharpe=[]
ck=[k for k in range(5,41,5)]
zp=[]
#对数据预处理,加权重的函数
# def plug_weight(temp):
#     temp=np.array(temp)
#     b=len(temp)
#     c=[]
#     for i in range(0,b):
#         c.append(temp[i]*(1-pow(0.5,i+1)))
#     return c
def plug_weight(temp):
    temp=np.array(temp)
    b=len(temp)
    c=[]
    for i in range(0,b):
        c.append(temp[i]*(1-pow(1/e,i+1)))
    return c
#把所有图像都画在一张图上面
def draw(arg):
    label=[k for k in range(5,41,5)]
    for i in range(0,len(arg)):
        plt.plot(arg[i,:])
    plt.legend(label,ncol=4,loc='lower right')
    plt.show()

# 导入数据,用上证的日线数据,对数据归一化,标准化
df=pd.read_csv("F:\大创(k线)\数据//999999.csv")
df["index"]=pd.to_datetime(df["index"],format='%Y-%m-%d')
# plt.plot(df['close'],label="close price history")
data=df.filter(['open','close','high','low','volume'])
dataset=data.values
data1=df.filter(['close'])
dataset1=data1.values
data2=df.filter(['volume'])
# data2=df.filter(['amount'])
training_data_len = math.ceil(len(dataset) * train_len)
#标准化
scaler=MinMaxScaler(feature_range=(0,1))
scaled_data=scaler.fit_transform(dataset)
# data['vol']=scaled_data
# scaled_data=data.values
scaler1=MinMaxScaler(feature_range=(0,1))
scaled_data1=scaler1.fit_transform(dataset1)
#修改原始数据
train_data=scaled_data[0:training_data_len,:]
train_data1=train_data.tolist()
#储存图的位置
time1=time.strftime('%Y-%m-%d')
sv_path='F:\大创(k线)\pred_data/'+time1
os.makedirs(sv_path,exist_ok=True)
#循环训练模型
for needlen in range(5,41,5):
    x_test=[]
    x_train=[]
    y_train=[]
    temp_train=[]
    temp1_train=[]
    temp_test=[]
    temp1_test=[]
    #切出训练数据
    for j in range(40,training_data_len):
        for z in range(j-needlen,j-1):
            temp_train.append(train_data1[z])
        temp_train=plug_weight(temp_train)
        temp1_train=np.array(temp_train)
        x_train.append(temp1_train)
        temp_train=[]
        y_train.append(train_data[j,1])
        if j<=needlen:
            print(x_train)
            print(y_train)
    # for f in x_train[:50]:
    #     print(len(f))
    x_train,y_train=np.array(x_train),np.array(y_train)
    x_train=backend.cast_to_floatx(x_train)
    y_train=backend.cast_to_floatx(y_train)
    #为训练模型Sequential使用add函数添加layer,训练
    model=Sequential()
    model.add(LSTM(50,return_sequences=True,input_shape=(x_train.shape[1],x_train.shape[2])))
    model.add(LSTM(50))
    model.add(Dense(1,activation='tanh'))
    model.compile(loss='mean_squared_error', optimizer='adam')
    model.fit(x_train,y_train,epochs=epoch)
    #切分测试数据
    test_data=scaled_data[training_data_len-needlen:,:]
    test_data1=test_data.tolist()
    y_test=dataset[training_data_len:,1]
    for i in range(needlen,len(test_data)):
        for g in range(i-needlen,i-1):
            temp_test.append(test_data1[g])
        temp_test=plug_weight(temp_test)
        temp1_test=np.array(temp_test)
        x_test.append(temp1_test)
        temp_test=[]
    x_test=np.array(x_test)
    #预测
    pred=model.predict(x_test)
    pred=np.reshape(pred,(pred.shape[0],pred.shape[1]))
    predtion=scaler1.inverse_transform(pred)
    zp.append(predtion)
    # err=np.sqrt(np.mean(predtion-y_test)**2)
    # print("square_err:%.2f"%err)
    ac=e_v(y_test,predtion)
    print("accuracy:%.2f"%(ac*100.0))
    #可视化预测和原始数据
    train = data[:training_data_len]
    valid = data[training_data_len:]
    valid['predtion']=predtion
    valid['return']=(valid['close'].shift(-1)-valid['close'])/valid['close']
    valid['exreturn']=valid['return']-rf/cycle
    sharperatio=math.sqrt(cycle)*valid['exreturn'].mean()/valid['exreturn'].std()
    valid['preturn']=(valid['predtion'].shift(-1)-valid['predtion'])/valid['predtion']
    valid['pexreturn']=valid['preturn']-rf/cycle
    sharperatio_p=math.sqrt(cycle)*valid['pexreturn'].mean()/valid['pexreturn'].std()
    plt.figure(figsize=(16,8))
    plt.title('2016——2021')
    plt.xlabel('date', fontsize=18)
    plt.ylabel('close prise', fontsize=18)
    plt.plot(train['close'])
    plt.plot(valid[['close','predtion']])
    plt.legend(['Train','Val','Predictions'], loc='lower right')
    plt.savefig(f'{sv_path}/(week)predict%d %.2f %.2f %.2f.jpg'%(needlen,sharperatio,sharperatio_p,ac*100.0))
    plt.close()
    # sharpe.append(sharperatio_p)
# plt.xlabel('window_len',fontsize=18)
# plt.ylabel('sharpestio', fontsize=18)
# plt.plot(sharpe)
zp=np.array(zp)
draw(zp)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值