知乎live:带你重新认识海龟交易策略, by 用Python的交易员
海龟的传奇
- 起源于 1983 年两位交易员的赌约,“海龟”并没有特殊的含义
- 最经典的量化交易策略,属于 CTA 策略,中低频趋势跟踪,策略包含投资组合管理
- 柯蒂斯,19岁加入海龟计划,没有做过交易,没有先入为主的观念,效果反而最好,四年狂赚 3000 万美元
- 意识到量化分析的重要性,通过表格卡纸手动计算交易信号,到了盘中通过打电话跟场内 Broker 交易,系统化交易
完整的海龟交易策略
交易品种
一般选择期货,也可以 CFD、杠杆外汇、数字币期货
- 流动性足够
- 带杠杆 —— 最好是期货,股票可能不太适合,股指期货可以
- 可以做空,做空成本不大,融券做空不合适
- 波动足够大,足够追涨杀跌
单位持仓
- 单位持仓 = (总资本 * 1%) / (N * 合约乘数),合约乘数即一个指数跳动对应的钱
- N = TR 的 20 日 EMA,可以用 ATR 代替(SMA)
- ATR 衡量风险,单位持仓和风险反向相关
风险分配
- 强制分散风险,限制同向持仓,有效管理 CTA 策略风险
- 同向风险:单一品种上,不能超过 4 单位持仓;高度相关的,不能超过 6 单位;低关联的,不超过 10 单位;整个投资组合,不超过 12 单位
策略入场
- 信号:唐奇安通道
- 长周期通道:55 日通道,突破上轨就做多,突破下轨就做空
- 短周期通道:20 日通道,突破上轨做多/空;但是如果上一次短周期信号赚了钱,就要过滤这一次的信号;原因是趋势追踪短周期连续出现两次赚钱的情况比较少
顺势加仓
- 逆市加仓非常危险,只在持有仓位盈利的时候才加仓
- 交易入场的时候立即记录当时 ATR
- 价格顺着建仓方向增加 0.5 * ATR 时,加 1 单位持仓,直到达到上限
出场信号
- 短周期信号:反向突破 10 日通道
- 长周期信号:反向突破 20 日通道
- 本质上是一种移动止损
交易止损
- 从入场价格算起,最多允许亏 2 * ATR,即每次亏最多亏 2%
- 每次加仓之后,将整体入场价格调到最新入场价,而不是平均数,强制锁定一部分利润
- 同向风险:单合约4,高关联6,低关联10,整体12
海龟回测的逻辑拆分
策略信号
单合约
- 策略入场
- 策略出场
- 交易止损
- 顺势加仓
策略组合
整个投资组合
- 单位持仓,最大12
- 风险分配
- 短周期过滤
回测引擎
- 品种选择
- 数据回放
- 成交记录
- 统计分析
难点
K线内部成交
- 无论长短周期,要求在突破通道的瞬间,立即执行交易,而非等到收盘
- Tick 数据量太大,只能用 K 线数据回测(?)
- ZipLine or 三大矿无法回测
实现逻辑(Stop Order):
- T-1 时刻 K 线走完后,计算 T 时刻上下轨(可以用 TA-lib),买入价 M
- T 时刻 K 线,如果开盘价 O 高于 M,以 O 成交;否则,如果最高价高于 M,以 M 成交;实际回测时还要考虑滑点
- 绝不能以 T 时刻的收盘价成交,否则会错过巨大的 Alpha
短周期信号的过滤
- 短周期通道,容易被频繁触发
- 为避免假突破,上次盈利时,要放弃本次指令
- 需要在信号中统计,多次加仓(顺势)&一次平仓要算为一次开平
实现逻辑:vnpy1.9.2 examples/TurtleStrategy/turtleStrategy.py
TurtleResult
多空仓位限制
- 单位持仓是由 ATR 计算出来的,是动态的
- 策略组合需要将单位持仓,转化为实际持仓
实现逻辑:vnpy1.9.2 examples/TurtleStrategy/turtleStrategy.py
TurtlePortfolio.newSignal
回测
准备数据
- 海龟基于日线,主力合约存在换月跳空
- 跳空可能给出错误的信号,需要进行平滑或者指数合成
- 可以使用 RQData
回测参数
- 上期所热门品种:RB ZN CU AL RU
- 原始海龟参数:由上世纪美国市场确定,可视为全样本外数据
- 2014-2018日线数据:使用产品指数数据
- 交易成本:交易所手续费 +10%,滑点 1tick
- 起始资金 1000 万,单位仓位使用固定 1000 万
结果
- 5 年时间,收益回测比 10
- sharpe 接近 1