溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

python中怎么利用Pandas庫實現(xiàn)一個商品期貨網(wǎng)格策略

發(fā)布時間:2021-07-10 14:45:58 來源:億速云 閱讀:177 作者:Leah 欄目:互聯(lián)網(wǎng)科技

本篇文章給大家分享的是有關(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è)資訊頻道。

向AI問一下細(xì)節(jié)

免責(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)容。

AI