本策略是为了验证SVM对于大盘涨跌的预测是否有效,相比于纯随机策略,是否有明显的提高。

SVM模型用06~14年的数据训练,16年1月~12月的数据用来回测,这样是为了避免因为在模型中投入了现阶段的数据导致的过拟合。

  • 第一次运算准确率为.66,不过个人认为这个准确率不一定能复现,所以做了Accuracy with sets这张图来看数据量和准确率的变化趋势。

  • Accuracy with sets这张图描述了准确率随着数据量提高的变化,可以看出准确率的变化趋势,以及准确率的变化范围。可以重复生成这张图,以便了解最低测试准确率为多少。

  • 克隆notebook后,通过更改最后一段数据中第48行的 代码
    if predict_up and not cost:
    将predict_up去掉,改为:
    if not cost:
    就可以生成出不使用我们的SVM模型,纯粹的随机策略的图了。用以比较该模型和纯随机策略的相比,是否有显著的提高。

从结果来看,在16年的小范围下跌中,该模型表现还凑合吧……

import numpy as np
import pandas as pd
from CAL.PyCAL import Date
from CAL.PyCAL import Calendar
from CAL.PyCAL import BizDayConvention
from sklearn import svm
start = '2014-01-01'                       # 回测起始时间
end = '2016-12-01'                         # 回测结束时间
benchmark = 'HS300'                        # 策略参考标准
universe = set_universe('HS300')  # 证券池,支持股票和基金
capital_base = 100000                      # 起始资金
freq = 'd'                                 # 策略类型,'d'表示日间策略使用日dw线回测,'m'表示日内策略使用分钟线回测
re

处理数据

fields = ['tradeDate','closeIndex', 'highestIndex','lowestIndex', 'turnoverVol','CHG','CHGPct']
2
stock = '000300'
3
#tradeDate是交易日、closeIndex是收盘指数、highestIndex是当日最大指数,lowestIndex是当日最小指数,CHG是涨跌
4
index_raw = DataAPI.MktIdxdGet(ticker=stock,beginDate=u"2006-03-01",endDate=u"2015-03-01",field=fields,pandas="1")
5
#获取2006年3月1日到2015年3月1日,上一行代码设定的所有索引的相关信息。
6
​
7
index_date = index_raw.set_index('tradeDate')
8
index_date = index_date.dropna()
9
index_date['max_difference'] = index_date['highestIndex'] - index_date['lowestIndex']
10
​
11
index_date['max_of_30day'] = None
12
index_date['min_of_30day'] = None
13
index_date['max_difference_of_30day'] = None
14
index_date['closeIndex_after30days'] = None
15
#预设需要处理的值为None,方便之后直接用dropna函数去掉无效数据
16
​
17
for i in xrange(len(index_date)-30):
18#对数据进行处理
19index_date['max_of_30day'][i+30] = max(index_date['highestIndex'][i:i+30])
20#找出前30天最大值。
21index_date['min_of_30day'][i+30] = min(index_date['lowestIndex'][i:i+30])
22#找出前30天最小值
23index_date['max_difference_of_30day'][i+30] = max(index_date['max_difference'][i:i+30])
24#找出前30天最大日波动
25index_date['closeIndex_after30days'][i]=index_date['closeIndex'][i+30]
26#找出30天后的收盘价。
27
​
28
index_date = index_date.dropna()   #去掉前30个和后30个无效的数据。
29
lables_raw = index_date['closeIndex_after30days'] #提取出需要预测的数据
30
lables = index_date['closeIndex_after30days'] > index_date['closeIndex'] #为分类处理数据,判断30天后的收盘价是否大于今日收盘价
31
lables_ud = lables.replace({True:'up',False:'down'}) #方便他人阅读,将True和False改为up和down,意味着30天后收盘价涨了还是跌了
32
features = index_date.drop(['closeIndex_after30days'],axis = 1) #在特征值中去掉我们要预测的数据。

在未调参之前,我们先获取一次准确率:

from sklearn import cross_validation
from sklearn import preprocessing
scaler = preprocessing.StandardScaler().fit(features)
features_scaler = scaler.transform(features)
#上面两行代码用来标准化数据X_train,X_test, y_train, y_test = cross_validation.train_test_split(features_scaler, lables, test_size = 0.2, random_state = 0)clf_svm = svm.SVC()   #使用SVM分类器来判断涨跌
clf_svm.fit(X_train, y_train)
print "预测准确率为:%0.2f" % (clf_svm.score(X_test, y_test))

然后调C值,这里我是先让C在1~100的range跑,然后100~200……到300~400的时候发现不会进一步提高了。其实可以直接从1~1000跑一次,很快就能绘画出整个变动的图,然而我电脑渣带不动。

