首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >一套代码跑遍 A 股、美股、港股:基于 QuantDash 的跨市场量化实战

一套代码跑遍 A 股、美股、港股:基于 QuantDash 的跨市场量化实战

原创
作者头像
用户9138916
修改2026-07-25 13:48:39
修改2026-07-25 13:48:39
2840
举报

导言 / TL;DR

随着全球大类资产配置的普及,跨市场量化交易(如 A 股沪深 300、港股腾讯控股、美股特斯拉及苹果)已成为量化团队的核心研究领域[5][6]。然而,开发多市场交易策略时,由于不同交易所的接口彼此割裂、代码后缀(如 .SS/.SZ、.HK、US)极其混乱、返回的数据列名及日期格式不一致,开发者往往需要编写大量臃肿的 if/else 代码清洗逻辑。 本文将展示如何利用 QuantDash 统一的多市场 SDK,仅用一套标准代码无缝获取三大市场的前复权 K 线,并利用 Pandas 快速合成相对强弱(RSI)动量指标,清除多市场分析的工程障碍[7]。


技术痛点拆解:多数据源拼表的“代码地狱”

当一个策略需要同时读取美股、港股和 A 股数据时,传统的实现方式简直是噩梦:

代码语言:txt
复制
# ❌ 传统跨市场拼接的繁琐写法(伪代码)
# A 股用 akshare
df_a = ak.stock_zh_a_daily(symbol="sh600519")
df_a = df_a.rename(columns={"日期": "date", "收盘价": "close"}) # 中文列名清洗

# 美股用 yfinance
df_us = yf.download("AAPL") # 字段多为大写 "Close", "Open"
df_us.index.name = "date"

# 港股用 tushare 
df_hk = ts_pro.hk_daily(ts_code="00700.HK")

# ⚠️ 问题来了:时区不一致、除权除息口径不同、数据列名拼写各异,直接导致拼表逻辑漏洞百出!

传统跨市场获取的硬伤:

  1. 代码标识后缀不规范:例如,“贵州茅台”在 Tushare 是 600519.SH,在爬虫里是 sh600519,而在 yahoo finance 里则是 600519.SS,统一转换十分痛苦[8]。
  2. 时区与交易日历混乱:美股含有夏/冬令时切换,港股与 A 股休市日历各异,如果在同一张 DataFrame 中进行对齐,极易因时间漂移产生“未来函数”[6][9]。
  3. 接口分裂:为了取三个市场的数据,需要同时维护 3 个不同的第三方库,任何一个依赖升级或爬虫接口失效,都会导致整个数据流崩溃。

生产级解决方案:标准统一的 QuantDash 接口

QuantDash 提供了高度规范的跨市场整合能力[8]。无论是 A 股、美股还是港股,均统一采用国际标准的 {代码}.{交易所后缀} 标准(如 600519.SH, 00700.HK, AAPL.US),且 K 线接口返回高度规整的、小写英文列名的 DataFrame[8][10]。

1. 跨市场统一数据流向
代码语言:txt
复制
A 股 (600519.SH)  ──┐
 港股 (00700.HK)   ──┼─> [QuantDash 统一网关] ─> 统一 DataFrame (trade_date, close...)
 美股 (AAPL.US)     ──┘
2. 实战代码实现

我们将用一套极简的代码,同时获取茅台、腾讯、苹果的历史日 K 线,并利用 pandas_ta(或手动用 Pandas)计算 RSI(14) 动量指标进行跨市场相对强弱对比[7]:

代码语言:python
复制
import os
import pandas as pd
from quantdash import QuantDash

# 初始化客户端(使用脱敏公共Token,生产环境建议替换为您的专属 API Key)
api_key = os.getenv("QUANTDASH_API_KEY", "demo_public_token")
qd = QuantDash(api_key=api_key)

