本篇文章給大家分享的是有關(guān)python中怎么利用Pandas庫(kù)實(shí)現(xiàn)一個(gè)商品期貨網(wǎng)格策略,小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。
成都創(chuàng)新互聯(lián)專業(yè)成都網(wǎng)站建設(shè)、成都網(wǎng)站制作,集網(wǎng)站策劃、網(wǎng)站設(shè)計(jì)、網(wǎng)站制作于一體,網(wǎng)站seo、網(wǎng)站優(yōu)化、網(wǎng)站營(yíng)銷、軟文發(fā)布平臺(tái)等專業(yè)人才根據(jù)搜索規(guī)律編程設(shè)計(jì),讓網(wǎng)站在運(yùn)行后,在搜索中有好的表現(xiàn),專業(yè)設(shè)計(jì)制作為您帶來(lái)效益的網(wǎng)站!讓網(wǎng)站建設(shè)為您創(chuàng)造效益。
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:以時(shí)間為索引的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維命名容器的模塊。
運(yùn)用Pandas的強(qiáng)大特性來(lái)進(jìn)行網(wǎng)格策略的編碼
網(wǎng)格策略秉持的原則是“倉(cāng)位策略比擇時(shí)策略更重要”。其基本操作方式就是以某點(diǎn)為基點(diǎn),每上漲戓下跌一定點(diǎn)數(shù)掛一定數(shù)量空單戓多單,設(shè)定盈利目標(biāo),但不設(shè)止損,當(dāng)價(jià)格朝期望方向進(jìn)展時(shí)獲利平倉(cāng),并在原點(diǎn)位掛同樣的買單戓賣單。這樣布下的這些交易單形成了一張像魚網(wǎng)樣的陣列,在震蕩的市場(chǎng)中來(lái)回獲利。
本策略首先計(jì)算了過(guò)去300個(gè)價(jià)格數(shù)據(jù)的均值和標(biāo)準(zhǔn)差,并根據(jù)均值加減1和2個(gè)標(biāo)準(zhǔn)差得到網(wǎng)格的區(qū)間分界線,并分別配以0.3和0.5的倉(cāng)位權(quán)重,然后根據(jù)價(jià)格所在的區(qū)間來(lái)配置倉(cāng)位(+/-40為上下界,無(wú)實(shí)際意義):
(-40,-3],(-3,-2],(-2,2],(2,3],(3,40](具體價(jià)格等于均值+數(shù)字倍標(biāo)準(zhǔn)差)
-0.5, -0.3, 0.0, 0.3, 0.5
第一步,我們需要引入策略代碼中需要用到的庫(kù)
import types import numpy as np import pandas as pd
第二步,我們需要在發(fā)明者量化平臺(tái)初始化合約數(shù)據(jù),這個(gè)例子中,我們還是使用螺紋鋼期貨為例子。
def init(): # 訂閱螺紋鋼的2005合約,并且取得發(fā)明者量化平臺(tái)當(dāng)前周期的所有收盤價(jià) 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)格的倉(cāng)位 context.weight = [0.5, 0.3, 0.0, 0.3, 0.5]
第三步,也是最重要的,我們開(kāi)始編寫策略邏輯和實(shí)現(xiàn)自動(dòng)化交易
這里需要注意的是,我們需要用到發(fā)明者量化平臺(tái)的國(guó)內(nèi)商品期貨模版,模版地址為:https://www.fmz.com/strategy/24288 各位在發(fā)明者量化策略編寫頁(yè)面進(jìn)行編碼時(shí),需要把此模版先復(fù)制到自己的策略庫(kù),然后在回測(cè)時(shí)勾選上,這里請(qǐng)各位讀者注意
關(guān)于如何部署托管者和機(jī)器人,請(qǐng)參考我之前的文章:https://www.fmz.com/bbs-topic/4140
想購(gòu)買自己云計(jì)算服務(wù)器部署托管者的讀者,可以參考這篇文章:https://www.fmz.com/bbs-topic/2848
策略邏輯與實(shí)現(xiàn)其自動(dòng)化交易:
def onTick(context, bars): obj = ext.NewPositionManager() # 使用發(fā)明者量化交易類庫(kù) # 此處用來(lái)獲取持倉(cāng)信息 positions = exchange.GetPosition() # 獲取持倉(cāng)數(shù)組 if len(positions) == 0: # 如果持倉(cāng)數(shù)組的長(zhǎng)度是0 return 0 # 證明是空倉(cāng),返回0 for i in range(len(positions)): # 遍歷持倉(cāng)數(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ù)價(jià)格落在(-40,-3],(-3,-2],(-2,2],(2,3],(3,40]的區(qū)間范圍來(lái)獲取最新收盤價(jià)所在的價(jià)格區(qū)間 grid = pd.cut([close_01], context.band, labels=[0, 1, 2, 3, 4])[0] # 若無(wú)倉(cāng)位且價(jià)格突破則按照設(shè)置好的區(qū)間開(kāi)倉(cāng) if not position_long and not position_short and grid != 2: # 大于3為在中間網(wǎng)格的上方,做多 if grid >= 3: obj.OpenLong("rb2005", 1) # 以市價(jià)單開(kāi)多倉(cāng)到倉(cāng)位 if grid <= 1: obj.OpenShort("rb2005", 1) # 以市價(jià)單開(kāi)空倉(cāng)到倉(cāng)位 # 持有多倉(cāng)的處理 elif position_long: if grid >= 3: obj.OpenLong("rb2005", 1) # 以市價(jià)單調(diào)多倉(cāng)到倉(cāng)位 # 等于2為在中間網(wǎng)格,平倉(cāng) elif grid == 2: obj.closebuy("rb2005", 1) # 以市價(jià)單全平多倉(cāng) # 小于1為在中間網(wǎng)格的下方,做空 elif grid <= 1: obj.closebuy("rb2005", 1) # 以市價(jià)單全平多倉(cāng) obj.OpenShort("rb2005", 1) # 以市價(jià)單開(kāi)空倉(cāng)到倉(cāng)位 # 持有空倉(cāng)的處理 elif position_short: # 小于1為在中間網(wǎng)格的下方,做空 if grid <= 1: obj.OpenShort("rb2005", 1) # 以市價(jià)單調(diào)空倉(cāng)到倉(cāng)位 # 等于2為在中間網(wǎng)格,平倉(cāng) elif grid == 2: obj.closesell("rb2005", 1) # 以市價(jià)單全平空倉(cāng) # 大于3為在中間網(wǎng)格的上方,做多 elif grid >= 3: obj.closesell("rb2005", 1) # 以市價(jià)單全平空倉(cāng) obj.OpenLong("rb2005", 1) # 以市價(jià)單開(kāi)多倉(cāng)到倉(cāng)位
最后,我們用一個(gè)Main函數(shù)把策略跑起來(lái)。這里建議大家學(xué)會(huì)部署自己的托管者,即使在自己的電腦中本地部署,這樣對(duì)于調(diào)試程序和回測(cè)交易邏輯來(lái)講都有莫大的有益,特別是對(duì)于pandas這樣的第三方庫(kù)的安裝,運(yùn)用本地的anaconda環(huán)境管理軟件來(lái)管理這些python庫(kù)和環(huán)境將會(huì)起到事半功倍的效果。
以下是完整的策略代碼:
import types import numpy as np import pandas as pd # 初始化合約數(shù)據(jù) def init(): # 訂閱螺紋鋼的2005合約,并且取得發(fā)明者量化平臺(tái)當(dāng)前周期的所有收盤價(jià) 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)格的倉(cāng)位 context.weight = [0.5, 0.3, 0.0, 0.3, 0.5] def onTick(context, bars): obj = ext.NewPositionManager() # 使用發(fā)明者量化交易類庫(kù) # 此處用來(lái)獲取持倉(cāng)信息 positions = exchange.GetPosition() # 獲取持倉(cāng)數(shù)組 if len(positions) == 0: # 如果持倉(cāng)數(shù)組的長(zhǎng)度是0 return 0 # 證明是空倉(cāng),返回0 for i in range(len(positions)): # 遍歷持倉(cāng)數(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ù)價(jià)格落在(-40,-3],(-3,-2],(-2,2],(2,3],(3,40]的區(qū)間范圍來(lái)獲取最新收盤價(jià)所在的價(jià)格區(qū)間 grid = pd.cut([close_01], context.band, labels=[0, 1, 2, 3, 4])[0] # 若無(wú)倉(cāng)位且價(jià)格突破則按照設(shè)置好的區(qū)間開(kāi)倉(cāng) if not position_long and not position_short and grid != 2: # 大于3為在中間網(wǎng)格的上方,做多 if grid >= 3: obj.OpenLong("rb2005", 1) # 以市價(jià)單開(kāi)多倉(cāng)到倉(cāng)位 if grid <= 1: obj.OpenShort("rb2005", 1) # 以市價(jià)單開(kāi)空倉(cāng)到倉(cāng)位 # 持有多倉(cāng)的處理 elif position_long: if grid >= 3: obj.OpenLong("rb2005", 1) # 以市價(jià)單調(diào)多倉(cāng)到倉(cāng)位 # 等于2為在中間網(wǎng)格,平倉(cāng) elif grid == 2: obj.closebuy("rb2005", 1) # 以市價(jià)單全平多倉(cāng) # 小于1為在中間網(wǎng)格的下方,做空 elif grid <= 1: obj.closebuy("rb2005", 1) # 以市價(jià)單全平多倉(cāng) obj.OpenShort("rb2005", 1) # 以市價(jià)單開(kāi)空倉(cāng)到倉(cāng)位 # 持有空倉(cāng)的處理 elif position_short: # 小于1為在中間網(wǎng)格的下方,做空 if grid <= 1: obj.OpenShort("rb2005", 1) # 以市價(jià)單調(diào)空倉(cāng)到倉(cāng)位 # 等于2為在中間網(wǎng)格,平倉(cāng) elif grid == 2: obj.closesell("rb2005", 1) # 以市價(jià)單全平空倉(cāng) # 大于3為在中間網(wǎng)格的上方,做多 elif grid >= 3: obj.closesell("rb2005", 1) # 以市價(jià)單全平空倉(cāng) obj.OpenLong("rb2005", 1) # 以市價(jià)單開(kāi)多倉(cāng)到倉(cāng)位 def main(): while True: onTick() Sleep(1000)
以上就是python中怎么利用Pandas庫(kù)實(shí)現(xiàn)一個(gè)商品期貨網(wǎng)格策略,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見(jiàn)到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。