i_list = []
score_list = []
for i in range(300,400,1):i=i/1.clf_svm = svm.SVC(C = i)   #使用SVM分类器来判断涨跌clf_svm.fit(X_train, y_train)i_list.append(i)score_list.append(clf_svm.score(X_test, y_test))score_list_df =  pd.DataFrame({'i_list':i_list,'score_list':score_list})
score_list_df.plot(x='i_list' ,y='score_list',title='score change with c')

然后是gamma值,和C值调参上也是同理。

i_list = []
score_list = []
for i in range(100,200,1):i=i/100.clf_svm = svm.SVC(C=350 ,  gamma = i)   #使用SVM分类器来判断涨跌clf_svm.fit(X_train, y_train)i_list.append(i)score_list.append(clf_svm.score(X_test, y_test))score_list_df =  pd.DataFrame({'gamma_list':i_list,'score_list':score_list})
score_list_df.plot(x='gamma_list' ,y='score_list',title='score change with gamma')

虽说没什么卵用……还是假吧意思的比对一下不同核函数下的准确率吧。理所当然的是默认的高斯核表现最好。

i_list = []
score_list = []kernels  =  ['linear', 'rbf','sigmoid']
for i in kernels :clf_svm = svm.SVC(C=350 , gamma = 1.8 , kernel = i )   clf_svm.fit(X_train, y_train)i_list.append(i)score_list.append(clf_svm.score(X_test, y_test))score_list_df =  pd.DataFrame({'kernels':i_list,'score_list':score_list})
score_list_df.plot(x='kernels' ,y='score_list',title='score change with kernels',kind='bar')

知道了大致参数最优范围以后,我们使用grisearchCV在这个范围内找到最优解。

from sklearn.grid_search import GridSearchCV
from sklearn.cross_validation import ShuffleSplit
i = range(100,200,1)
params = {'C':range(300,400,1),'gamma':[x /100. for x in range(100,200,1)]}# X_train,X_test, y_train, y_test = cross_validation.train_test_split(features_scaler, lables, test_size = 0.2, random_state = 0)clf_svm = svm.SVC()
# cv_sets = ShuffleSplit(X_train.shape[0], n_iter = 10, test_size = 0.20, random_state = 0)grid = GridSearchCV(clf_svm, params )
grid = grid.fit(X_train, y_train)
print grid.best_estimator_

然后在最优解的基础上再次计算一次准确率

from sklearn import cross_validation
from sklearn import preprocessing
scaler = preprocessing.StandardScaler().fit(features)
features_scaler = scaler.transform(features)
#上面两行代码用来标准化数据X_train,X_test, y_train, y_test = cross_validation.train_test_split(features_scaler, lables, test_size = 0.2, random_state = 0)clf_svm = svm.SVC(C = 300,gamma = 1.03)   #使用SVM分类器来判断涨跌
clf_svm.fit(X_train, y_train)
print "预测准确率为:%0.2f" % (clf_svm.score(X_test, y_test))

为了判断模型是否稳健,我们让训练集合处于变化中,然后观察随着训练集合的变化,准确率的波动范围图。这里采取的是1000~2500数据每10个变化一次。

发现最低没有低于过0.72的准确率,波动较大在0.14左右,模型稳健度一般。

num_list = []
score_list = []
for i in xrange((len(features_scaler)-1000)/10):num_now = len(features_scaler)%10 + 10*i +1000X_train,X_test, y_train, y_test = cross_validation.train_test_split(features_scaler[:num_now], lables[:num_now], test_size = 0.2, random_state = 0)clf_svm = svm.SVC(C=350,gamma = 1.8)   #使用SVM分类器来判断涨跌clf_svm.fit(X_train, y_train)num_list.append(num_now)score_list.append(clf_svm.score(X_test, y_test))score_list_df =  pd.DataFrame({'sets_num':num_list,'accuracy':score_list})
score_list_df.plot(x='sets_num' ,y='accuracy',title='Accuracy with sets')

接下来是比对用的空白组,纯随机策略(不控制风险,只是随机买,1.20倍卖出)

