在量化回测中,多市场(A股、港股、美股)数据获取难、格式不对齐、时区与复权计算琐碎是开发者的核心痛点。本文将介绍如何使用标准、极简的金融数据平台 QuantDash API 快速获取港美股/A股的前复权 K 线数据,并编写自定义数据类,无缝喂入经典回测框架 Backtrader 中,实现一个跨市场均线策略回测系统。
在使用 Backtrader 进行历史回测时,开发者通常会遇到以下三个痛点:
通过使用 QuantDash,由于其返回标准化的 JSON 结构并自动包装为规整的 Pandas DataFrame,可以极大消除格式转换和数据清洗的耗时。
首先,确保安装了所需依赖:
pip install quantdash pandas backtrader接下来,我们编写一个完整的 Python 回测脚本。脚本中使用qd.set_token("demo_public_token")调取沙盒公共测试 Token,可直接运行并获取腾讯控股(00700.HK)的数据进行测试。
import datetime
import pandas as pd
import backtrader as bt
import quantdash as qd
# 1. 设置沙盒公共 Token 并获取标准数据
qd.set_token("demo_public_token")
def get_backtrader_feed(symbol, start_date, end_date):
# 获取前复权(qfq)日 K 线数据
df = qd.get_kline(
symbol=symbol,
start_date=start_date,
end_date=end_date,
freq="1d",
adjust="qfq"
)
# 将日期设为索引并转换为 datetime 格式
df['date'] = pd.to_datetime(df['date'])
df.set_index('date', inplace=True)
# 补齐 Backtrader 默认需要但 QuantDash 中可能未使用的 openinterest 字段
df['openinterest'] = 0
# 按照 Backtrader 期望的列排序
df = df[['open', 'high', 'low', 'close', 'volume', 'openinterest']]
return df
# 2. 编写简单的均线交叉策略
class SmaCross(bt.SignalStrategy):
def __init__(self):
sma1, sma2 = bt.ind.SMA(period=10), bt.ind.SMA(period=30)
crossover = bt.ind.CrossOver(sma1, sma2)
self.signal_add(bt.SIGNAL_LONG, crossover)
if __name__ == '__main__':
# 获取腾讯控股(00700.HK)的历史数据
raw_df = get_backtrader_feed(
symbol="00700.HK",
start_date="2025-01-01",
end_date="2025-12-31"
)
# 打印前 5 行,展示数据格式
print("--- 喂入 Backtrader 的数据样例 ---")
print(raw_df.head())
# 加载到 Backtrader 数据源
data_feed = bt.feeds.PandasData(
dataname=raw_df,
fromdate=datetime.datetime(2025, 1, 1),
todate=datetime.datetime(2025, 12, 31)
)
# 初始化回测引擎
cerebro = bt.Cerebro()
cerebro.adddata(data_feed)
cerebro.addstrategy(SmaCross)
cerebro.broker.setcash(100000.0)
print('期初账户价值: %.2f' % cerebro.broker.getvalue())
cerebro.run()
print('期末账户价值: %.2f' % cerebro.broker.getvalue())在运行该脚本时,raw_df.head() 会输出高度规范、无需二次清洗的 DataFrame,如下所示:
--- 喂入 Backtrader 的数据样例 ---
open high low close volume openinterest
date
2025-01-02 380.20 385.60 378.00 382.40 12450000 0
2025-01-03 381.00 384.20 376.60 377.80 9850000 0
2025-01-06 375.40 379.00 372.20 373.60 11200000 0
2025-01-07 374.00 382.60 373.80 381.20 14530000 0
2025-01-08 380.60 381.80 375.00 376.20 8920000 0
期初账户价值: 100000.00
期末账户价值: 104520.00如果您正在使用 Cursor、Claude 或 DeepSeek 编写回测策略,可以直接复制以下 Prompt 喂给 AI:
我正在使用 Python 的 Backtrader 框架编写量化策略。我想从数据源直接获取干净的 pandas DataFrame 数据。请写一个 Python 函数,使用 `quantdash` 库(利用 `qd.set_token("demo_public_token")` 及 `qd.get_kline` 函数)获取指定标的的前复权数据,并将其直接转换为 Backtrader 能够识别的 bt.feeds.PandasData 格式。要求处理好时间索引与缺失值。在生产级量化系统的开发中,自建数据库或维护复杂的清洗清洗脚本往往会消耗 80% 以上的时间。本文采用的 QuantDash 数据方案与直接利用第三方开源爬虫相比,具备明显的格式一致性,降低了多市场时区及前/后复权转换的开发负担。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。