Python实现马科维茨资产配置:QuantDash组合优化

用户头像mx_****zqklr
2026-07-20 发布

导言 / TL;DR

无论是多因子选股还是跨市场ETF轮动,策略最终都要落地到“仓位权重分配”上。盲目等权重配置往往无法最大化风险收益比。本文将展示如何通过 QuantDash 提取 A 股和美股多资产历史 K 线,并结合知名的开源组合优化库 PyPortfolioOpt,利用马科维茨均值-方差模型(MVO)计算出最大夏普比率(Max Sharpe)的黄金仓位。

技术痛点拆解

在进行多资产投资组合优化时,量化开发者经常面临两个工程阻碍:

  • 多市场时序不齐对齐难:当组合中同时包含中美资产时,由于时差和休市日历不同,计算资产协方差矩阵(Covariance Matrix)前必须进行严格的缺失值填充与时间对齐,否则会导致矩阵非正定,算法无法收敛。
  • 计算过程繁琐:手写二次规划(Quadratic Programming)求解有效前沿不仅代码量大,且容易在约束条件(如禁止做空、单资产比例上限)上出错。

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

首先,安装所需依赖:

pip install quantdash pandas pyportfolioopt

以下为获取历史收盘价并求解最优资产配置比例的完整代码:

import pandas as pd
from pypfopt import EfficientFrontier, risk_models, expected_returns
from quantdash import QuantDash

# 1. 初始化 QuantDash 客户端
qd = QuantDash(api_key="sk_xxxxx")  # 官方文档详见 docs.quantdash.net

# 定义资产组合:包含A股和美股核心标的
assets = ["600519.SH", "00700.HK", "AAPL.US", "MSFT.US"]

def get_portfolio_data(symbols, start_date="2025-01-01", end_date="2025-12-31"):
    price_dict = {}
    for sym in symbols:
        # 获取标准日K线
        df = qd.klines.get(symbol=sym, period="1d", start=start_date, end=end_date, to_dataframe=True)
        if df is not None and not df.empty:
            df["trade_date"] = pd.to_datetime(df["trade_date"])
            df.set_index("trade_date", inplace=True)
            price_dict[sym] = df["close"]
          
    # 合并为价格矩阵
    df_prices = pd.DataFrame(price_dict)
    # 前向填充跨市场休市造成的缺失值,随后删除多余空值
    df_prices = df_prices.ffill().dropna()
    return df_prices

if __name__ == "__main__":
    # 获取历史收盘价数据
    prices = get_portfolio_data(assets)
  
    # 2. 计算期望年化收益率与样本协方差矩阵
    mu = expected_returns.mean_historical_return(prices)
    S = risk_models.sample_cov(prices)
  
    # 3. 求解最大夏普比率组合 (限制单标的仓位最大为 40%)
    ef = EfficientFrontier(mu, S)
    ef.add_constraint(lambda w: w <= 0.40)  # 约束单标的权重上限
  
    weights = ef.max_sharpe()
    cleaned_weights = ef.clean_weights()
  
    # 输出优化结果
    print("\n[+] 优化后的多资产组合权重:")
    for asset, weight in cleaned_weights.items():
        print(f" - {asset}: {weight * 100:.2f}%")
      
    performance = ef.portfolio_performance(verbose=True)

数据输出样例

经过对齐与二次规划求解,控制台输出的最优配置权重及组合表现如下:

[+] 优化后的多资产组合权重:
 - 600519.SH: 15.30%
 - 00700.HK: 24.70%
 - AAPL.US: 40.00%
 - MSFT.US: 20.00%

Expected annual return: 18.5%
Annual volatility: 14.2%
Sharpe Ratio: 1.16

AI 编程助手专属提示词

如果您正在 Cursor 或 Copilot 中优化此组合模型,可以直接复制以下 Prompt:

我正在使用 PyPortfolioOpt 和 quantdash 的历史价格进行资产组合分配。
请帮我修改上面的优化代码:
1. 将目标函数改为“最小波动率组合(Minimum Variance)”。
2. 增加行业/板块限制,使得所有美股标的(AAPL.US, MSFT.US)的合计权重不能超过 50%。

总结与三步走指引

评论