import random
start = '2016-01-01'                       # 回测起始时间
end = '2016-12-01'                         # 回测结束时间
benchmark = 'HS300'                        # 策略参考标准
universe = set_universe('HS300')  # 证券池,支持股票和基金
capital_base = 100000                      # 起始资金
freq = 'd'                                 # 策略类型,'d'表示日间策略使用日线回测,'m'表示日内策略使用分钟线回测
refresh_rate = 1                           # 调仓频率,表示执行handle_data的时间间隔,若freq = 'd'时间间隔的单位为交易日,若freq = 'm'时间间隔为分钟def initialize(account):                   # 初始化虚拟账户状态passfeatures_list = []
def handle_data(account):random.shuffle(account.universe)       # 随机化股票池一遍随机策略for stock in account.universe:         # 股票是股票池中的股票,并且优矿帮你自动剔除了当天停牌退市的股票p = account.reference_price[stock]        # 股票前一天的收盘价cost = account.security_cost.get(stock)  # 股票的平均持仓成本if not cost:                           # 判断当前没有买入该股票order_pct_to(stock, 0.10)          # 将满足条件的股票买入,总价值占虚拟帐户的10%elif cost and p >= cost * 1.20:        # 卖出条件,当p这个价格涨幅到买入价的1.20倍;order_to(stock, 0)        # 将满足条件的股票卖到剩余0股,即全部卖出

然后是纯随机策略基础上,只增加一个预测盘指的涨跌,如果预测涨,则随机买入,否则不买。和纯随机策略比,的确好了一丢丢。

import random
2
start = '2016-01-01'                       # 回测起始时间
3
end = '2016-12-15'                         # 回测结束时间
4
benchmark = 'HS300'                        # 策略参考标准
5
universe = set_universe('HS300')  # 证券池,支持股票和基金
6
capital_base = 100000                      # 起始资金
7
freq = 'd'                                 # 策略类型,'d'表示日间策略使用日线回测,'m'表示日内策略使用分钟线回测
8
refresh_rate = 1                           # 调仓频率,表示执行handle_data的时间间隔,若freq = 'd'时间间隔的单位为交易日,若freq = 'm'时间间隔为分钟
9
stock = '000300' #预测的指数,沪深300指数。和策略参考池一致。
10
fields = ['tradeDate','closeIndex', 'highestIndex','lowestIndex', 'turnoverVol','CHG','CHGPct']
11
#tradeDate是交易日、closeIndex是收盘指数、highestIndex是当日最大指数,lowestIndex是当日最小指数,CHG是涨跌
12
​
13
def initialize(account):                   # 初始化虚拟账户状态
14pass
15
​
16
features_list = []
17
def handle_data(account):
18# 生成买入列表
19last_date = account.previous_date.strftime("%Y-%m-%d") #获取上一个交易日日期并格式化
20begin_date = pd.date_range(end=last_date,periods=60)[0] #获取60日之前的交易日日期
21begin_date = begin_date.strftime("%Y-%m-%d") #格式化这个日期
22to_class = DataAPI.MktIdxdGet(ticker='000300',beginDate=begin_date,endDate=last_date,field=fields,pandas="1")
23to_class = to_class.dropna()
24to_class = to_class[-30:] #获取我们要的30天的指数信息
25to_class_date = to_class.set_index('tradeDate')
26to_class_date['max_difference'] = to_class_date['highestIndex'] - to_class_date['lowestIndex']
2728to_class_date_max_of_30day = max(to_class_date['highestIndex'])
29#找出前30天最大值。
30to_class_date_min_of_30day = min(to_class_date['lowestIndex'])
31#找出前30天最小值
32to_class_date_max_difference_of_30day = max(to_class_date['max_difference'])
33#找出前30天最大日波动
3435features_for_predict = to_class_date[-1:]
36features_for_predict['max_of_30day'] = to_class_date_max_of_30day
37features_for_predict['min_of_30day'] = to_class_date_min_of_30day
38features_for_predict['max_difference_of_30day'] = to_class_date_max_difference_of_30day
3940features_fp_scaler = scaler.transform(features_for_predict)
41predict_up = clf_svm.predict(features_fp_scaler)
42
​
43#预测30天后的收盘是涨还是跌。
44random.shuffle(account.universe)
45for stock in account.universe:         # 股票是股票池中的股票,并且优矿帮你自动剔除了当天停牌退市的股票
46p = account.reference_price[stock]        # 股票前一天的收盘价
47cost = account.security_cost.get(stock)  # 股票的平均持仓成本
48if predict_up and not cost:                        # 判断当前没有买入该股票
49order_pct_to(stock, 0.10)          # 将满足条件的股票买入,总价值占虚拟帐户的10%
50elif cost and p >= cost * 1.20:        # 卖出条件,当p这个价格涨幅到买入价的1.20倍;
51order_to(stock, 0)        # 将满足条件的股票卖到剩余0股,即全部卖出

更多实盘源码请点击链接

