Python机器学习之金融风险管理
上QQ阅读APP看书,第一时间看更新

1.2 收益

所有金融投资都是为了获得利润,即收益(Return),又称回报。更严谨地说,收益是指在一段时期内投资所获得的利润。

风险和收益之间存在这样一种权衡:假设的风险越高,实现的收益就越大。由于在这方面很难得出最佳解决方案,所以这种权衡是金融学中最具争议的问题之一。然而,Markowitz(1952)对这个问题提出了一个直观的、令人兴奋的解决方案。他定义风险的方式精致、清晰,从而改变了金融研究的格局,因为在此之前对风险的定义是模糊不清的。Markowitz用标准差来量化风险。这个直观的定义使研究人员能够在金融领域中运用数学和统计学。该标准差定义如下(Hull,2012):

其中,R分别指的是年收益率和预期收益(又称期望收益)。本书将在多处使用符号来表示预期收益。涉及投资组合方差时,引入协方差,公式变为:

其中,w表示权重,表示方差,Cov表示协方差。

取得方差平方根后,得到投资组合标准差为:

换句话说,投资组合预期收益是个体收益的加权平均值,表示为:

接下来,将通过可视化来探索风险和收益的关系。我们将使用Python构建一个假定的投资组合以计算必要的统计值:

In [1]: import statsmodels.api as sm
        import numpy as np         
        import plotly.graph_objs as go
        import matplotlib.pyplot as plt
        import plotly         
        import warnings         
        warnings.filterwarnings('ignore')
 
In [2]: n_assets = 5❶
        n_simulation = 500 ❷
 
In [3]: returns = np.random.randn(n_assets, n_simulation) ❸
 
In [4]: rand = np.random.rand(n_assets) ❹
        weights = rand/sum(rand) ❺
 
        def port_return(returns):
            rets = np.mean(returns, axis=1)
            cov = np.cov(rets.T, aweights=weights, ddof=1)
            portfolio_returns = np.dot(weights, rets.T)
            portfolio_std_dev = np.sqrt(np.dot(weights, np.dot(cov, weights)))
            return portfolio_returns, portfolio_std_dev ❻
 
In [5]: portfolio_returns, portfolio_std_dev = port_return(returns) ❼
 
In [6]: print(portfolio_returns)
        print(portfolio_std_dev) ❽
 
        0.012968706503879782
        0.023769932556585847
 
In [7]: portfolio = np.array([port_return(np.random.randn(n_assets, i))
                              for i in range(1, 101)]) ❾
 
In [8]: best_fit = sm.OLS(portfolio[:, 1], sm.add_constant(portfolio[:, 0]))\
                   .fit().fittedvalues ❿
 
In [9]: fig = go.Figure()
        fig.add_trace(go.Scatter(name='Risk-Return Relationship',
                                 x=portfolio[:, 0],
                                 y=portfolio[:, 1], mode='markers'))
        fig.add_trace(go.Scatter(name='Best Fit Line',
                                 x=portfolio[:, 0],
                                 y=best_fit, mode='lines'))
        fig.update_layout(xaxis_title = 'Return', 
                          yaxis_title = 'Standard Deviation',
                          width=900, height=470)
        fig.show() ⓫

❶ 指定资产数量。

❷ 指定模拟次数。

❸ 随机生成正态分布样本用作收益。

❹ 生成随机数并用于计算权重。

❺ 计算权重。

❻ 用于计算投资组合预期收益和标准差的函数。

❼ 调用函数的结果。

❽ 输出投资组合预期收益和标准差的结果。

❾ 重新运行函数100次。

❿ 通过线性回归绘制最佳拟合线。

⓫ 绘制交互式图表。

上述Python代码所生成的图表如图1-1所示,证实了风险和收益是相关的,但这种相关性的具体大小取决于个股和金融市场状况[2]


[2] 译者注:代码使用了随机数,所以读者运行代码的结果可能与图1-1不一致,但是原理是一样的。

图1-1 风险和收益的关系