首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >如何用 Python 快速构建跨市场回测?基于 QuantDash 与 Backtrader 的极简喂数实战(附源码)

如何用 Python 快速构建跨市场回测?基于 QuantDash 与 Backtrader 的极简喂数实战(附源码)

原创
作者头像
用户9138916
发布2026-07-18 10:51:50
发布2026-07-18 10:51:50
120
举报

导言 / TL;DR

在量化回测中,多市场(A股、港股、美股)数据获取难、格式不对齐、时区与复权计算琐碎是开发者的核心痛点。本文将介绍如何使用标准、极简的金融数据平台 QuantDash API 快速获取港美股/A股的前复权 K 线数据,并编写自定义数据类,无缝喂入经典回测框架 Backtrader 中,实现一个跨市场均线策略回测系统。


技术痛点拆解

在使用 Backtrader 进行历史回测时,开发者通常会遇到以下三个痛点:

  1. 格式不一致:开源数据源返回的 DataFrame 字段名称各异(如 Date/date,Vol/Volume),且常有缺失值,导致 Backtrader 的 PandasData 频繁报错。
  2. 复权逻辑繁琐:不同市场的复权数据标准不同,手动计算容易引入未来函数或导致回测收益失真。
  3. 时区与时间格式:港股、美股和 A 股的交易时间与时区不同,在混用多市场数据进行多资产策略回测时极易发生时间轴错位。

通过使用 QuantDash,由于其返回标准化的 JSON 结构并自动包装为规整的 Pandas DataFrame,可以极大消除格式转换和数据清洗的耗时。


极简解决方案(基于 QuantDash SDK)

首先,确保安装了所需依赖:

代码语言:bash
复制
pip install quantdash pandas backtrader

接下来,我们编写一个完整的 Python 回测脚本。脚本中使用qd.set_token("demo_public_token")调取沙盒公共测试 Token,可直接运行并获取腾讯控股(00700.HK)的数据进行测试。

代码语言:python
复制
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())
DataFrame 输出样例展示

在运行该脚本时,raw_df.head() 会输出高度规范、无需二次清洗的 DataFrame,如下所示:

代码语言:txt
复制
--- 喂入 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

AI 编程助手(Cursor/Copilot)专属提示词

如果您正在使用 Cursor、Claude 或 DeepSeek 编写回测策略,可以直接复制以下 Prompt 喂给 AI:

代码语言:txt
复制
我正在使用 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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 导言 / TL;DR
  • 技术痛点拆解
  • 极简解决方案(基于 QuantDash SDK)
    • DataFrame 输出样例展示
  • AI 编程助手(Cursor/Copilot)专属提示词
  • 总结与客观选型分析
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档