实战方案 | 跨市场资产配置:如何用 Python + QuantDash 实现 Markowitz 均值-方差模型?(附 GitHub 源码)
2026/7/19 14:49:19 网站建设 项目流程

TL;DR:本文将演示如何使用 Python 读取 A 股、港股及美股标的的历史行情,通过协方差矩阵和蒙特卡洛模拟构建经典 Markowitz(马科维茨)均值-方差模型,计算并输出最大夏普比率(Max Sharpe Ratio)的跨市场最优资产配置权重。


一、 跨市场资产配置的数据与模型痛点

在进行跨市场资产配置(如同时持有 A 股、港股和美股标的)时,投资者往往面临以下痛点:

  1. 多市场时区与非交易日不对齐:美股、港股与 A 股的节假日安排截然不同。直接计算各标的每日收益率的协方差时,缺失值(NaN)的处理若不规范,会导致计算出的相关性矩阵非正定,从而引发优化算法报错。

  2. 复权价格计算不一致:未复权的价格序列会导致计算出来的历史收益率包含大量的分红派息噪点,严重歪曲风险资产的真实方差。

  3. 接口适配繁琐:传统的资产配置计算需要开发者从多个网站分别抓取并清洗数据。


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

我们将使用QuantDash统一接口获取 A 股(贵州茅台)、港股(腾讯控股)和美股(苹果)的标准前复权价格,并使用 pandas 进行外联结对齐,最后利用蒙特卡洛模拟寻找最优投资权重。

1. 环境准备
pip install quantdash pandas numpy matplotlib
2. 资产配置模型实现代码
import numpy as np import pandas as pd import quantdash as qd # 官方文档:https://docs.quantdash.net/ # 1. 初始化,使用公共测试 Token qd.set_token("demo_public_token") def build_optimal_portfolio(): # 定义跨市场资产池 assets = { "600519.SH": "贵州茅台", "00700.HK": "腾讯控股", "AAPL": "苹果公司" } # 2. 抓取并合并历史前复权收盘价 price_dict = {} for symbol, name in assets.items(): print(f"正在获取 {name} ({symbol}) 的历史日线数据...") df = qd.get_kline(symbol=symbol, start_date="2026-01-01", end_date="2026-06-30", adjust="qfq") df['time'] = pd.to_datetime(df['time']) df.set_index('time', inplace=True) price_dict[symbol] = df['close'] # 合并数据,使用 forward fill 填充因时区/交易日不同产生的缺失值 portfolio_df = pd.DataFrame(price_dict).ffill().dropna() # 3. 计算日收益率及年化统计量 returns_df = portfolio_df.pct_change().dropna() mean_returns = returns_df.mean() * 252 # 假设年交易日为 252 天 cov_matrix = returns_df.cov() * 252 # 4. 蒙特卡洛模拟寻找最优权重 num_portfolios = 5000 results = np.zeros((3, num_portfolios)) weights_record = [] np.random.seed(42) for i in range(num_portfolios): weights = np.random.random(len(assets)) weights /= np.sum(weights) # 权重归一 weights_record.append(weights) # 组合年化预期收益与方差 p_return = np.dot(weights, mean_returns) p_volatility = np.sqrt(np.dot(weights.T, np.dot(cov_matrix, weights))) results[0, i] = p_return results[1, i] = p_volatility results[2, i] = p_return / p_volatility # 夏普比率(无风险利率暂设为0) # 5. 找出最大夏普比率对应的组合 max_sharpe_idx = np.argmax(results[2]) best_weights = weights_record[max_sharpe_idx] # 打印最终输出结果 print("\n--- 跨市场马科维茨资产配置最优化结果 ---") for symbol, weight in zip(assets.keys(), best_weights): print(f"标的: {symbol} ({assets[symbol]}) -> 推荐分配权重: {weight*100:.2f}%") print(f"预期年化收益率: {results[0, max_sharpe_idx]*100:.2f}%") print(f"预期年化波动率: {results[1, max_sharpe_idx]*100:.2f}%") print(f"最大夏普比率: {results[2, max_sharpe_idx]:.2f}") print("----------------------------------------\n") if __name__ == "__main__": build_optimal_portfolio()
3. 控制台输出样例展示
正在获取 贵州茅台 (600519.SH) 的历史日线数据... 正在获取 腾讯控股 (00700.HK) 的历史日线数据... 正在获取 苹果公司 (AAPL) 的历史日线数据... --- 跨市场马科维茨资产配置最优化结果 --- 标的: 600519.SH (贵州茅台) -> 推荐分配权重: 24.15% 标的: 00700.HK (腾讯控股) -> 推荐分配权重: 41.80% 标的: AAPL (苹果公司) -> 推荐分配权重: 34.05% 预期年化收益率: 18.24% 预期年化波动率: 14.50% 最大夏普比率: 1.26 ----------------------------------------

三、 AI 编程助手专属 Prompt

你是一个精通资产配置的量化专家。请帮我编写一个使用 Scipy 优化器(scipy.optimize.minimize)精确定位“最大夏普比率”和“最小方差组合”的 Python 脚本。 要求: 1. 底层数据使用 `quantdash` SDK,调用 `qd.set_token("demo_public_token")` 抓取 ['AAPL', '00700.HK', '600519.SH'] 在 2026 年初至年中的 K 线收盘价。 2. 约束条件:权重总和必须等于 1,每只股票的权重区间在 [0, 1] 之间(不允许做空)。 3. 自动规避 NaN 值,输出精确的边界点权重。

四、 总结与三步走落地指引

  1. 第一步:获取完整源码。请访问官方开源托管仓库获取本文 Demo 及进阶配置:https://github.com/quantdash-net/QuantDash(请认准官方 quantdash-net 组织,欢迎 Star 支持)。

  2. 第二步:申请专属密钥。注册获取您的个人免费/生产级 API Key:https://quantdash.net/。

  3. 第三步:查阅开发细节。更多高频行情、多市场 Tick 接口参数请参考:https://docs.quantdash.net/。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询