顯示具有 Power Language 標籤的文章。 顯示所有文章
顯示具有 Power Language 標籤的文章。 顯示所有文章

2013年12月6日 星期五

波段突破策略(with ATR)

 

紀錄一個常用也好用的邏輯,突破策略。區間突破最常使用在當沖程式裡,不過波段的程式使用起來也不差,基本邏輯就是由開盤向上漲多少要突破作多,向下跌多少要突破做空,很單純,最主要的因素只有這個突破的臨界點是如何決定?

 

先前曾經紀錄過簡單當沖突破的測試 - 當沖逆勢單進場。其中提到開盤點為準,漲50點作多,跌50點作空,如果沒翻就擺到收盤,這樣的邏輯在近年是無法獲利的。但是波段程式就不一樣了,能獲利。只是突破的區間要思考,不是單純點數或比例就能適用的。

 

這時 Average True Range(ATR) 平均真實範圍 就是個好用的指標,當行情波動大時,這個區間確認也應該放大,波動小時,則區間也小,因此加上波動性的指標有用處,ATR比其它波動性指標直接方便的是它本身就是價格的表示,而不是比例或無法對應的數字。例如ATR 100點,就是近期日高低點數平均在100點,而開盤後往上50點或往下50點的區間內都很正常,而我們設定的突破邏輯就是市價漲超過50點作多,跌超過50點作空。

 

搭配觀察指標和策略訊號的程式碼範例如下。

 

id

 

bkatr

 

在策略設計的部份只有一個參數,是要決定ATR用多少期間,其中變數TRX是每日的TR值,ATR用來紀錄…ATR,TR的陣列和其中註記//replace AverageArray的部份是因為Multicharts內建的AverageArray用起來不對勁,就自己再寫進策略裡,內容就是把TRX一個個放進TR陣列裡,放到最後一個時順便算一下裡面那些TR的平均值紀錄到ATR。

 

再詳細一點的紀錄程式,因為ATR在這個例子中使用的是日線層級,但實際運用的K線可能是10min、5min、8min之類的,會要再搭配其它的指標,所以才使用這種Array的方式將TR記錄下來,在新的一天開始時計算一次( date <> date[1] ),然後看是要多少個TR的平均,一個一個放進去,另外特別注意Array第一個位置是0起始,所以for迴圈裡目標值減一,這樣個數才對。

 

這個Array+For迴圈的方法在使用不同k線層級的指標時蠻好用的,可以多加利用,如果是常coding的朋友可能會覺得一個地方怪怪的,平常都是for i=0 to X,這邊因為i是 Multicharts 的關鍵字所以不能用,常常都要再改成 j….,是特別的習慣。

 

回到突破邏輯,以ATR所計算的近日高低作為區間,它近期的進出及績效(2005~2013,10min)如下。

 

chart

 

performance

 

trade

 

以一個不加濾網、不加出場邏輯、未設停損停利的邏輯來說,這樣的績效是蠻不錯的,值得繼續研究開發。

 

延伸一點的說,區間可以使用其它的波動性指標來調整、或直接用N日高低區間、或布林通道的區間、或參考CDP之類的,都可嘗試看看。這樣的突破邏輯應該是每個人都會測試過的基本款,不過應用時如何決定區間指標和如何搭配濾網就是深入的工夫了。

 

 

2013年11月13日 星期三

歷史波動率策略設計

 

在 歷史波動率 這一篇中紀錄了歷史波動率的計算和指標語法,就可以拿來作為策略訊號的設計或濾網,基礎想法是在於波動率期間的比較,如果短期的波動率小於長期的波動率,表示目前行情較為穩定、黏著、緩慢,也比較像是多頭的環境中表現的狀況。反之,若短期的波動率大於長期的波動率,表示目前行情的波動較快速、急拉急殺,可能有恐慌氣氛,那就像是空頭盤勢了。

 

以上述波動率比較作為濾網,嘗試搭配最根本的均線策略邏輯,市價大於均線作多、市價小於均線作空,設計一個留倉長波段策略來觀察表現,程式碼如下列:

 

CODE

 

 

主要邏輯在第11、12列,如前述,另出場條件設定為市價反向跌/漲破均線時多少點該出場。以上參數也列出來了,讀者可以自行練習邏輯和參數調整。範例策略使用30分線的週期,進出場的價位節錄如下圖。

 

pic

 

可以先預想勝率和盈虧比和強弱處,它就和基本的均線策略一樣,大波段可以獲利,均線黏著時易洗刷,勝率應低於40%,盈虧比應高於2.5,drawdown起碼25萬以上。就以上圖來觀察,搭配波動率作濾網是有效果的,避開了不少次無謂的洗刷。績效報告如下圖 (2005~2013,交易費用800)。

 

