工具篇的两篇搞定了 AKShare 数据源和 vnpy 回测框架,海龟策略也跑通了。回过头看,会发现很多概念在写代码时默认自己懂,但真要说清楚”为什么这么算、为什么是这个值”其实说不出所以然——这是后端开发者接触量化最容易踩的坑:技术栈跑通了,但对领域知识只是模糊感知。
这一篇把量化研究需要的股票基础系统性补一遍。结构上按照一个自然的认知递进来组织:
市场是什么(交易对象与规则)→ 数据是什么(K 线与量价)→ 怎么分析(技术指标)→ 怎么形成策略(两大流派)→ 真实世界的摩擦(成本)→ 怎么活下来(风险管理)→ 怎么评估好坏(回测指标与陷阱)→ 闭环(重读海龟代码)
每一层都建立在前一层之上。读完你应该能完整解释工具篇(二)里策略代码的每一行为什么这么写。
Table of contents
Open Table of contents
第一层:市场是什么
写策略之前,先搞清楚交易的对象和市场的运行机制。这一层是所有后续内容的地基。
1.1 股票、指数、ETF:你交易的到底是什么
三个概念经常被混着说,但它们本质完全不同:

股票(Stock):一家公司的所有权凭证。买入 100 股平安银行,你就是平安银行的(微型)股东。可以直接交易。
指数(Index):按某种规则从一堆股票计算出来的一个数字。沪深300指数 = 沪深两市市值最大、流动性最好的 300 只股票按市值加权算出的值。指数本身不可交易——它只是个数字,就像”全班平均分”不能被买卖一样。
ETF(Exchange Traded Fund,交易型开放式指数基金):为了让普通人能”买指数”,基金公司按指数成分股的比例买入一篮子股票,打包成基金份额在交易所上市。像股票一样可以随时买卖。510300(沪深300ETF)就是跟踪沪深300指数的 ETF。
为什么个人量化从 ETF 起步是共识:
- 不会踩雷:单一公司可能暴雷退市,ETF 持有 300 家公司,单一暴雷影响 1/300
- 没有 T+1 限制(部分 ETF 支持 T+0,如跨境、债券 ETF;A 股股票 ETF 仍是 T+1,但可转债、部分 QDII 是 T+0)
- 交易成本低:免印花税(后面成本一节细讲)
- 流动性好:主流宽基 ETF 日成交额几十亿,买卖不影响价格
工具篇里选 510300 做回测标的,就是这些原因。
1.2 市场怎么撮合:盘口、订单、价差
你在代码里写 self.buy(price, volume),这笔订单到了交易所之后发生了什么?答案藏在盘口(Order Book)里:

盘口结构:任意时刻,市场上都有一堆没成交的挂单在排队。卖方挂单从低到高排(卖一最便宜),买方挂单从高到低排(买一出价最高)。卖一价和买一价之间的差叫买卖价差(Bid-Ask Spread)。
两种基本订单类型:
- 市价单(Market Order):不指定价格,“不管多少钱立刻给我成交”。买入市价单直接吃掉卖一(价格不够就继续吃卖二、卖三),成交快但价格不可控。
- 限价单(Limit Order):指定价格,“4.048 或更低才买”。进入队列排队,价格可控但可能永远不成交。
这跟回测的关系:vnpy 回测里 self.buy(bar.close_price, shares) 提交的是限价单,撮合引擎用”当 bar 的 low <= 挂单价即成交”来模拟。这个模拟忽略了排队——真实市场里同价位可能有几百万股排在你前面。这是回测天然比实盘乐观的原因之一,也是设置 slippage 参数的理论依据。
价差是隐性成本:主流 ETF 价差通常只有 0.001 元(一个最小报价单位),冷门品种可能差好几个价位。用市价单交易冷门品种,一买一卖光价差就能吃掉千分之几。
1.3 A 股游戏规则
跑过美国市场回测的策略直接搬到 A 股会踩坑,因为 A 股有几个独有约束:

