用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")

 

 

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值