浅谈股价预测模型:你是否掉进机器学习的陷阱
1:本文主要讨论机器学习中常犯的错误;
2:本文主要为理念的讲解,依旧是基于干货的分享;
3:本文引用了一些别人的模型及数据用以举例,除此之外均是笔者自建;
4:文中假设与观点是基于笔者对模型及数据的一孔之见,若有不同见解欢迎随时留言交流;
目录
1. 哪里出问题了
1.1 操作风险
1.2 被完美蒙蔽了双眼
2. 模拟检验
3. 意义何在
1. 哪里出问题了
笔者最近整理一些卷积网络的资料发现一些人预测出来的股价是这种款的:
原文链接:
(20条消息) 利用神经网络预测股票价格走势_vzfearless的博客-CSDN博客_基于神经网络的股价预测https://blog.csdn.net/qq_28566521/article/details/103123320?ops_request_misc=&request_id=&biz_id=102&utm_term=%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C%20%E8%82%A1%E4%BB%B7&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-9-103123320.nonecase&spm=1018.2226.3001.4187
更有甚者是这样的:
原文链接:(20条消息) 【python量化】用时间卷积神经网络(TCN)进行股价预测_敲代码的quant的博客-CSDN博客_tcn预测https://blog.csdn.net/frankiehello/article/details/113409856?ops_request_misc=&request_id=&biz_id=102&utm_term=%E6%97%B6%E9%97%B4%E5%8D%B7%E7%A7%AF%E7%BD%91%E7%BB%9C%20%E8%82%A1%E4%BB%B7&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-113409856.nonecase&spm=1018.2226.3001.4187
这里声明一下,类似这样的回测不止这两个截图,上面两篇文章仅作举例,笔者无意针对,只是就机器学习和模型设计的一些不合理之处发表一下看法,读者朋友们如果觉得有道理便采纳,没道理就当听个乐呵。
那么回到这样的回测结果,好家伙,既然这么准巴菲特是不是可以让位了。至少如果笔者自己的模型给出这样的走法笔者第一反应绝不是我开发了了不起的模型,而是哪里出问题了。原因很简单,股票市场不是识别图片上的阿猫阿狗,里面充满的是不确定性。如果机器能识别到这么精准的走势那不叫机器,那叫上帝。
1.1 操作风险
最常见的问题是把标签数据当成样本数据喂给模型了,想当初笔者上课时听到这种错误只觉得这么低级的错误不可能犯的,事实上自己做一些大点的模型稍不留神就搞错了,尤其像卷积神经网络这种需要滑动区域的一不留神就把标签数据跟着滑进去了,得到90%+的正确率还在哪儿沾沾自喜,殊不知已经掉进陷阱。虽然这是笔者自嘲,但本着实事求是精神,还是拿出来说一说,时刻提醒自己。
1.2 被完美蒙蔽了双眼
其实还有一种陷阱那就是没有犯错,非常容易蒙蔽双眼。正好似热恋中的男女,都想展现最好的一面给对方,一切看似完美,殊不知在一起时间长了卸下伪装形如陌路之人。正如文章开始笔者所展示的那两张图片,其实他们没有犯任何计算或者逻辑上的错误,从样本,标签,网络结构,到激活函数,损失函数,优化算法,再到训练,测试,这些都很完美。但笔者想说,实际拿这个到市场上交易怕是要摩托变单车。
其实原因很简单,他们所用的标签数据无一例外都非常小,有甚者只对未来一天进行预测,这从他们的代码中很容易看出来:
for i in range(len(data) - look_back):a = data[i:(i + look_back), 1:]dataX.append(a)dataY.append(data[i:(i + look_back), 0][-1])# dataX.shape = (n,look_back,4)dataX = np.array(dataX)dataY = np.array(dataY)dataY.reshape(-1, 1)
————————————————
版权声明:本文为CSDN博主「vzfearless」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_28566521/article/details/103123320
def build_model():train_X, train_label, test_X, test_label, scaler = get_dataset()model = keras.models.Sequential([keras.layers.Input(shape=(window_size, 1)),TCN(nb_filters=filter_nums, # 滤波器的个数,类比于unitskernel_size=kernel_size, # 卷积核的大小dilations=[1, 2, 4, 8]), # 空洞因子keras.layers.Dense(units=1, activation='relu')])model.summary()model.compile(optimizer='adam', loss='mae', metrics=['mae'])model.fit(train_X, train_label, validation_split=0.2, epochs=epochs)————————————————
版权声明:本文为CSDN博主「敲代码的quant」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/frankiehello/article/details/113409856
您看出来了吗,都是预测一天的:
dataY.reshape(-1, 1)
keras.layers.Dense(units=1, activation='relu')
其实从模型的角度用非常小的标签没有错,毕竟如果需要拟合的天数越多,不确定性越高,模型越容易犯错(说穿了就是越不准)。
但降低误差,降低训练难度让模型更准不是好事吗?
若果从展示效果上讲,是的。
如果从交易角度讲,橱窗展示效应(window dress),通俗来讲就是个花瓶,中看不中用。
A股主板是有涨跌停板限制的,每天涨上天也只能涨10%,跌到地也只能跌10%,如果仅预测未来一天的数据再差也不可能产生超过涨跌停板的波动。每天做一次预测,把时间周期再一拉长,走势自然就和真实走势非常接近了。
2. 模拟检验
不知道读者朋友们品出多少味道,可能还有人认为就算预测一天也一样可以进行参考啊,下面笔者用模拟的股价简要阐释为什么笔者依然认为这种做法不可取。
首先做一个简单随机游走模型用以模拟股价:
import random
import matplotlib.pyplot as pltx = 0
price = []
for i in range(20):b = random.uniform(-1, 1)x = x + bprice.append(x)plt.figure(figsize = (15,6))
plt.plot(range(len(price)), price)
plt.show()
展示一下模拟股价走势,坐标轴就不改了,一切从简:
图一:随机游走模拟股价
抛开简陋的图例和坐标轴,单看走势笔者要说这是股价没毛病吧,下跌趋势,V型反转,上涨趋势,高位平台整理,不出意外后面出完货就该跌下去了。。
那接下来在这个的基础上生成一条随机涨跌的预测线,预测股价本质就算预测涨跌,笔者按着跌停涨停的范围随机取数算出预测价格:
predict_p = []
for i in price:pct_chg = random.uniform(-0.1, 0.1) # 随机涨跌predicting = i * (1 + pct_chg)predict_p.append(predicting)plt.figure(figsize = (15,6))
plt.plot(range(len(price)), price, color = "b")
plt.plot(range(len(predict_p)), predict_p, color = "r")
plt.show()
展示一下,不出意外的话就应该是出意外了:
图二:叠加预测走势1(红:预测,蓝:实际)
走势不能说相似,只能说一模一样。我把上面代码和图片全遮住,猜一猜蓝色红色那条是预测的那条是实际的恐怕有一半人要猜错,双线傍图走,安能辨我是哪条。
可能还有人不服,毕竟笔者用的是当天的股价预测当天的,继续安排入土,改成用昨天的股价预测第二天的:
predict_p = []
for i in price[:len(price)-1]:pct_chg = random.uniform(-0.1, 0.1)predicting = i * (1 + pct_chg)predict_p.append(predicting)plt.figure(figsize = (15,6))
plt.plot(range(len(price[1:])), price[1:], color = "b")
plt.plot(range(len(predict_p)), predict_p, color = "r")
plt.show()
图三:叠加预测走势2(红:预测,蓝:实际)
除了稍微滞后一点,依旧毫无违和感。
笔者说得难听点,想要形成文章开头那样的走势实在是太简单了。只要计算机算的够快,我们可以拿分钟级别的数据做这样的拟合,那走势图一拉出来,看上去更准。这里的问题是:做这样的预测有意义吗?
3. 意义何在
笔者认为短期进行机器学习的预测没有意义,笔者依旧认同股价在超短期和短期内有随机游走的倾向,用神经网络学习这种充满随即和不确定性的数据根本没有意义。很多课本在讲到随机游走都会提到醉汉牵着一条狗的故事,这一分钟醉汉在点A,下一分钟他会跑到什么地方是完全随机的。但不变的是你肯定能在醉汉附近找到那条狗,因为狗被绳子牵引了。
这个醉汉就好似股价,狗就好似机器学习,那条狗链子就算是A股的涨跌停板限制。尽管狗狗永远在醉汉附近,但你永远只能在距离醉汉狗绳为半径的范围内找到狗狗,而这个圆内充满了不确定性。
如果您不认同随机游走理论,那么笔者从另一个角度说明短期的股价预测并没有意义,那就是市场中存在的短期交易者太多,很多时候还需要面对的是还是机器运作的高频交易。笔者看过一些关于欧美市场的访谈,早在上世纪90年代就有一些交易员表示短期套利空间小到几乎忽略不计(感兴趣的可以看看Anton Kreil,很早之前看的,链接找不到了)。现在的交易更不是上世纪可比,得益于高性能计算机和算法的加持,短期内与你交易的除了是和你一样的散户,对手盘还有毫无感情的机器,以及随时下套的庄家。笔者认为想在这样的短期市场获利要么你比别人聪明,要么你的算法或者计算机性能比别人优越。凭借着这么一个民用计算机上跑的小小卷积网络想成功?预测有狗绳牵着的A股尚且如此之难,更遑论没有涨跌停板的美股,或者如此逆天的妖股。
图四:A股某公司股价(数据来源:同花顺)
在此,笔者呼吁:认清现实,回归基本面的本质。
写到这里告一段落,笔者觉得这个写多了也没什么意思,更多的是点启发性的东西,后面有必要再继续出相关内容。您若不弃,我们风雨共济。
浅谈股价预测模型:你是否掉进机器学习的陷阱相关推荐
- 浅谈股价预测模型:捉摸不定,最为致命
摘要与声明 1:本文将蒙特卡洛模拟的理念运用在股价预测上: 2:本文所使用的行情数据通过Tushare(ID:444829)金融大数据平台接口获取: 3:笔者希望搭建出一套交易体系,原则是只做干货的分 ...
- 读者变为用户,别掉进算法的“陷阱”
本文转载自腾讯网 网络文艺对用户几乎没有门槛,加之突出的娱乐性,吸引网民汹涌加入.新华社发(王威摄) 5G技术革新带来万物互联.万物皆媒的未来传播图景.新华社记者 王全超摄 拍摄手工艺品视频.新华社记 ...
- 《魔兽世界》衰败之因:掉进“大数据陷阱”
玩<魔兽世界>的人越来越少了.这并非笔者的主观臆断.其2013年第一季度的财报显示,虽仍保有830万付费玩家,全球最多,但与上季相比,却一下子锐减了130万. <魔兽世界>有着 ...
- 中睿微课堂 | 防不胜防!小心掉进“退订”陷阱
企业邮箱作为企事业单位必不可少的对外和内部主要信息传输工具,承载着大量重要信息,电子邮件内容的泄露或篡改会给单位和个人带来无法估量的损失,邮件钓鱼是最常见的邮件攻击形式,一些看似合规的普通电子邮件却可 ...
- 浅谈PPO算法-玩转月球登陆
浅谈PPO算法-玩转月球登陆 前言 github 什么是Actor-Critic? Actor-Critic代码 ppo算法 实现 前言 总感觉强化学习公式真难学,也难表达心中所想,我还是白话强化学习 ...
- java 变量共享_浅谈Java共享变量
Java并发一直都是开发中比较难也比较有挑战性的技术,对于很多新手来说是很容易掉进这个并发陷阱的,其中尤以共享变量最具代表性,其实关于讲这个知识点网上也不少,但大象想讲讲自己对这个概念的理解.共享变量 ...
- 浅谈Service Manager成为Android进程间通信(IPC)机制Binder守护进程之路
原文地址: http://blog.csdn.net/luoshengyang/article/details/6621566 上一篇文章Android进程间通信(IPC)机制Binder简要介绍和学 ...
- 浅谈估值模型:PB指标与剩余收益估值
摘要及声明 1:本文简单介绍PB指标的推导以及剩余收益的估值方式: 2:本文主要为理念的讲解,模型也是笔者自建,文中假设与观点是基于笔者对模型及数据的一孔之见,若有不同见解欢迎随时留言交流: 3:笔者 ...
- 浅谈无缓存I/O操作和标准I/O文件操作区别 (转载)
首先,先稍微了解系统调用的概念: 系统调用,英文名system call,每个操作系统都在内核里有一些内建的函数库,这些函数可以用来完成一些系统系统调用把应用程序的请求传给内核,调用相应的的内核函数完 ...
- iOS实录15:浅谈iOS Crash
导语:在当前的iOS开发中,虽然ARC为开发者解决了手动内存管理时代 的许多麻烦,但是内存方面的问题依然是产生iOS Crash的元凶之一,本文介绍内存方面,有关僵尸对象.野指针.内存泄漏.废弃内存这 ...
最新文章
- 据说这是个电子元器件采购的春天,我们该如何把握机遇?
- 莱斯信道衰落下的QPSK误码率分析
- go本地调用image-syncer
- C#简单实现LRU缓存
- android 程序退出广播,android 利用广播实现程序的强制退出
- Dancing Stars on Me HDU - 5533
- ue4 设置intellisence_UE4.22编辑器界面操控设置(4)
- 在C#中判断某个类是否实现了某个接口
- rocketmq4.x快速入门指南
- C语言printf输出格式总结
- 网络电视机顶盒测试软件,网络机顶盒最值得安装的软件,可免费收看全网vip独播剧!...
- 黑马程序员2022新版python教程补充(P61)
- UE4 RTXGI插件安装及使用
- 一张图解决为什么校外访问不了学校购买的中国知网
- 凑辣荷丶换怂档屯览破擦丶笛丶北
- ElementUI级联框回显问题
- 中秋晴朗夜,我们与星月相见
- 好用的报表分析软件有哪些?
- 盘点2019年十大泡沫经济事件:今年哪个行业有点衰?
- 人脸识别的关键技术及原理