用SVM預測股票漲跌 - 免費分享全套代碼

突然看到幾篇用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")

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章