要把股价输入神经网络,首先要用窗口切分数据,在不混入未来信息的前提下做归一化,并决定要预测什么(目标值)。本篇用真实的苹果股价 506 个交易日,让最简单的基线“明天 = 今天”、线性模型和 LSTM 以同样的方式(前推验证)一较高下。结果无论好坏都如实呈现。教育用示例,不构成投资建议。
只有一串价格是无法学习的。必须把它变成“看过去 L 天,预测下一天”的问题。窗口每滑动一格,就生成一个(输入,答案)对。
价格在不同时期的水平不同(2015 年约 120 美元,2016 年约 90 美元),测试时会出现训练时从未见过的范围。所以要换成每日变化率(对数收益率 = log(今天/昨天) × 100%)。归一化(减去平均值再除以标准差)的基准只在训练区间计算。如果使用整个期间的平均值,测试区间的信息就会漏进训练中(第 4 节的泄漏)。目标值也要先决定:预测“下一天的收益率(数值)”、“涨还是跌(方向)”还是“波动大小”。
神经网络会自己找出多个信号之间的非线性关系。因此,像股价这样由众多因素交织而成的问题,人们对它寄予厚望。但首先要向数据问一个问题:“昨天的收益率和今天的收益率有关系吗?”
两项大型研究的结论彼此不同。需要一起看清:在什么条件下有所改进,在什么条件下没有。
股价预测中的“惊人成绩”,大多来自这四个陷阱之一。下面用真实数据的数字逐一来看。
评估方式与实际使用时完全相同。只用截至当天的过去数据训练,预测接下来的几天,等这几天过去后再把它们也加进去重新训练。测试区间必须始终在训练区间之后。
用前推验证预测了最后 200 个交易日(2016-05-04 ~ 2017-02-16)。策略是“认为会涨就持有,认为会跌就持现金”,每次在持有与现金之间切换都扣除 0.1%。
两段代码都只使用 Colab 默认安装的库。点击“下载笔记本(.ipynb)”后,在 Colab 中通过文件 → 上传笔记本打开,或者复制后粘贴到新笔记本的单元格中。
下载公开 CSV,用前推验证评估 2 个基线和岭回归线性模型,并把扣除交易成本后的策略与买入并持有进行比较。也用数字展示泄漏和过拟合陷阱。想换成自己的数据,修改 PRICE 即可。
用过去 20 天的收益率预测下一天的 LSTM,每 50 天重新训练一次。2 个种子的结果分别列出。第 6 节的表格直接由这段输出生成。
这是粘贴到 ChatGPT、Qwen、Claude 等 AI 助手中的提示词。点击“复制”时,所选代码会一并附在提示词后面。把〔 〕里的内容换成自己的情况即可。
AI 的回答只是起点。它提出的论文·数值·库函数务必对照原文和官方文档核实。如果在竞赛·论文中借助了 AI,请按照主办方和期刊的规定说明使用的事实和范围。
与正文中黄色虚线下划线相同的词典。整个系列使用统一的写法。点击章节名可跳到首次出现的位置。
类比是理解的第一步,但也可能成为误解的种子。果蝇·大脑类比标注了强度。直接 有证据表明实际在做同样的事 · 部分 只有部分性质相似 · 无 尚未发现对应的东西
| 概念 | 日常类比 | 果蝇·大脑类比 | 类比失灵之处 |
|---|---|---|---|
| 窗 | 看过去一周的天气,猜明天的天气 | 部分 果蝇也会根据最近几秒的气味变化决定方向 | 天气有物理规律,而股价则是人们的预测本身会改变价格 |
| 基线 | 总说“明天和今天一样”的天气预报员 | 无 | 看似简单,却很难战胜。所有模型都必须先战胜它 |
| 数据泄漏 | 考试前偷看了答案的学生的分数 | 无 | 大多数情况下,人们并不知道自己看过答案。它会悄悄藏进归一化和特征计算中 |
| 过拟合(选择偏差) | 抛 100 枚硬币,把正面次数多的那枚称作“幸运硬币” | 无 | “幸运”在下一次抛掷时就会消失。而实际的策略要识别出这一点要难得多 |
| 结构变化 | 用夏装的销售记录预测冬季销售额 | 部分 环境改变时,果蝇习得的记忆也会被重新改写 | 季节可以预测,但市场性质的变化不知何时到来 |
| 前推验证 | 每周只看截至上周的记录来预测下一周的模拟考试 | 无 | 与模拟考试不同,无论我的预测对错,市场都不会等我 |
E-1 作者简介 · E-2 学术参考文献 · E-3 图片参考资料
finance-charts-apple.csv(GitHub plotly/datasets)。使用的是含分红调整的收盘价(AAPL.Adjusted)这是为讲师、实务 OJT 负责人和辅导老师准备的教学运营指南。时间为估计值,请根据实际课堂调整。为避免本篇被理解为投资推荐,请在课程开始和结束时明确说明“教育用示例,不构成投资建议”。
| 对象 | 想预测需求·销售额·传感器·价格等时间序列的大学生·从业者,金融科技入门者 |
|---|---|
| 先修知识 | 平均值·标准差,3-2 的过拟合与验证,3-7 的 LSTM |
| 学习目标 | ① 用窗口·归一化·目标值把时间序列变成学习问题 ② 用数字说明泄漏·过拟合·结构变化·交易成本 ③ 用前推验证以同一把尺子比较基线与模型 |
| 预计时间 | 阅读 40~50 分钟 · 演示 20 分钟 · Colab 实践 30 分钟(代码 1 10 分钟,代码 2 运行 4 分钟 + 解读 15 分钟) |
导入 5 分钟(开篇的“LSTM 比基线差”)→ 第 1·2 节 15 分钟 → 第 4 节四个陷阱 15 分钟 → 第 5·6 节 10 分钟 → 检测题 5 分钟。
为本团队的预测对象(需求·销售额等)确定基线 15 分钟 → 把第 4 节改成本团队数据的泄漏检查表 25 分钟 → 把本团队的时间序列放进代码 1 35 分钟 → 讨论结果报告方式 15 分钟。
入门者只看第 1·4·6 节。中级者让他们亲手跟一遍代码 1 的前推验证循环,并亲自确认把标准化基准换成整个期间时数字会如何变化。
| 章节 | 停下来提问的问题 | 操作提示 |
|---|---|---|
| 1 窗口·目标值 | “直接输入价格会有什么问题?” | 按 价格 → 收益率 的顺序点击 |
| 2 期待与现实 | “方向和波动大小,哪个更容易预测?” | 按 收益率 → 绝对值 的顺序点击,比较超出色带的柱子数量 |
| 3 研究案例 | “两项研究的结论为什么不同?” | 并排比较数据规模和问题类型这两行 |
| 4 陷阱 | “试了 100 个再挑出一个,它的成绩可信吗?” | 按 过拟合 → 交易成本(0 → 0.3%)的顺序查看 |
| 5 前推验证 | “为什么不能随机打乱划分?” | 交替点击两种方式 |
| 6 比较 | “LSTM 比基线差。可以试着改变什么?” | 按 RMSE → 策略收益 的顺序查看 |
| 误解 | 正确解释 | 要展示的场景 |
|---|---|---|
| LSTM 专攻时间序列,所以比基线强 | 在线索很少的问题上很难战胜基线。在这个实验中,LSTM 比基线差 | 第 6 节 |
| 方向命中率 55% 就能赚钱 | 如果猜错时亏得多,就会亏损。还需要考虑交易成本,并与持有做比较 | 第 6 节的基线一行(55.0%) |
| 回测表现好,实战中也会好 | 多次尝试后挑选,结果就会混入偶然。市场的性质也会变化 | 第 4 节 过拟合·结构变化 |
| 归一化用全部数据做一次就行 | 基准必须只在训练区间计算。否则未来信息会泄漏 | 第 1 节,第 4 节 泄漏 |
| 神经网络对股价预测毫无用处 | 在大数据·多信号·横截面问题上,有研究显示出改进。条件很重要 | 第 3 节 |
505 − 5 = 500 个。
10 次。第一次训练有 500 − 200 = 300 对,最后一次有 480 对。
40 × 0.1 = 4%p(按对数收益近似)。
多次尝试后挑出的结果是迎合了偶然,所以在新的区间无法重现(过拟合·选择偏差)。测试区间只能在最后使用一次。
如实写出结果:“在这份数据(1 只股票、506 天、信号为过去收益率)和这个设置(窗口 20 天、每 50 天重新训练、40 个轮次(epoch))下,LSTM 未能战胜基线(RMSE 1.462%·1.550% 对 1.209%)。”接着说明可以尝试改变的条件以及推广的局限。
把代码 1 的 ridge_fit 中的标准化基准(mu, sd)改为整个期间(全部 X)后重新运行。记录 RMSE 和策略收益如何变化,并用两句话写出为什么这属于泄漏。
把代码 2 的目标从“下一天的收益率”改为“下一天收益率的绝对值(波动大小)”。基线设为“过去 20 天的平均绝对值”。结合第 2 节的自相关,用 3 个以上的种子报告在波动预测上 LSTM 能否战胜基线。
| 入门者 | 跳过第 2·3 节也不会打断思路。第 4 节的过拟合和第 6 节的表格一定要看 |
|---|---|
| 进阶 | 让学员调查多次尝试的回测成绩应如何校正(多重检验)。调查到的论文要查阅原文确认 |
| 延伸学习 | Sangsun Ahn,《面向商业的数据科学》讲义(数据科学概论)· STEP [K-数字] 金融科技数据分析基础(与本篇直接相关)· STEP [K-数字] 人工智能自然语言处理(与 3-5·3-8 相关) |
| 讲师用资料 | 检测题的评分标准和作业参考答案可在教师用答案页面(3-6)查看 |
你已读完「3-6 时间序列·股价」篇。实验室的成员们各用一句话为你总结。