在回测中我除了需要用到最新的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,并不是代码的问题
https://doc.shinnytech.com/tqsdk/latest/reference/tqsdk.backtest.html?highlight=%E5%9B%9E%E6%B5%8B
李思恒 已回答的问题 2022年2月14日