全球资产配置是降低单一市场风险、获取 Beta 收益的经典手段。本篇我们将使用 DeepSeek 配合 QuantDash 的跨市场数据提取能力,快速构建一个“A股沪深300 ETF + 美股标普500 ETF”的双通道动量轮动策略。
1. 策略逻辑设计
-
备选标的:沪深300 ETF(510300.SH)与标普500(SPY)。
-
调仓周期:每周五收盘前,计算过去 20 个交易日的动量(区间涨幅)。
-
交易规则:
- 比较两者的动量,选择动量更高且为正值的资产满仓买入;
- 若两者动量皆为负,则选择空仓避险(或买入国债 ETF)。
2. 数据准备与多市场拉取
跨市场策略最头疼的是数据对齐和时区处理。QuantDash 在底层完成了标准化清洗,让我们可以直接批量拉取跨市场历史 K 线。
import pandas as pd
from quantdash import QuantDash
# 1. 初始化(若未设置环境变量,请在此传入您的 API Key)
# 您也可以在终端 export QUANTDASH_API_KEY="your_key" 之后直接 qd = QuantDash()
qd = QuantDash(api_key="your_api_key_here")
# 2. 备选标的(美股标的请严格添加 .US 后缀)
symbols = ["510300.SH", "SPY.US"]
# 存储结果的字典,用来模拟 batch 接口返回的结构
dfs = {}
# 3. 使用通用的 klines.get() 接口循环获取数据,完全避开 batch 权限限制
for symbol in symbols:
print(f"正在拉取 {symbol} 历史日K数据...")
try:
# 使用通用的单只股票获取接口,所有账户均可免费调用
df = qd.klines.get(
symbol=symbol,
period="1d",
count=60,
adjust="forward",
to_dataframe=True
)
if df is not None and not df.empty:
dfs[symbol] = df
else:
print(f"[-] 警告:未能获取到 {symbol} 的数据")
except Exception as e:
print(f"[-] 获取 {symbol} 数据时发生异常: {e}")
# 4. 计算 20 日动量
for symbol in symbols:
df = dfs.get(symbol)
if df is None or df.empty:
print(f"[-] 标的: {symbol} 无可用数据,跳过计算。")
continue
# 确保数据按交易日期升序排序
df = df.sort_values("trade_date")
# 获取当前收盘价与 20 个交易日前的收盘价
close_now = df['close'].iloc[-1]
close_20d_ago = df['close'].iloc[-20]
# 计算动量
momentum = (close_now - close_20d_ago) / close_20d_ago
print(f"标的: {symbol} | 当前价: {close_now:.2f} | 20日动量: {momentum:.2%}")
数据输出:
正在拉取 510300.SH 历史日K数据...
正在拉取 SPY.US 历史日K数据...
标的: 510300.SH | 当前价: 4.70 | 20日动量: -5.20%
标的: SPY.US | 当前价: 738.93 | 20日动量: 1.36%
3. 经验总结
跨市场轮动策略的关键在于数据格式的无缝兼容**。通过** qd.klines.batch 批量返回以 symbol 为 key 的字典,不仅避免了多次网络请求的开销,还能通过标准的 Pandas trade_date 轻松实现异构市场的对齐。这让原本复杂的跨国配置策略,简化到了不足 30 行代码。
4. 常见问题解答 (FAQ)
-
Q: A股和美股交易时间不同,如何做回测对齐?
- A: 通常在日频轮动策略中,我们以“交易日”为轴。QuantDash 规整后的 DataFrame 会保留各自市场的 trade_date,您可以使用 Pandas 的 merge 或 concat 按日期进行外连接或内连接,轻松实现多市场时序对齐。
-
Q: 想要尝试这个跨市场策略,如何获取数据权限?
- A: 可通过 注册获取 API Key 获取免费额度进行测试。详细的参数指南请参考 详细接口参数参考。

