1.51K 浏览
0

在回测中我除了需要用到最新的k线数据,还需要用到一些背景周期数据,因此我选择了在回测中使用get_kline_serial方法。但是我最近发现get_kline_serial方法无论在什么回测的日期区间、数据周期所获取到volume(成交量)字段都是0。[apcode language="python"]

import warnings
warnings.filterwarnings('ignore')
from tqsdk import TqApi, TqAuth, TqSim, TargetPosTask, BacktestFinished, TqBacktest
from tqsdk import *
import numpy as np
from tqsdk.tafunc import *
from datetime import *
from datetime import date
import time
 def MyStrategy(file, target, margin_rate, comm_rate, trading_shares, Account, Password):
    # 在创建 api 实例时传入 TqBacktest 就会进入回测模式
    acc = TqSim(10000,'Ct_Os')
    api = TqApi(acc,web_gui=True, backtest=TqBacktest(start_dt=date(2019,1,8),end_dt=date(2019,12,30)),auth=TqAuth(Account, Password))
    # 获得3分钟K线的引用
    klines = api.get_kline_serial(target, 3 * 60, data_length = 10)
    quote = api.get_quote(target)
    flags = 0
    step = 0
    try:
        while True:
            api.wait_update()
            actions = None
            last_action = None
            if api.is_changing(klines) and quote.datetime[-9:] == '00.000000' and quote.datetime >= '2019-01-08 09:00:00.000000':
                data_df = klines[['open', 'high', 'low', 'close', 'volume']].astype('float64').copy()
                print('Now at: ', quote.datetime,  data_df.iloc[-1]['volume'])
                tmp_action = file[step]
                if tmp_action == 1:
                    actions = 1
                    last_action = actions
                elif tmp_action == 0:
                    actions = last_action
                else:
                    actions = 0
                step += 1
                target_pos = TargetPosTask(api, quote.underlying_symbol)
                target_price = klines.iloc[-1].close
                acc.set_commission("KQ.m@SHFE.rb", target_price*comm_rate)
                acc.set_margin("KQ.m@SHFE.rb", target_price*margin_rate)
                #Long Put
                if actions == 0:
                    if flags == 1:
                        pass
                    elif flags == -1:
                        target_pos.set_target_volume(trading_shares)
                        flags = 1
                    else:
                        target_pos.set_target_volume(trading_shares)
                        flags = 1
                #short
                elif actions == 1:
                    if flags == 1:
                        target_pos.set_target_volume(-trading_shares)
                        flags = -1
                    elif flags == -1:
                        pass
                    else:
                        target_pos.set_target_volume(-trading_shares)
                        flags = -1
                #closeout
                elif actions == 2:
                    if flags == 1:
                        target_pos.set_target_volume(0)
                        flags = 0
                    elif flags == -1:
                        target_pos.set_target_volume(0)
                        flags = 0
                    else:
                        pass
                else:
                    pass
            else:   
                pass
    except BacktestFinished:
        api.close()
    except:
        print('')
        print('Unknow Exception Experienced, Returning -infs')
        print('')
        api.close()
 if __name__ == '__main__':
    Account = 
    Password = 
    margin_rate = 0.1
    comm_rate = 0.00045
    trading_shares = 1
    target = "KQ.m@SHFE.rb"
    file = np.load("zigzag_action_file.npy", allow_pickle=True)
    MyStrategy(file,target,margin_rate,comm_rate,trading_shares, Account, Password)

李思恒 已回答的问题 2022年2月14日
0

看一下文档,有些字段在回测中确实是0,并不是代码的问题
https://doc.shinnytech.com/tqsdk/latest/reference/tqsdk.backtest.html?highlight=%E5%9B%9E%E6%B5%8B

李思恒 已回答的问题 2022年2月14日