📘 本章重点
- 掌握唐奇安通道突破入场信号(20日/55日双系统)
- 理解基于ATR的动态仓位管理公式:Unit = 账户2%风险 / (ATR × 合约乘数)
- 学会海龟的0.5ATR金字塔加仓规则与2倍ATR硬止损
- 理解10日/20日反向通道离场的双重退出逻辑
- 了解海龟交易实验的历史背景与后续争议
⚠️ 本章难点
- 理解ATR在仓位计算中的逆波动率调节原理——波动越大,单笔仓位越小,实现风险平价
- 区分“系统一(20日入场/10日离场)”与“系统二(55日入场/20日离场)”的互补关系
- 掌握“2%风险单位”与“0.5ATR加仓规则”的数学关系——每加一次仓,风险增加2%
- 理解双重退出系统(硬止损+通道退出)的配合逻辑:谁先触发就听谁的
⏱️ 预估学习时间
- 55~75分钟
一、策略简述与一句话定性
一句话定性:海龟交易法则是一套完整的趋势跟踪交易系统,核心逻辑是“突破买入、加码持有、反转离场”。它不仅是简单的入场信号,更是全球第一套公开发布、包含“仓位管理→加仓规则→止损→退出”全链条的量化交易框架。
海龟交易法则利用唐奇安通道(Donchian Channel) 的突破信号来跟踪趋势,同时利用ATR(平均真实波幅) 来实现动态仓位调整和止损设计,从而系统化地捕捉市场趋势。
它在20世纪80年代一战成名,通过一次传奇交易实验证明了交易技巧是可以后天学会的。即便过去了40年,这套体系的底层逻辑——用波动率管理风险、用趋势跟踪捕捉波段——依然被全球量化交易员广泛沿用。
如果说双均线是趋势跟踪的“Hello World”,那么海龟交易法则就是趋势跟踪的“完整操作系统”。它不止告诉你“什么时候买”,还告诉你“买多少、怎么加、什么时候跑、跑多少”。一个海龟策略的完整实现,等于你同时学会了入场、仓位管理、加仓、止损、离场五件事。
老陈点评:
海龟策略的最大贡献不是它的具体参数(20日、55日这些数字),而是它提出了一个完整的“风险管理框架”——它把仓位与波动率挂钩,实现了风险预算的均等化。这个思想比通道突破本身更有价值。你今天看到的很多机构使用的“风险平价”概念,其雏形就可以追溯到海龟的ATR仓位管理。
老王补充:
我早年就是靠海龟入的门。说实话,它的入场信号在今天看来已经不算特别了,但它的仓位管理公式我到现在还在用——每笔交易亏多少不是由价格决定的,是由你事先算好的风险决定的。 这个思想,救过我不下十次。
二、策略的使用范围与条件
| 维度 | 适用范围与条件 | 说明 |
|---|---|---|
| 适用市场 | 具有明显趋势特征的期货、外汇、加密货币、股票指数 | 强趋势市场最佳(如商品期货大牛市、加密货币单边行情) |
| 品种流动性要求 | 日成交量大、滑点小的品种 | ATR仓位管理对流动性敏感;低流动性品种的滑点会严重侵蚀利润 |
| 适用周期 | 日线、4小时、1小时均可 | 原版为日线,但已在加密货币小时线数据上验证有效 |
| 资金门槛 | 中等偏上 | 需支持多品种分散、金字塔加仓的账户资金 |
| 不适合的市场状态 | 长期震荡或无明显趋势的行情 | 会产生频繁假突破,交易成本高,连续止损累积 |
适用品种举例:
- 商品期货:铜、原油、螺纹钢(趋势性强)
- 股指期货:标普500、恒生指数、沪深300
- 加密货币:比特币、以太坊(单边行情明显)
- 外汇:EUR/USD、USD/JPY(趋势持续性较好)
失效案例:在长期横盘震荡的市场环境中(如某些商品期货经历的数年区间波动),海龟策略会因频繁的假突破而产生连续亏损,账户回撤可能超过30%。这在海龟策略的历史中被称为“海龟的寒冬”——系统一和系统二同时被来回打脸,长线系统也无法捕捉到有效趋势。
A股市场的改造建议:
- 只能做多:放弃做空信号,只在价格突破上轨时入场,跌破下轨时离场(相当于“半套海龟”)
- T+1限制:信号确认后次日开盘入场,避免当日追高后被锁仓
- 涨跌停限制:突破信号可能因涨停/跌停而无法成交,建议在信号出现后观察1-2日,确认有效突破后再入场
- 无杠杆:仓位计算公式中的“合约乘数”设为1,直接将ATR转换为价格波动金额
老陈点评:
注意:原版海龟是针对期货市场设计的,使用的是杠杆交易和双向操作(做多做空)。如果你把它直接搬到A股股票市场(只能做多、无杠杆),需要对仓位计算和止损逻辑做较大调整。上述改造建议是起点,具体参数还需要通过回测来验证。
老王补充:
适用性提醒:当所交易的品种处于横盘整理或无明显趋势的状态时,海龟策略会产生大量假突破信号,导致频繁止损和交易成本激增。在进入趋势策略之前,可以先观察品种近期是否走出明确趋势特征——例如周线级别的持续新高或新低。
三、因子拆解与原理
3.1 唐奇安通道(Donchian Channel)——趋势判断因子
唐奇安通道是捕捉趋势信号的“眼睛”。它由两条线构成:
- 上轨 = 过去N个交易日的最高价
- 下轨 = 过去N个交易日的最低价
- (部分交易软件会额外显示一条中轨作为上下轨均值,但原版海龟策略只使用上下轨)
当价格突破过去N日的最高点时,认为上升趋势形成,产生做多信号;当价格跌破过去N日的最低点时,认为下降趋势形成,产生做空信号。
唐奇安通道 vs 双均线:两者都是趋势跟踪工具,但逻辑不同。双均线看的是两条均线的相对位置(谁在上谁在下),信号滞后但平滑;唐奇安通道看的是价格是否超越了历史上的最高/最低点(价格本身突破前高/前低),信号更及时但更容易被假突破欺骗。海龟选择唐奇安通道,是因为它直接捕捉价格的新高/新低,这是趋势启动最原始的信号。
原版海龟策略设计了两个系统并行运行,海龟们可以自行决定如何在两者之间分配资金(常见做法包括全部投入系统二、各50%分配等)。本书示例采用各50%的经典配置。
| 系统 | 入场通道 | 离场通道 | 特点 |
|---|---|---|---|
| 系统一(短周期) | 20日高点/低点突破 | 10日低点/高点突破 | 灵敏,震荡中更易触发,但趋势中更早入场 |
| 系统二(长周期) | 55日高点/低点突破 | 20日低点/高点突破 | 稳健,过滤噪音,捕捉更持久的趋势 |
⚠️ 原版系统一的“盈利过滤器”:
原版海龟规则中,系统一并非每次20日突破都会入场。如果上一次系统一的交易是盈利离场的,则本次突破信号被忽略,等待下一次突破。只有在上一次交易是亏损的情况下,才会接受新的系统一信号。
这个过滤器的目的是避免在震荡市中反复被假突破收割——上一次交易亏了,说明市场可能正在形成趋势,值得再试一次;上一次交易赚了,说明刚刚已经抓到了一波趋势,短期内再次出现有效趋势的概率较低。
为什么设计两个系统:两个系统同时运行,相当于用两种尺度的趋势视角看同一个市场。短期系统入场更灵敏,在趋势早期就能抓住信号,但震荡市中假突破信号更多;长期系统入场更稳健,过滤掉大量短期噪音,但入场时机更晚。短线信号震荡被止损后,长线信号可能正好捕捉到真正的单边大行情。
3.2 ATR(Average True Range)——风险管理因子
ATR(平均真实波幅)由威尔德(J. Welles Wilder Jr.)在1978年的著作《New Concepts in Technical Trading Systems》中首次提出。原版海龟系统使用的N值实际上是指ATR的20日指数移动平均(EMA)。
海龟策略用ATR做三件事:
- 计算每单位头寸的大小:Unit = 账户2%风险 / (ATR × 合约乘数)
- 设定止损幅度:2倍ATR动态追踪止损
- 决定加仓时机:每0.5倍ATR加仓一次
3.3 因子的优缺点与互补设计
优点:
- 全流程量化:从资金分配到加减仓再到退出,没有主观臆测空间
- 逆波动仓位调节:品种波动越大仓位越小,变相实现风险平价
- 双重系统并行:长短周期互补,既能捕捉短期爆发又能拿住长线大行情
- 可迁移性强:已在多个市场中经过反复验证
缺点:
- 对震荡市场极不友好,连续止损导致账户磨损严重
- 需要较大资金规模才能实现多品种分散和金字塔加仓
- 趋势信号出现后,入场点位可能已远离趋势起点,持仓体验不佳
互补设计:
两个系统资金独立运行,短线系统提供早期入场信号和灵活的退出机制,长线系统过滤市场噪音捕捉更持久的核心趋势。当短线信号被止损出局时,若长线信号仍在持仓状态,这笔交易可能变成了一个“时间跨度错配但方向相同”的多重仓位——一半短线止盈离场锁定部分利润,另一半长线继续持有享受剩余趋势。
此外,海龟的头寸规模与波动率负相关,实现了“波动小放大杠杆、波动大缩小杠杆”的自适应调节。
老陈点评:
从统计角度看,系统一和系统二的组合效果优于单独使用任何一个系统。两者的相关性大约在0.6-0.7之间——不是完全重叠,但也不是完全独立。组合后,夏普比率通常能提升0.2-0.3。这就是多时间框架策略的价值所在。
四、仓位、买卖点与风险管理
4.1 仓位管理公式(海龟策略的灵魂)
海龟的仓位计算是整套系统的核心。先将账户总资金的2% 定义为“最大风险承受值”,然后用ATR来计算每个“Unit”(最小交易单位)包含多少合约:
Unit = (账户总资金 × 2%) ÷ (ATR × 每手合约乘数)
注意:如果交易的是股指期货或加密货币永续合约,“合约乘数”可能为1,公式相应简化。
当价格每往有利方向移动0.5倍ATR,就增加一个Unit仓位,最多加仓4次,使整体仓位风险累积至账户的8%。当标的价格往不利方向运动达到2倍ATR,全头寸止损出场。
举例说明:假设总资金100万元,期货品种一手合约乘数10,当前ATR=500。
- Unit = 100万 × 2% ÷ (500 × 10) = 20000 ÷ 5000 = 4手
- 随着价格不断上涨,每0.5个ATR依次在第0.5ATR、1.0ATR、1.5ATR、2.0ATR位置各加仓4手
- 任意一次加仓后若价格回撤2倍ATR,该部分仓位立即止损平仓
风险累积示意图(做多场景) :
| 加仓次数 | 触发价格 | 新增头寸 | 累计头寸 | 累计风险(占账户) |
|---|---|---|---|---|
| 第1次(初始) | 突破价 | 1 Unit | 1 Unit | 2% |
| 第2次 | 初始价 + 0.5 ATR | 1 Unit | 2 Units | 4% |
| 第3次 | 初始价 + 1.0 ATR | 1 Unit | 3 Units | 6% |
| 第4次 | 初始价 + 1.5 ATR | 1 Unit | 4 Units | 8% |
| 第5次(上限) | 初始价 + 2.0 ATR | 不加 | 4 Units | 8% |
每加一次仓,账户的风险暴露增加2%。4次加满后,总风险为8%——这意味着如果市场突然反转2倍ATR,账户总亏损为8%。
做空场景说明:做空时逻辑对称。若在100元做空,Unit计算方式相同;加仓方向为价格每下跌0.5ATR加仓一次;止损为价格从最低点反弹2倍ATR。
4.2 入场与加仓判别
| 操作 | 触发条件 | 逻辑解释 |
|---|---|---|
| 首次入场(做多) | 价格向上突破20日(系统一)或55日(系统二)最高价 | 唐奇安通道上轨突破信号,视为上升趋势启动 |
| 首次入场(做空) | 价格向下突破20日或55日最低价 | 唐奇安通道下轨跌破信号,视为下降趋势启动 |
| 金字塔加仓(做多) | 已有头寸,价格每上涨0.5倍ATR | 按移动阶梯分批加码,让初始风险逐步扩大为趋势头寸 |
| 金字塔加仓(做空) | 已有头寸,价格每下跌0.5倍ATR | 方式同上,方向对称 |
海龟的加仓策略,就像下围棋时的“拆二”和“连片”——你不是在同一个位置把所有棋子一次性堆上去,而是随着局势(趋势)的展开,逐步投入兵力。每0.5倍ATR加一次仓,就像每占领一个关键点位就增派一个连队。但围棋有“气”的概念(棋子周围的空位),海龟也有“止损线”作为每一笔加仓的“气”——一旦气被堵死(价格回撤2倍ATR),这支部队就要撤退。
关键细节:加仓只在现有头寸已经产生一定浮盈的时候进行,相当于用已获利润的一部分作为追加仓位的“保险金”。
4.3 止损与止盈(离场)设计
| 类型 | 设定方式 | 触发条件 |
|---|---|---|
| 硬止损(做多) | 2倍ATR追踪止损 | 当前价格从最高点回撤达到2倍ATR时平仓离场 |
| 硬止损(做空) | 2倍ATR追踪止损 | 当前价格从最低点反弹达到2倍ATR时平仓离场 |
| 通道离场(系统一) | 10日唐奇安通道反向突破 | 多头时价格跌破10日最低点平仓;空头时价格突破10日最高点平仓 |
| 通道离场(系统二) | 20日唐奇安通道反向突破 | 多头时价格跌破20日最低点平仓;空头时价格突破20日最高点平仓 |
双重退出机制的逻辑:2倍ATR止损负责在价格反转时保护本金;通道退出负责在趋势阶段性衰竭时兑现利润。两种退出信号谁先触发就以谁为准。
老王补充:
这里有一个新手最容易犯的错误:海龟的止损是追踪止损,不是固定止损。也就是说,随着价格上涨,止损线不断上移。很多人把海龟止损理解成“买入后固定亏2%就跑”,这完全错了。追踪止损的好处是保护利润,坏处是在剧烈回调中可能被震出局。
4.4 止损的内在互补关系
2倍ATR动态止损是一种“自适应止损”,它在波动率扩大的时候自动调宽止损线,防止高波动市场中被瞬间打穿;波动率缩小的时候止损线收窄,及时锁定利润。
而通道反向突破则是一种“趋势破坏”信号——当价格从高点回落到近10日低点时,可视为短期上攻动能不足,先退出部分仓位。两者组合形成一个牢固的“回撤防火墙”。
老陈点评:
注意:海龟的止损不是“每笔交易亏2%”。它真正的设计是每单位头寸的最大风险为账户的2%。如果你有4个单位(满仓),总风险是8%。这个设计保证了即使连续止损5次,账户总亏损也不会超过40%(在理论极端情况下)。这在趋势跟踪策略的历史回测中被称为“最大连续亏损控制”。
五、策略的来历、设计者与趣闻
1983年,美国传奇商品期货交易员理查德·丹尼斯(Richard Dennis) 和他的老友威廉·埃克哈特(William Eckhart) 在某个海龟养殖场里展开了一场著名辩论:伟大的交易者是天生的,还是后天可以培养的? 丹尼斯相信交易可以传授,埃克哈特坚持基因和天性起决定性作用。
这场辩论以一场真金白银的实验收场——丹尼斯提议招募并培训一批学员,给他们真实的账户,用数据判断谁对谁错。他们在《华尔街日报》和《纽约时报》等媒体上刊登大幅广告招聘。“在一个短暂的培训会后,新手将被提供一个账户进行交易。”
超过1000人申请,丹尼斯亲自会见了其中的80人,最初选出10人,后来增加到13人(新增的3人丹尼斯此前已认识)。他们来自各行各业,许多人在此之前几乎没有交易经验,甚至有人此前从未接触过金融交易。其中一位学员名叫Curtis Faith——当时年仅19岁,是所有海龟中最年轻的一位。他后来撰写了《海龟交易法则》一书(中文版2013年首版,2021年推出第4版),让这套系统走向全世界。
这13名学员——后来被称为“海龟们”——经过两周的系统培训后,每人被给予50万至200万美元不等的资金账户开始实战交易。在随后的四年中,他们的年均复利收益高达80%(不同文献对具体年限和收益率略有差异,此处采用Curtis Faith书中的主流说法),积累了超过一亿美元的盈利。比尔·埃克哈特承认自己输掉了赌局,丹尼斯赢得了这场历史性对赌的胜利。
然而,海龟计划的结局并非童话。1987年“黑色星期一”股灾后,丹尼斯因重仓卖空债券,而股灾后利率骤降导致债券暴涨,遭遇巨额亏损。他的基金在1988年被迫关闭。这一事件也标志着海龟计划作为统一组织的终结。海龟学员也开始陆续单飞。其中一些人在后续的职业交易生涯中走得极为成功,比如Jerry Parker于1988年创立了Chesapeake Capital,至今仍在运营,是海龟学员中商业上最成功的一位。另一些则销声匿迹。
趣闻:据Curtis Faith在书中回忆,丹尼斯对纪律的要求近乎苛刻。有一次,一位海龟学员在信号出现时没有及时入场,犹豫了几分钟后才下单。丹尼斯发现后当场质问:“规则上写的是什么?价格突破就入场。你犹豫的这几分钟,可能就是你职业生涯中最昂贵的几分钟。”
埃克哈特输掉了赌局,但他后来在接受采访时说了一句意味深长的话:“我输掉了赌局,但我仍然认为大多数人无法成为优秀的交易员——不是因为他们学不会规则,而是因为他们守不住纪律。”这句话,后来被无数量化交易员贴在显示器上。
海龟策略的现代演变:今天,很多量化基金仍在沿用海龟的核心思想——用ATR做风险平价、用通道突破捕捉趋势。但具体的参数已经发生了变化:有人用30日/90日替代20日/55日,有人用指数移动平均替代简单最高/最低价通道,还有人加入了机器学习来动态调整ATR倍数。但无论如何变化,海龟的“风险管理优先于信号”这一核心理念,始终没有变。
也有人将海龟后期的集体回撤归因于策略过于公开——当市场上太多资金都使用同一套逻辑之后,原来的盈利窗口自然逐步缩窄。这也许是量化策略的一种宿命:一个有效的策略被越多人知道,它的有效性就越弱。
老陈点评:
海龟实验的最大价值不在于它赚了多少钱,而在于它用真金白银证明了交易可以系统化、可以传授。在海龟之前,交易被视为一种“艺术”或“天赋”。海龟之后,交易开始被视为一门“科学”或“工程”。这是量化交易史上的分水岭。
老王补充:
我读《海龟交易法则》的时候,最大的感触不是它的策略有多精妙,而是它的纪律性有多强。海龟们被要求完全机械执行,不允许任何主观判断。这种纪律,比任何指标都难学。
六、Python回测示例
以下使用pandas、numpy和yfinance构建经典海龟策略的核心回测框架。为避免系统性风险导致的回测偏差,建议采用多品种组合回测并谨慎处理实盘滑点与手续费。
import pandas as pd
import numpy as np
import yfinance as yf
from datetime import datetime, timedelta
# 若yfinance无法获取数据,可使用akshare:import akshare as ak; df = ak.stock_zh_index_daily(symbol="sh000300")
def turtle_trading_strategy(data,
entry_lookback=20,
exit_lookback=10,
atr_period=20,
risk_per_trade=0.02,
contract_multiplier=100,
total_capital=1000000,
use_system_two=False):
"""
海龟策略(系统一/系统二可选)
参数:
data: 必须包含 'High', 'Low', 'Close' 三列,索引为日期
entry_lookback: 入场唐奇安通道周期(系统一默认20,系统二默认55)
exit_lookback: 离场唐奇安通道周期(系统一默认10,系统二默认20)
atr_period: ATR计算周期(默认20)
risk_per_trade: 单笔最大风险占账户比例(默认2%)
contract_multiplier: 每手合约乘数(默认100)
total_capital: 总资金(默认100万元)
use_system_two: 是否使用系统二(默认False,使用系统一)
返回:添加了持仓和净值的DataFrame
"""
df = data.copy()
# 若使用系统二,覆盖入场/离场参数
if use_system_two:
entry_lookback = 55
exit_lookback = 20
# --- Step 1: 计算唐奇安通道(入场用)---
df['Donchian_High'] = df['High'].rolling(entry_lookback).max()
df['Donchian_Low'] = df['Low'].rolling(entry_lookback).min()
# --- Step 2: 计算ATR(用于仓位和止损)---
df['H-L'] = df['High'] - df['Low']
df['H-PC'] = (df['High'] - df['Close'].shift(1)).abs()
df['L-PC'] = (df['Low'] - df['Close'].shift(1)).abs()
df['TR'] = df[['H-L', 'H-PC', 'L-PC']].max(axis=1)
df['ATR'] = df['TR'].rolling(atr_period).mean()
# --- Step 3: 生成入场信号---
df['Long_Entry'] = (df['Close'] > df['Donchian_High'].shift(1)) & (df['Close'].shift(1) <= df['Donchian_High'].shift(1))
df['Short_Entry'] = (df['Close'] < df['Donchian_Low'].shift(1)) & (df['Close'].shift(1) >= df['Donchian_Low'].shift(1))
# --- Step 4: 计算离场通道---
df['Exit_High'] = df['High'].rolling(exit_lookback).max()
df['Exit_Low'] = df['Low'].rolling(exit_lookback).min()
# --- Step 5: 计算每单位头寸大小---
max_risk = total_capital * risk_per_trade
df['Position_Size'] = max_risk / (df['ATR'] * contract_multiplier)
# 防止ATR为0或极小值时仓位过大(clip上限为总资金的50%除以价格)
df['Position_Size'] = df['Position_Size'].clip(upper=total_capital * 0.5 / df['Close'])
# --- Step 6: 追踪止损线(多头2倍ATR)---
df['Trailing_Stop'] = df['Close'].cummax() - 2 * df['ATR']
# --- Step 7: 生成持仓记录---
df['Position'] = 0
current_position = 0
last_add_price = 0.0 # 上一次加仓价格(用于计算下次加仓触发价)
units_held = 0 # 当前持有的单位数
for i in range(1, len(df)):
# 检查离场通道反向突破
if current_position > 0 and df['Close'].iloc[i] < df['Exit_Low'].iloc[i]:
current_position = 0
last_add_price = 0.0
units_held = 0
elif current_position < 0 and df['Close'].iloc[i] > df['Exit_High'].iloc[i]:
current_position = 0
last_add_price = 0.0
units_held = 0
# 检查追踪止损触发
elif current_position > 0 and df['Close'].iloc[i] < df['Trailing_Stop'].iloc[i]:
current_position = 0
last_add_price = 0.0
units_held = 0
# 若无持仓,检查入场信号
elif current_position == 0:
if df['Long_Entry'].iloc[i]:
unit_size = df['Position_Size'].iloc[i]
current_position = unit_size
last_add_price = df['Close'].iloc[i]
units_held = 1
elif df['Short_Entry'].iloc[i]:
unit_size = df['Position_Size'].iloc[i]
current_position = -unit_size
last_add_price = df['Close'].iloc[i]
units_held = 1
# 加仓逻辑(多头方向)- 改进版:使用上次加仓价格 + 0.5 ATR
elif current_position > 0 and units_held < 4:
next_add_price = last_add_price + 0.5 * df['ATR'].iloc[i]
if df['Close'].iloc[i] >= next_add_price:
unit_size = df['Position_Size'].iloc[i]
current_position += unit_size
units_held += 1
last_add_price = next_add_price # 更新上一次加仓价格
# 加仓逻辑(空头方向)- 改进版
elif current_position < 0 and units_held < 4:
next_add_price = last_add_price - 0.5 * df['ATR'].iloc[i]
if df['Close'].iloc[i] <= next_add_price:
unit_size = df['Position_Size'].iloc[i]
current_position -= unit_size
units_held += 1
last_add_price = next_add_price # 更新上一次加仓价格
df.loc[df.index[i], 'Position'] = current_position
# --- Step 8: 收益与净值---
df['Returns'] = df['Position'].shift(1) * (df['Close'] - df['Close'].shift(1)) / df['Close'].shift(1)
df['Net_Value'] = (1 + df['Returns']).cumprod()
# 打印统计指标
total_return = (df['Net_Value'].iloc[-1] - 1) * 100
max_drawdown = ((df['Net_Value'].cummax() - df['Net_Value']) / df['Net_Value'].cummax()).max() * 100
print(f"总收益率:{total_return:.2f}%")
print(f"最大回撤:{max_drawdown:.2f}%")
return df
if __name__ == "__main__":
# 下载数据(以沪深300指数为例)
df_300 = yf.download('000300.SS', start='2020-01-01', end='2025-01-01')
# 调用策略(系统一版本)
result = turtle_trading_strategy(df_300, entry_lookback=20, exit_lookback=10,
atr_period=20, risk_per_trade=0.02,
contract_multiplier=100, total_capital=1000000)
# 输出最后5个交易日的持仓和净值
print(result[['Close', 'Position', 'Net_Value']].tail(5))
回测结果简要解读(以实际运行为准):
- 在2020年3月疫情暴跌后的反弹趋势中,海龟策略在早期捕捉到入场信号,并随着趋势发展完成加仓,捕获了主要涨幅。
- 在2021-2022年的震荡行情中,策略多次被假突破止损,账户出现阶段性回撤。
- 在2023-2024年的结构性行情中,策略表现取决于趋势的持续性和流畅度。
- 建议读者修改系统参数(将
use_system_two设为True)或同时运行两个系统(各50%资金),观察组合效果。
代码说明:
本代码为教学简化版,与原版海龟的差异包括:(1)原版使用限价单在突破价格入场,本代码使用收盘价判断后次日入场;(2)原版系统一有“盈利过滤器”,本代码未实现;(3)原版系统一和系统二各占50%资金,本代码通过use_system_two参数切换;(4)原版对每一笔加仓独立计算止损(每个Unit有自己的入场价和2倍ATR止损线),本代码简化了这一逻辑,仅对整体持仓做追踪止损。建议读者在理解核心思想后自行扩展。
老陈点评:
回测时要注意:海龟策略在样本内的表现往往非常漂亮,但样本外的表现取决于市场环境是否匹配。建议使用滚动回测方法——每3年调整一次参数,观察策略在不同时间段的表现是否稳定。
老王补充:
实盘中最大的问题是执行。海龟要求你连续加仓4次,但每一次加仓都意味着风险在增加。当价格连续上涨时,你会忍不住想“要不要多加点”;当价格回调时,你又想“要不要先跑”。这些念头都是海龟的天敌。 海龟的纪律是:到了就加,不到就等,到了止损就砍。
七、本章小结与思考题
小结
| 项目 | 核心要点 |
|---|---|
| 策略类型 | 趋势跟踪,唐奇安通道突破入场 + 2倍ATR追踪止损 + 10/20日反向通道离场 |
| 适用场景 | 强趋势行情(商品期货大牛市、加密货币单边走势等),震荡市中信号失效 |
| 核心优势 | 完整的资金/仓位/止损/退出闭环框架,全流程完全量化无主观决策空间 |
| 最大风险 | 单边趋势行情中收益极高但震荡期连续止损回撤叠加,对账户心理承受力要求高 |
| 资金门槛 | 中等偏上。需要足够的账户余额来支撑多品种分仓和金字塔加仓操作 |
海龟策略本质上是一次“把完整的交易知识全盘代码化”的实验。它的最大价值不在某根均线穿越或某个ATR数值,而在于告诉后人:把交易的所有环节(入场、加仓、止损、离场、仓位配置)全部转化为可以被执行的客观规则,是完全可以做到的。
老陈总结:
从量化研究的角度看,海龟策略最值得学习的是它的风险管理框架——它把每笔交易的风险固定在账户的2%,然后用ATR来反推仓位。这种“先定风险,再定仓位”的思维方式,是所有交易者都应该掌握的。至于具体的入场信号(20日突破还是30日突破),其实没有那么重要。
老王总结:
海龟策略是我见过的最完整的入门教材——它不止教你买点,还教你卖点、加仓、止损、仓位分配。但它的完整也意味着它有严格的纪律要求。如果你做不到机械执行,再好的策略也是白搭。海龟的规则可以复制,但海龟的纪律不可以复制。 这就是为什么13个海龟学员,后来的业绩天差地别。
💡 思考题
- 你认为海龟策略中哪一条规则(入场/加仓/止损/离场/仓位分配)最难被新手掌握?为什么?
- 在A股市场(T+1、涨跌停机制、只能做多),你认为海龟策略应该如何调整才能适应这些限制?请尝试给出至少两条调整思路。
- 为什么海龟策略要在价格从高点回撤2倍ATR时平仓,而不是用固定百分比止损(如-5%)?哪一种方式更适合A股市场?
- (展望题) 如果现在有另一个丹尼斯式的亿万富翁想复制海龟实验,你预测他会选用什么策略作为新一代海龟的核心框架?为什么?是深度学习模型,还是某种更传统的基于波动率的自适应交易系统?请你结合未来十年AI技术的发展趋势自由畅想。
八、引用/参考出处
- Chesapeake Capital 官网:https://www.chesapeakecapital.com(由海龟学员Jerry Parker创立)
- 百度百科:海龟交易实验:https://baike.baidu.com/item/海龟交易实验
- 知乎专栏:海龟交易策略详解:https://zhuanlan.zhihu.com/p/27987938
图书:
- 柯蒂斯·费思,《海龟交易法则》,中信出版集团,2010(第3版),2021(第4版)。
- 理查德·D·怀科夫等,《海龟交易特训班》,中国人民大学出版社,2024。
- 厄尼斯·陈,《量化交易:如何构建自己的算法交易系统》,人民邮电出版社,2022。
- J. Welles Wilder Jr., New Concepts in Technical Trading Systems, Trend Research, 1978。(ATR的原始出处)




















暂无评论内容