突然看到几篇用SVM预测股票涨跌的博客, 照着跑了一下发现正确率很高78.85%, 盈利次数和亏损次数的比值 也是不得了啊
然后发现这些文章的涨跌是当日对昨日的涨跌,也就是在盘中, 已知开盘价,最低价,最高价等资讯, 预测今天收盘是涨还是跌.....这需要用svm?
value = pd.Series(df_CB['close']-df_CB['close'].shift(1),\
index=df_CB.index)
为了贴近真实操盘情况, 我把涨跌幅改成 后天开盘价对明天开盘价(或是明天收盘价)的涨跌幅,看看能不能预测.....
# 第二天开盘买入,第三天开盘卖出
value = pd.Series((df['open'].shift(-2)-df['open'].shift(-1))/df['open'].shift(-1),index=df.index)
当然可以改成明天收盘买入,后天开盘卖出,但是这样取得正例的几率又更少了
当百分比大于0.7%(股票交易成本)的时候为正
交易策略就是如果预测会盈利就在明天开盘买入,然后后天卖出,运行结果正确率还是很高62.98%,但是其实是因为预测结果都是0,其实就是没法预测的意思
虽然心里受到了一点打击,但其实是符合常理的, 你真的以为能赚钱的代码会免费分享给你么?
最后免费分享全套代码
股票数据可以从yahoo上取得https://hk.finance.yahoo.com/lookup
import pandas as pd
from sklearn import svm,preprocessing
df=pd.read_csv("./MNIST_data/601012.csv")
columns=['date','open','high','low','close','adjclose','vol']
df.columns=columns
df_original=df.copy()
# value = pd.Series((df['close']-df['close'].shift(1))/df['close'].shift(1),index=df.index)
# 第二天收盘买入,第三天开盘卖出
# value = pd.Series((df['open'].shift(-2)-df['close'].shift(-1))/df['close'].shift(-1),index=df.index)
# 第二天开盘买入,第三天开盘卖出
value = pd.Series((df['open'].shift(-2)-df['open'].shift(-1))/df['open'].shift(-1),index=df.index)
#明日上涨
# value = pd.Series((df['close'].shift(-1)-df['close'])/df['close'],index=df.index)
df_original['后天开盘价']=df['open'].shift(-2)
df_original['明天开盘价']=df['open'].shift(-1)
df_original['涨幅']=value
# df_original['close shift(1)']=df['close'].shift(1)
value=value.fillna(0) #第一笔数据是nan
value[value>0.007]=1 #交易成本千分之7,至少要覆盖
value[value<=0.007]=0
df['value']=value
df.set_index('date')
df.sort_index()
df.drop(columns='date',inplace=True)
#删除无效数据
df=df.dropna(axis=0, how='any')
df=df.astype('float64')
df_x=df.drop(columns='value',axis=1)
df_x=preprocessing.scale(df_x)
correct=0
totalNum=0
df_original['结果']=""
trainNo=int(df_x.shape[0]*0.8)
trainOrigin=trainNo
profitTimes=0 #盈利次数
lossTimes=0 #亏损次数
miss_op=0. #
esc_risk=0. #
while trainNo<df_x.shape[0]:
trainX=df_x[trainNo-trainOrigin:trainNo]
trainY=value[trainNo-trainOrigin:trainNo]
predictX=df_x[trainNo:trainNo+1]
answer=value[trainNo:trainNo+1]
classifier=svm.SVC(kernel='linear')
# classifier = svm.SVC(C=1.0, kernel='poly')
# classifier = svm.SVC(C=1.0, kernel='rbf')
classifier.fit(trainX,trainY)
value_predict=classifier.predict(predictX)
anserC=answer.values[0]
pre=value_predict[0]
print("{} 实际:{},预测:{}".format(df_original.loc[trainNo,'date'],anserC,pre))
if(anserC==1):
if(pre==1):
df_original.loc[trainNo, '结果']="赚钱"
profitTimes+=1
correct +=1
else:
df_original.loc[trainNo, '结果'] = "错过机会"
miss_op+=1
else:
if (pre == 1):
df_original.loc[trainNo, '结果'] = "赔钱"
lossTimes+=1
else:
df_original.loc[trainNo, '结果'] = "躲过风险"
esc_risk += 1
correct += 1
trainNo = trainNo + 1
totalNum+=1
print("总天数",profitTimes+lossTimes+miss_op+esc_risk)
print("盈利次数",profitTimes)
print("亏损次数",lossTimes)
print("错过机会",miss_op)
print("躲过风险",esc_risk)
print("正确率 {:.2%}".format(correct/totalNum))
print("END")