为了防止自己忘记,在这保存
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)