在回测中我除了需要用到最新的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日