跳转至

预期回报

作者:Robert Andrew Martin

译者:片刻小哥哥

项目地址:https://www.dafeiyang.cn/finance/stock/tools/PyPortfolioOpt/ExpectedReturns

原始地址:https://pyportfolioopt.readthedocs.io/en/latest/ExpectedReturns.html

均值方差优化需要了解预期回报。在实践中, 这些都很难确切地知道。因此我们能做的就是 提出估计,例如通过推断历史数据,这就是 均值方差优化的主要缺陷——优化过程是合理的,并且提供了 强有力的数学保证, 给定正确的输入 。这是原因之一 为什么我强调模块化:用户应该能够提出自己的 高级模型并将其输入优化器。

警告

提供预期回报弊大于利。如果预测股票收益就像计算平均历史收益一样简单,我们都会变得富有!对于大多数用例,我建议您集中精力选择适当的风险模型(参见 风险模型 )。

从 v0.5.0 开始,您可以使用 Black-Litterman Allocation 显着提高预期回报估计的质量。

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) [来源]

根据输入 (daily) 资产价格计算年化平均 (daily) 历史回报。 使用 compounding 在默认几何平均值 (CAGR) 和算术平均值。

Parameters:

  • prices ( pd.DataFrame ) – 调整后的资产收盘价,每行是一个日期每列都是一个股票代码/id。
  • returns_data ( bool, 默认为 False ) – 如果为真,第一个参数是回报而不是价格。 这些 不应该 是日志返回。
  • compounding ( bool, 默认为 True ) – 如果为 True,则计算几何平均回报,否则算术,可选。
  • frequency ( int, optional ) – 一年中的时间段数,默认为 252( 一年中的交易日数)
  • log_returns ( bool, 默认为 False ) – 是否使用对数返回进行计算

Returns: 每项资产的年化平均 (daily) 回报

Return type: pd.Series

这可能是默认的教科书方法。它直观且易于解释, 然而,这些估计存在很大的不确定性。这是一个问题,尤其是在 均值方差优化器的上下文,它将最大化错误输入。

pypfopt.expected_returns.ema_historical_return(prices, returns_data=False, compounding=True, span=500, frequency=252, log_returns=False) [来源]

计算 (daily) 历史回报的指数加权平均值,给出 较新的数据权重更高。

Parameters:

  • prices ( pd.DataFrame ) – 调整后的资产收盘价,每行是一个日期 每列都是一个股票代码/id。
  • returns_data ( bool, 默认为 False ) – 如果为真,第一个参数是回报而不是价格。这些 不应该 是日志返回。
  • compounding ( bool, 默认为 True ) – 如果为 True,则计算几何平均回报, 否则算术,可选。
  • frequency ( int, optional ) – 一年中的时间段数,默认为 252( 一年中的交易日数)
  • span ( int, optional ) – EMA 的时间跨度,默认为 500 天 EMA。
  • log_returns ( bool, 默认为 False ) – 是否使用对数返回进行计算

Returns: 每项资产的年化指数加权平均 (daily) 回报

Return type: pd.Series

指数移动平均线是对平均历史回报率的简单改进; 它使最近的回报更加可信,从而旨在提高估计的相关性。 这是通过 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,资产回报等于市场回报加上编码资产相对风险的 \(eta\) 术语。

\[ R_i = R_f + \beta_i (E(R_m) - R_f) \]

Parameters:

  • prices ( pd.DataFrame ) – 调整后的资产收盘价,每行是一个日期 每列都是一个股票代码/id。
  • market_prices ( pd.DataFrame, optional ) – 调整后的基准收盘价,默认为 None
  • returns_data ( bool, 默认为 False ) – 如果为真,第一个参数是回报而不是价格。
  • risk_free_rate ( float, optional ) – 无风险借贷利率,默认为0.02。 您应该使用适当的时间段,相应 到频率参数。
  • compounding ( bool, 默认为 True ) – 如果为 True,则计算几何平均回报, 否则算术,可选。
  • frequency ( int, optional ) – 一年中的时间段数,默认为 252( 一年中的交易日数)
  • log_returns ( bool, 默认为 False ) – 是否使用对数返回进行计算

Returns: 年化回报率预估

Return type: pd.Series

pypfopt.expected_returns.returns_from_prices(prices, log_returns=False) [来源]

计算给定价格的回报。

Parameters:

  • prices ( pd.DataFrame ) – 调整后的资产 (daily) 收盘价,每行是一个 日期,每一列都是一个股票代码/ID。
  • log_returns ( bool, 默认为 False ) – 是否使用对数返回进行计算

Returns: (daily) 回报

Return type: pd.DataFrame

pypfopt.expected_returns.prices_from_returns(returns, log_returns=False) [来源]

计算给定回报的伪价格。这些不是真实价格,因为 初始价格全部设置为 1,但通过后它的行为符合预期 任何 PyPortfolioOpt 方法。

Parameters:

  • return ( pd.DataFrame ) – 资产的 (daily) 百分比回报
  • log_returns ( bool, 默认为 False ) – 是否使用对数返回进行计算

Returns: (daily) 伪价格。

Return type: pd.DataFrame



回到顶部