1. 程式人生 > 其它 >零基礎入門商品期貨程式化交易(1)

零基礎入門商品期貨程式化交易(1)

不同於區塊鏈資產交易,商品期貨交易屬於傳統交易領域。程式化交易入門有一定門檻,特別是大部分傳統交易領域的交易者對於交易都很精通,但是對於程式化相關的知識、計算機知識等知之甚少。以至於認為商品期貨程式化非常的難,想做到根據自己的思路自由、靈活的開發交易策略更是難上加難。那麼本文就從實踐出發,帶領你從0基礎進入商品期貨程式化交易的大門。

交易所、期貨公司

我們先來說說什麼是商品期貨。商品期貨交易簡單說就是大宗商品入庫註冊形成倉單,然後在商品期貨交易所掛牌交易,交易的是標準化的合約。一手合約對應了一定數量的實物,例如一手rb螺紋鋼合約對應10噸螺紋鋼。

交易所主要有:
上期所:貴金屬等
大商所:農產品等
鄭商所:化工等
中金所:金融衍生品等

互動、報單過程

首先,要在交易所交易這些商品期貨合約,你需要一個賬戶,所以便有了期貨公司。你在期貨公司開設賬戶,入金交易。不論是手動交易,例如使用一些軟體(文華財經等),向期貨公司打電話報單(現在很少了),還是使用一些程式化交易軟體傳送請求到期貨公司前置機去交易,下的交易單都會由期貨公司傳送到交易所去。這個過程需要了解。

使用者下單(軟體、策略程式等)->期貨公司(前置機伺服器)->交易所(系統)

協議

即使是手動交易,也要藉助於軟體。那麼這些軟體或者我們寫的交易策略程式是如何和期貨公司前置機通訊的呢?通常用這兩種:CTP協議易盛協議。在某個期貨公司開戶後,通常是預設開通CTP協議的,CTP協議也是使用的最多的,具體開通或者停止都是電聯期貨公司提出申請。以FMZ量化交易平臺為例:在配置商品期貨賬戶時,需要指定是那種協議接入。

期貨公司的賬戶開通了哪種協議接入,這裡就使用對應的選項就可以了。

期貨公司

期貨公司國內有很多,根據大小規模分級別,通常在A類期貨公司開戶,大的期貨公司裝置投入之類的比較多一些,更加易用、穩定。推薦使用巨集源期貨,A類期貨公司,手續費可以優惠至交易所標準加1分錢。期貨公司通常在交易所手續費、保證金基礎上增加一部分手續費、保證金,每家期貨公司各不相同,如果需要了解,可以具體諮詢期貨公司。一般期貨公司都支援CTP/易盛協議,通常是預設開通CTP協議,但是不排除有些期貨公司預設什麼都不開通,具體需要和期貨公司溝通確認。

看穿式認證

行業要求,期貨公司目前需要看穿式認證過的軟體程式才給接入前置機。目前FMZ上在配置期貨公司賬戶資訊時,輸入期貨公司名稱時,可以輸入“看穿式”來篩選出目前已經看穿式認證過的期貨公司,如圖:

如果你配置的期貨公司賬號是這些帶有看穿式認證過的期貨公司,不用任何其它設定,直接配置資金賬號、密碼即可使用。其它沒有認證過的期貨公司賬號,則需要自行向期貨公司做看穿式認證(過程通常比較長,很繁瑣),認證後獲取到appidappid對應的授權碼配置,如圖:

合約

以上提到的交易所對於合約程式碼定義並不是完全統一定義的,這類問題經常有新同學問到。我們看一些軟體上對於不同品種命名更是各種各樣。我們以FMZ量化交易平臺上對於合約程式碼的命名標準為例,在API文件上地址:https://www.fmz.com/api#期貨交易

例如上期所的螺紋鋼品種,合約程式碼是rb開頭,加上4個數字。rb2110即為螺紋鋼這個品種,2021年10月份交割的合約。

可以看到實際就是這樣組成的合約程式碼:rb-21-10

大商所的鐵礦石,合約程式碼為i開頭,加上4個數字。i2109即為鐵礦石這個品種,2021年9月交割的合約。

可以看到實際就是這樣組成的合約程式碼:i-21-09

鄭商所的甲醇,合約程式碼為MA開頭,加上3個數字。MA109即為甲醇這個品種,2021年9月交割的合約。

可以看到實際就是這樣組成的合約程式碼:MA-1-09

要注意合約程式碼是區分大小寫的,寫錯了肯定程式會報錯的。可以編寫一個策略打印出所有品種的資訊,雖然剛開始入門就接觸到編寫程式碼有點難,但是不用怕。這裡僅僅作為測試使用。

