您好,登錄后才能下訂單哦!
小編給大家分享一下互聯網中如何利用回歸幅度構建多品種反轉策略,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
策略原理
價格反轉是一種能量轉換的結果,是一個艱難的過程,需要充分的時間、空間進行能量的交換。但正如能量守恒定律,時間可以換取空間,反之空間可以抵消時間。反轉中既有激烈的單日V型反轉,又有耗時頗巨的圓底與圓頂,V型反轉,直來直去,干凈利落,無半點喘息時間。
相對而言,基于固定點位的反轉,可能會受制于品種價格波動率的變化而變化,但是基于固定百分比幅度的反轉,則較少受到類似的困擾,除非該品種的波動性水平已經發生變化。本策略正是基于這一點。
同樣,在這個策略中,并沒有定義如何區分趨勢和震蕩,而是直奔主題,根據當前價格與前期高低點的關系來開平倉。因為不管是趨勢還是震蕩,這些都只是人為主觀定義的一個概念,在行情走出來之前,誰也不知道是趨勢還是震蕩,所以這些主觀定義是典型的事后分析時用到的概念。
況且,在不同的時間與趨勢結構力度框架下,震蕩與趨勢基本上很難準確的定義,大周期的震蕩就是小周期的趨勢。那么也就是說,在行情沒有走出來的之前,對行情進行震蕩與趨勢的分析定義,也是沒有意義的。
策略構建
第一步,我們先來看下策略框架,在fmz網站的策略廣場,有很多不同種類的策略框架,這些框架可以用于不同的策略類型,簡單方便還能節省不少時間,比如本篇的利用回歸幅度構建多品種反轉策略,就比較適合使用CTA策略框架。具體的使用方法,可以參考這個鏈接
該策略框架后臺自動提供數據和基礎服務,借助該策略框架可以大幅提高策略編寫效率,正常幾百行的策略,用CTA策略框架幾十行就能實現一個并發穩定可實盤的多品種策略。另外,配合專門的程序化交易數據結構和豐富的金融統計函數庫,同樣支持復雜的邏輯應用,簡單又不失靈活。如下:
function main() { $.CTA("RB000,RU000,CF000,TA000,I000,PP000,P000,L000,J000,JM000", function(st) { var bars = st.records; // 獲取K線數組 // K線長度過濾 if (bars.length < 20) { return } var unit = 1; // 下單數量 var buyToOpen = '多頭開倉條件'; var buyToClose = '多頭平倉條件'; var sellToOpen = '空頭開倉條件'; var sellToClose = '空頭平倉條件'; // 多頭平倉 if (buyToClose) { return -unit; } // 空頭平倉 if (sellToClose) { return unit; } // 多頭開倉 if (buyToOpen) { return unit; } // 空頭開倉 if (sellToOpen) { return -unit; } }); }
第二步,開始在CTA框架中填充策略邏輯,首先給每個合約創建一個倉位表。大家知道,不同品種在不同行情中,開平倉的時機是不一樣的,比如:螺紋鋼開了多單,橡膠開了空單;或者螺紋鋼平倉了,橡膠還持有空單。所以倉位表可以針對具體合約分別記錄和管理持倉,如下:
contractType = 'rb000/rb888,ru000/ru888'; // 合約類型 var contractType_Dic = {}; // 創建一個空對象,用于接收不同的合約類型 var contractType_Array1 = contractType.split(","); // 分割合約類型參數 var contractType_Array2 = []; // 創建一個空數組,用于接收不同的交易合約 for (var i = 0; i < contractType_Array1.length; i++) { // 遍歷每個設置的合約 contractType_Array2.push(contractType_Array1[i].split('/')[1]); // 分別存儲交易合約 } contractType_Array2.toString(); // 把數組轉變為字符串 for (var key in contractType_Array2) { // 遍歷字符串 contractType_Dic[contractType_Array2[key]] = { falsePosition: 0 // 把每個交易合約的初始倉位賦值為0 } } Log(contractType_Dic) // 查看處理好的倉位表,打印:{ rb888: { falsePosition: 0 }, ru888: { falsePosition: 0 } }
第三步,把策略開平倉邏輯寫到里面就可以了。其中用到了K線周期內最高價和最低價與當前價格的相互位置關系。策略沒有附帶止盈止損,只有開倉和平倉,核心思想就是:截斷虧損,讓利潤奔跑!大家注意看下面策略代碼中的注釋。
多頭開倉:如果當前沒有持倉,并且價格大于前 N 根 K 線內的最低價 + 百分比幅度。
空頭開倉:如果當前沒有持倉,并且價格小于前 N 根 K 線內的最高價 - 百分比幅度。
多頭平倉:如果當前持有多單,并且價格小于前 N 根 K 線內的最低價與前 N 根 K 線內的最高價的和的一半。
空頭平倉:如果當前持有空單,并且價格大于前 N 根 K 線內的最低價與前 N 根 K 線內的最高價的和的一半。
function main() { // 參數 cycleLength = 50; // 周期長度 backRatio = 1; // 回撤比率 contractType = 'rb000/rb888,ru000/ru888'; // 合約類型 unit = 1; // 下單數量 // 倉位表 var contractType_Dic = {}; // 創建一個空對象,用于接收不同的合約類型 var contractType_Array1 = contractType.split(","); // 分割合約類型參數 var contractType_Array2 = []; // 創建一個空數組,用于接收不同的交易合約 for (var i = 0; i < contractType_Array1.length; i++) { // 遍歷每個設置的合約 contractType_Array2.push(contractType_Array1[i].split('/')[1]); // 分別存儲交易合約 } contractType_Array2.toString(); // 把數組轉變為字符串 for (var key in contractType_Array2) { // 遍歷字符串 contractType_Dic[contractType_Array2[key]] = { falsePosition: 0 // 把每個交易合約的初始倉位賦值為0 } } // CTA框架 $.CTA(contractType, function(st) { var bars = st.records; // 獲取K線數組 var j = bars[bars.length - 2].Close; // 獲取上根K線收盤價 var high = TA.Highest(bars, cycleLength, 'High'); // 計算N日內的最高價 var low = TA.Lowest(bars, cycleLength, 'Low'); // 計算N日內的最低價 var highBack = high * (1 - backRatio / 100); // 計算N日內的最高價的回撤1%的值 var lowBack = low * (1 + backRatio / 100); // 計算N日內的最低價的回撤1%的值 // 過濾K線數量 if (!bars || bars.length < cycleLength + 1) { return; } //多頭平倉 if (contractType_Dic[st.symbol].falsePosition > 0 && j < (lowBack + highBack) / 2) { contractType_Dic[st.symbol].falsePosition = 0; return -unit; } //空頭平倉 if (contractType_Dic[st.symbol].falsePosition < 0 && j > (lowBack + highBack) / 2) { contractType_Dic[st.symbol].falsePosition = 0; return unit; } //多頭開倉 if (contractType_Dic[st.symbol].falsePosition == 0 && j > lowBack && j > highBack) { contractType_Dic[st.symbol].falsePosition = 1; return unit; } //空頭開倉 if (contractType_Dic[st.symbol].falsePosition == 0 && j < lowBack && j < highBack) { contractType_Dic[st.symbol].falsePosition = -1; return -unit; } }); }
完整策略源碼已經公開到發明者量化 https://www.fmz.com/strategy/69937 ,無需配置直接回測。
策略改進
總的來說,這是一個通用性極強的策略。當然這只是個簡單的策略思路,該策略或許可以在其他地方改進:
1、增加波動率因子。我們都知道,每個品種的都有其性格,基本面與技術面互相影響。增加波動率因子,可以更客觀的反映出當前品種的價格走勢。
2、將固定周期改為自適應周期。這個策略核心參數,其實只有一個,而且參數是固定。如果我們通過價格變化速度與加速度的關系,動態的將固定參數加減,可以更能即時反映當時的行情。
3、將百分比回撤改為固定的數值。舉個例子,如果當前價格是1000,那么其1%就是10;如果當前價格是5000,那么其1%就是50。10與50之間在相差了好幾個數量級。同樣的合約品種,因為不同時期的當前價格,結果導致開平倉條件相差很大。
以上是“互聯網中如何利用回歸幅度構建多品種反轉策略”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。