《量化交易:如何建立自己的算法交易事业》读书笔记
原书名:Quantitative Trading: How to Build Your Own Algorithmic Trading Business
作者:Ernest P. Chan(欧内斯特·陈)
出版:2009 年(第一版)/ 2021 年(第二版)
译者:商诺奇、谢彦
这是一本写给想要入门量化交易的个人投资者的实战指南。作者 Ernest Chan 是一位拥有多年对冲基金经验的量化交易员,他在书中分享了如何从零开始建立自己的量化交易系统。
经常也会读很多书,但是很多书读完就忘了,有时候可能看几遍也没办法集中注意力。想想还是写写笔记记录自己的读书过程,常看常新。之前尝试写过一些读书笔记,但大多都很难坚持下来,写一半就没有下文了,这可能是我学习过程中最大的障碍吧,说白了就是坚持,做什么事情都要坚持,我认为这是学习的关键。
结合 AI 去写博客是一个不错的办法,整体上文章比较规范,行文思路也很规范,也算是提升自己写作能力的一种办法吧。看了那么多书,也了解了很多但是并不能很好的表达出来,归根结底是思考的少,或者只是自己以为理解了,实际上泛泛而谈,没有深度。逼着自己把看过的东西写下来,看看效果吧。
为什么读这本书
距离自己进入股市也有 3 年了,盈亏常有很多,但一直没有找到适合自己的交易策略,自从 2024 年 9 月 24 号以来虽然也挣了一些钱,但在我看来运气的成分更多,我也在想着如何把自己的收益率包吃住,不求挣很多,而是稳定。所以决定读这本书,看看如何建立自己的量化交易系统。这本书特别适合初学者,里面有很多专业性的理论对我帮助很大,填补了我对于股票交易的知识黑洞。
书中金句
「量化交易的核心不是找到一个神奇的策略,而是建立一套可重复、可验证的交易流程。」
与其他量化投资书籍不同,这本书不是教你某个具体策略,而是教你 如何自己寻找盈利策略 ——如何识别、回测、验证、执行一个策略,并在实盘中持续优化。
全书框架
本书按照交易员开展量化交易事业的步骤顺序组织:
核心观点
第一章:量化交易初探
先入为主我认为量化交易是通过预设好的程序对交易市场中的数据进行分析,然后进行高频的套利交易。那么其中最关键的应该是程序也就是策略吧。我就这么认为吧,也不知道对不对,这篇博客也不是为了扫盲,而是为了记录自己的学习过程。想到啥写啥吧!
信息比率、基准收益、夏普比率这些听着就很高大上,这可能是我这种泥腿子(半路出家,也没有经过专业的学习,在做中学,学中做)在交易过程中欠缺的东西,完全跟着感觉走,一些行为还是需要理论支撑的。
先是概念澄清,然后程序化,然后就是策略了。我们一旦可以对事物进行准确的定义,那么我们就可以对其进行数字化建模,然后进行策略的验证和执行。
谁能成为量化交易员?
- 不需要华尔街背景,个人投资者也可以入门
- 需要具备:编程能力、统计学基础、风险意识
- 量化交易的优势:纪律性、可回测、可自动化
第二章:寻找切实可行的策略
正所谓兵马未动粮草先行,想要挣钱那么先要问自己能接受多大的亏损,这可能是很多人都会忽略的吧。看问题需要从整体出发,而不是从局部出发。深思熟虑,比如最近全球的贵金属价格波动剧烈,有的人就是那么的不让人理解,金价已经涨到 5000 美元/ounce,还要非常狂热的买入,这显然是不合理的。就好像头顶的苹果触手可及,但是低头一看自己站在悬崖边上,就算不挣钱也不能承担超出自己承受范围内的风险呀!
书中所了一个很专业的概念:挫跌和挫跌期。问问自己能承受的最大的蹉跌是多少?10%?30%?50%?能承受的最长挫跌期是多少?10 天?几个月?还是几年?据我所知黄金可是不容易涨的,套上几十年谁也受不了吧,要么就做好止损(这可是个老大难的问题,什么时候入场,什么时候立场)。
一个很显然的原则是,我们做一笔交易(一买一卖)需要考虑成本和风险。成本包括券商佣金、手续费、滑点等。风险包括市场风险、交易风险、策略风险等。在做交易前应该能提前计算我的盈利价格和亏损价格,像以往那种买进去被套上了在研究解套的问题,这在量化程序中是绝对不可取的,即使在现实中也是不可取的。各种离场策略、止盈止损等。
策略来源:
- 学术论文(SSRN、arXiv)
- 金融博客和论坛
- 财经新闻中的市场异常
- 自己对市场的观察
甄别策略的标准:
好策略的特征
- 逻辑清晰:能用简单的经济学原理解释为什么有效
- 适合自己:匹配你的资金规模、风险偏好、时间投入
- 有竞争壁垒:别人不容易复制或已经失效
常见陷阱:
- 数据窥探偏差(Data Snooping Bias)
- 过度拟合历史数据
- 忽略交易成本和滑点
- 幸存者偏差
第三章:回测
这是本书最核心的章节之一。详细介绍了回测的步骤、工具和指标。回测是量化交易中最关键的一步,它帮助我们验证策略的有效性,避免在实盘中踩坑。我可能会花很大的篇幅去实践书中介绍的回测过程,因为只是阅读我并不能很好的理解,其实还是太懒了,如果能进下心来深入思考这个其实不难。
3.2.1 数据是否经分拆及股息调整?
在回测之前,有一个容易被忽视但极其重要的问题:你的历史数据是否经过分拆和股息调整?
如果不处理这个问题,你的回测结果可能完全是错的。
假设某公司在 T 日进行 1 拆 N 的股票分拆:
| 分拆比例 | 含义 | 股价变化 |
|---|---|---|
| N = 2 | 1 股变 2 股 | 股价减半 |
| N = 0.5 | 2 股合 1 股(反向分拆) | 股价翻倍 |
分拆调整示例
假设股票在分拆前收盘价 100 元,1 拆 2 后变成 50 元。
如果不调整历史数据,回测系统会认为股票「暴跌 50%」,产生错误的卖出信号!
正确做法:把 T 日之前的所有历史价格都乘以 \(\frac{1}{N} = \frac{1}{2}\)
调整公式:
当公司在 T 日派发每股 \(d\) 元的股息时,股价会相应下跌(除息)。
为什么不能直接减去股息?
假设:T-2 日收盘 95 元,T-1 日收盘 100 元,T 日除息派发 2 元
| 调整方式 | T-2 调整后 | T-1 调整后 | T-2→T-1 收益率 |
|---|---|---|---|
| 减法(-2) | 95-2=93 | 100-2=98 | (98-93)/93=5.38% ❌ |
| 乘因子(×0.98) | 95×0.98=93.1 | 100×0.98=98 | (98-93.1)/93.1=5.26% ✅ |
| 原始数据 | 95 | 100 | (100-95)/95=5.26% ✅ |
结论:减法会破坏历史收益率的一致性,乘因子才能保证所有历史日期之间的收益率不变!
调整公式: $ 调整后价格 = 原价格 \times \frac{Close(T-1) - d}{Close(T-1)} $
其中 \(Close(T-1)\) 是除息日前一天的收盘价。
实践建议
- 使用「调整后收盘价」(Adjusted Close)进行回测
- Yahoo Finance 的
Adj Close列已经处理好分拆和股息 - 自己处理原始数据时,务必按时间倒序调整(先调整最近的事件)
📊 案例:IGE 基金 2005-2007 年数据调整
以 IGE 基金为例,演示调整因子的计算过程。公式:\(调整因子 = (Close - d) / Close\)
股息调整因子表(2005-2007 年共 9 次派息):
| 除息日 | 股息 | 前一日收盘价 | 调整因子 |
|---|---|---|---|
| 2007-9-26 | 0.177 | 128.08 | 0.998618 |
| 2007-6-29 | 0.3 | 119.44 | 0.997488 |
| 2006-12-21 | 0.322 | 102.61 | 0.996862 |
| 2006-9-27 | 0.258 | 91.53 | 0.997181 |
| 2006-6-23 | 0.32 | 92.2 | 0.996529 |
| 2006-3-27 | 0.253 | 94.79 | 0.997331 |
| 2005-12-23 | 0.236 | 89.87 | 0.997374 |
| 2005-9-26 | 0.184 | 89 | 0.997933 |
| 2005-6-21 | 0.217 | 77.9 | 0.997214 |
计算总因子:股息总因子 = 所有调整因子累乘 = 0.976773;2005-6-9 有 1 拆 2 分拆,分拆因子 = 0.5;
分拆+股息总因子 = \(0.976773 \times 0.5\) = 0.488386
验证调整结果:
| 日期 | 原始收盘价 | 用哪个因子 | 调整后价格 |
|---|---|---|---|
| 2005-6-10 | 74 | 0.976773(分拆后,只调股息) | 72.28 |
| 2005-6-9 | 73.74 | 0.976773(分拆当天) | 72.03 |
| 2005-6-8 | 144.48 | 0.488386(分拆前,调股息+分拆) | 70.56 |
| 2005-6-7 | 144.11 | 0.488386 | 70.38 |
常用回测平台:
| 平台 | 特点 | 适用场景 |
|---|---|---|
| Excel | 简单直观 | 快速验证想法 |
| MATLAB | 数学运算强 | 复杂统计分析 |
| Python | 生态丰富 | 全流程开发 |
| R | 统计分析 | 学术研究 |
| TradeStation | 实盘集成 | 期货交易 |
业绩度量指标:
| 指标 | 公式/说明 | 参考值 |
|---|---|---|
| 夏普比率 | (年化收益 - 无风险利率) / 年化波动率 | > 1 可接受,> 2 优秀 |
| 最大回撤 | 从峰值到谷底的最大跌幅 | < 20% 较好 |
| 卡玛比率 | 年化收益 / 最大回撤 | > 1 可接受 |
| 胜率 | 盈利交易数 / 总交易数 | 因策略而异 |
| 盈亏比 | 平均盈利 / 平均亏损 | > 1.5 较好 |
3.2.2 夏普比率的计算细节
计算夏普比率时,甚至老练的投资经理也会混淆一个细节问题:是否需要从货币中性组合的收益中减去无风险收益?
什么是无风险利率?比如你要花 10 万块投资股票,对应的无风险利率就是你把这 10 万块钱存入银行,那么无风险利率就是银行给你的利息。也可以是你认为的无风险标的,银行并不是绝对的,也可以是国债、货币基金等。
什么是货币中性组合?
货币中性组合(Dollar-Neutral Portfolio)是一种对冲策略,其核心特点是:
做多金额 = 做空金额
例如:用 100 万做多股票 A,同时用 100 万做空股票 B。
为什么叫「货币中性」?
- 净投入资金为零(做空得到的钱用来做多)
- 对整体市场涨跌「中性」,不受大盘影响
- 只赚取 A 和 B 之间的**相对收益**(即 A 比 B 表现好就能赚钱,不管大盘涨跌)
实践借鉴意义:
| 优势 | 说明 |
|---|---|
| 降低市场风险 | 大盘涨跌对组合影响小 |
| 自融资 | 不需要额外投入本金 |
| 专注相对收益 | 只需判断 A 比 B 强,不用判断市场方向 |
适用场景:配对交易、统计套利、行业内轮动等策略。
延伸阅读:《货币中性策略:不看大盘也能赚钱的交易方法》 —— 详细介绍选股方法、操作流程和风险控制
答案是:不需要。
货币中性组合(Dollar-Neutral Portfolio)的特点:
- 做多和做空的金额相等
- 用卖空所得现金买入证券,属于 自融资 策略
- 融资成本很小(只有存贷利率差),回测时可忽略
- 保证金余额能获得与无风险利率 \(r_F\) 近似的存款利率
数学推导:
假定策略收益率(组合收益率减去存款利率)为 \(R\),无风险利率为 \(r_F\),那么:
因此在实际计算中,完全可以忽略无风险利率,只需关注股票头寸的收益率即可。
同样,一个 没有隔夜头寸的纯多头当日交易策略 也没有资金成本,其超额收益率也是策略本身的收益率。
何时需要减去无风险利率?
一般而言,在计算夏普比率时,仅当策略需要支付资金成本时,才需要减掉无风险利率。
例如:持仓过夜需要融资的策略。
年化夏普比率可以使策略更加容易比较。
年化收益率:
年化收益率标准差:
假设月收益率是序列不相关的(Sharpe, 1994),年收益率标准差就是月收益率标准差的 \(\sqrt{12}\) 倍:
年化夏普比率:
实践要点
- 货币中性策略和日内交易策略可以直接用收益率计算夏普比率
- 需要融资的策略才需要减去无风险利率
- 比较不同策略时,统一使用年化夏普比率
📊 案例:用 Excel 计算 IGE 买入持有策略的夏普比率
策略设定:
| 项目 | 内容 |
|---|---|
| 标的 | IGE(iShares 北美天然资源 ETF) |
| 买入 | 2001-11-26,以收盘价买入 1 股并持有 |
| 卖出 | 2007-11-14,以收盘价卖出 |
| 无风险利率 | 年化 4% |
| 交易日 | 一年约 252 个交易日 |
Excel 操作步骤:
- 下载的数据已在 A-G 列(日期、开盘、最高、最低、收盘、成交量、调整后收盘价)
- 按日期升序对所有列进行排序(选择「扩展选定区域」「升序」「有标题行」)
- 在 H3 单元格内输入
=(G3-G2)/G2,计算**日收益率** - 选定 H3 单元格,双击单元格右下角的黑点,使 H 列的整列按 H3 单元格的方法计算日收益率
- 在 H1 单元格内输入「日收益率」以便阅读
- 在 I3 单元格内输入
=H3-0.04/252,计算**超额日收益率**(假设无风险利率为每年 4%,一年有 252 个交易日) - 选定 I3 单元格,双击单元格右下角的黑点,使 I 列的整列按 I3 单元格的方法计算超额日收益率
- 在 I1 单元格内输入「超额日收益率」以便阅读
- 在 I1506 单元格内输入
=SQRT(252)*AVERAGE(I3:I1505)/STDEV(I3:I1505) - I1506 单元格显示结果应该是 0.789317538,这个结果是买入并持有策略的夏普比率
公式解析:
| 公式部分 | 含义 |
|---|---|
(G3-G2)/G2 | 日收益率 = (今日收盘价 - 昨日收盘价) / 昨日收盘价 |
H3-0.04/252 | 超额日收益率 = 日收益率 - 日无风险利率 |
AVERAGE(I3:I1505) | 超额日收益率的平均值 |
STDEV(I3:I1505) | 超额日收益率的标准差 |
SQRT(252) | 年化系数 \(\sqrt{252} \approx 15.87\) |
结果解读:
夏普比率 0.789 属于一般水平(< 1),说明 IGE 买入持有策略的风险调整后收益性价比一般。
| 评级 | 夏普比率范围 |
|---|---|
| ❌ 较差 | < 0.5 |
| ⚠️ 一般 | 0.5 - 1.0 |
| ✅ 良好 | 1.0 - 2.0 |
| 🌟 优秀 | > 2.0 |
📉 案例:用 Excel 计算最大挫跌和最长挫跌期
核心概念:
| 概念 | 定义 |
|---|---|
| 高水位线 | 到某一天为止,策略的最大累积收益率(历史最高点) |
| 挫跌 | 当前净值相对于高水位线的回撤幅度 |
| 最大挫跌 | 历史上最大的回撤幅度 |
| 挫跌期 | 从高水位线开始,连续处于回撤状态的天数 |
| 最长挫跌期 | 历史上最长的连续回撤天数 |
为什么用累积收益率?
用累积收益率曲线来计算高水位线和挫跌,与用净值曲线是一样的。因为净值正是初始投资额与「1 + 累积收益率」的乘积。
Excel 操作步骤(继续使用前面的多空市场中性策略数据):
- 在 M3 单元格内输入
=L3(L 列是日收益率) - 在 M4 单元格内输入
=(1+M3)*(1+L4)-1,计算策略到某天为止的**累积复合收益率**。按此方法计算 M 列并删除该列最后一个单元格,将这列命名为「累积收益率」 - 在 N3 单元格内输入
=M3 - 在 N4 单元格内输入
=MAX(N3,M4),计算到某天为止的「高水位线」。按此方法计算 N 列并删除该列最后一个单元格,将这列命名为「高水位线」 - 在 O3 单元格内输入
=(1+N3)/(1+M3)-1,计算每日收盘后的**挫跌**,按此方法计算 O 列,得到策略的挫跌 - 在 O1506 单元格内输入
=MAX(O3:O1505),计算策略的**最大挫跌**,结果约为 0.1053,即最大挫跌是 10.53% - 在 P3 单元格内输入
=IF(O3=0,0,P2+1),计算当前**挫跌期**。按此方法计算 P 列,是为策略的挫跌期,并删除该列最后一个单元格 - 在 P1506 单元格内输入
=MAX(P3:P1505),计算策略的**最长挫跌期**,这个值大概是 497,即最长挫跌期含 497 个交易日
公式解析:
| 列 | 公式 | 含义 |
|---|---|---|
| M(累积收益率) | =(1+M3)*(1+L4)-1 | 复利累积:\((1+r_1)(1+r_2)...(1+r_n)-1\) |
| N(高水位线) | =MAX(N3,M4) | 取历史最大值,只升不降 |
| O(挫跌) | =(1+N3)/(1+M3)-1 | 高水位线相对当前净值的回撤 |
| P(挫跌期) | =IF(O3=0,0,P2+1) | 如果没有挫跌则归零,否则天数+1 |
结果解读:
| 指标 | 结果 | 解读 |
|---|---|---|
| 最大挫跌 | 10.53% | 策略历史上最多从峰值下跌 10.53% |
| 最长挫跌期 | 497 天 | 最长约 2 年时间处于回撤状态 |
实践意义
在选择策略时,问问自己:
- 能承受的最大挫跌是多少?10%?30%?50%?
- 能承受的最长挫跌期是多久?几个月?1 年?几年?
如果策略的挫跌超出你的承受范围,即使长期收益再高,你也可能在中途放弃。
3.4 避免回测陷阱
陷阱很多,作者也是挑选了两个例子来说明。我不知道是不是最重要的,姑且把自己的阅读感受写下来。
3.4.1 前视偏差(Look-Ahead Bias)
第一个是 前视偏差,我理解其实就是上帝视角,我们在回测时是能够知道回测周期内地所有价格的(开盘/收盘/日内最高/日内最低),但是在实际交易中我们无法知道未来价格。以上帝视角去判断是否买入,这显然是错误的。关于如何避免可以看下文描述,这是 AI 辅助生成的,可是帮了我的大忙。
# ❌ 错误示范:使用未来数据
signal = price > price.shift(-1) # shift(-1) 使用了未来价格!
# ✅ 正确做法:只使用历史数据
signal = price > price.shift(1) # shift(1) 使用昨天的价格
前视偏差(Look-Ahead Bias)
这是回测中最常见的错误。确保在 t 时刻做出的决策只使用 t 时刻之前的数据。
使用 Excel 进行回测天然可以避免这个问题,因为 Excel 我们通常是基于当前单元行之前的数据进行计算。
🔍 如何检测回测程序是否存在前视偏差?
即便非常谨慎,在编写回测程序时还是有可能犯前视偏差错误。有些错误非常微妙、难以避免,特别是在使用 MATLAB 的时候。
对比检验法:
步骤 1:用全部历史数据运行回测
→ 结果存入文件 A(包含每天生成的所有推荐头寸)
步骤 2:移除最近 N 天的历史数据(N = 10~100 天)
原始数据最后一天是 T 日
移除后数据最后一天是 T-N 日
步骤 3:用移除后的数据再次运行回测
→ 结果存入文件 B
步骤 4:比较文件 A 和文件 B 的头寸
两个文件的行数应该相同,最后一天均为 T-N 日
判断标准:
| 情况 | 说明 |
|---|---|
| 头寸一致 ✅ | 回测程序 没有 前视偏差 |
| 头寸不一致 ❌ | 回测程序 存在 前视偏差,必须找出并改正 |
原理:如果程序正确,那么在 T-N 日做出的决策,不应该受到 T-N 日之后数据的影响。如果移除未来 N 天数据后结果发生了变化,说明程序在计算时「偷看」了未来的数据。
举例
假设策略在 2024-01-15 生成信号:
- 文件 A(用全部数据):2024-01-15 → 买入 A 股票
- 文件 B(移除最后 30 天):2024-01-15 → 买入 B 股票
结果不一致!说明 1 月 15 日的决策用到了 1 月 15 日之后的数据,存在前视偏差。
3.4.2 数据迁就偏差(Data-Snooping Bias)
第二个是 数据迁就偏差。前面第 2 章提到过,因迁就历史数据的噪声而过度优化模型参数,造成策略的回测业绩高于未来业绩,即为数据迁就偏差。
在基于历史数据的统计预测模型中,数据迁就偏差非常普遍,而在金融中,因为独立数据的量非常有限,所以这个问题就更加严重。高频数据倒是非常多,但只对高频模型有用。尽管股票市场数据可以追溯到 20 世纪初,但只有最近十年的数据才适用于构建预测模型。此外,如果发生了第 2 章讨论过的状态转换,最近几年的旧数据可能也没法用。独立数据的量越少,交易模型中用到的可调整参数就应该越少。
根据经验,作者在计算移动平均值时不会超过 5 个参数,包括如建仓清仓阈值、持有期限、回溯期限等定量指标。此外,并非所有的数据迁就偏差都是由参数优化造成的。用相同数据集重复做回测时,还会影响模型的 定性决策选择,如在开盘还是收盘时建仓、是否隔夜持仓、交易大盘股还是中盘股等。通常,这些可以优化回测业绩的定性选择,对未来未必是最优的。
构建数据驱动模型时,几乎不可能完全消除数据迁就偏差,但有几种方法可以降低这种偏差:
降低数据迁就偏差的最基本方法是,按照要优化的自由参数个数,使用足够多的回测数据。
经验法则:优化参数所需的数据点个数 = 模型中自由参数个数 × 252(一年交易天数约为 252 天)
注意
这个假定未基于任何统计调查结果,完全是由经验所得。
示例计算:
| 模型类型 | 参数个数 | 所需数据量 | 计算过程 |
|---|---|---|---|
| 3 参数日交易模型 | 3 | 3 年 日价格数据 | 3 × 252 = 756 天 |
| 3 参数分钟交易模型 | 3 | 7 个月 分钟数据 | 252/390 年 × 3(每天交易 6.5×60=390 分钟) |
关于分钟数据的陷阱
注意,如果是一个日交易模型并且有了 7 个月的分钟数据点,实际上也只有 7×21=147 个有效数据(每月交易天数 21),要回测三参数模型是不够的。
关键点:数据点的独立性很重要,分钟数据不能简单等同于更多的日级独立样本。
将历史数据根据时间先后分为两段,后一段数据用于样本外测试。
数据划分:
| 数据集 | 用途 | 说明 |
|---|---|---|
| 训练集 | 参数优化和定性选择 | 使用前一段数据构建模型 |
| 测试集 | 验证模型泛化能力 | 使用后一段数据测试 |
划分比例:
- 两段数据的大小要大致相等
- 若数据量不够,则至少用 三分之一 的数据做测试
- 训练集的最小含量由上一节提到的经验规则决定
判断标准:
在理想情况下,基于训练集的最优参数和决策,对于测试集也是最优的,不过实际上很难做到这一点。但测试集上的业绩起码要合理。否则,模型就存在数据迁就偏差,需要进一步简化并减少参数。
动态参数优化
动态参数优化是更严密、也更复杂的样本外测试方法。这种方法通过使参数不断适应变化的历史数据,来消除数据迁就偏差。(参见「无参数交易模型」)
在完成模型的参数和各种特征的优化、通过测试集的检验之后,可以通过改变这些参数或改变模型的定性决策,来观察模型业绩在训练集和测试集上的变化。
核心问题:如果业绩变化很大,在参数取任何其他值时业绩都很糟糕,模型很有可能存在数据迁就偏差。
简化模型的方法:
各种简化模型的方法都值得尝试。决定是否交易真的需要五个不同的条件吗?逐个移除这些条件,模型在训练集上的业绩会在哪个临界点显著降低呢?
关键原则:
| 操作 | 正确做法 | 错误做法 |
|---|---|---|
| 移除条件后 | 观察测试集业绩是否相应降低 | 为提升测试集业绩而增加条件 |
| 调整参数后 | 确保业绩不会显著变化 | 为提升业绩而调整参数值 |
避免二次偏差
更重要的是,移除这些条件时,模型在测试集上的业绩会相应降低吗?即使模型在训练集上的业绩可能会降低,只要没有显著降低,就应该尽可能地移除更多的条件、约束和参数。
但不能为了提升测试集上的业绩而增加条件和参数,或调整参数值,如果这样做了,就等于把测试集当成训练集使用了,并且有可能使模型再度产生数据迁就偏差。
参数平均化:
在简化了参数集和条件,并确保样本外测试的业绩在参数和条件微小变化时不受显著影响之后,应考虑将资金分配到不同的参数值和条件集。这种资金在参数上的平均化,将进一步确保模型的真实交易业绩与回测业绩不会相差太大。
📊 案例:GLD 和 GDX 的配对交易
本案例展示如何将数据分成训练集和测试集,在训练集上优化参数,在测试集上观察效果。
标的选择:
| ETF | 说明 | 相关性 |
|---|---|---|
| GLD | 黄金现货价格 ETF | 金价上涨 → GLD 上涨 |
| GDX | 采金企业股票 ETF | 金价上涨 → 采金企业收益增加 |
两者价格高度相关,GLD 多头和 GDX 空头形成的差价呈均值回归特性。
策略核心:
- 用 OLS 回归计算 对冲比率 β
- 计算差价:\(Spread = GLD - \beta \times GDX\)
- 用 Z-Score 标准化差价
- 当 Z ≤ -2 时做多差价,Z ≥ 2 时做空差价,|Z| ≤ 1 时清仓
回测结果:
| 数据集 | 夏普比率 | 说明 |
|---|---|---|
| 训练集 | 2.3 | 优秀 |
| 测试集 | 1.5 | 良好,无过拟合 |
完整实现:《配对交易实战:GLD 与 GDX 的均值回归策略》 —— 用 Golang 从零实现,重点讲解数学公式原理
第四章:创建交易业务
业务结构选择:
| 类型 | 优点 | 缺点 |
|---|---|---|
| 个人账户 | 简单、灵活 | 税务不优化 |
| 自营公司 | 税务优惠、杠杆更高 | 监管要求 |
| 对冲基金 | 可管理外部资金 | 合规成本高 |
初始资本:
- 作者建议:至少 $50,000 - $100,000
- 资金太少 → 交易成本占比过高
- 资金太多(对新手)→ 心理压力大
第五章:交易执行系统
自动交易系统架构:
关键组件:
- 数据获取:实时行情、历史数据
- 信号生成:策略逻辑计算
- 订单管理:订单状态跟踪、异常处理
- 执行算法:TWAP、VWAP、冰山订单
- 监控报警:异常检测、自动熔断
第六章:资金与风险管理
凯利公式:
- \(f^*\):最优投资比例
- \(p\):胜率
- \(q\):败率 (1-p)
- \(b\):盈亏比
实践建议
实际使用时,通常取凯利值的 ½ 或 ¼(半凯利、四分之一凯利),以降低波动。
风险控制原则:
- 单笔交易风险 < 总资金的 1-2%
- 单日最大亏损限制
- 策略级别的止损
- 组合层面的相关性控制
第七章:进阶策略类型
书中介绍了几种常见的量化策略:
核心假设:价格偏离均值后会回归
典型方法: - 配对交易(Pairs Trading) - 统计套利 - 布林带策略
适用市场:震荡市
核心假设:强者恒强,趋势会延续
典型方法: - 突破策略 - 移动平均交叉 - 通道突破
适用市场:趋势市
核心假设:某些因子能解释股票收益差异
常见因子: - 价值因子(低 PE、PB) - 动量因子(过去收益) - 质量因子(ROE、低负债) - 规模因子(小盘股溢价)
特点: - 持仓时间极短(秒级) - 依赖技术基础设施 - 需要极低的延迟
门槛:对个人投资者来说门槛较高
第八章:扩大你的交易事业
- 从个人账户到管理外部资金
- 如何找到合适的投资者
- 基金结构和合规要求
- 规模扩大后的策略容量问题
关键概念速查
| 概念 | 说明 |
|---|---|
| 回测(Backtesting) | 用历史数据模拟策略表现 |
| 前视偏差(Look-Ahead Bias) | 在回测中错误使用了未来数据 |
| 过拟合(Overfitting) | 策略过度适应历史数据,失去泛化能力 |
| 夏普比率(Sharpe Ratio) | 风险调整后的收益指标 |
| 最大回撤(Max Drawdown) | 策略净值从峰值到谷底的最大跌幅 |
| 滑点(Slippage) | 预期成交价与实际成交价的差异 |
| 存活者偏差(Survivorship Bias) | 只看到成功案例,忽略失败样本 |
| 样本外测试(Out-of-Sample) | 用未参与策略开发的数据进行验证 |
实用工具推荐
数据源:
- Yahoo Finance(免费)
- Quandl(部分免费)
- Wind、Choice(国内付费)
回测框架(Python):
backtrader- 功能全面,社区活跃zipline- Quantopian 开源框架vnpy- 国内期货量化框架qlib- 微软开源的 AI 量化平台
券商 API:
- Interactive Brokers(IB)
- 国内:华泰、中泰等券商的量化接口
我的思考
延伸阅读
- 《打开量化投资的黑箱》- Rishi K. Narang
- 《主动投资组合管理》- Grinold & Kahn
- 《算法交易:制胜策略与原理》- Ernest P. Chan(作者的进阶书籍)
- 《量化投资:策略与技术》- 丁鹏
阅读进度:🔖 进行中