真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

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

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


網(wǎng)站名稱:python中怎么利用Pandas庫(kù)實(shí)現(xiàn)一個(gè)商品期貨網(wǎng)格策略
標(biāo)題路徑:http://weahome.cn/article/jecicd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部