在VNPY中策略中,使用分鐘線合成日K線

張國平發表於2019-11-27

在論壇裡面看到不少關於分鐘合成日線的討論,也試著實現了。這裡是針對vnpy2.0的,1.92其實基本也差不多。


  1. 這裡把合成的日線HLOC資訊放在pandas.DataFrame裡面,因為日線分析的話,對運算時間要求不是特別高,DataFrame足矣

  2. 合成過程放在on_bar方法裡面,對每個傳入的分鐘進行日線合併處理;

  3. 這裡用了trading == False進行判斷,就是隻在策略初始化過程對於歷史資料進行日線合併。在交易過程中,不對當天傳入分鐘資料進行處理。因為日線是長週期資料,放在程式啟動時候呼叫使用就可以,不必要盤中分析,如果打算真要,註釋掉這個就可以。

  4. 這裡只是提供了這個DataFrame 放置日線資料,具體如何分析還是要看使用者了


定於dayFrame儲存日線資料,在策略定義中插入全域性變數

class *********Strategy(CtaTemplate):
    author = "用Python的交易員"
    import pandas as pd
    dayFrame = pd.DataFrame(columns=['datetime', 'high', 'low', 'open', 'close'])


合併過程,在on_bar 方法中插入下面程式碼

def on_bar(self, bar: BarData):
    """
   
    """
if self.trading == False:
    # adjustedBarTime = bar.datetime + timedelta(hours = 5)
    if self.dayFrame.empty:
        # 如果dayFrame 為空,先加入一條
        self.dayFrame = self.dayFrame.append({'datetime': bar.datetime.date(), 'high':bar.high_price, 'low': bar.low_price, 'open': bar.open_price, 'close': bar.close_price},
                                   ignore_index=True)
    else:
        self.dayFrame = self.dayFrame.sort_values(['datetime']).reset_index(drop=True)
        # 如果dayFrame 不為空,先按照日期排序,
        if bar.datetime.date() in self.dayFrame['datetime'].values:
            # 如果是已有日期,對比high,low更新,並使用新close
            self.dayFrame.loc[self.dayFrame['datetime'] == bar.datetime.date(), 'high'] = \
                max(max(self.dayFrame.loc[self.dayFrame['datetime'] == bar.datetime.date(), 'high'].values),bar.high_price)
            self.dayFrame.loc[self.dayFrame['datetime'] == bar.datetime.date(), 'low'] = \
                min(min(self.dayFrame.loc[self.dayFrame['datetime'] == bar.datetime.date(), 'low'].values),bar.low_price)
            self.dayFrame.loc[self.dayFrame['datetime'] == bar.datetime.date(), 'close'] = bar.close_price
        else:
            # 如果是新的日期,新建一條
            self.dayFrame = self.dayFrame.append(
                {'datetime': bar.datetime.date(), 'high': bar.high_price, 'low': bar.low_price,
                 'open': bar.open_price, 'close': bar.close_price},
                ignore_index=True)


另外,這裡預設就是自然日。如果想按照國內期貨期貨時間,就是晚上九點開盤時間就是第二天的話。有個取巧的方法,就是把bar時間加上5個小時,那麼下午9點就變成明天1點,這樣dataframe就會儲存為下一天資料。而當天15點加上5點20點還是當天資料。

不過這樣改很粗糙,只能支援國內時間和國內期貨,如果伺服器再其他時區,或者其他產品就另外分析。

修改方法,定義區域性變數adjustedBarTime,是傳入bar.datetime 時間加5;代替後面新增程式碼中所有用到bar.datetime地方。

週五時候想到一個問題,對於國內期貨,週五晚上資料屬於週一的,想想還真是頭大,這裡還要加上一天判斷是否第二天是週六,如果是就要改到加兩天,幸好一般節假日之前的交易日晚上無夜盤,不然更麻煩。

from datetime import datetime, timedelta
if self.trading == False:
    adjustedBarTime = bar.datetime + timedelta(hours = 5)
    if adjustedBarTime.weekday() is 5:
        adjustedBarTime = adjustedBarTime + timedelta(days= 2)

會插入如下資料,按照初始化使用天數,就會有多少條,

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22259926/viewspace-2665919/,如需轉載,請註明出處,否則將追究法律責任。

相關文章