交易时段:一天只有 4 小时。
- 09:15-09:25 开盘集合竞价(所有挂单撮合出一个开盘价)
- 09:30-11:30 早市连续竞价
- 13:00-14:57 午市连续竞价
- 14:57-15:00 收盘集合竞价(决定收盘价)
- 15:05-15:30 盘后固定价格交易
盘后固定价格交易:2026 年 7 月 6 日起,适用范围由原来的科创板、创业板扩大到全部 A 股及沪深市场 ETF。以当日收盘价成交(投资者无法自主定价),按时间优先撮合。新股上市首日、退市整理期、当日停牌股票不适用。
注意别和美股的盘前盘后混为一谈:AKShare 里的 postVol/postAmt 是为美股盘前盘后行情准备的字段,与 A 股这个机制不是一回事——要用 A 股盘后数据,先确认你调的接口是否真的覆盖了它。
T+1 制度:今天买入的股票/ETF,最早明天才能卖。影响:
- 日内高频策略在 A 股股票上无法实现
- vnpy 回测引擎不模拟 T+1,如果策略出现”当天买当天卖”,回测结果比实盘乐观,需要自己在策略里加约束
- 例外:期货是 T+0;可转债、部分跨境 ETF 也是 T+0
涨跌停:主板 ±10%、创业板/科创板 ±20%、北交所 ±30%。涨停买不进、跌停卖不出。回测引擎默认也不模拟这个——如果你的策略信号经常出现在涨跌停日,回测会严重高估。
⚠️ 2026 年 7 月 6 日起 ST 股规则有变:主板 ST/*ST 股的涨跌幅由 ±5% 上调至 ±10%,与主板其他股票一致,涉及约 150 只个股。同时,连续三个交易日收盘价涨跌幅偏离值的异常波动披露阈值由 ±12% 调整为 ±20%。用历史数据回测时要注意这个时间分界——2026 年 7 月 6 日之前的 ST 股行情仍受 ±5% 约束。
最小交易单位:买入必须是 100 股(1 手)的整数倍,卖出可以卖零头。海龟策略代码里 int(shares/100)*100 就是在满足这个约束。
第二层:数据是什么
搞清楚市场规则后,第二层认知是:策略看到的”市场”,其实是一串 OHLCV 数据。理解这串数据怎么来的、有什么坑,是数据清洗的第一课。
2.1 K 线:市场的最小信息单元
一根 K 线压缩了一个时间周期(1 分钟/1 天/1 周)内的四个价格:开盘 Open、最高 High、最低 Low、收盘 Close,加上成交量 Volume 合称 OHLCV。

颜色规则注意:A 股和美股是反的。A 股红涨绿跌,美股绿涨红跌。很多海外量化库默认西方配色,画 A 股图会跟直觉相反。
实体与影线的信息:
- 实体高度 = |开盘 − 收盘|:多空双方最终的力量对比
- 上影线:多方一度冲上去但被打回来的部分(上方有抛压)
- 下影线:空方一度砸下去但被拉起来的部分(下方有承接)
为什么用 K 线不用折线图:折线图只有收盘价,丢掉了日内的博弈信息。“大幅震荡但收平”的一天,折线图上什么都看不见,K 线上是一根长上下影线的十字星——完全不同的市场含义。

一段 K 线序列能读出趋势、震荡、突破。海龟策略里 if bar.close_price > entry_up 本质就是把”突破”这个视觉直觉数学化:今天的收盘价穿过了过去 N 天所有 K 线的最高点 = 创出新高 = 突破。
2.2 复权:数据清洗第一课
AKShare 接口的 adjust 参数有三个取值:""(不复权)、"qfq"(前复权)、"hfq"(后复权)。选错了,整个回测都是错的。

问题的来源:公司送股(10 送 10)、派息(每股分 0.5 元)时,股价会跳空低开——不是公司变差了,只是每股代表的份额变小了。10 送 10 后股价直接砍半,但股东总市值不变(股数翻倍了)。
不复权的数据直接跑回测会发生什么:
- 均线在除权日出现巨大突变
- ATR 波动率突然爆炸
- 策略误判”价格暴跌”发出错误卖出信号
前复权 vs 后复权:
- 前复权(qfq):以当前价格为基准,把历史价格向下调整。当前价格保持真实,历史曲线连续。
- 后复权(hfq):以最早价格为基准,把后来价格向上调整。能看出”累计真实涨幅”,但当前价格跟盘面对不上。
回测用前复权,理由:策略要用当前价格下单,前复权保证下单价真实;指标计算需要连续序列。唯一的代价是历史价格会随每次新除权而变化——对回测无影响,但如果你把数据存进本地数据库长期用,记得定期全量刷新而不是增量追加。
2.3 量价关系:数据的另一半
价格告诉你市场”最终往哪走”,成交量告诉你”这个决定有多大力量在推动”。只看价格不看量,等于只看结论不看论据。
volume(成交量,股数)和 amount(成交额,金额)的关系:amount / volume ≈ 当日均价。

几个业内共识:
| 量价组合 | 解读 |
|---|---|
| 价涨 + 量增 | 高质量上涨(真实资金推动) |
| 价涨 + 量缩 | 弱势上涨(后继乏力,易回调) |
| 突破前高 + 放量 | 高质量突破(很多策略的过滤条件) |
| 急跌 + 巨量 | 恐慌抛售(可能接近短期底部) |
在策略里的应用:海龟策略是纯价格突破,没看量。真实改进方向是加一个量能过滤——“突破 20 日高点 且 当日量 > 20 日均量 × 1.5”——能过滤掉相当一部分假突破。这是后续因子增强的第一步。
第三层:怎么分析——技术指标体系
有了干净的数据,第三层是从数据里提取信号。技术指标本质上都是对 OHLCV 的数学变换,按用途分三类:趋势类、波动类、动量类。
3.1 趋势类:均线家族
先说它解决什么问题。每天的收盘价是一串跳来跳去的数字,今天涨 2%、明天跌 1.5%,光看单日根本判断不出方向。这就像每天早上称体重:单日数字受喝水、进食影响上下浮动一斤很正常,你不会因为今天重了半斤就认定自己胖了——但如果看最近七天的平均值在稳步上升,那才是真的在长胖。
均线做的就是这件事:用平均值把”每天的随机波动”抹平,只留下方向。用信号处理的话说,这是一个低通滤波器,滤掉高频噪声、保留低频趋势。
MA(N) = 最近 N 天收盘价的平均
手算一遍就懂了。假设某只 ETF 最近 5 天收盘价是 10, 11, 12, 11, 13:
MA5 = (10 + 11 + 12 + 11 + 13) / 5 = 11.4
第六天收盘 15,此时窗口向前滑动一格——去掉最早的 10,加入新的 15:
MA5 = (11 + 12 + 11 + 13 + 15) / 5 = 12.4
均线从 11.4 抬到 12.4,这个”抬头”才是趋势信号。注意关键点:均线上不上行,取决于新进来的价格比被挤出去的价格高还是低。新价 15 高于被挤出的 10,所以均线上行。理解了这一点,你就知道为什么均线天然滞后——它反映的是过去 N 天的平均状态,价格已经涨了好几天,均线才慢慢跟上来。

周期怎么选:N 越大越平滑、越滞后。常用的几个周期各自对应一个观察尺度:
| 周期 | 对应时间 | 用途 |
|---|---|---|
| MA5 | 一周 | 短期情绪,噪声大 |
| MA20 | 一个月 | 最常用的中期趋势线 |
| MA60 | 一季度 | 中长期趋势 |
| MA250 | 一年 | 年线,常被视为牛熊分界 |
为什么是 5/20/60/250 这几个数?因为 A 股一周 5 个交易日、一月约 20 个、一季约 60 个、一年约 250 个。这些数字没有任何数学上的神圣性,只是交易日历的自然产物——别把它们当成经过验证的最优参数。
三种算法变体,区别只在”怎么给每天分配权重”:
- SMA 简单平均:N 天权重完全相等。今天的价格和 N 天前的价格一样重要。
- EMA 指数平均:
EMA_t = α×P_t + (1-α)×EMA_{t-1},越近的价格权重越大,衰减是指数式的。 - WMA 加权平均:手动指定每天权重。
举个能看出差别的例子:价格连续 20 天横盘在 10 元,第 21 天突然跳到 15 元。SMA20 只会从 10 涨到 10.25(多出来的 5 元被 20 天摊薄),而 EMA20 大约会跳到 10.48——EMA 对新价格的反应快接近一倍。代价是它也更容易被单日异常值带偏。趋势策略常用 EMA 求快,滤波去噪常用 SMA 求稳。
图上怎么看:
- 均线方向比均线数值更重要:向上=多头占优,走平=震荡,向下=空头占优
- 价格在均线之上还是之下:站上=强,跌破=弱
- 多条均线的排列顺序:MA5 > MA20 > MA60 叫多头排列,说明各个时间尺度上买方都占优
经典信号:金叉(短均线上穿长均线,视为买入)、死叉(短均线下穿长均线,视为卖出)。
局限,也是最常见的误用:金叉死叉在震荡市会反复打脸。价格上蹿下跳但没有方向时,短均线会来回穿越长均线,每一次都产生信号,每一次都是假的。一个月内出现五六次金叉死叉、每次都在小亏中止损,手续费还照收不误——这种”反复挨刀”是新手用均线策略亏钱的头号原因。
更根本的问题是:均线交叉只能告诉你”过去两个时间尺度的平均值发生了交叉”,它不包含任何关于”现在是不是趋势市”的信息。而它偏偏只在趋势市有效。
这正是海龟策略选择”突破”而非”金叉”的原因:bar.close_price > entry_up(收盘价创 20 日新高)是比均线交叉更强的条件——震荡市里价格来回摆动,很难持续创出新高,天然过滤掉了一部分假信号。
3.2 趋势类进阶:MACD
均线告诉你”在往哪走”,MACD 想回答的是下一个问题:“走得还有没有劲?”
用开车打个比方。均线相当于速度表——告诉你当前多快。而 MACD 更像加速度:车速还是 100 码,但油门已经松了、速度在缓慢下降,这个变化速度表要过一会儿才体现,加速度立刻就知道。趋势也一样:价格还在涨,但涨势的力度可能已经在衰减了。
DIF = EMA(12) - EMA(26) 快慢均线的差
DEA = EMA(DIF, 9) DIF 再平滑一次
MACD = 2 × (DIF - DEA) 柱状图
逐行拆开看:
第一行 DIF:快均线减慢均线。为什么这个差值有意义?因为 EMA12 反应快、EMA26 反应慢,价格上涨时快线先动、涨得比慢线多,两者的差距会拉大;上涨乏力时,快线先停下来,差距开始收窄。所以 DIF 本质是”快慢两条线的张口大小”,张口越大说明趋势越强。
- DIF > 0:快线在慢线上方,中短期趋势向上
- DIF 上升:张口在变大,趋势在增强
- DIF 虽然仍 > 0 但开始下降:还在涨,但劲在减弱(这就是”加速度”的价值)
第二行 DEA:把 DIF 再做一次 9 日 EMA 平滑,得到一条更迟钝的参考线。它的作用就是给 DIF 当”基准”——DIF 比自己的近期平均值高,说明动能正在加速。
第三行柱状图:2 × (DIF - DEA),画成红绿柱。柱子变长=动能加速,柱子缩短=动能减速。注意柱子缩短不等于下跌——它只是说”还在涨,但涨得没那么猛了”。

图上怎么看,按重要性从低到高:
- 金叉死叉:DIF 上穿 DEA 为金叉,下穿为死叉。最直观,但也最滞后。
- 零轴位置:DIF 在零轴上方运行 = 处在多头格局;零轴附近反复穿越 = 震荡市,这时候所有 MACD 信号都不可信。
- 柱状图的伸缩节奏:连续几根柱子逐根缩短,往往早于金叉死叉给出预警。
背离,最值得关注的信号。价格创出新高,但 MACD 的 DIF 没有同步创新高,这叫顶背离:
价格: 高点 A (10.0元) → 高点 B (10.5元) ← 价格创新高
DIF : 高点 A (0.35) → 高点 B (0.22) ← 动能反而变弱
含义很直白:这一波新高是”硬撑”上去的,推动它的力量比上一波小了。很多资深交易员宁信背离不信交叉,因为背离反映的是能量层面的变化,而交叉只是价格层面的滞后确认。底背离同理,方向相反。
常见误用:
- 在震荡市里用金叉死叉。和均线一样的毛病,而且 MACD 因为多做了一层平滑,滞后更严重。先判断有没有趋势,再谈用不用 MACD。
- 把背离当成精确的择时信号。背离只说明”动能在衰减”,不说明”明天就会跌”。顶背离出现后价格再涨两个月是家常便饭——著名的说法是”顶背离可以出现三次以上”。它适合用来降低仓位或收紧止损,不适合用来直接做空。
- 迷信 12/26/9 这三个参数。这组数字来自 1970 年代,当时美股一周交易六天,26 约等于一个月、12 约等于半个月。放到今天完全没有特殊性,只是因为所有软件都默认用它,才形成了一定的自我实现效应。
3.3 波动类:ATR 与布林带
前面两类指标都在回答”往哪走、有多大劲”。波动类回答的是另一个维度的问题:“这条路有多颠簸?”
这个维度极其重要,却最容易被新手忽略。同样是预期赚 5%,一只每天波动 1% 的股票和一只每天波动 8% 的股票,风险完全不是一回事——后者可能在到达目标前就先把你震出局。仓位该买多少、止损该设多远,全都取决于波动率,而不是取决于你多看好它。
ATR:波动率的尺子
ATR 全称 Average True Range,中文叫平均真实波幅,衡量的就是”最近平均每天波动多少钱”。
为什么不直接用”最高价 − 最低价”?因为它会漏掉跳空。假设某只股票昨天收在 10.0 元,今天受利好影响直接从 10.8 开盘,全天在 10.8~11.0 之间窄幅整理:
当日振幅 = 11.0 − 10.8 = 0.2 元 ← 看起来"很平静"
实际波动 = 11.0 − 10.0 = 1.0 元 ← 相对昨收,其实动了 10%
只看日内振幅会得出”今天很平静”的错误结论。所以 True Range 取三者中的最大值:
TR = max(
当日最高 − 当日最低, ← 日内振幅
|当日最高 − 昨日收盘|, ← 向上跳空的情况
|当日最低 − 昨日收盘| ← 向下跳空的情况
)
上面那个例子里,三个值分别是 0.2、1.0、0.8,取最大值 1.0——跳空被正确捕捉到了。ATR 就是把 TR 做 N 日平均(通常 N=14 或 20)。
ATR 的数值怎么读:ATR 是绝对金额,不是百分比。某 ETF 价格 4.00 元、ATR = 0.06,意思是”最近平均每天上下动 6 分钱”,约合 1.5%。所以跨品种比较时必须换算成 ATR / 价格 才有可比性——直接比较两只不同价位股票的 ATR 数值是没有意义的。
海龟策略用它做两件事,这也是 ATR 最经典的用法:
risk_cash = 100_000 × 0.02 = 2000 元 # 单笔愿承担的风险
unit_risk = 2 × ATR = 2 × 0.06 = 0.12 元 # 每份承担的风险
shares = 2000 / 0.12 → 约 1600 份 # ① 算仓位
long_stop = 4.00 − 2 × 0.06 = 3.88 元 # ② 定止损
注意这个设计的精妙之处:波动越大,ATR 越大,算出来的 shares 越小。策略自动地在颠簸的路上少装货、在平坦的路上多装货,让每一笔交易承担的风险金额大致相等,而不是每一笔买入相同的股数或相同的金额。这是海龟策略最值得借鉴的一点,比它的入场信号重要得多。
布林带:把波动率画成通道
布林带是均线 ± 2 倍标准差构成的上下轨。标准差就是统计学里衡量”数据有多分散”的那个量——数据越散,带子越宽。
中轨 = MA20
上轨 = MA20 + 2 × 标准差
下轨 = MA20 − 2 × 标准差
为什么是 2 倍?因为正态分布下约 95% 的样本落在均值 ±2 个标准差以内。所以理论上价格有 95% 的时间应该待在通道里,触及边界属于”相对少见”的事件。
但要清醒一点:股价收益率并不服从正态分布,它的尾部比正态分布厚得多(极端行情出现的频率远高于理论值)。所以”95%“只是个粗略的心理参照,不能当作严格的概率保证——真实市场里价格沿着上轨走十几天不回头是很常见的。

图上最该看的其实是带子的宽窄变化,而不是价格碰到哪条线:
- 收口:带子越缩越窄,说明波动率在下降、市场在盘整蓄势。极窄的收口常常是大行情的前兆(波动率有均值回归的倾向,不会永远低下去)。
- 开口:带子突然张开,说明波动率骤升,通常伴随方向性突破。
- 价格贴着上轨持续上行:这不是”超买该卖”,恰恰是强趋势的典型形态。
两种互斥的用法,注意方向完全相反:
| 均值回归框架 | 突破框架 | |
|---|---|---|
| 触及上轨 | 超买,卖出 | 强势启动,买入 |
| 触及下轨 | 超卖,买入 | 破位,卖出 |
| 适用市况 | 震荡市 | 趋势市 |
同一个”价格触及上轨”的信号,两种框架下操作完全相反。这不是谁对谁错,而是它们对当前市场状态的假设不同。用哪一种,取决于你判断现在是震荡市还是趋势市——而这个判断本身,恰恰是最难的部分。这个矛盾正是第四层要展开的核心话题。
3.4 动量类:RSI
动量类指标回答第四个问题:“最近这段时间,买方和卖方谁的力气更大?”
RSI 的思路非常朴素——把最近 N 天分成上涨日和下跌日两堆,比一比两堆的总幅度谁大。全是上涨日就接近 100,全是下跌日就接近 0,势均力敌就在 50 附近。
RS = N 日内平均涨幅 / N 日内平均跌幅
RSI = 100 − 100 / (1 + RS)
这个式子等价于下面这个更直观的形式:
RSI = 100 × 平均涨幅 / (平均涨幅 + 平均跌幅)
手算一遍。取 N=6,某只股票这 6 天的日涨跌幅是 +2%, +1%, −1%, +3%, −0.5%, +1.5%:
上涨日:+2, +1, +3, +1.5 → 总涨幅 7.5,平均涨幅 7.5/6 = 1.25
下跌日:−1, −0.5 → 总跌幅 1.5,平均跌幅 1.5/6 = 0.25
RS = 1.25 / 0.25 = 5
RSI = 100 − 100/(1+5) = 83.3
83.3 说明这 6 天里买方力量压倒性占优。注意分母用的是 N(总天数)而不是下跌日的天数——这是标准算法,很多人手推时会算错这一步。
常规读法:
- RSI > 70:超买区,可能回调
- RSI < 30:超卖区,可能反弹
- RSI ≈ 50:多空均衡
但这个”常规读法”恰恰是 RSI 最大的坑。强趋势里 RSI 会长期钉在极值区:连涨 20 天,RSI 可能一直在 75~85 之间徘徊,一次都不回到 70 以下。如果你机械地按”超买就卖”操作,会在行情刚启动时就下车,然后眼睁睁看着它再涨 50%——这是新手用 RSI 亏钱最典型的方式。
原因不难理解:RSI 衡量的是相对强度,而不是绝对高度。它说的是”最近买方比卖方强得多”,这在强势行情里本来就是常态,是趋势健康的表现,不是”太高了要跌”的信号。
所以更靠谱的用法有两个:
- 背离,而不是绝对值。价格创新高但 RSI 没创新高,说明这一波的推动力弱于上一波——和 MACD 背离是同一个逻辑,只是换了个衡量动能的口径。
- 做过滤器,而不是做主信号。例如趋势策略只在 RSI < 70 时才允许开新仓,避免在最疯狂的位置追进去;或者反过来,只在 RSI > 50 时才接受买入信号,确保顺着中期强弱方向做。
一句话总结这一节:RSI 适合用来”否决”信号,不适合用来”产生”信号。
四类指标讲完了,可以看出一条清晰的脉络:它们分别回答方向(均线)、动能(MACD)、波动(ATR / 布林带)、强弱(RSI)四个不同维度的问题。
但请注意一个贯穿始终的事实:所有技术指标都是 OHLCV 的数学变换,没有任何一个引入了新信息。它们只是把同一份价量数据换个角度呈现出来,帮你看清某个侧面。这意味着——
- 堆砌再多指标也不会凭空产生”更多信息”,只会让你更容易找到彼此矛盾的信号
- 指标之间高度相关(均线、MACD、RSI 都是基于收盘价的变换),叠加使用时的”相互印证”往往是幻觉
- 真正决定策略成败的,不是你用了哪个指标,而是你怎么处理它必然会出错的那些时候——也就是仓位管理和风险控制
第四层:怎么形成策略——两大流派
指标只是原材料,策略是把指标组织成”什么时候买、什么时候卖”的完整规则。所有策略归根结底属于两大流派之一:

4.1 趋势跟踪(Trend Following)
信念:涨了还会涨,跌了还会跌(动量效应)。
行为:追涨杀跌。突破新高买入,跌破新低卖出。不求买在最低卖在最高,只求吃到趋势的中段。
盈亏特征:低胜率 + 高赔率。大部分交易小亏(假突破被止损),少数几笔大赚(抓住真趋势)。海龟策略 4 年 14 笔交易大部分亏损、靠 2024 年 9 月一波翻正,就是教科书式的呈现。
适合市场:单边趋势市。最怕震荡市(反复假突破)。
4.2 均值回归(Mean Reversion)
信念:涨多了要跌回来,跌多了要涨回去(价格围绕价值波动)。
行为:低买高卖。偏离均值过远时反向操作,回到均值时平仓。
盈亏特征:高胜率 + 低赔率。大部分交易小赚(价格确实回归了),偶尔巨亏(价格一去不回头——“这次不一样”的时候)。
适合市场:震荡市。最怕单边市(接飞刀接在半山腰)。
4.3 没有普适的圣杯
两个流派的盈亏结构互为镜像,没有谁绝对更好——关键是策略与市场状态的匹配。A 股大部分时间在震荡(这是工具篇海龟策略 Sharpe 只有 0.2 的根本原因),但趋势一旦来了幅度巨大(2024 年 9 月)。成熟的做法是:
- 用市场状态过滤器(比如大盘均线之上才开趋势仓)
- 或者两类策略组合持有,互相对冲弱点
这是后续”多策略组合”的理论基础。
第五层:真实世界的摩擦——交易成本
回测里每一笔交易都要付”过路费”。成本模型不准,回测就是自欺欺人。
5.1 A 股成本结构
| 项目 | 费率 | 说明 |
|---|---|---|
| 佣金 | 万 1.5 - 万 3 | 券商收,可协商,单笔最低 5 元 |
| 印花税 | 千分之一 | 只在卖出时收,国家税收 |
| 过户费 | 万 0.1 | 沪市股票专属 |
股票双边合计约万 4 到万 6.5。
ETF 免印花税——这是 ETF 对量化最友好的一点,总成本只有股票的 1/2 到 1/10。工具篇里 rate=2.5e-5(万 0.25)就是 ETF 的典型佣金。
5.2 滑点:更隐蔽的成本
滑点 = 想按 4.150 成交、实际按 4.152 成交的差额。来源就是第一层讲的盘口机制:买卖价差、排队、大单冲击。回测里用固定值模拟(slippage=0.001),故意估高一点是好习惯——能提前淘汰”回测赚钱实盘亏钱”的边缘策略。
5.3 成本敏感度与交易频率
海龟策略 4 年 14 笔,总成本几十块钱,对 6.89% 的收益微不足道。但把同样的成本模型套到日内策略(一天 10 笔)上:4 年 1 万多笔,成本瞬间放大 1000 倍,直接决定策略生死。
规律:策略越活跃,对成本越敏感。这也是散户做高频永远打不过机构的结构性原因——机构佣金能谈到万 0.5 以下,散户谈不下来。个人量化选择低频策略(持仓数天到数月),某种意义上是在成本约束下的最优解。
第六层:怎么活下来——风险管理
策略决定你能赚多少,风控决定你能活多久。海龟策略里 risk_per_trade=0.02 这个数字,来自一个严肃的数学推理。
6.1 核心问题:连续判断错误时,账户能撑几笔?
每笔按固定比例 x 亏损,连亏 n 笔后剩余资金 = 本金 × (1−x)^n:

| 单笔风险 | 连亏 10 笔 | 连亏 20 笔 | 连亏 50 笔 |
|---|---|---|---|
| 1% | 剩 90% | 剩 82% | 剩 61% |
| 2% | 剩 82% | 剩 67% | 剩 36% |
| 5% | 剩 60% | 剩 36% | 剩 8% |
| 10% | 剩 35% | 剩 12% | 基本归零 |
6.2 亏损与收益的不对称性
这是风控里最反直觉也最重要的数学事实:
- 亏 20% → 需要赚 25% 回本
- 亏 50% → 需要赚 100% 回本
- 亏 80% → 需要赚 400% 回本
回撤越深,回本难度指数级上升。保住本金不是保守,是数学最优。
6.3 为什么是 2%
- 连亏 20 笔(真实交易中完全可能)后还剩 67%,有翻身资本
- 单笔亏损额足够”疼”(10 万账户亏 2000),迫使认真对待每笔交易
- 波动可控,不至于因单笔成败情绪化
这个值来自 Van K. Tharp 对大量交易者行为数据的统计,与凯利公式的建议区间吻合。5% 是能力上限,10% 以上是赌博。
第七层:怎么评估——回测指标与陷阱
跑完回测,拿什么标准判断策略好坏?以及,为什么回测好看的策略实盘经常崩?
7.1 核心评估指标
工具篇(二)的 calculate_statistics() 输出过这些,系统整理一下:
| 指标 | 含义 | 参考标准 |
|---|---|---|
| 总收益率 | (期末−期初)/期初 | 必须跑赢同期指数,否则不如买 ETF 躺平 |
| 年化收益 | 折算成每年的复合收益 | A 股长期指数年化约 8%,策略应显著高于此 |
| 最大回撤 | 从峰值到谷底的最大跌幅 | 个人策略 <20% 较好,>30% 心态很难扛 |
| Sharpe 比率 | 超额收益 ÷ 波动率 | <0 亏钱; 0.5-1 一般; 1-2 不错; >2 优秀; >3 可疑 |
| 胜率 | 盈利笔数占比 | 趋势策略 30-40% 正常,均值回归 60-70% 正常 |
| 盈亏比 | 平均盈利 ÷ 平均亏损 | 与胜率联合看:胜率 35% × 盈亏比 3:1 = 赚钱 |
| 收益回撤比 | 年化收益 ÷ 最大回撤 | >1 及格,>2 良好 |
胜率和盈亏比必须联合看——这是第四层策略流派的量化呈现:趋势策略低胜率高盈亏比,均值回归反之。单看胜率会误杀所有趋势策略。
期望收益公式:E = 胜率 × 平均盈利 − (1−胜率) × 平均亏损。E > 0 且样本足够多,策略才成立。
7.2 回测的三大陷阱
回测好看只是必要条件,不是充分条件。三个最危险的陷阱:

陷阱一:过拟合(Overfitting)
参数调得越多、越精细,策略就越”记住”了历史数据的噪声而不是规律。20 个参数精调出年化 40% 的回测,实盘大概率崩溃;2 个参数的简单策略回测平庸,但样本外往往依然稳定。
对策:参数尽量少;样本内调参、样本外验证(比如用 2019-2022 调参,2023-2024 验证);参数微调后结果剧变的策略不可信(参数平原 > 参数尖峰)。
陷阱二:前视偏差(Look-ahead Bias)
策略用了”当时不可能知道”的信息。经典错误:用当日收盘价决定当日买入(收盘价 15:00 才确定,但你 14:00 就”用”它下单了);用未来数据算的指标。海龟策略里 high_array[-N:-1] 特意不含当日,就是在防这个。
陷阱三:幸存者偏差(Survivorship Bias)
只用”活到今天”的股票回测。退市股从数据源里消失了,回测天然跳过了所有暴雷标的,结果系统性乐观。用 ETF 回测天然规避了大部分这个问题(指数会自动调出问题股),这是 ETF 起步的又一个隐藏优点。
第八层:闭环——重读海龟策略
现在把八层知识叠起来,重读工具篇(二)的核心代码,每一行都能说清楚”为什么”:
# 【第二层】唐奇安通道 = K 线序列前 N 天的最高点(不含当日,防前视偏差【第七层】)
self.entry_up = am.high_array[-self.entry_window:-1].max()
# 【第三层】ATR = 波动率度量,同时服务于仓位和止损
self.atr_value = am.atr(self.atr_window)
if self.pos == 0:
# 【第二层+第四层】收盘价突破 K 线序列高点 = 趋势跟踪流派的入场信号
if bar.close_price > self.entry_up:
# 【第六层】单笔风险 2%:连亏 20 笔仍有翻身资本的数学解
risk_cash = self.fixed_capital * self.risk_per_trade
unit_risk = 2 * self.atr_value
# 【第一层】A 股 100 股整数倍约束
shares = int(risk_cash / unit_risk / 100) * 100
# 【第一层】限价单进入盘口撮合;回测滑点模拟真实价差【第五层】
self.buy(bar.close_price, shares)
# 【第三层+第六层】止损位 = 入场价 - 2 倍波动:给正常波动留空间,超出即认错
self.long_stop = bar.close_price - 2 * self.atr_value
策略回测出 Sharpe 0.2、胜率约 30%、最大回撤 -8.4%——用第七层的标准看:胜率低是趋势流派的正常特征(第四层),Sharpe 低是策略与震荡市场不匹配(第四层),回撤控制良好是 2% 风控的功劳(第六层)。每个数字都有出处,这就是体系化认知和碎片化知识的区别。
下一步
基础三件套齐了:工具(工具篇一、二)+ 领域知识(本篇)+ 跑通的完整策略。后续方向:
- 策略增强:量能过滤、市场状态过滤、MACD 背离检测叠加到海龟骨架上
- A 股规则建模:把 T+1、涨跌停约束加进 vnpy 回测,消除回测与实盘的系统性偏差
- 基础知识(二):基本面维度(PE/PB/ROE 怎么读、怎么用财务指标筛股)和市场结构(板块轮动、风格切换)
参考资料
- Van K. Tharp《Trade Your Way to Financial Freedom》(风险管理与头寸计算经典)
- John Bollinger《Bollinger on Bollinger Bands》(布林带作者本人的书)
- 工具篇(一):AKShare 数据环境搭建
- 工具篇(二):vnpy + 海龟策略实录