暑假在家發(fā)現(xiàn)了Ricequant這個(gè)挖金礦的地方
,狠狠泡了些日子
,津
(hun
)津
(hun
)有
(yu
)味
(shui
)地閱讀API文檔
,一步步把海龜?shù)妮喞獦?gòu)建起來(lái)
。選擇實(shí)現(xiàn)海龜策略也是有原因的
,海龜交易法則不是僅僅停留在指標(biāo)系統(tǒng)的階段
,準(zhǔn)確說(shuō)
,它已經(jīng)正真意義上的形成了交易系統(tǒng)的雛形
,它涵蓋了交易的各個(gè)方面
,沒(méi)有給交易員留下主觀想象決策的余地
,這正好使得程序化操作該系統(tǒng)的優(yōu)勢(shì)得到發(fā)揮
。這一步步敲擊代碼的過(guò)程中收獲還是不少
,今天我也來(lái)放上自己的思考和代碼與大家伙分享
。首先,我們從趨勢(shì)策略說(shuō)起......在國(guó)內(nèi)A股濃厚的追漲殺跌氣氛中
,第一感覺(jué)趨勢(shì)追隨策略簡(jiǎn)單粗暴有效
,不過(guò)我覺(jué)得
,看待一個(gè)策略就像看待一個(gè)人一段歷史一樣
,時(shí)間拉長(zhǎng)
,作出評(píng)價(jià)才更加客觀
。我們先來(lái)看看API中自帶的基于趨勢(shì)指標(biāo)MACD的策略
,關(guān)于MACD的介紹可以戳Technical Analysis from A to Z
,A Primer On The MACD
,MACD Histogram Helps Determine Trend Changes(
http://www./articles/technical/082701.asp)
,以及計(jì)算公式
。為消除選股因素影響
,交易標(biāo)的使用日指數(shù)數(shù)據(jù)CSI300.INDX
。為和后續(xù)策略對(duì)比
,回測(cè)時(shí)間統(tǒng)一設(shè)定為20050104-20160310這十年時(shí)間
。(源碼
:https://www./community/topic/62)十一年回測(cè)只用不到6秒
(時(shí)光時(shí)光慢些吧
。。)回測(cè)收益 209.829% 回測(cè)年化收益 11.067% 基準(zhǔn)收益 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
嗯...好像并沒(méi)有想象那么好
,平時(shí)看交易軟件上的MACD覺(jué)得靠譜得不要不要的
,不過(guò)這樣看也沒(méi)有那么神吶
,最大回撤快五十了額
,我是不敢把銀子交給它...睡不著覺(jué)啊
,不過(guò)夏普0.80
,十年時(shí)間
,也不容易......也算差強(qiáng)人意了
。好了
,下面切換到我們的正題
:海龜交易法則
。聽(tīng)我一本正經(jīng)地娓娓道來(lái)
:海龜交易法則背景
說(shuō)到海龜交易
,不得不提他的創(chuàng)始人--Richard Dennis
Riachard Dennis是七八十年代著名的期貨投機(jī)商
,是一位具有傳奇色彩的人物
,在多年的投機(jī)生涯中
,Dennis出盡風(fēng)頭
,給人的感覺(jué)是常??梢栽谧畹忘c(diǎn)買(mǎi)進(jìn)
,然后在最高峰反手賣(mài)空
。他相信優(yōu)秀的交易員是后天培養(yǎng)而非天生的
。他在1983年12月招聘了23名新人
,昵稱(chēng)為海龜
,并對(duì)這些交易員進(jìn)行了一個(gè)趨勢(shì)跟蹤交易策略培訓(xùn)
。隨后給予每個(gè)新人100萬(wàn)美元的初始資金
。經(jīng)5年的運(yùn)作
,大部分
“海龜
”的業(yè)績(jī)非常驚人
,其中最好的業(yè)績(jī)達(dá)到1.72億美元
。N年后海龜交易法則公布于世
,我們才有幸看到曾名噪一時(shí)的海龜交易法則全貌
。(畫(huà)外音
:能夠開(kāi)發(fā)出領(lǐng)先時(shí)代的交易模型
,收益是多么誘人
!)
海龜交易法則內(nèi)容海龜交易法則的原版書(shū)籍可以猛戳
(http://bigpicture./comments/files/turtlerules.pdf)這里先畫(huà)個(gè)簡(jiǎn)單的思維導(dǎo)圖表示下海龜交易法則的基本框架
:下面一個(gè)個(gè)具體來(lái)說(shuō)
:市場(chǎng):海龜們都是期貨交易者
,海龜們只選擇有一定交易量流動(dòng)性高的市場(chǎng)
。這里我選擇日指數(shù)數(shù)據(jù)CSI300.INDX
,一方面是為了更好與基準(zhǔn)比較
,另一方面也是因?yàn)樵摌?biāo)的可以不用擔(dān)心流動(dòng)性的問(wèn)題
。頭寸規(guī)模:頭寸規(guī)模是海龜交易系統(tǒng)最重要的部分之一
。頭寸規(guī)模是海龜交易系統(tǒng)最重要的部分之一
。頭寸規(guī)模是海龜交易系統(tǒng)最重要的部分之一
。海龜交易法則根據(jù)一個(gè)市場(chǎng)的絕對(duì)波動(dòng)幅度來(lái)調(diào)整頭寸規(guī)模
,也就是將頭寸的絕對(duì)波動(dòng)幅度進(jìn)行了標(biāo)準(zhǔn)化
。比如
,投資標(biāo)的的價(jià)值波動(dòng)性較強(qiáng)時(shí)
,可以減少持有量
,相反
,當(dāng)它的價(jià)值波動(dòng)性較弱時(shí)候
,可以增加持有量
。總而言之
,市場(chǎng)的波動(dòng)性與頭寸規(guī)??梢韵嗷サ窒?h-char style="BOX-SIZING: border-box; POSITION: relative" unicode="3002">
。海龜用一個(gè)被稱(chēng)為N的概念來(lái)表示某個(gè)市場(chǎng)根本的波動(dòng)性
,它表示單個(gè)交易日某個(gè)特定市場(chǎng)所造成的價(jià)格波動(dòng)的平均范圍
,它同時(shí)也涵蓋了開(kāi)盤(pán)價(jià)的缺口
。其實(shí)這個(gè)所謂的N
,就是我們平常所熟悉的ATR
,關(guān)于ATR的介紹
,可以戳AVERAGE TRUE RANGE(
http://www./Customer/Resources/TAAZ/Default.aspx?p=35)
以下為計(jì)算公式:TR=Max(H-L,H-PDC,PDC-L)其中
: TR=真實(shí)波幅
H=當(dāng)日最高價(jià)
L=當(dāng)日最低價(jià)
PDC=前一日收盤(pán)價(jià)
N(即ATR)的計(jì)算公式如下(其實(shí)就是前面計(jì)算所得TR的20日移動(dòng)平均)
:N=(19*PDN+TR)/20其中
: PDN=前一日N值
TR=當(dāng)日的真實(shí)波動(dòng)幅度
有了N之后
,下一步可以計(jì)算絕對(duì)波動(dòng)幅度
,也就是用根本的市場(chǎng)價(jià)格波動(dòng)性
(用N值定義
)表示的價(jià)值量波動(dòng)性
。絕對(duì)波動(dòng)幅度=N*合約每一點(diǎn)所代表的價(jià)值最后
,海龜按照我們所稱(chēng)的單位
(Units
)建立頭寸
。使1N代表帳戶(hù)凈值的1%
。波幅調(diào)整后的頭寸單位為
:頭寸規(guī)模單位=賬戶(hù)的1%/市場(chǎng)的絕對(duì)波動(dòng)幅度
可以看出
,使用N作為市場(chǎng)波動(dòng)標(biāo)準(zhǔn)化的度量并以此作為開(kāi)倉(cāng)量及持倉(cāng)量的依據(jù)
,其背后的資金管理含義是
,即便當(dāng)日投資標(biāo)的跌幅達(dá)到N(ATR)的水平,當(dāng)日的損失都能控制在1%的總資產(chǎn)水平內(nèi)。即便當(dāng)日投資標(biāo)的跌幅達(dá)到N(ATR)的水平,當(dāng)日的損失都能控制在1%的總資產(chǎn)水平內(nèi)。 即便當(dāng)日投資標(biāo)的跌幅達(dá)到N(ATR)的水平,當(dāng)日的損失都能控制在1%的總資產(chǎn)水平內(nèi)。以書(shū)中給的參考為例
:2003年3月份民用燃料油合約
日期 | 最高價(jià) | 最低價(jià)| 收盤(pán)價(jià)| 真實(shí)波幅| 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
-------- | ---
根據(jù)12月4日的N值0.0141計(jì)算頭寸規(guī)模如下
:N=0.0141
賬戶(hù)規(guī)模=1000000美元
每一點(diǎn)的價(jià)值=42000美元
頭寸單位規(guī)模=0.011000000/0.014142000=16.88
舍去小數(shù)
,得16份合約
。另外
,海龜被限制在任何時(shí)間持倉(cāng)的單位(Units)數(shù)目
,在證券市場(chǎng)這種單一市場(chǎng)中
,最多持倉(cāng)的單位數(shù)設(shè)為4個(gè)單位
,且海龜一般每周一計(jì)算一次N用于更新單位(Units)大小
。入市:海龜?shù)娜胧幸?guī)則有兩個(gè)系統(tǒng)
,我們可以根據(jù)自己的意愿決定將凈值配置在何種系統(tǒng)上
。系統(tǒng)一
:以20日突破為基礎(chǔ)的偏短線(xiàn)系統(tǒng)
突破定義為超過(guò)前20日的最高價(jià)或者最低價(jià)
海龜總是在日間突破發(fā)生時(shí)進(jìn)行交易
,而不會(huì)等到收盤(pán)或次日開(kāi)盤(pán)
系統(tǒng)二
:以55日突破為基礎(chǔ)的較簡(jiǎn)單的長(zhǎng)線(xiàn)系統(tǒng)
只要有一個(gè)信號(hào)顯示價(jià)格超過(guò)了前55日的最高價(jià)和最低價(jià)就建立頭寸
。由于我的回測(cè)周期較長(zhǎng)
,我選擇了系統(tǒng)二
,即以55日突破為基礎(chǔ)的較簡(jiǎn)單的長(zhǎng)線(xiàn)系統(tǒng)
。追蹤:海龜交易系統(tǒng)不是一有突破信號(hào)就全倉(cāng)介入
,而是根據(jù)最新市場(chǎng)價(jià)格變化進(jìn)行逐步建倉(cāng)
。海龜在價(jià)格突破時(shí)只建立一個(gè)單位的頭寸
,在建立頭寸后根據(jù)前面指令的實(shí)際成交價(jià)為基礎(chǔ)以每突破0.5N的間隔進(jìn)行加倉(cāng)
。例如
: 黃金
:N=2.5
55日突破=310
增加的第一個(gè)單位310.00
第二個(gè)單位310.00+1/2個(gè)2.5即311.25
第三個(gè)單位311.25+1/2個(gè)2.5即312.50
第四個(gè)單位312.50+1/2個(gè)2.5即313.75
海龜被告知在接受入市信號(hào)時(shí)要非常連續(xù)
,因?yàn)橐荒曛械拇蟛糠掷麧?rùn)可能僅僅來(lái)自?xún)扇未筅A利
。止損:對(duì)大多數(shù)人來(lái)說(shuō)
,始終抱著虧損的交易終究會(huì)反轉(zhuǎn)的愿望比干脆退出虧損頭寸并承認(rèn)交易失敗要容易得多
。長(zhǎng)期看
,不會(huì)止損的交易是不會(huì)成功的
。在你建立頭寸之前
,你需要預(yù)先確定退出的點(diǎn)位
。如果市場(chǎng)波動(dòng)觸及你的價(jià)位
,你就必須每一次毫無(wú)例外的退出
。在這一立場(chǎng)上搖擺不定最終會(huì)導(dǎo)致災(zāi)難
。(畫(huà)外音
:前段時(shí)間大家應(yīng)該體會(huì)比較深刻吧
。)
止損標(biāo)準(zhǔn)
海龜以頭寸風(fēng)險(xiǎn)為基礎(chǔ)設(shè)置止損
,任何一筆交易不能出現(xiàn)2%以上的風(fēng)險(xiǎn)
,因?yàn)閮r(jià)格波動(dòng)1N表示1%的賬戶(hù)凈值
,容許風(fēng)險(xiǎn)為2%的最大止損就是價(jià)格波動(dòng)2N
,為了保證全部頭寸的風(fēng)險(xiǎn)最小
,如果另外增加了單位
,前面單位的止損需提高0.5N
。例如
: 原油
:N=1.255 日突破=28.30
第一單位 28.30 25.90
離市:艱難的離市
對(duì)于大多數(shù)交易員
,海龜離市規(guī)則是系統(tǒng)法則中唯一最難的部分
。等待10或20新低出現(xiàn)通常意味著眼睜睜瞅著20%
,40%甚至100%的利潤(rùn)化為泡影
。海龜交易法則對(duì)于系統(tǒng)一系統(tǒng)二有著不同的離市標(biāo)準(zhǔn)
:系統(tǒng)一
:離市對(duì)于多頭頭寸為10日最低價(jià)
,對(duì)于空頭頭寸為10日最高價(jià)
。如果價(jià)格波動(dòng)于頭寸背離至10日突破頭寸中所有單位都會(huì)退出
系統(tǒng)二
:離市對(duì)于多頭頭寸為20日最低價(jià)
,對(duì)于空頭頭寸為20日最高價(jià)
,如果價(jià)格波動(dòng)與頭寸背離至20日突破頭寸中所有單位都會(huì)退出
海龜入市時(shí)一般不會(huì)設(shè)置離市止損價(jià)
,但會(huì)在日間盯著價(jià)格
,一旦價(jià)格穿過(guò)離市突破價(jià)
,就開(kāi)始打電話(huà)下離市指令
。規(guī)則告一段落
以上就是海龜交易系統(tǒng)的全套法則內(nèi)容
,法則的每一部分及各部分的關(guān)聯(lián)構(gòu)成了一個(gè)交易系統(tǒng)
,下面
,我們一步步實(shí)現(xiàn)......
不考慮N僅根據(jù)突破信號(hào)構(gòu)建的策略- 源碼
:https://www./community/topic/62回測(cè)結(jié)果
:恩
,夏普比率0.346
,比之前的MACD結(jié)果差些
,回撤表現(xiàn)也不好
。這個(gè)策略中
,只是粗暴地將每次買(mǎi)入賣(mài)出的量控制在初始資金的1/10
,當(dāng)突破55日高點(diǎn)買(mǎi)入一份
,最新價(jià)跌破20日最低價(jià)賣(mài)出一份
。反正都是追漲殺跌
,大同小異
。接下來(lái),我把上面策略其他部分保持不變,僅引入頭寸規(guī)模中N的概念來(lái)計(jì)算每次交易的單位(而不是僅簡(jiǎn)單以本金1/10來(lái)控制),看看會(huì)有什么效果。
引入N根據(jù)突破信號(hào)構(gòu)建的策略- 源碼同上link
。。回測(cè)結(jié)果
:回測(cè)收益 453.756%
回測(cè)年化17.218%
收益基準(zhǔn)收益 205.066%
Sharpe 0.7499
最大回撤 32.33%
額
,夏普比率總算有大點(diǎn)兒提升了
,與之前沒(méi)有引入N的策略相比
,表現(xiàn)有了很大提高
,最大回撤也由48降低到32
,這說(shuō)明
,海龜體系中引入的N
,即根據(jù)過(guò)去價(jià)格波動(dòng)幅度而調(diào)節(jié)開(kāi)平倉(cāng)的單位
,是經(jīng)受得住數(shù)據(jù)考驗(yàn)的
。海龜策略完全體系構(gòu)建最后的最后
,放上海龜體系的完全版
,Code里面包含了上一節(jié)中提到的所有環(huán)節(jié)
,注意本海龜策略是基于體系二的
,感興趣的朋友可以嘗試構(gòu)建體系一
源碼放送
:https://www./community/topic/180 這個(gè)完全版是用Python寫(xiě)的
,以上的都是用Java寫(xiě)的
。沒(méi)用到python的一些黑法術(shù)的情況下java代碼190行,python代碼120行。回測(cè)結(jié)果
:回測(cè)收益287.019%
回測(cè)年化收益 13.384%
基準(zhǔn)收益 205.066%
Sharpe 0.6562
最大回撤 23.54%
opps吐血
,雖然代碼蠻長(zhǎng)運(yùn)行還是挺快噠
,終于搞定
,完整版的策略包括了按照海龜中的進(jìn)場(chǎng)
、追蹤
、止損
、離場(chǎng)所有細(xì)節(jié)
,然而并沒(méi)有什么卵用
,結(jié)果沒(méi)有想象那么漂亮
,不過(guò)繼續(xù)在之前的基礎(chǔ)上把最大回撤降低到22
,我想這還是因?yàn)橹箵p大法好的原因
,寬慰一點(diǎn)點(diǎn)
。多少自己還是體會(huì)到一個(gè)交易系統(tǒng)雛形構(gòu)建的方方面面
,我這么對(duì)自己說(shuō)
,成功完成了一次心理按摩
。最后,歡迎小伙伴就代碼進(jìn)行深度交流
引伸
: 本身海龜策略是基于期貨的
,與證券市場(chǎng)有一定的差異
。另外本來(lái)海龜應(yīng)用于期貨
,做空成本低
。而A股做空
(融券
)成本較高
(Cry
。。這時(shí)刻還能融到券嗎
?),所以上面的都沒(méi)有涉及到做空
。另外
,畢竟是上世紀(jì)的老策略
,效果也只能聽(tīng)天由命了
。不過(guò)新手學(xué)習(xí)瞻仰體會(huì)實(shí)現(xiàn)下收獲還是很有
,我們嘗試?yán)斫馄鋬?nèi)在邏輯
、結(jié)構(gòu)框架以及體系各部分的相互制約是價(jià)值所在
。海龜策略基于ATR的止損規(guī)則是有一定借鑒意義的
,感覺(jué)比僵硬設(shè)置止損線(xiàn)
“科學(xué)
”一些
,有興趣可以專(zhuān)門(mén)控制變量進(jìn)行下對(duì)比
,是騾子是馬就清楚了馓
。https://www./community/topic/62https://www./community/topic/180 Python完全版