零基礎入門商品期貨程序化交易(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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章