from datetime import date
from tqsdk import *
from tqsdk.tafunc import *
import pandas as pd
import numpy as np
import time
import warnings
warnings.filterwarnings("ignore")
try:
# 在创建 api 实例时传入 TqBacktest 就会进入回测模式
acc = TqSim()
api = TqApi(acc, backtest=TqBacktest(start_dt=date(2021, 9, 1), end_dt=date(2021, 9, 25)), auth=TqAuth("15208415859", "19991221"))
#api = TqApi(acc, auth=TqAuth(" ", " "))
data_length_klines = 10
data_length_tick = data_length_klines*60*2
# 获得 1分钟K线的引用
rebar_klines = api.get_kline_serial("KQ.m@SHFE.rb", 60, data_length=data_length_klines)
rebar_quote = api.get_quote("KQ.m@SHFE.rb")
rebar_tick = api.get_tick_serial("KQ.m@SHFE.rb", data_length = data_length_tick)
while True:
api.wait_update()
if api.is_changing(rebar_tick) and api.is_changing(rebar_klines):
#time_start=time.time()
#rebar
target_pos_rebar = TargetPosTask(api, rebar_quote.underlying_symbol)
rebar_tick_v = pd.DataFrame()
rebar_tick_v['datetime'] = rebar_tick.datetime.apply(lambda x: time_to_str(x))
rebar_tick_v['datetime'] = pd.to_datetime(rebar_tick['datetime'])
rebar_tick_v['amount'] = rebar_tick.amount
rebar_tick_v = rebar_tick_v.set_index('datetime')
print(rebar_tick_v.tail(3))
rebar_current_data = rebar_klines[['open','close','high','low','volume']]
rebar_current_data['datetime'] = rebar_klines.datetime.apply(lambda x: time_to_str(x))
rebar_current_data['datetime'] = pd.to_datetime(rebar_current_data['datetime'])
rebar_current_data = rebar_current_data.set_index('datetime')
rebar_current_data['amount'] = rebar_tick_v['amount'].resample('1min').sum()
print('rebar_current_data', rebar_current_data.tail(3))
rebar_current_data_array = rebar_current_data.to_numpy()
except BacktestFinished as e:
# 回测结束时会执行这里的代码
api.close()
#print(acc.trade_log) # 回测的详细信息
#print(acc.tqsdk_stat) # 回测时间内账户交易信息统计结果,其中包含以下字段
print(acc.tqsdk_stat.init_balance)
print(acc.tqsdk_stat.balance)
# init_balance 起始资金# balance 结束资金# max_drawdown 最大回撤# profit_loss_ratio 盈亏额比例# winning_rate 胜率# ror 收益率
# annual_yield 年化收益率# sharpe_ratio 年化夏普率# tqsdk_punchline 天勤点评
在回测时因为1分钟的数据没有成交额(amount)字段,就需要同时获取对应的tick数据合成成交额字段。可是当获取8月31日下午1:00的tick数据时,一分钟周期的数据就已经到那天的下午2:59和晚上9点钟夜盘的数据了,请问这个问题怎么处理呢。
谢谢
李思恒 已回答的问题 2021年9月29日