績效結果

 

交易分析

 

績效報告中,最大的亮點是盈虧比很高,尤其是空單的表現,表示這個策略在空方勢時可以抱的很緊、很久。pro/DD 和 kelly值也相當不錯,更多的策略評估可以參考 交易策略評估-Kelly formula 、 交易策略評估-獲利風險比 、交易策略評估-損益期間 。

 

以上,是利用歷史波動率作為策略邏輯的應用,參數都是經過最佳化的,另外值得注意的是這個策略2013年表現並不突出,不至虧損,但幾乎無獲利,因此若要當作實戰的交易邏輯還有得思考修改。

 

 

2013年7月23日 星期二

Multicharts跨圖表傳遞資料

 

在MultiCharts裡有時候會想要引用不同圖表的資料,這個資料可能是價格、計算的指標值、或是某一個圖表訊號的部位,例如B圖表想要參考A圖表策略的目前部位為何?

 

不同圖表間資料的傳遞可以利用下面內建的函數,

GVSetNamedDouble

GVSetNamedInt

GVGetNamedDouble

GVGetNamedInt

 

Set就是存值,Get就是取值。Int是存整數,Double是存小數。

 

以一個傳遞訊號部位的例子來說明,建立兩個indicator,一個是PositionSource,將部位值存起來。一個是PositionDestination,將部位值取出來。

 

PositionSource範例程式如下,

 

PositionSource

 

行號4,將IntrabarOrderGeneration開啟,原因是部位可能每個TICK就有變動,這要看你的Signal是不是用到,一般來說,如果用到SetStop這類函數,就要把這個IOG打開。

 

行號6,和上面同樣理由,宣告一個IOG的變數PositionSource

 

行號8,i_MarketPosition 和 i_CurrentContracts 是部位方向和部位口數,兩個值就是在Siganl裡寫的MarketPosition和CurrentContracts,因為這裡寫的是指標,所以就用前面+ i_的。兩個值相乘後存到PositionSource這個變數裡,例如作空一口值是-1,作多兩口值是2。

 

行號10,呼叫GVSetNamedInt函數,將PositionSource的值,存到前面引號內的變數名,這邊同樣也取作PositionSource,這個名字就是給其它圖表呼叫用的。另外,這個例子傳遞部位值使用整數Int就可以了。

 

PositionDestination範例程式如下,

 

 

PositionDestination

 

前面一樣設定相關IOG,行號8將PositionSource的值取出來,存到變數Position中,第二個參數的說明並不清楚,函數說明僅寫是ErrorCode,推測是取不到值發生錯誤該傳什麼值,這個填一個數字就行了。

 

應用上,這個部位也可以拿來再和自己的部位相加,或是取其它資料時再拿來運算。只是這個取的值,只有存最後的狀態而已,如果需求是要拿來回測就沒辦法了,要用一般多新增Data的方式才可以回測。

 

 

2013年5月22日 星期三

逆勢策略 - HighShort - LowBuy

 

逆勢策略這篇中提到好幾種逆勢交易的方法,此篇來實作長短期間的逆勢單。

 

若只單純的因為漲多了就去放空,或跌多了就去作多,這樣是沒辦法獲利的,還很容易虧損,所以很多人說逆勢單不會賺錢,根本捨棄了逆勢單。

 

但 L 認為逆勢單還是不可或缺的一部份,儘管它只是很小一部份,但它也不需要輸出多少獲利,只要長期下來是打平或是小贏就已足夠,因為有它在策略組合內,可以更有效降低整體組合的Drawdown

 

同時,我們需要利用它的特性,目標勝率高、停利快,讓整體組合的損益更平滑。試想一個上沖下洗的交易日裡,趨勢單和突破單虧損連連時,一支小賺的逆勢單就突顯了它的價值。

 

我們要想的是逢高放空及逢低作多,先思考這樣作有效嗎?

為什麼逢高放空後,市場就該跌?

 

以長短期區間這個方法來解釋,原因是長期間的方向,代表了趨勢,而我們在短期間找尋逆勢的機會,如下圖顯示

 

HighShort示意圖

 

 

藍色雙箭頭表示一個較長的期間,目前的價格位置是在整個期間裡偏低的位置,我們假設趨勢是偏空的。

 

紅色雙箭頭表示一個較短的期間,目前的價格位置是在整個期間裡偏高的位置,對應長期趨勢是偏空,我們找尋一個高點開始往下跌的位置作空,例如綠色圈圈的價格。

 

這樣想還算合理,實作上要怎麼設計呢? 有一些不同的方法,例如