您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關(guān)python中怎么利用Pandas庫實現(xiàn)一個商品期貨網(wǎng)格策略,小編覺得挺實用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
Pandas的數(shù)據(jù)結(jié)構(gòu)
Series:一維數(shù)組,與Numpy中的一維array類似。二者與Python基本的數(shù)據(jù)結(jié)構(gòu)List也很相近。Series如今能保存不同種數(shù)據(jù)類型,字符串、boolean值、數(shù)字等都能保存在Series中。
Time-Series:以時間為索引的Series。
DataFrame:二維的表格型數(shù)據(jù)結(jié)構(gòu)。很多功能與R中的data.frame類似??梢詫ataFrame理解為Series的容器。
Panel:三維的數(shù)組,可以理解為DataFrame的容器。
Panel4D:是像Panel一樣的4維數(shù)據(jù)容器。
PanelND:擁有factory集合,可以創(chuàng)建像Panel4D一樣N維命名容器的模塊。
運用Pandas的強大特性來進行網(wǎng)格策略的編碼
網(wǎng)格策略秉持的原則是“倉位策略比擇時策略更重要”。其基本操作方式就是以某點為基點,每上漲戓下跌一定點數(shù)掛一定數(shù)量空單戓多單,設(shè)定盈利目標(biāo),但不設(shè)止損,當(dāng)價格朝期望方向進展時獲利平倉,并在原點位掛同樣的買單戓賣單。這樣布下的這些交易單形成了一張像魚網(wǎng)樣的陣列,在震蕩的市場中來回獲利。
本策略首先計算了過去300個價格數(shù)據(jù)的均值和標(biāo)準(zhǔn)差,并根據(jù)均值加減1和2個標(biāo)準(zhǔn)差得到網(wǎng)格的區(qū)間分界線,并分別配以0.3和0.5的倉位權(quán)重,然后根據(jù)價格所在的區(qū)間來配置倉位(+/-40為上下界,無實際意義):
(-40,-3],(-3,-2],(-2,2],(2,3],(3,40](具體價格等于均值+數(shù)字倍標(biāo)準(zhǔn)差)
-0.5, -0.3, 0.0, 0.3, 0.5
第一步,我們需要引入策略代碼中需要用到的庫
import types import numpy as np import pandas as pd
第二步,我們需要在發(fā)明者量化平臺初始化合約數(shù)據(jù),這個例子中,我們還是使用螺紋鋼期貨為例子。
def init(): # 訂閱螺紋鋼的2005合約,并且取得發(fā)明者量化平臺當(dāng)前周期的所有收盤價 exchange.SetContractType("rb2005") records = exchange.GetRecords() close_01 = records.Close # 獲取網(wǎng)格區(qū)間分界線 context.band = np.mean(close_01) + np.array([-40, -3, -2, 2, 3, 40]) * np.std(close_01) # 設(shè)置網(wǎng)格的倉位 context.weight = [0.5, 0.3, 0.0, 0.3, 0.5]
第三步,也是最重要的,我們開始編寫策略邏輯和實現(xiàn)自動化交易
這里需要注意的是,我們需要用到發(fā)明者量化平臺的國內(nèi)商品期貨模版,模版地址為:https://www.fmz.com/strategy/24288 各位在發(fā)明者量化策略編寫頁面進行編碼時,需要把此模版先復(fù)制到自己的策略庫,然后在回測時勾選上,這里請各位讀者注意
關(guān)于如何部署托管者和機器人,請參考我之前的文章:https://www.fmz.com/bbs-topic/4140
想購買自己云計算服務(wù)器部署托管者的讀者,可以參考這篇文章:https://www.fmz.com/bbs-topic/2848
策略邏輯與實現(xiàn)其自動化交易:
def onTick(context, bars): obj = ext.NewPositionManager() # 使用發(fā)明者量化交易類庫 # 此處用來獲取持倉信息 positions = exchange.GetPosition() # 獲取持倉數(shù)組 if len(positions) == 0: # 如果持倉數(shù)組的長度是0 return 0 # 證明是空倉,返回0 for i in range(len(positions)): # 遍歷持倉數(shù)組 if (positions[i]['Type'] == PD_LONG) or (positions[i]['Type'] == PD_LONG_YD): position_long = 1 # 將position_long標(biāo)記為1 elif (positions[i]['Type'] == PD_SHORT) or (positions[i]['Type'] == PD_SHORT_YD): position_short = -1 # 將position_short標(biāo)記為-1 bar = bars[0] # 根據(jù)價格落在(-40,-3],(-3,-2],(-2,2],(2,3],(3,40]的區(qū)間范圍來獲取最新收盤價所在的價格區(qū)間 grid = pd.cut([close_01], context.band, labels=[0, 1, 2, 3, 4])[0] # 若無倉位且價格突破則按照設(shè)置好的區(qū)間開倉 if not position_long and not position_short and grid != 2: # 大于3為在中間網(wǎng)格的上方,做多 if grid >= 3: obj.OpenLong("rb2005", 1) # 以市價單開多倉到倉位 if grid <= 1: obj.OpenShort("rb2005", 1) # 以市價單開空倉到倉位 # 持有多倉的處理 elif position_long: if grid >= 3: obj.OpenLong("rb2005", 1) # 以市價單調(diào)多倉到倉位 # 等于2為在中間網(wǎng)格,平倉 elif grid == 2: obj.closebuy("rb2005", 1) # 以市價單全平多倉 # 小于1為在中間網(wǎng)格的下方,做空 elif grid <= 1: obj.closebuy("rb2005", 1) # 以市價單全平多倉 obj.OpenShort("rb2005", 1) # 以市價單開空倉到倉位 # 持有空倉的處理 elif position_short: # 小于1為在中間網(wǎng)格的下方,做空 if grid <= 1: obj.OpenShort("rb2005", 1) # 以市價單調(diào)空倉到倉位 # 等于2為在中間網(wǎng)格,平倉 elif grid == 2: obj.closesell("rb2005", 1) # 以市價單全平空倉 # 大于3為在中間網(wǎng)格的上方,做多 elif grid >= 3: obj.closesell("rb2005", 1) # 以市價單全平空倉 obj.OpenLong("rb2005", 1) # 以市價單開多倉到倉位
最后,我們用一個Main函數(shù)把策略跑起來。這里建議大家學(xué)會部署自己的托管者,即使在自己的電腦中本地部署,這樣對于調(diào)試程序和回測交易邏輯來講都有莫大的有益,特別是對于pandas這樣的第三方庫的安裝,運用本地的anaconda環(huán)境管理軟件來管理這些python庫和環(huán)境將會起到事半功倍的效果。
以下是完整的策略代碼:
import types import numpy as np import pandas as pd # 初始化合約數(shù)據(jù) def init(): # 訂閱螺紋鋼的2005合約,并且取得發(fā)明者量化平臺當(dāng)前周期的所有收盤價 exchange.SetContractType("rb2005") records = exchange.GetRecords() close_01 = records.Close # 獲取網(wǎng)格區(qū)間分界線 context.band = np.mean(close_01) + np.array([-40, -3, -2, 2, 3, 40]) * np.std(close_01) # 設(shè)置網(wǎng)格的倉位 context.weight = [0.5, 0.3, 0.0, 0.3, 0.5] def onTick(context, bars): obj = ext.NewPositionManager() # 使用發(fā)明者量化交易類庫 # 此處用來獲取持倉信息 positions = exchange.GetPosition() # 獲取持倉數(shù)組 if len(positions) == 0: # 如果持倉數(shù)組的長度是0 return 0 # 證明是空倉,返回0 for i in range(len(positions)): # 遍歷持倉數(shù)組 if (positions[i]['Type'] == PD_LONG) or (positions[i]['Type'] == PD_LONG_YD): position_long = 1 # 將position_long標(biāo)記為1 elif (positions[i]['Type'] == PD_SHORT) or (positions[i]['Type'] == PD_SHORT_YD): position_short = -1 # 將position_short標(biāo)記為-1 bar = bars[0] # 根據(jù)價格落在(-40,-3],(-3,-2],(-2,2],(2,3],(3,40]的區(qū)間范圍來獲取最新收盤價所在的價格區(qū)間 grid = pd.cut([close_01], context.band, labels=[0, 1, 2, 3, 4])[0] # 若無倉位且價格突破則按照設(shè)置好的區(qū)間開倉 if not position_long and not position_short and grid != 2: # 大于3為在中間網(wǎng)格的上方,做多 if grid >= 3: obj.OpenLong("rb2005", 1) # 以市價單開多倉到倉位 if grid <= 1: obj.OpenShort("rb2005", 1) # 以市價單開空倉到倉位 # 持有多倉的處理 elif position_long: if grid >= 3: obj.OpenLong("rb2005", 1) # 以市價單調(diào)多倉到倉位 # 等于2為在中間網(wǎng)格,平倉 elif grid == 2: obj.closebuy("rb2005", 1) # 以市價單全平多倉 # 小于1為在中間網(wǎng)格的下方,做空 elif grid <= 1: obj.closebuy("rb2005", 1) # 以市價單全平多倉 obj.OpenShort("rb2005", 1) # 以市價單開空倉到倉位 # 持有空倉的處理 elif position_short: # 小于1為在中間網(wǎng)格的下方,做空 if grid <= 1: obj.OpenShort("rb2005", 1) # 以市價單調(diào)空倉到倉位 # 等于2為在中間網(wǎng)格,平倉 elif grid == 2: obj.closesell("rb2005", 1) # 以市價單全平空倉 # 大于3為在中間網(wǎng)格的上方,做多 elif grid >= 3: obj.closesell("rb2005", 1) # 以市價單全平空倉 obj.OpenLong("rb2005", 1) # 以市價單開多倉到倉位 def main(): while True: onTick() Sleep(1000)
以上就是python中怎么利用Pandas庫實現(xiàn)一個商品期貨網(wǎng)格策略,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降摹OM隳芡ㄟ^這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。