def calculate_rsi(df, period=14):
    """手动用 Pandas 优雅计算标准 RSI(14) 指标"""
    delta = df["close"].diff()
    gain = (delta.where(delta > 0, 0)).rolling(window=period).mean()
    loss = (-delta.where(delta < 0, 0)).rolling(window=period).mean()
    rs = gain / (loss + 1e-9)
    df["RSI_14"] = 100 - (100 / (1 + rs))
    return df

def get_multi_market_momentum():
    # 定义跨市场标的(A股、港股、美股)
    symbols = {
        "A-Share (茅台)": "600519.SH",
        "HK-Share (腾讯)": "00700.HK",
        "US-Share (苹果)": "AAPL.US"
    }
    
    combined_results = []
    
    for name, symbol in symbols.items():
        print(f"正在从 QuantDash 提取 {name} [{symbol}] 的前复权 K 线...")
        try:
            # 统一的接口、统一的参数、统一的复权口径
            df = qd.klines.get(
                symbol=symbol,
                period="1d",
                adjust="forward",   # forward 为前复权,确保历史指标连续、不因除权失真
                to_dataframe=True
            )
            
            if df is None or df.empty:
                continue
                
            # 计算 RSI 指标
            df = calculate_rsi(df)
            
            # 取最新一天的收盘价和 RSI 值
            latest_row = df.iloc[-1]
            combined_results.append({
                "市场名称": name,
                "标准代码": symbol,
                "交易日期": latest_row["trade_date"],
                "最新收盘价": round(latest_row["close"], 2),
                "RSI(14)值": round(latest_row["RSI_14"], 2)
            })
            
        except Exception as e:
            print(f"拉取 {symbol} 数据异常: {e}")
            
    return pd.DataFrame(combined_results)

if __name__ == "__main__":
    momentum_df = get_multi_market_momentum()
    print("\n=== 跨市场最新收盘价与相对强弱(RSI)对比面板 ===")
    print(momentum_df.to_string(index=False))
3. 运行数据输出
代码语言:txt
复制
正在从 QuantDash 提取 A-Share (茅台) [600519.SH] 的前复权 K 线...
正在从 QuantDash 提取 HK-Share (腾讯) [00700.HK] 的前复权 K 线...
正在从 QuantDash 提取 US-Share (苹果) [AAPL.US] 的前复权 K 线...

=== 跨市场最新收盘价与相对强弱(RSI)对比面板 ===
         市场名称      标准代码       交易日期   最新收盘价  RSI(14)值
 A-Share (茅台) 600519.SH 2026-07-24 1297.41     68.55
HK-Share (腾讯)  00700.HK 2026-07-24  434.60     44.83
US-Share (苹果)   AAPL.US 2026-07-24  333.02     67.70

Cursor / DeepSeek AI 编程助手专享 Prompt

你可以直接复制本段 Prompt 投喂给 AI 助手,在编写跨市场代码时彻底规避由于接口幻觉导致的 Bug[13][14]:

代码语言:txt
复制
你是一个资深的量化研究员。我正在使用统一的 quantdash 数据源 SDK。
请帮我写一个 Python 脚本,要求:
1. 导入 quantdash:from quantdash import QuantDash; qd = QuantDash(api_key=os.getenv("QUANTDASH_API_KEY"))
2. 获取三个标的 "BTC.US" (比特币ETF或美股相关)、"00700.HK" 和 "510300.SH" 过去 60 天的前复权日K线数据:qd.klines.get(symbol=symbol, period="1d", adjust="forward", to_dataframe=True)
3. 使用 pandas 计算每个标的的 20 日简单移动平均线(MA20)。
4. 对齐三个标的的 trade_date,合并输出一张包含各标的 close 以及 MA20 的宽表,缺失值使用前向填充 ffill。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 导言 / TL;DR
  • 技术痛点拆解:多数据源拼表的“代码地狱”
  • 生产级解决方案:标准统一的 QuantDash 接口
    • 1. 跨市场统一数据流向
    • 2. 实战代码实现
    • 3. 运行数据输出
  • Cursor / DeepSeek AI 编程助手专享 Prompt
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档