[TS懶人包] [保險服務]

2009年9月17日 星期四

程式交易 - Pairs Trading

最近有個朋友在 msn 問我關於 Pairs Trading 的程式寫法…我才發現自己並沒有研究到這塊…目前接觸到的市場還太少了…我的印象裡只有在外匯常玩 Pair Trade,大概會類似同時買進美元並且作空日元之類的。

今天花了點時間想一下要怎麼樣在一隻程式裡面…條件相同的情況下一邊作多一邊作空。這邊就簡單介紹一下。

首先這是網路上抓到的介紹:

配對交易(Pairs Trading)又稱為價差交易或是統計套利,它提供投資人在二種相關性資產間的交易契機,而所依循的價格數理邏輯很簡單,只要二種資產(或證券)在價格上具備高度相關,假設他們的股價數學關連性會持續存在,縱使短期這個數學關係中斷,經過一段時間後必將恢復,而中斷的時間就存在套利交易的空間了!

接著就是在 TS 上要怎麼做到這個?

首先就是開兩組 K 線圖出來:


注意一下 Symbol name 的部份…可以看到左邊的部份我在上面的 K 線圖放上了 FITX 這個 symbol 而在第二個 symbol 的部份放上了 TTXN 這個 symbol。(很抱歉…其實兩個都是台指期的資料)
另外在右邊的部份上面的 K 線圖則是 TTXN,下方則是 FITX。

也就是在你要執行 Pairs Trading 的兩個商品…分別放在兩個 Charts windows 的第一 symbol。

這是因為 TradeStation 在買賣訊號只能在第一個 symbol 上面產生訊號的關係。


接著就是程式的寫法了:

if getsymbolname of data1 = "FITX" then begin
if average(close of data1, 10) cross under average(close of data1, 20) and close of data2 > average(close of data2, 30) then
sell next bar at market;
if average(close of data1, 10) cross over average(close of data1, 20) and close of data2 < average(close of data2, 30) then
buy next bar at market;
end;


if getsymbolname of data1 = "TTXN" then begin
if average(close of data2, 10) cross under average(close of data2, 20) and close of data1 > average(close of data1, 30) then
buy next bar at market;
if average(close of data2, 10) cross over average(close of data2, 20) and close of data1 < average(close of data1, 30) then
sell next bar at market;
end;


同樣只用上了簡單的均線來作進出…比較重要的是…整個程式可以說利用 getsymbolname 函式分成兩大區…這兩個區塊內的條件必需是一樣的,只是在買賣的部份作了一個交換。一邊買進…另一邊就是賣出。

把這個程式放進 K 線如下(把圖放靠近一點方便對照):


可以看到兩個商品的買賣訊號是相對的…也就完成了 Pairs Trading 了。

不過這樣的寫法其實有一個比較不方便的地方…那就是兩個商品的週期最好是一樣的。如果兩個商品使用的週期不同…那會因為程式判斷的週期不一樣產生錯誤。

這樣的寫法主要是方便自動下單…如果是要人工操作的話…其實應該用指標會更簡單一點,以上面的程式為例,我寫了這樣的一個指標:


vars:pair(0);


if average(close of data1, 10) cross under average(close of data1, 20) and close of data2 > average(close of data2, 30) then
pair = -1;
if average(close of data1, 10) cross over average(close of data1, 20) and close of data2 < average(close of data2, 30) then
pair = 1;

plot1(pair, "pair");


這樣的指標顯示出來的結果如下:



也就是指標轉 1 的時候買進 FITX 賣出 TTXN,指標轉 -1 的時候賣出 FITX 買進 TTXN。

7 則留言:

  1. 你好,我叫Jack,
    想請問一下,如果用Pair Trade進場兩個商品,要怎麼用程式碼設定"整體的停利點"(而不是單邊的停利)並且同時出掉兩邊。

    因為我使用setprofittarget,好像只能對單一商品設停利。

    如果願意的話,可以跟我分享一下嗎?
    我的email:smallli777@gmail.com

    回覆刪除
    回覆
    1. pair trade 的話…那大概有兩種作法… 一種是開二個 chart ,並且在這二個 chart 都放上同一個商品的 data2 資料…策略主要開發就是用這個 data2 資料,然後分別作買、賣單到 data1 的商品去。

      第二種呢…就是透過外部 dll 來做…

      因為二個 chart 的資料是沒辦法互傳的…所以你要做到的「整體停利點」其實是不容易達到的~

      刪除
  2. 你好,我叫Jack,還有另一個關於Tradestation的問題是,

    Tradestation是每根K線完成後才計算訊號,到下一根K線送出,可以改成tick來計算讓速度快一點嗎 ?

    回覆刪除
    回覆
    1. 你需要的應該是 This bar 的進出了,這應該要去用 TS8 才會有這個功能,或是用 MC 並在策略裡打開 IOG,不過我對 This bar 和 IOG 都沒什麼研究~

      因為我總覺得還是很容易有問題~

      刪除
  3. 請問DK大,你說或是用 MC 並在策略裡打開 IOG
    請問要如何打開或關閉呢?
    還是策略裡出現哪些指令就代表有用到 IOG?
    小弟今天用MC做細部回測,看到數據後整個傻眼...

    回覆刪除
  4. 我找到了,原來是在設定訊號..設定..k棒內產生委託
    原始設定好像是關閉IOG 的

    我剛好和樓上的Jack相反,我希望每根K線完成後才計算訊號
    不要改成tick來計算,因為策略裡進單條件會和前幾根K棒做比較,買單也都用buy next bar at XXX stop;只是昨天爬文才知道在策略中若出現SET STOP等等就要開細部回測,原來MC回測有這麼多眉角,或說是陷阱,一直以來都不知道,慘~~

    DK大可以指導一下何謂SET STOP等需要開細部回測的指令或訊號嗎?小弟真是傻了,被粉擦很厚的回測報告騙了都不知道 ><"

    回覆刪除
  5. set 類的指令都不需要開所謂的細部回測~執行結果會是正確的。

    粉擦很厚倒是不至於啦…如果你沒開 IOG 的,而且進出都是用 next bar,那回測報告就會是正確的~

    回覆刪除

請留下您的大名…匿名者恕不回應…

Related Posts Plugin for WordPress, Blogger...