暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

基于逻辑回归和SVM分类预测股市涨跌(tushare))

量化分析之路 2020-04-15
1272

前面已经讲过了逻辑回归和SVM分类的算法原理。

今天简单讲一个以收盘价为因子预测涨跌的例子。

以沪深300指数为例

策略 :以前七日的指数收盘价为学习因子,预测下一天收盘价的涨跌

分类问题 

 涨 label 1

 跌 label -1


训练集   2014.01.01-2018.06.30  沪深300指数 收盘价

测试集   2018.07.01-2020.01.01  沪深300指数 收盘价


回测如下

一:准备

from pylab import plt
%matplotlib inline
import seaborn
import matplotlib as mpl
mpl.rcParams['font.family'] = 'serif'
import warnings;warnings.simplefilter('ignore')
import pandas as pd
import numpy as np
import tushare as ts        #数据来源    

二 :数据准备

hs300 = ts.get_k_data('hs300',start='2014-01-01',end='2018-06-30')   #训练集 17-19   19-20测试
hs300.set_index('date',inplace=True)
hs300.head(10)
hs300['return'] = hs300['close'].pct_change()            #迭代差值就比例
hs300.dropna(inplace=True)
hs300.head()
#得到指数收益

for i in range(1,8,1):
hs300['close - '+str(i)+'d'] = hs300['close'].shift(i) #shift(period:表示移动的幅度 axis:轴向 =0 )
hs300.head(10)

hs_7d = hs300[[x for x in hs300.columns if 'close' in x]].iloc[7:]
hs_7d.head(10)

3:模型训练

import sklearn
from sklearn import linear_model
X_train = hs_7d
X_train = sklearn.preprocessing.scale(X_train) #标准化
X_train

lm =  linear_model.LogisticRegression(C=1000)         #C 控制决策边界 的惩戒因子 
Y_train = np.sign(hs_7d['close'].pct_change().shift(-1)) #sign -1 0 +1 重要 拿到下一天的收益 所以上移
Y_train.replace(to_replace=np.NAN,value= 0, inplace = True)

lm.fit(X_train,Y_train)

hs300['prediction'].value_counts()


hs300['strategy'] = (hs300['prediction']*hs300['return']+1).cumprod()
hs300['cum_ret'] = (hs300['return']+1).cumprod()
hs300[['strategy','cum_ret']].dropna().plot()


训练好的模型训练集的收益。  跑输大盘 我测了好几年的  表现都比较一般、

下面为测试集收益

hs300_test = ts.get_k_data('hs300',start='2019-01-01',end='2020-01-01')
hs300_test.set_index('date',inplace = True)
hs300_test['returns']= hs300_test['close'].pct_change()
hs300_test.dropna(inplace=True)
hs300_test.head()

for i in range(1,8,1):
hs300_test['close - '+str(i)+'d'] = hs300_test['close'].shift(i) #shift(period:表示移动的幅度 axis:轴向 =0 )
hs_7d_test = hs300_test[[x for x in hs300_test.columns if 'close' in x]].iloc[7:]
hs_7d_test.head()

可以看到 用逻辑回归算法 得到的回测结果比较一般。


SVM算法指数回测 数据处理情况比较类似

 只是把 训练模型改成了SVM模型

我就把截图放一下

第一部分 数据准备

第二准备 数据处理

第三部分 训练模型以及训练集回测

第四部分 测试集的回测

今天的这两个回测 都是分类预测

即以前七天的股价涨跌为学习因子  预测下一天的涨跌。1  , -1

下一节学习一个以SVM为模型的回归问题 

以前20天的股价为因子  预测下一天股市的收盘价。


定量输出称为回归,或者说是连续变量预测;
定性输出称为分类,或者说是离散变量预测。


举个例子:
预测明天的气温是多少度,这是一个回归任务
预测明天是阴、晴还是雨,就是一个分类任务

预测股市是上涨还是下跌,这是一个分类任务
预测明天股市的点数       ,就是一个回归任务

定量输出称为回归,或者说是连续变量预测;
定性输出称为分类,或者说是离散变量预测。

文章转载自量化分析之路,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论