使用SVM预测大盘涨跌的简单策略相关推荐

  1. 使用AdaBoost预测预测大盘涨跌

    继使用SVM预测大盘涨跌, 使用决策树预测大盘涨跌后的第三个预测大盘涨跌的模型.包括调参的过程以及模型稳健性验证. 经过调参之后,预测准确率可以达到平均90%,上下波动范围约10%. 看到预测的准确率 ...

  2. 网格向量必须包含特征点。_【专题研究】基于SVM支持向量机模型的选股策略

    研究过集成学习中的随机森林和XGBoost后,本文将介绍一种更传统的机器学习方法:SVM支持向量机.SVM由于其较高的准确度,并且能够解决非线性分类问题,曾一度成为非常流行的机器学习算法.本文分别介绍 ...

  3. 量化交易入门之vnpy简单策略编写

    本篇博客将介绍量化交易框架vnpy的简单策略编写.在阅读本博客前的环境准备请看我的上一篇博客.传送门如下: 零基础搭建量化交易框架 一.开发环境 因为python版本兼容有点差,且源码功能都有所变化, ...

  4. 战棋游戏中的简单策略方法:基于群表示论的思想

    战棋游戏中的简单策略方法:基于群表示论的思想 最近在开发一款自娱自乐的基于上世纪30年代历史背景的战棋游戏,需要为其设计一个策略算法,我一开始就想可能用比较传统的动态规划,恰逢本周周一周二中科院数学所 ...

  5. 聚宽 - 简单策略试验

    几种简单策略及其回测结果,基于聚宽平台测试. 策略1:均价-昨日收盘价策略(均线策略) 具体描述:计算该股一定时间(设为days)内的收盘均价,若低于昨日收盘价,则用当前所有资金买入股票:若高于收盘价 ...

  6. 图像分类再思考DNN似乎遵循一种令人困惑的简单策略来对图像分类

    https://www.toutiao.com/a6695148561157325319/ 作者:Wieland Brendel 编译:ronghuaiyang 导读 一直以来,对于深度神经网络图像分 ...

  7. 下次激活策略10_服装店营销策划方案,简单策略让服装超市提升10倍业绩

    对于实体企业老板来说,都希望能在做营销活动时想一个完全的营销方案,所以大多老板都绞尽脑汁的思考.那么,一个好的营销方案到底该如何形成呢?一个好的营销方案又需要具备哪些方面呢? 首先,好营销方案的核心点 ...

  8. 下次激活策略10_服装店营销策划方案,简单策略让服装超市提升10倍业绩!

    对于实体企业老板来说,都希望能在做营销活动时想一个完全的营销方案,所以大多老板都绞尽脑汁的思考.那么,一个好的营销方案到底该如何形成呢?一个好的营销方案又需要具备哪些方面呢? 首先,好营销方案的核心点 ...

  9. SpringBoot中实现简单策略模式

    策略模式(Strategy Pattern):一个类的行为或其算法可以在运行时更改,策略模式属于行为型模式. 策略模式简单Java实现: https://www.runoob.com/design-p ...

最新文章

  1. Android应用开发基础篇(9)-----SharedPreferences
  2. 【编译打包】twemproxy-0.4.0-2.el7.centos.src.rpm
  3. 如何使cmd的输入和输出重定向到管道中(用这种方法可以将指令写入cmd并抓取输出)
  4. WINCE下如何设置/删除/查询这些环境变量
  5. 接软件开发项目,你需要知道这些!
  6. Linux根目录详解-转自鸟哥的私房菜
  7. MyBatis框架学习笔记02:利用MyBatis实现CRUD操作
  8. PHP学习总结(13)——PHP入门篇之常量
  9. 实现京东金融-悬浮框效果
  10. 细枝末节都交给App 我只负责享受生活 | 2016与我的数字生活
  11. 模糊C均值聚类算法---图像分割(python)
  12. ASCII码中10和13的含义
  13. 手机刷机软件与ROM的盈利模式分析
  14. lol无限乱斗服务器,LOL无限火力升级无限乱斗 LOL无限乱斗玩法攻略
  15. 金蝉素数java代码分析_JAVA 水题
  16. 如何清爽的安排日常?
  17. conda install安装不了任何包,一直下载一直错
  18. java 微信服务器录音下载到自己服务器,并转为wav格式
  19. 康华医疗旗下康华医院道歉:生命不该用钱衡量,还曾是中植系
  20. Cocos2dx 菜单项控件-Menu

热门文章

  1. RobotFramework 之 Setup和Teardown
  2. 21 种代码的坏味道
  3. 什么是液晶屏的极性变换(一)
  4. linux远程无法连接能ping通,能ping通服务器,但是不能ssh远程登录为什么?
  5. 微软强力工具powertoys下载地址
  6. 根据以上数据,为我定制一周的锻炼计划,一周3天训练左右,包含一些健身房和户外的运动,列出每次训练的详细动作,包括重量时间,消耗的卡路里...
  7. android 系统图标的使用
  8. js的if判断,关于==的判断
  9. 数据库的设计(E-R图,数据库模型图,三大范式)
  10. rt-thread的moudle源码分析