当构建第一个基础的回归模型或分类模型时,我们可以看出开发者们希望通过机器学习实现预测的“野心”。金融市场是最早应用机器学习技术的领域之一。自20世纪80年代起,人们就开始利用机器学习技术来发现市场中的规律。尽管机器学习在预测市场结果方面取得了显著的成功,但近年来深度学习并未在金融市场预测方面提供太多帮助。
大量时间序列数据的存在,加上年轻人对社交的“懒惰”,使人们重新产生了寻找古老却有价值的事物的想法。
机器学习能否揭示股票、货币和财务目标背后的规律?能否用于市场预测?
光说不做是没有意义的。下面是具体的行动方案:
网络上有许多简短的教程,这可以作为很好的起点。这些教程展示了如何提取股票的历史数据,计算各种指标,然后将这些数据输入到回归算法中,尝试预测第二天的股票价格。或者使用分类器来预测股票是上涨还是下跌,而不是预测具体的价格。
基于上述内容,我有两个想法。首先,我希望扩大覆盖范围。我认为,某些股票、货币和财务目标之间可能存在一些微妙的关系,这些关系难以被人类发现,但机器学习算法可以通过挖掘这些关系来揭示它们。
其次,我不打算预先选定要预测的股票。相反,我计划训练所有可能的模型,然后观察哪种股票的表现最佳。我的假设是,某些公司的股票可能比其他公司更容易被预测,因此需要找到这些公司。
以下是我在实践过程中学到的东西:
首先,我收集了标准普尔500指数中大多数股票的历史数据、许多货币的历史数据和多个财务指标。使用Python脚本,我将这些数据转换成统一的格式,填补缺失值,并删除了那些无法追溯到2000年初的数据。
最终,我得到了一张整齐的Pandas表格,里面包含了18年间的上千列数据。
随后,我使用了TA-lib库来计算每个时间序列指标在5天、10天和30天窗口内的值。
我没有金融背景,也不确定哪些因素真正会影响股票价格,因此我尝试了多种不同的股票,并使用模型进行分类。数据集中的列非常多,最终模型将处理超过32,000列的数据。
考虑到整体性能以及是否容易查看模型的预测效果,我选择了XGBoost算法。我设置它遍历整个数据集中的所有股票,为每个股票训练两个模型:一个分类器用于预测股票第二天是上涨还是下跌;另一个回归模型用于预测第二天的收盘价。
对于每种模型,我使用95%的数据进行训练,剩余5%的数据用于验证,以模拟未见过的数据。这大约相当于3个月的交易数据。
为了验证模型的效果,我进行了模拟投资,使用1000美元作为初始资金。如果模型预测股票会上涨,我就买入;如果预测下跌,就卖出。我没有考虑交易成本,因为我只想看看结果如何。
经过一个月的运行,我发现大多数股票的预测结果都不理想,准确性不高。然而,有些数据在验证阶段表现得异常出色。在3到6个月内,模拟资金增长了两到三倍,而一组数据甚至实现了20倍的增长。
令人惊讶的是,这个结果是在模型从未见过的数据上实现的,即最初保存在训练数据集中的那5%。
是否存在一些与市场指标高度相关的股票?能否进行有效的预测?如果可以,那么就可以通过价格波动获利。
几个月后,我更新了数据集,输入了最新的交易数据,决定检查模型在这段时间内的表现。结果表明,这些模型在验证阶段表现良好。
但如果在过去几个月中一直使用这些模型进行实时交易,其表现如何呢?这个问题让我非常期待。
结果令人沮丧。那些在最后训练和验证阶段表现优异的模型在后续数据上的表现可能不错,也可能完全失败,甚至损失所有的初始资金。模拟投资有一半的概率会盈利,另一半则会亏损。有时,模型的准确率高于50%,而有时则低得多。
为什么会这样?原本看起来很有前景的模型为何会失败?
最终,我认识到,如果股票价格是随机波动的,那么成功的机会大约是50%,这也是预期的结果。通过程序搜索数百只股票来寻找表现良好的股票,确实偶然发现了一些在验证期间表现良好的股票。但在几周或几个月后,这些股票的表现可能会大相径庭。
没有任何隐藏的模式。这个模型只是偶尔走运了几次,而我恰好选中了这些模型,这使得这个实验不可重复。
因此,问题变得清晰:机器学习并不是万能的。它无法预测随机序列,在训练模型时必须小心自己的偏差。仔细验证至关重要。
当然,我相信我不是唯一一个尝试这种方法的人,但谨慎行事始终是关键。
如果你希望学习更多,尽量避免处理随机时间序列。进行模拟,仔细验证,并注意自己的偏差。
希望你能从中学到一些东西,并在实际操作中取得成功。