VeighNa量化社区
你的开源社区量化交易平台 | vn.py | vnpy
Member
avatar
加入于:
帖子: 10
声望: 0

我想用vnpy构建tick级的价差交易回测,从git上下载example后,将bar修改为tick,发现engine.load_data时无数据。能否烦请协助处理,谢谢!

  1. 从git上下载vnpy-master,根据examples/spread_backtesting/backtesting.ipynb的代码,修改engine.set_parameters的interval, mode, start, end

  2. 检查get_database().get_tick_overview()时,发现legs=[LegData("T2503.CFFEX"), LegData("TL2503.CFFEX")]均有数据。
    print(f"{tick_overview.id}. {tick_overview.symbol}.{tick_overview.exchange.value}, {tick_overview.start}-{tick_overview.end}, count {tick_overview.count}")
    T2503.CFFEX, 2024-06-17 09:30:00.600000-2025-03-14 11:30:00, count 2066031
    TL2503.CFFEX, 2024-06-17 09:30:00.100000-2025-03-14 11:30:00, count 2528014

  3. 在engine.load_data()时无数据。
    经debug,在D:\veighna_studio\Lib\site-packages\vnpy_sqlite\sqlite_database.py,选取s: ModelSelect时无结果,尤其是在DbTickData.symbol == symbol时。
    请问是否要提前合成tick级价差数据?

description

Member
avatar
加入于:
帖子: 10
声望: 0

完整代码如下:

from vnpy.trader.constant import Interval
from vnpy.trader.optimize import OptimizationSetting
from vnpy_ctastrategy.base import BacktestingMode
from vnpy_spreadtrading.backtesting import BacktestingEngine
from vnpy_spreadtrading.strategies.statistical_arbitrage_strategy import (
StatisticalArbitrageStrategy
)
from vnpy_spreadtrading.base import LegData, SpreadData
from datetime import datetime

spread = SpreadData(
name="T-TL-Spread",
legs=[LegData("T2503.CFFEX"), LegData("TL2503.CFFEX")],
variable_symbols={"A": "T2503.CFFEX", "B": "TL2503.CFFEX"},
variable_directions={"A": 1, "B": -1},
price_formula="A-B",
trading_multipliers={"T2503.CFFEX": 1, "TL2503.CFFEX": 1},
active_symbol="T2503.CFFEX",
min_volume=1,
compile_formula=False # 回测时不编译公式,compile_formula传False,从而支持多进程优化
)

engine = BacktestingEngine()
engine.set_parameters(
spread=spread,
interval=Interval.TICK.value,
start=datetime(2024, 6, 17),
end=datetime(2025, 3, 14),
rate=0,
slippage=0,
size=300,
pricetick=0.2,
capital=1_000_000,
mode=BacktestingMode.TICK
)
engine.add_strategy(StatisticalArbitrageStrategy, {})

engine.load_data()
engine.run_backtesting()
df = engine.calculate_result()
engine.calculate_statistics()
engine.show_chart()

for trade in engine.trades.values():
print(trade)
#

setting = OptimizationSetting()
setting.set_target("sharpe_ratio")
setting.add_parameter("boll_window", 10, 30, 1)
setting.add_parameter("boll_dev", 1, 3, 1)
#

engine.run_ga_optimization(setting)
#

engine.run_bf_optimization(setting)

Member
avatar
加入于:
帖子: 1853
声望: 141

价差交易的Tick级别回测,需要使用DataRecorder模块自行录制价差Tick数据后才能跑

© 2015-2022 上海韦纳软件科技有限公司
备案服务号:沪ICP备18006526号

沪公网安备 31011502017034号

【用户协议】
【隐私政策】
【免责条款】