You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python遗传算法实现中累积收益率计算异常问题求助

投资组合年度累积收益率计算问题

绘制不同投资组合年度累积收益率图表时,发现仅‘Overall’组合起始值大于1,其余组合均从0开始。不确定当前计算逻辑是否正确,恳请指导调整计算逻辑并修正代码。

当前计算代码

Overall组合累积收益率计算

#Calculate the cumulative returns of the overall portfolio for 2017, 2018 and 2019

daily_portfolio_returns_2017 = (log_returns * best_ind).sum(axis=1)
cumulative_returns_2017 = (1 + daily_portfolio_returns_2017).cumprod()

daily_portfolio_returns_2018 = (log_returns_2018 * best_ind).sum(axis=1)
cumulative_returns_2018 = (1 + daily_portfolio_returns_2018).cumprod()

daily_portfolio_returns_2019 = (log_returns_2019 * best_ind).sum(axis=1)
cumulative_returns_2019 = (1 + daily_portfolio_returns_2019).cumprod()

其他组合累积收益率计算

# Calculate the daily returns for the risk taker and balanced portfolios for each year
risk_taker_returns_2017 = (log_returns * best_ind_risk_taker).sum(axis=1)
risk_taker_returns_2018 = (log_returns_2018 * best_ind_risk_taker).sum(axis=1)
risk_taker_returns_2019 = (log_returns_2019 * best_ind_risk_taker).sum(axis=1)

balanced_returns_2017 = (log_returns * best_ind_balanced).sum(axis=1)
balanced_returns_2018 = (log_returns_2018 * best_ind_balanced).sum(axis=1)
balanced_returns_2019 = (log_returns_2019 * best_ind_balanced).sum(axis=1)

risk_averse_returns_2017 = (log_returns * best_ind_risk_averse).sum(axis=1)
risk_averse_returns_2018 = (log_returns_2018 * best_ind_risk_averse).sum(axis=1)
risk_averse_returns_2019 = (log_returns_2019 * best_ind_risk_averse).sum(axis=1)

# Calculate the cumulative returns for the risk taker, risk averse and balanced portfolios for each year
cumulative_returns_risk_taker = {
    '2017': (1 + risk_taker_returns_2017).cumprod(),
    '2018': (1 + risk_taker_returns_2018).cumprod(),
    '2019': (1 + risk_taker_returns_2019).cumprod()
}

cumulative_returns_risk_averse = {
    '2017': (1 + risk_averse_returns_2017).cumprod(),
    '2018': (1 + risk_averse_returns_2018).cumprod(),
    '2019': (1 + risk_averse_returns_2019).cumprod()
}

cumulative_returns_balanced = {
    '2017': (1 + balanced_returns_2017).cumprod(),
    '2018': (1 + balanced_returns_2018).cumprod(),
    '2019': (1 + balanced_returns_2019).cumprod()
}

项目仓库:https://github.com/MaximoFigueroa457/Repo-Data-Science.git


问题分析与修正方案

核心问题

代码混淆了对数收益率与算术收益率的计算逻辑:

  • 组合的对数收益率确实是各资产对数收益率的加权和,但直接将其当作算术收益率计算(1 + 对数收益率).cumprod()是错误的。这种计算方式会导致当对数收益率为负时,1 + 对数收益率可能小于1甚至趋近于0,最终让累积收益率起始值异常。
  • 正确的累积收益率计算(基于对数收益率)应该是对组合对数收益率进行累积求和后指数化,这样起始值必然为1(对应初始投资的基准)。

修正后的代码

Overall组合修正

import numpy as np

# Calculate the cumulative returns of the overall portfolio for 2017, 2018 and 2019
# 计算组合对数收益率
portfolio_log_2017 = (log_returns * best_ind).sum(axis=1)
# 累积对数收益率求和后指数化得到累积收益率(起始值=1)
cumulative_returns_2017 = np.exp(portfolio_log_2017.cumsum())

portfolio_log_2018 = (log_returns_2018 * best_ind).sum(axis=1)
cumulative_returns_2018 = np.exp(portfolio_log_2018.cumsum())

portfolio_log_2019 = (log_returns_2019 * best_ind).sum(axis=1)
cumulative_returns_2019 = np.exp(portfolio_log_2019.cumsum())

其他组合修正

# Calculate the cumulative returns for the risk taker, risk averse and balanced portfolios for each year
cumulative_returns_risk_taker = {
    '2017': np.exp((log_returns * best_ind_risk_taker).sum(axis=1).cumsum()),
    '2018': np.exp((log_returns_2018 * best_ind_risk_taker).sum(axis=1).cumsum()),
    '2019': np.exp((log_returns_2019 * best_ind_risk_taker).sum(axis=1).cumsum())
}

cumulative_returns_risk_averse = {
    '2017': np.exp((log_returns * best_ind_risk_averse).sum(axis=1).cumsum()),
    '2018': np.exp((log_returns_2018 * best_ind_risk_averse).sum(axis=1).cumsum()),
    '2019': np.exp((log_returns_2019 * best_ind_risk_averse).sum(axis=1).cumsum())
}

cumulative_returns_balanced = {
    '2017': np.exp((log_returns * best_ind_balanced).sum(axis=1).cumsum()),
    '2018': np.exp((log_returns_2018 * best_ind_balanced).sum(axis=1).cumsum()),
    '2019': np.exp((log_returns_2019 * best_ind_balanced).sum(axis=1).cumsum())
}

验证要点

修正后所有组合的累积收益率起始值都会为1,与‘Overall’组合保持一致。若仍有异常,需检查:

  • log_returns等原始对数收益率数据是否正确(确保是np.log(1 + 算术日收益率)计算得到)
  • 权重数组(best_ind、best_ind_risk_taker等)是否归一化(权重和为1)

内容的提问来源于stack exchange,提问作者Maximo Figueroa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 18:15:03