浅谈股价预测模型:你是否掉进机器学习的陷阱

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,                   # 滤波器的个数,类比于units
            kernel_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. 模拟检验

        不知道读者朋友们品出多少味道,可能还有人认为就算预测一天也一样可以进行参考啊,下面笔者用模拟的股价简要阐释为什么笔者依然认为这种做法不可取。 

        首先做一个简单随机游走模型用以模拟股价:

x_{t} = x _{t-1} + b

import random
import matplotlib.pyplot as plt

x = 0
price = []
for i in range(20):
    b = random.uniform(-1, 1)
    x = x + b
    price.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股某公司股价(数据来源:同花顺)

         在此,笔者呼吁:认清现实,回归基本面的本质。

        写到这里告一段落,笔者觉得这个写多了也没什么意思,更多的是点启发性的东西,后面有必要再继续出相关内容。您若不弃,我们风雨共济。

  • 8
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Simon Cao

创作不易,您的鼓励将是我的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值