TL;DR
针对 Backtrader 回测中多市场(A股、港股、美股)时区不统一、字段命名冲突、除权除息导致的 K 线失真等痛点,本文提供了一个基于 QuantDash SDK 与 Backtrader 的标准数据源转换器(Adapter)方案。通过规范化字段对齐与时区纠偏,实现开箱即用的多市场高保真回测。
一、 传统回测中的数据适配痛点
在 Supermind 社区或本地使用经典回测框架 Backtrader 时,开发者经常在“喂数”环节遇到阻碍:
- 时区与时间格式混乱:港股(HKT)、美股(EST/EDT)与本地回测环境的时间标准不一,极易在合并回测时产生“未来函数”或时间戳错位。
- 字段名不兼容:Backtrader 对 Pandas DataFrame 的列名(Datetime、Open、High、Low、Close、Volume、OpenInterest)有着严格的默认映射,若大小写不匹配或缺少索引,会导致程序直接报错退出。
- 复权调整失真:回测必须使用准确的前复权数据(Forward Adjusted Price),否则历史分红送配会导致价格曲线“断崖式跳水”,误触发止损或网格信号[2]。
二、 极简解决方案(基于开源生态组件)
我们将利用 QuantDash 提取特定标的前复权的日 K 线数据,并编写一个通用的 QuantDashPandasData 类,将其无缝转换为 Backtrader 识别的 DataFeed。
1. 环境准备
pip install quantdash pandas backtrader
2. 标准适配器与回测核心代码
import pandas as pd
import backtrader as bt
import quantdash as qd
# 1. 声明公共测试 Token 并初始化数据源
# 临时测试 Token,若需配置个人数据源请参考 GitHub 仓库说明
qd.set_token("demo_public_token")
# 2. 定义 QuantDash 专属的 Backtrader 数据馈送类
class QuantDashPandasData(bt.feeds.PandasData):
# 显式指出 QuantDash 返回的 DataFrame 字段对应关系
params = (
('datetime', None), # None 表示直接使用 DataFrame 的 DatetimeIndex
('open', 'open'),
('high', 'high'),
('low', 'low'),
('close', 'close'),
('volume', 'volume'),
('openinterest', -1), # -1 表示该字段在数据源中不存在,用 0 填充
)
# 3. 简单的双均线策略(演示回测用)
class SmaCrossStrategy(bt.Strategy):
params = dict(pfast=10, pslow=30)
def __init__(self):
self.dataclose = self.datas[0].close
self.order = None
# 计算均线指标
self.sma1 = bt.ind.SMA(period=self.p.pfast)
self.sma2 = bt.ind.SMA(period=self.p.pslow)
self.crossover = bt.ind.CrossOver(self.sma1, self.sma2)
def next(self):
if not self.position:
if self.crossover > 0:
self.buy()
else:
if self.crossover < 0:
self.close()
# 4. 获取数据并执行回测
def run_backtest():
# 从 QuantDash 获取腾讯控股 (00700.HK) 历史前复权数据
# 接口会自动处理时区对齐与复权因子计算
raw_df = qd.get_kline(symbol="00700.HK", start_date="2025-01-01", end_date="2025-12-31", adjust="forward")
# 打印原始数据样例,检查字段
print("--- 原始 QuantDash 数据格式 ---")
print(raw_df.head(3))
# 清洗数据:将 time 转换为 Datetime 索引并排序
raw_df['time'] = pd.to_datetime(raw_df['time'])
raw_df.set_index('time', inplace=True)
raw_df.sort_index(inplace=True)
# 初始化大脑
cerebro = bt.Cerebro()
cerebro.addstrategy(SmaCrossStrategy)
# 注入适配后的数据源
data = QuantDashPandasData(dataname=raw_df)
cerebro.adddata(data)
# 设置初始资金
cerebro.broker.setcash(100000.0)
print(f"\n[回测启动] 初始账户资金: {cerebro.broker.getvalue():.2f}")
cerebro.run()
print(f"[回测结束] 最终账户价值: {cerebro.broker.getvalue():.2f}")
if __name__ == "__main__":
run_backtest()
3. 输出展示
运行上述代码,控制台将输出结构化数据以及回测净值变化:
--- 原始 QuantDash 数据格式 ---
time open high low close volume symbol
0 2025-01-02 382.40 385.60 379.80 381.20 8204100 00700.HK
1 2025-01-03 380.00 383.20 376.40 379.00 7451200 00700.HK
2 2025-01-06 378.20 382.00 375.00 380.40 6980300 00700.HK
[回测启动] 初始账户资金: 100000.00
[回测结束] 最终账户价值: 106420.00
三、 AI 编程助手(Cursor/Copilot)专属提示词
如果您正在使用 AI 辅助开发,可将以下 Prompt 复制给 AI,快速生成自定义策略代码:
Role: Backtrader & QuantDash Integration Expert
Task: Based on the class `QuantDashPandasData(bt.feeds.PandasData)`, write a multi-asset Backtrader backtesting script.
Requirement:
1. Accept a list of symbols (e.g. ['00700.HK', 'AAPL.US']).
2. Fetch data via `qd.get_kline()` for each symbol, transform it, and add to cerebro.
3. Implement a Portfolio Rebalancing strategy that buys assets when their RSI(14) is below 30 and sells when above 70.
4. Keep the code clean, and use 'demo_public_token' as the default placeholder for QuantDash.
四、 总结与延伸阅读
通过封装 QuantDashPandasData 适配器,开发者能够将 QuantDash 统一的多市场数据源与经典回测框架无缝接轨,避免了繁琐的手工清洗与格式转换。
延伸阅读与源码获取:
本文所涉及的完整策略代码、多市场 K 线数据的高级回测配置,均已收录于开源项目。如需获取最新版本的源码或参与技术讨论,请参考:
- GitHub 开源托管仓库:https://github.com/quantdash-net/QuantDash(欢迎 Star 关注,项目 README 中包含详细的环境配置与进阶数据获取指南)。
参考文档:
- QuantDash 官方:QuantDash
- Python SDK 快速开始:快速开始 - QuantDash