function main(){
    while(true){
        if(exchange.IO("status")){         
            var products_CZCE_Tbl = {
                "type" : "table", 
                "title" : "鄭商所 CZCE", 
                "cols" : ["商品名稱(ProductName)", "合約程式碼短名(ProductID)" , "一跳價格(PriceTick)", "一手合約乘數(VolumeMultiple)", "交易所程式碼(ExchangeID)"], 
                "rows" : [] 
            }
            var products_DCE_Tbl = {
                "type" : "table", 
                "title" : "大商所 DCE", 
                "cols" : ["商品名稱(ProductName)", "合約程式碼短名(ProductID)" , "一跳價格(PriceTick)", "一手合約乘數(VolumeMultiple)", "交易所程式碼(ExchangeID)"], 
                "rows" : [] 
            }
            var products_SHFE_Tbl = {
                "type" : "table", 
                "title" : "上期所 SHFE", 
                "cols" : ["商品名稱(ProductName)", "合約程式碼短名(ProductID)" , "一跳價格(PriceTick)", "一手合約乘數(VolumeMultiple)", "交易所程式碼(ExchangeID)"], 
                "rows" : [] 
            }
            var products_other_Tbl = {
                "type" : "table", 
                "title" : "其它", 
                "cols" : ["商品名稱(ProductName)", "合約程式碼短名(ProductID)" , "一跳價格(PriceTick)", "一手合約乘數(VolumeMultiple)", "交易所程式碼(ExchangeID)"], 
                "rows" : [] 
            }
            exchange.IO("products").forEach(function(product) {
                if (product.ExchangeID == "CZCE") {
                    products_CZCE_Tbl.rows.push([product.ProductName, product.ProductID, product.PriceTick, product.VolumeMultiple, product.ExchangeID])
                } else if (product.ExchangeID == "DCE") {
                    products_DCE_Tbl.rows.push([product.ProductName, product.ProductID, product.PriceTick, product.VolumeMultiple, product.ExchangeID])
                } else if (product.ExchangeID == "SHFE") {
                    products_SHFE_Tbl.rows.push([product.ProductName, product.ProductID, product.PriceTick, product.VolumeMultiple, product.ExchangeID])
                } else {
                    products_other_Tbl.rows.push([product.ProductName, product.ProductID, product.PriceTick, product.VolumeMultiple, product.ExchangeID])
                }                
            })
            LogStatus(_D(), "已經連線CTP", "\n`" + JSON.stringify([products_CZCE_Tbl, products_DCE_Tbl, products_SHFE_Tbl, products_other_Tbl]) + "`")  
            Sleep(1000 * 60 * 5)
        } else {
            LogStatus(_D(), "未連線CTP !")
        }
        Sleep(1000)
    }
}

策略程式碼執行起來就會顯示如圖列表資訊,可以查詢到所有的品種程式碼。

實際使用時配置交易所的問題

首先我們來學習如何在FMZ上配置一個商品期貨交易所物件(簡單說就是配置一個商品期貨賬號到FMZ上,用於讓策略自動化操作這個賬戶從而交易)。當註冊好FMZ賬號之後,登入。點選控制中心,跳轉到控制中心頁面。

然後點選交易所,跳轉至交易所頁面。

接著點選新增交易所按鈕,跳轉至交易所物件配置頁面。

我們以FMZ已經做過看穿式認證的期貨公司,巨集源期貨為例子,巨集源期貨預設開通CTP協議。所以我們設定協議為CTP協議,然後只用配置上資金賬號密碼即可。通常,左側的期貨公司前置機IP地址等資訊是用預設的就可以的,但是如果出現網路訪問不到前置機。可以試試調整使用其它線路、IP。

1、如果資金賬號、密碼設定錯誤了,在使用時會發生報錯:

看到這個錯誤,那一定是賬號或者密碼配置錯誤了,具體檢查。通常最簡單的辦法就是刪除配置的,仔細、細心的重新配置一個。

2、如果使用的期貨公司是FMZ沒有支援看穿式認證的期貨公司,也會無法通過期貨公司前置機認證,導致報錯。

3、如果錯誤登入次數過多,例如用錯誤密碼一直嘗試登入,期貨公司系統會禁止登入。

實踐一下

可以配置一下自己的期貨公司賬戶到FMZ平臺,然後使用本篇中展示所有合約品種的策略程式碼,執行起來一個實盤。在FMZ控制中心頁面,點選策略庫,跳轉到策略庫頁面。再點選新建策略按鈕,跳轉至新建策略頁面。

然後到控制中心頁面,點選實盤,跳轉到實盤頁面。再點選建立實盤按鈕,跳轉到實盤建立頁面。

往下看,到頁面下部。

一個實盤策略就建立好了,這個策略會以表格形式顯示所有的期貨交易品種。我們在實盤頁面新增上的這個“華泰期貨次席(看穿式監管)”在程式碼裡具體對應的是什麼呢?可能有的同學已經猜到,這個新增的 華泰期貨次席(看穿式監管) 對應的就是程式碼裡的交易所物件exchange