期望收益率
均值-方差优化需要输入期望收益数据,但在实践中,这些都很难确切地知道。 我们能做的最好的事情就是得出估计值,例如通过推断历史数据(这也是均值-方差优化的主要缺陷),优化程序是健全的,并且在正确的输入条件下提供强大的数学保证。 这也是我强调模块化的原因之一:用户应该能够提供他们自己的优秀模型,并将其输入优化器。
小心
提供预期收益可能弊大于利。如果预测股票收益率像计算历史平均收益率那样容易,我们都会发财!所以对于大多数使用情况,我建议把精力放在选择一个合适的风险模型上(见 风险模型)。
从 v0.5.0 版本开始,可以使用 Black-Litterman 模型 来大幅提高对期望收益的估计质量。
expected_returns
模块提供了估算资产期望收益的函数,这是均值-方差优化中的一个必要输入。
按照惯例,这些方法的输出是期望年化收益。在这里假设提供的是每日价格,尽管实际上这些函数与时间频率无关(只要改变 frequency
参数)。
资产价格必须以 pandas dataframe 的形式提供,按照 用户指南 中描述的那样。
所有的函数都将价格数据处理成百分比收益率数据,然后再计算它们各自对期望收益的估计。
目前已经实现:
一般收益模型函数,允许调用一个函数来运行收益模型。
历史平均收益率
指数加权平均历史收益率
CAPM 估计收益率
此外,还提供了从收益率转换为价格以及反向转换的函数。
备注
对于下面的函数,如果希望传入收益率(默认是价格),则请设置 returns_data=True
。
- pypfopt.expected_returns.mean_historical_return(prices, returns_data=False, compounding=True, frequency=252, log_returns=False)[源代码]
根据输入的(日频)资产价格计算年化平均(日频)历史收益率。使用
compounding
参数切换使用默认的几何平均数(CAGR)或算术平均数。- 参数:
prices (pd.DataFrame) – 调整后的资产收盘价,每一行是一个日期,每一列是一个股票/ID。
returns_data (bool, 默认为 False.) – 如果是 True, 第一个参数是收益率而不是价格。不应是对数收益率。
compounding (bool, 默认为 True) – 如果为 True 则计算几何平均数,否则为算数平均数,可选。
frequency (int, optional) – 一年中的时间数,默认为252(一年中的交易日数)
log_returns (bool, 默认为 False) – 是否使用对数收益率进行计算
- 返回:
每项资产的年化平均(日频)收益率
- 返回类型:
pd.Series
这可能是课本上的默认方法,它很直观,也很容易解释,但是估计值很不稳定。这是个问题,特别是在均值-方差优化器中,它将放大输入数据的偏差。
- pypfopt.expected_returns.ema_historical_return(prices, returns_data=False, compounding=True, span=500, frequency=252, log_returns=False)[源代码]
计算(日频)历史收益的指数加权平均值,给较近的数据以较高的权重。
- 参数:
prices (pd.DataFrame) – 调整后的资产收盘价,每一行是一个日期,每一列是一个股票/ID。
returns_data (bool, 默认为 False.) – 如果是 True, 第一个参数是收益率而不是价格。不应是对数收益率。
compounding (bool, 默认为 True) – 如果为真则计算几何平均数,否则计算算数平均数,可选。
frequency (int, optional) – 一年中的时间段数,默认为252(一年中的交易日数)。
span (int, optional) – EMA 的时间跨度,默认为 500 天 EMA。
log_returns (bool, 默认为 False) – 是否使用对数收益进行计算
- 返回:
每项资产的年化指数加权平均(日频)收益率
- 返回类型:
pd.Series
指数移动平均数是对历史平均收益率的简单改进;它对最近的收益率给予更多的权重,旨在提高估计值的相关性。
span
参数决定了对最近的数据给予多大的权重。 一般来说,我会选择较高的 span,这将使估计值倾向于平均历史收益。然而,如果你打算更频繁地进行再平衡,就有理由降低 span,以捕捉近期趋势。
- pypfopt.expected_returns.capm_return(prices, market_prices=None, returns_data=False, risk_free_rate=0.02, compounding=True, frequency=252, log_returns=False)[源代码]
使用资本资产定价模型计算收益估计。在 CAPM 下,资产收益等于市场收益加乘以 β。
\[R_i = R_f + \beta_i (E(R_m) - R_f)\]- 参数:
prices (pd.DataFrame) – 调整后的资产收盘价,每一行是一个日期,每一列是一个股票/ID。
market_prices (pd.DataFrame, optional) – 基准的调整后收盘价,默认为 None
returns_data (bool, 默认为 False.) – 如果是 True, 第一个参数是收益率而不是价格
risk_free_rate (float, optional) – 借贷的无风险利率,默认为 0.02。应该使用适当的时间段,与频率参数相对应。
compounding (bool, 默认为 True) – 如果为真则计算几何平均数,否则计算算数平均数,可选。
frequency (int, optional) – 一年中的时间段数,默认为252(一年中的交易日数)。
log_returns (bool, 默认为 False) – 是否使用对数收益进行计算
- 返回:
年化收益率估计
- 返回类型:
pd.Series