669 浏览
0

今天在回测中我发现通过get_quote来获取主力连续合约映射的具体合约时,下午14:56映射的具体合约就切换了(如在KQ.m@CFFEX.IF 的2022-03-16 14:56:00映射的具体合约就切换到了CFFEX.IF2204,但是get_kline_serial的数据直到2022-03-17 09:28:00才切换),同时通过

if intial == True:
underlaying_symbol = quote.underlying_symbol
initial = False
elif quote.datetime[10:19] == ‘ 09:28:00’:
underlaying_symbol = quote.underlying_symbol
else:
pass

也无法解决这个问题,请问能不能帮我看看,谢谢。

import warnings
warnings.filterwarnings("ignore")
from tqsdk import *
from tqsdk.tafunc import *
from datetime import *
 SYMBOL = "KQ.m@CFFEX.IF"  # 合约代码
period = 8*60#s
api = TqApi(backtest=TqBacktest(start_dt=date(2021, 12, 1), end_dt=date(2023, 4, 25)), 
            auth=TqAuth("A", "B"))
klines = api.get_kline_serial(SYMBOL, duration_seconds=period, data_length=5)
quote = api.get_quote(SYMBOL)
train_df = pd.DataFrame()
test_df = pd.DataFrame()
last_date = None
train_test_split = datetime(2023, 2, 1)
underlaying_symbol = None
intial = True
try:
    while True:
        T1 = datetime.now()
        api.wait_update()
        if api.is_changing(klines) and klines.datetime.iloc[-1] != last_date:
            if intial == True:
                underlaying_symbol = quote.underlying_symbol
                initial = False
            elif quote.datetime[10:19] == ' 09:28:00':
                underlaying_symbol = quote.underlying_symbol
            else:
                pass
            print(quote.datetime, underlaying_symbol)
            last_date = klines.datetime.iloc[-1]
            tmp_df = pd.DataFrame()
            tmp_df = klines.iloc[-2]
            tmp_df.datetime = time_to_datetime(tmp_df.datetime) 
            tmp_df['underlaying_symbols'] = underlaying_symbol
            if tmp_df.datetime > train_test_split:
                test_df = test_df.append(tmp_df)
            else:
                train_df = train_df.append(tmp_df)
            T2 = datetime.now()
            print('数据处理耗时:%s毫秒' % (T2 - T1))
            #print('总延迟:', (T2 - T1))
            print('--------------------------End--------------------------')
            print('')
        else:
            pass
 except BacktestFinished:
    train_df.to_csv('IF_8min_train.csv')
    test_df.to_csv('IF_8min_test.csv')
    api.close()
    print("回测结束")

李思恒 已回答的问题 2023年5月12日
0

主连数据和对应的主力数据其实不是100%对上的,即使是实盘你也可以测试下.不是一个完全复制的关系,具体的算法这个确实没法告知.

李思恒 已回答的问题 2023年5月12日