一、预测股价

代码:
import pandas as pd
import numpy as np
from pandas_datareader import data,wb
import matplotlib.pyplot as plt
from scipy.spatial.distance import euclidean
from fastdtw import fastdtw
pd.set_option('display.max_colwidth',200)
import pandas_datareader as pdr
start_date = pd.to_datetime('2000-01-01')
stop_date = pd.to_datetime('2016-03-01')
# sp = pdr.data.get_data_yahoo('sp',start_date,stop_date)
# sp.to_csv('sp_long.csv')
sp = pd.read_csv('spy_long.csv',index_col =0)
# print(sp)
def dtw_dist(x,y):
distance,path = fastdtw(x,y,dist= euclidean)
return distance
tseries =[]
tlen = 5
for i in range(tlen,len(sp),tlen):
pctc = sp['Close'].iloc[i-tlen:i].pct_change()[1:].values*100
res = sp['Close'].iloc[i-tlen:i+1].pct_change()[-1]*100
tseries.append((pctc,res))
# print(tseries[0])
dist_pairs = []
for i in range(len(tseries)):
for j in range(len(tseries)):
dist = dtw_dist(tseries[i][0],tseries[j][0])
dist_pairs.append((i,j,dist,tseries[i][1],tseries[j][1]))
dist_frame = pd.DataFrame(dist_pairs,columns = ['A','B','Dist','A Ret','B Ret'])
sf = dist_frame[dist_frame['Dist']>0].sort_values(['A','B']).reset_index(drop=1)
sfe = sf[sf['A']<sf['B']]
winf = sfe[(sfe['Dist']<=1)&(sfe['A Ret']>0)]
print(winf)
plt.plot(np.arange(4),tseries[6][0])
# plt.show()
def get_stats(s, n=252):
s = s.dropna()
wins = len(s[s>0])
losses = len(s[s<0])
events = len(s[s==0]) #不亏不赚
mean_w = round(s[s>0].mean(),3)
mean_l = round(s[s<0].mean(),3)
win_r = round(wins/losses,3)
mean_trd = round(s.mean(),3)
sd = round(np.std(s),3)
max_l = round(s.min(),3)
max_w = round(s.max(),3)
sharp_r = round((s.mean()/np.std(s))*np.sqrt(n),4)
cnt = len(s)
win_t = round(wins/cnt,3) #胜率
print('Trades(交易次数):',cnt,
'\nWins(盈利次数):',wins,
'\nLosses(亏损次数):',losses,
'\nBreakeven(盈亏平衡次数):',events,
'\nWin/Loss Ratio(盈利次数/亏损次数):',win_r,
'\nMean Win(盈利的平均值):',mean_w,
'\nMean Loss(亏损的平均值):',mean_l,
'\nMean(平均收益):',mean_trd,
'\nStd Dev(标准差):',sd,
'\nMax loss(最大亏损):',max_l,
'\nMax Win(最大盈利):',max_w,
'\nwin/Total(胜率):',win_t,
'\nSharp Ratio(夏普比率):',sharp_r,
)
exclueded = {}
return_list = []
def get_returns(r):
if exclueded.get(r['A']) is None:
return_list.append(r['B Ret'])
if r['B Ret'] < 0:
exclueded.update({r['A']:1})
winf.apply(get_returns,axis = 1)
print(get_stats(pd.Series(return_list)))
二、上证
再来一个上证指数的,不知为什么,使用了更多的数据,但是胜率却没有这么高。

将数据量提高到1万
