[ML 初探] 基于 SVM 的市场形态预测器研究

2016-08-25 11:19:27 +08:00
 mushroomqiu
程序媛 mm ——“小狐狸”最近又发现一篇和机器学习相关的文章,觉得好东西不能大家捂着,要拿出来和大家分享一下哈。

市场形态预测器:将市场分为震荡市场和趋势市场,希望能够依据历史信息判断第二天的市场为震荡市场还是趋势市场。若能够大概率下准确判断未来是震荡市场还是趋势市场,可以据此信号来做 MOM 或 FOF 等资产配置类的策略。比如在震荡市场,将资产权重更多的配置在波动率策略上;在趋势市场,将资产权重更多的配置在趋势策略上等。

鉴于机器学习在各领域中已经开始绽放光芒,它必然也能给金融市场带来一些不一样的尝试。二级市场试图做的事情无非是在历史信息中挖掘特征去拟合未来收益函数或判断离散变量。拟合未来收益函数这件事本身是比较困难的,因此判断离散变量相对来说更加务实一点,离散变量可以是涨跌,也可以是自定义的离散类别。因此个人认为 ML 对金融市场的帮助应该先从有监督的分类器入手,本文尝试使用 sklearn 中 SVM 的分类器对市场形态进行预测,给出个简单的研究过程来抛砖引玉。
首先确定标的为单只股票或指数的收盘价格时间序列。

接着标定数据,根据某种市场形态的定义规则来为每一天贴标签,本文中标签为二元标签『-1 :震荡市场; 1 :趋势市场』,其标定方法参考华泰联合证券之《震荡市还是趋势市?--市场状态的量化划分方法及应用》。
下面生成数据集,利用带标签的数据生成数据集,生成函数 f :特征向量↦标签。生成函数是 ML 的一大核心,其包括选取合适的特征及贴合适的标签(做预测器通常用 t 时刻的特征对应 t+1 时刻的标签)。

最后是模型优化,利用交叉验证中测试集准确率的平均作为某个模型的成绩,并通过 sklearn 中的网格优化选择合适的模型。

使用沪深 300 指数 10 年的收盘价序列进行测试

对二元标签『-1 :震荡市场; 1 :趋势市场』使用市场效率“ market efficiency ” E(t) 来定义

E(t) 定义了每个点的市场形态,当其数值小于某个阈值 , 认为是震荡市场;大于该阈值时认为是趋势市场。

下面画出标签图谱
查看原文码: https://uqer.io/community/share/5790ac2e228e5b9


“ Market efficiency ”定义所选取的阈值为 0.199 。由上图可以看出,其标注符合预期。然后使用了比较简单的方法生成数据集。直接将 t 日过去 n 日的时间序列作为 feature ,其后一日 t+1 的市场形态标签作为 label , 以此对应数据集。这样的思路是利用过去 n 的收盘价用作 n 个特征维度,来预测后一天的市场形态。

再利用 sklearn 中的网格优化在一定的参数范围内选取合适的模型。( PS : Grid search 的原理其实是参数遍历,并返回一个 grid score 字典记录每一组组合的结果。 这个原理很简单,可以通过遍历笛卡尔积来手动实现。但利用 sklearn 的好处是其模型内部做了优化,可以配置硬件,设置缓存大小及 CPU 核。)

查看原文代码: https://uqer.io/community/share/5790ac2e228e5b9

以上计算出了最优的 SVC 的模型及其 10−fold 交叉验证的准确率(测试集准确预测的百分比)。
观察可知,交叉验证的结果相近,因此理论上不存在过拟合问题。
可通过设置大而密的网格,并借助硬件的力量,去训练得到性能较好的模型。
此处交叉验证的平均准确率可近似为样本外回测,但不等同。原因在于:样本外回测时,要考虑样本的时间先后性;而交叉验证的结果并不考虑样本的时间先后性。

总结
1.可利用有监督的分类器尝试做一些离散的预测信号;
2.对于离散的分类器模型,如 SVC , passiveAggressive, Decesion tree 等:若训练集无序,研究中最好通过交叉验证来验证有无过拟合;若训练集有序,研究中应尽量增大测试集的比例;
3.若做实时策略模型,应尽量使用 online 的学习算法
4.数据集生成中,特征向量的选取可以更加精炼并有所选择。特征选取可结合无监督学习、神经网络等方法。

最后, 本文给出了研究机器学习模型的简单过程。真正实战,建议首先利用 offline 模型通过训练、优化、交叉验证对分类器的功能构想做验证,进而再开发 online 的实际策略模型,也许会更加清晰哦
3341 次点击
所在节点    推广
7 条回复
nooper
2016-08-25 16:07:47 +08:00
震荡市最好的策略就是不操作
hccbook
2016-08-26 09:31:16 +08:00
这广告……
staticor
2016-08-26 14:42:46 +08:00
对 sklearn 有兴趣的可以直接看 http://scikit-learn.org/stable/modules/svm.html

这篇文章这么多字看得比英文感觉还吃力
Borden
2016-08-26 22:48:23 +08:00
卧槽,用 SVM 做预测不纯粹是伪科学跳大神吗?

给一万个有男有女的人给机器学习,然后把第 10001 个人给机器看,让它判断这是男是女,这叫分类器。

给一万个有男有女的人给机器学习,然后第 10001 个人不给机器看,让它猜这是男是女,这叫预测器。

SVM 是分类器,不是预测器。这文章拿 SVM 做预测还能左手右手一个慢动作,整得跟真的似的,牛逼。
grindsgears
2016-08-29 10:16:44 +08:00
"使用沪深 300 指数 10 年的收盘价序列进行测试 " wtf
这么低的精度,,,说白了,就是针对特定的 historical data 进行 optimize 。。不用这么复杂,就可以做一个 equity curve 一直往上和一直往下的两个 strategy 。 lol
这种都是纸上谈兵的东西,,,,
要么是针对 globe macro hedge trade 的那种, excel 就搞定,要么数据进度至少要包含 order book , foot print 之类的 hft 。。。
这个东西弄完没有什么用,,市场的 liquidity 有多少? 到时候进不去,出不掉。。 lmaoooooooooooo
102516949
2016-08-29 10:23:31 +08:00
@Borden SVM 是可以做回归预测的,你可以参照李航的那本《统计学习方法》,或者周志华的那本《机器学习》
quix
2016-08-29 10:29:06 +08:00
@Borden 但也可以这样啊, 给 10000 种走势,各种市场参数+ 结果(涨,跌) 给机器学习, 然后给 10001 种市场参数, 让机器分类是涨是跌, 对于结果有限情况下, 分类器就是预测期啦

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/301657

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX