暑假在家发现了Ricequant这个挖金矿的地方
,狠狠泡了些日子
,津
(hun
)津
(hun
)有
(yu
)味
(shui
)地阅读API文档
,一步步把海龟的轮廓构建起来
。选择实现海龟策略也是有原因的
,海龟交易法则不是仅仅停留在指标系统的阶段
,准确说
,它已经正真意义上的形成了交易系统的雏形
,它涵盖了交易的各个方面
,没有给交易员留下主观想象决策的余地
,这正好使得程序化操作该系统的优势得到发挥
。这一步步敲击代码的过程中收获还是不少
,今天我也来放上自己的思考和代码与大家伙分享
。首先,我们从趋势策略说起......在国内A股浓厚的追涨杀跌气氛中
,第一感觉趋势追随策略简单粗暴有效
,不过我觉得
,看待一个策略就像看待一个人一段历史一样
,时间拉长
,作出评价才更加客观
。我们先来看看API中自带的基于趋势指标MACD的策略
,关于MACD的介绍可以戳Technical Analysis from A to Z
,A Primer On The MACD
,MACD Histogram Helps Determine Trend Changes(
http://www.investopedia.com/articles/technical/082701.asp)
,以及计算公式
。为消除选股因素影响
,交易标的使用日指数数据CSI300.INDX
。为和后续策略对比
,回测时间统一设定为20050104-20160310这十年时间
。(源码
:https://www.ricequant.com/community/topic/62)十一年回测只用不到6秒
(时光时光慢些吧
。。)回测收益 209.829% 回测年化收益 11.067% 基准收益 205.066%
Alpha 0.0305 Beta 0.441 Sharpe 0.3638 Sortino 0.3448
Information Ratio -0.1163 Volatility 0.2007
最大回撤 50.77% Tracking Error 0.2255 Downside Risk 0.2117
嗯...好像并没有想象那么好
,平时看交易软件上的MACD觉得靠谱得不要不要的
,不过这样看也没有那么神呐
,最大回撤快五十了额
,我是不敢把银子交给它...睡不着觉啊
,不过夏普0.80
,十年时间
,也不容易......也算差强人意了
。好了
,下面切换到我们的正题
:海龟交易法则
。听我一本正经地娓娓道来
:海龟交易法则背景
说到海龟交易
,不得不提他的创始人--Richard Dennis
Riachard Dennis是七八十年代著名的期货投机商
,是一位具有传奇色彩的人物
,在多年的投机生涯中
,Dennis出尽风头
,给人的感觉是常常可以在最低点买进
,然后在最高峰反手卖空
。他相信优秀的交易员是后天培养而非天生的
。他在1983年12月招聘了23名新人
,昵称为海龟
,并对这些交易员进行了一个趋势跟踪交易策略培训
。随后给予每个新人100万美元的初始资金
。经5年的运作
,大部分
“海龟
”的业绩非常惊人
,其中最好的业绩达到1.72亿美元
。N年后海龟交易法则公布于世
,我们才有幸看到曾名噪一时的海龟交易法则全貌
。(画外音
:能够开发出领先时代的交易模型
,收益是多么诱人
!)
海龟交易法则内容海龟交易法则的原版书籍可以猛戳
(http://bigpicture.typepad.com/comments/files/turtlerules.pdf)这里先画个简单的思维导图表示下海龟交易法则的基本框架
:下面一个个具体来说
:市场:海龟们都是期货交易者
,海龟们只选择有一定交易量流动性高的市场
。这里我选择日指数数据CSI300.INDX
,一方面是为了更好与基准比较
,另一方面也是因为该标的可以不用担心流动性的问题
。头寸规模:头寸规模是海龟交易系统最重要的部分之一
。头寸规模是海龟交易系统最重要的部分之一
。头寸规模是海龟交易系统最重要的部分之一
。海龟交易法则根据一个市场的绝对波动幅度来调整头寸规模
,也就是将头寸的绝对波动幅度进行了标准化
。比如
,投资标的的价值波动性较强时
,可以减少持有量
,相反
,当它的价值波动性较弱时候
,可以增加持有量
。总而言之
,市场的波动性与头寸规模可以相互抵消
。海龟用一个被称为N的概念来表示某个市场根本的波动性
,它表示单个交易日某个特定市场所造成的价格波动的平均范围
,它同时也涵盖了开盘价的缺口
。其实这个所谓的N
,就是我们平常所熟悉的ATR
,关于ATR的介绍
,可以戳AVERAGE TRUE RANGE(
http://www.metastock.com/Customer/Resources/TAAZ/Default.aspx?p=35)
以下为计算公式:TR=Max(H-L,H-PDC,PDC-L)其中
: TR=真实波幅
H=当日最高价
L=当日最低价
PDC=前一日收盘价
N(即ATR)的计算公式如下(其实就是前面计算所得TR的20日移动平均)
:N=(19*PDN+TR)/20其中
: PDN=前一日N值
TR=当日的真实波动幅度
有了N之后
,下一步可以计算绝对波动幅度
,也就是用根本的市场价格波动性
(用N值定义
)表示的价值量波动性
。绝对波动幅度=N*合约每一点所代表的价值最后
,海龟按照我们所称的单位
(Units
)建立头寸
。使1N代表帐户净值的1%
。波幅调整后的头寸单位为
:头寸规模单位=账户的1%/市场的绝对波动幅度
可以看出
,使用N作为市场波动标准化的度量并以此作为开仓量及持仓量的依据
,其背后的资金管理含义是
,即便当日投资标的跌幅达到N(ATR)的水平,当日的损失都能控制在1%的总资产水平内。即便当日投资标的跌幅达到N(ATR)的水平,当日的损失都能控制在1%的总资产水平内。 即便当日投资标的跌幅达到N(ATR)的水平,当日的损失都能控制在1%的总资产水平内。以书中给的参考为例
:2003年3月份民用燃料油合约
日期 | 最高价 | 最低价| 收盘价| 真实波幅| N值
-------- | ---
2002/12/2| 0.7375| 0.7227| 0.7359| 0.0148| 0.0134
2002/12/3|0.7447| 0.7310| 0.7389| 0.0137| 0.0134
2002/12/4 |0.7420|0.7140| 0.7162| 0.0280| 0.0141
-------- | ---
根据12月4日的N值0.0141计算头寸规模如下
:N=0.0141
账户规模=1000000美元
每一点的价值=42000美元
头寸单位规模=0.011000000/0.014142000=16.88
舍去小数
,得16份合约
。另外
,海龟被限制在任何时间持仓的单位(Units)数目
,在证券市场这种单一市场中
,最多持仓的单位数设为4个单位
,且海龟一般每周一计算一次N用于更新单位(Units)大小
。入市:海龟的入市规则有两个系统
,我们可以根据自己的意愿决定将净值配置在何种系统上
。系统一
:以20日突破为基础的偏短线系统
突破定义为超过前20日的最高价或者最低价
海龟总是在日间突破发生时进行交易
,而不会等到收盘或次日开盘
系统二
:以55日突破为基础的较简单的长线系统
只要有一个信号显示价格超过了前55日的最高价和最低价就建立头寸
。由于我的回测周期较长
,我选择了系统二
,即以55日突破为基础的较简单的长线系统
。追踪:海龟交易系统不是一有突破信号就全仓介入
,而是根据最新市场价格变化进行逐步建仓
。海龟在价格突破时只建立一个单位的头寸
,在建立头寸后根据前面指令的实际成交价为基础以每突破0.5N的间隔进行加仓
。例如
: 黄金
:N=2.5
55日突破=310
增加的第一个单位310.00
第二个单位310.00+1/2个2.5即311.25
第三个单位311.25+1/2个2.5即312.50
第四个单位312.50+1/2个2.5即313.75
海龟被告知在接受入市信号时要非常连续
,因为一年中的大部分利润可能仅仅来自两三次大赢利
。止损:对大多数人来说
,始终抱着亏损的交易终究会反转的愿望比干脆退出亏损头寸并承认交易失败要容易得多
。长期看
,不会止损的交易是不会成功的
。在你建立头寸之前
,你需要预先确定退出的点位
。如果市场波动触及你的价位
,你就必须每一次毫无例外的退出
。在这一立场上摇摆不定最终会导致灾难
。(画外音
:前段时间大家应该体会比较深刻吧
。)
止损标准
海龟以头寸风险为基础设置止损
,任何一笔交易不能出现2%以上的风险
,因为价格波动1N表示1%的账户净值
,容许风险为2%的最大止损就是价格波动2N
,为了保证全部头寸的风险最小
,如果另外增加了单位
,前面单位的止损需提高0.5N
。例如
: 原油
:N=1.255 日突破=28.30
第一单位 28.30 25.90
离市:艰难的离市
对于大多数交易员
,海龟离市规则是系统法则中唯一最难的部分
。等待10或20新低出现通常意味着眼睁睁瞅着20%
,40%甚至100%的利润化为泡影
。海龟交易法则对于系统一系统二有着不同的离市标准
:系统一
:离市对于多头头寸为10日最低价
,对于空头头寸为10日最高价
。如果价格波动于头寸背离至10日突破头寸中所有单位都会退出
系统二
:离市对于多头头寸为20日最低价
,对于空头头寸为20日最高价
,如果价格波动与头寸背离至20日突破头寸中所有单位都会退出
海龟入市时一般不会设置离市止损价
,但会在日间盯着价格
,一旦价格穿过离市突破价
,就开始打电话下离市指令
。规则告一段落
以上就是海龟交易系统的全套法则内容
,法则的每一部分及各部分的关联构成了一个交易系统
,下面
,我们一步步实现......
不考虑N仅根据突破信号构建的策略- 源码
:https://www.ricequant.com/community/topic/62回测结果
:恩
,夏普比率0.346
,比之前的MACD结果差些
,回撤表现也不好
。这个策略中
,只是粗暴地将每次买入卖出的量控制在初始资金的1/10
,当突破55日高点买入一份
,最新价跌破20日最低价卖出一份
。反正都是追涨杀跌
,大同小异
。接下来,我把上面策略其他部分保持不变,仅引入头寸规模中N的概念来计算每次交易的单位(而不是仅简单以本金1/10来控制),看看会有什么效果。
引入N根据突破信号构建的策略- 源码同上link
。。回测结果
:回测收益 453.756%
回测年化17.218%
收益基准收益 205.066%
Sharpe 0.7499
最大回撤 32.33%
额
,夏普比率总算有大点儿提升了
,与之前没有引入N的策略相比
,表现有了很大提高
,最大回撤也由48降低到32
,这说明
,海龟体系中引入的N
,即根据过去价格波动幅度而调节开平仓的单位
,是经受得住数据考验的
。海龟策略完全体系构建最后的最后
,放上海龟体系的完全版
,Code里面包含了上一节中提到的所有环节
,注意本海龟策略是基于体系二的
,感兴趣的朋友可以尝试构建体系一
源码放送
:https://www.ricequant.com/community/topic/180 这个完全版是用Python写的
,以上的都是用Java写的
。没用到python的一些黑法术的情况下java代码190行,python代码120行。回测结果
:回测收益287.019%
回测年化收益 13.384%
基准收益 205.066%
Sharpe 0.6562
最大回撤 23.54%
opps吐血
,虽然代码蛮长运行还是挺快哒
,终于搞定
,完整版的策略包括了按照海龟中的进场
、追踪
、止损
、离场所有细节
,然而并没有什么卵用
,结果没有想象那么漂亮
,不过继续在之前的基础上把最大回撤降低到22
,我想这还是因为止损大法好的原因
,宽慰一点点
。多少自己还是体会到一个交易系统雏形构建的方方面面
,我这么对自己说
,成功完成了一次心理按摩
。最后,欢迎小伙伴就代码进行深度交流
引伸
: 本身海龟策略是基于期货的
,与证券市场有一定的差异
。另外本来海龟应用于期货
,做空成本低
。而A股做空
(融券
)成本较高
(Cry
。。这时刻还能融到券吗
?),所以上面的都没有涉及到做空
。另外
,毕竟是上世纪的老策略
,效果也只能听天由命了
。不过新手学习瞻仰体会实现下收获还是很有
,我们尝试理解其内在逻辑
、结构框架以及体系各部分的相互制约是价值所在
。海龟策略基于ATR的止损规则是有一定借鉴意义的
,感觉比僵硬设置止损线
“科学
”一些
,有兴趣可以专门控制变量进行下对比
,是骡子是马就清楚了馓
。https://www.ricequant.com/community/topic/62https://www.ricequant.com/community/topic/180 Python完全版