1. 课程导入
欢迎进入《深度学习量价信号建模实战》。在正式动手写模型之前,我们需要先建立一张清晰的“认知地图”:量价信号建模到底在解决什么问题,它与传统技术分析、纯价格预测有什么区别,以及这30章会沿着怎样的路径把我们从数据一路带到可复现的策略回测。本章不涉及复杂公式,但会决定你后续每一行代码的方向感。
一、什么是量价信号建模
量价信号建模,是指以金融市场的价格序列与成交量序列(及其派生指标)为原始输入,通过统计学习或深度学习方法,提取其中具有预测性或状态判别能力的模式,并输出可执行的交易信号(如方向、强度、仓位、风险等级)的完整过程。它包含三个不可分割的层面:
- 数据层:OHLCV、成交额、换手率、盘口快照、逐笔成交等原始量价数据,以及由它们衍生的波动率、量比、资金流等特征。
- 模型层:从线性回归、树模型到CNN、RNN、Transformer、GNN等深度学习结构,用于捕捉时序依赖、局部形态与跨资产关系。
- 决策层:将模型输出映射为可回测、可风控、可执行的信号规则,包括阈值、仓位管理与止损逻辑。
需要强调的是,量价信号建模不等于“预测明天涨跌”。它更接近一种条件概率估计与状态识别:在什么样的量价结构下,未来收益分布偏向哪一侧、风险有多大。理解这一点,能避免后续陷入“追求100%准确率”的误区。
核心公式化表达:信号 = f(量价特征, 市场状态, 风险约束)。其中 f 由数据驱动学习得到,而非人工硬编码。
二、核心原理:量价关系为何具有信息含量
价格反映“共识定价”,成交量反映“参与强度与分歧程度”。二者结合,才能区分“无量上涨”与“放量突破”这类截然不同的市场含义。其信息含量主要来自三个机制:
- 供需失衡的持续性:放量突破往往意味着新增资金入场,短期供需失衡可能延续。
- 微观结构的痕迹:大单、主动买卖盘、量价背离等,隐含机构行为与流动性变化。
- 行为金融的惯性:投资者对信息的反应存在滞后与过度反应,形成可被模型捕捉的统计规律。
深度学习之所以适合这一任务,是因为量价数据具有高噪声、非线性、多尺度、时序依赖强等特点。传统线性模型难以刻画“缩量回调后放量反转”这类复合形态,而卷积与注意力结构可以在不同时间窗口上自动学习局部形态与长程依赖。
三、学习目标与能力清单
完成本课程后,你应当具备独立完成一个量价信号建模项目的端到端能力。具体目标如下:
| 能力维度 | 具体目标 | 对应章节重点 |
|---|---|---|
| 数据工程 | 能清洗、对齐、构造量价特征,处理复权与缺失 | 数据获取与预处理 |
| 模型构建 | 能根据任务选择CNN/RNN/Transformer并完成训练 | 深度学习模型实战 |
| 信号设计 | 能把模型输出转化为可执行的方向与仓位信号 | 信号映射与风控 |
| 回测评估 | 能搭建含滑点、手续费的向量化回测并做归因 | 回测与绩效分析 |
| 迭代复盘 | 能识别过拟合、信号衰减并制定再训练策略 | 复盘与策略迭代 |
四、整体课程框架与实战路线图
30章内容按“认知—数据—模型—信号—回测—迭代”六段式推进,每段都配有可运行代码与真实数据场景。路线图如下:
- 认知奠基(第1–3章):定义、目标、量价关系的经济学与行为学基础。
- 数据工程(第4–8章):数据源接入、清洗、复权、特征构造与窗口切片。
- 模型实战(第9–18章):从基线模型到CNN、RNN、Transformer、GNN及多任务融合。
- 信号与风控(第19–23章):阈值、置信度、仓位映射、止损止盈与风险约束。
- 回测与评估(第24–27章):向量化回测、滑点手续费、绩效归因与容量分析。
- 迭代与复盘(第28–30章):信号衰减诊断、再训练机制与完整项目复盘。
建议学习方式:每章先跑通示例代码,再替换为自己的数据或参数做一次小实验。量价建模的直觉来自反复调试,而非一次性阅读。
五、常见误区与复盘提醒
在开始之前,先认清几个高频误区,可以节省大量试错时间:
- 误区一:把回测当实盘。未考虑滑点、手续费、涨跌停与流动性约束的回测结果往往严重高估。
- 误区二:用未来信息做特征。例如用当日收盘价计算当日信号,却假设能在开盘执行,属于典型前视偏差。
- 误区三:追求复杂模型。在噪声极高的量价数据上,复杂模型极易过拟合,简单基线常常更难被击败。
- 误区四:忽略市场状态漂移。牛熊转换、监管变化会让历史规律失效,模型需要滚动更新与状态判别。
在后续章节中,任何一次回测结果都必须附带:数据区间、特征列表、训练/验证划分方式、滑点与手续费假设。缺少这些信息的绩效数字不具备参考价值。
下面是一段最小可运行的量价特征构造示例,用于建立“数据层”的直观感受。它读取OHLCV数据并生成收益率、量比与波动率三个基础特征:
import pandas as pd
import numpy as np
def build_price_volume_features(df: pd.DataFrame) -> pd.DataFrame:
"""df 需包含 open, high, low, close, volume 列,索引为时间"""
out = pd.DataFrame(index=df.index)
out["ret_1"] = df["close"].pct_change(1)
out["ret_5"] = df["close"].pct_change(5)
out["vol_ratio"] = df["volume"] / df["volume"].rolling(20).mean()
out["volatility_20"] = df["ret_1"].rolling(20).std()
out["price_range"] = (df["high"] - df["low"]) / df["close"]
out = out.replace([np.inf, -np.inf], np.nan).dropna()
return out
# 使用示例
# features = build_price_volume_features(ohlcv_df)
# print(features.tail())