如题所述,我先利用一个空策略完成了tick数据到minutebar的合成和存储,然后利用原始的tick数据和新和成的minute bar同时进行vnpy示例策略:double_MA_strategy的回测。结果出乎意料地出现了许多不同,请问这是为何?
# tick数据合成分钟k并存储到数据库中
import csv
from datetime import datetime
from vnpy_ctastrategy import (
CtaTemplate,
StopOrder,
TickData,
BarData,
TradeData,
OrderData,
BarGenerator,
ArrayManager,
)
from pymongo import MongoClient
from datetime import datetime, timezone
import os
from vnpy.trader.constant import Exchange
from vnpy.trader.database import get_database
from vnpy.trader.object import TickData
# 获取数据库管理器
database_manager = get_database()
class TickDataToBarData(CtaTemplate):
""""""
parameters = [
]
variables = [
]
def on_init(self) -> None:
"""
Callback when strategy is inited.
"""
self.write_log("策略初始化")
# # 初始化CSV文件
# self.csv_file = open(f"bar_data_{datetime.now().strftime('%Y%m%d_%H%M%S')}.csv", 'w', newline='', encoding='utf-8')
# self.csv_writer = csv.writer(self.csv_file)
# # 写入CSV表头
# self.csv_writer.writerow([
# 'symbol', 'exchange', 'datetime', 'interval',
# 'open_price', 'high_price', 'low_price', 'close_price',
# 'volume', 'turnover', 'open_interest'
# ])
self.bg = BarGenerator(self.on_bar)
def on_start(self) -> None:
"""
Callback when strategy is started.
"""
self.write_log("策略启动")
def on_stop(self) -> None:
"""
Callback when strategy is stopped.
"""
self.write_log("策略停止")
# 关闭CSV文件
# self.csv_file.close()
def on_tick(self, tick: TickData) -> None:
"""
Callback of new tick data update.
"""
self.bg.update_tick(tick)
def on_bar(self, bar: BarData) -> None:
"""
Callback of new bar data update.
"""
bars = []
bars.append(bar)
database_manager.save_bar_data(bars)
# 将BarData写入CSV文件
# self.csv_writer.writerow([
# bar.symbol,
# bar.exchange.value, # 转换为字符串
# bar.datetime.strftime('%Y-%m-%d %H:%M:%S'),
# bar.interval.value,
# bar.open_price,
# bar.high_price,
# bar.low_price,
# bar.close_price,
# bar.volume,
# bar.turnover,
# bar.open_interest
# ])
self.put_event()
def on_order(self, order: OrderData) -> None:
"""
Callback of new order data update.
"""
pass
def on_trade(self, trade: TradeData) -> None:
"""
Callback of new trade data update.
"""
self.put_event()
def on_stop_order(self, stop_order: StopOrder) -> None:
"""
Callback of stop order update.
"""
pass

