单只股票的预期回报
任何股票的风险和回报都是可以通过一些特定的参数进行控制的,所以投资者可以通过调整某些特定的参数将他/她的投资组合的回报率和风险比调整到他能接受的水平。其中一个最常见的措施就是调整投资者投资组合中的股票权重。
在这里我们将讨论个股的权重如何影响投资组合的这两个参数。假设我们有一只股票 ABC,ri 为股票的预期回报,rx 为有 px 的概率获得的回报。那么预期收益 ri 可以使用如下公式进行计算:
如下图,让我们假设股票 ABC 可以按照列 B 的概率获得列 A 的回报,那么我们可以计算出股票 ABC 所获得的总回报就是列 C,也就是列 A 和列 B 的乘积。
接下来,让我们用代码来计算一下这只股票 ABC 的投资回报。我们从先导入 pandas 包开始,这是我们经常用的一个数据处理的包。
import pandas as pd
df = pd.DataFrame({'rx': pd.Series([5,6,8,9,12,15], index=['1','2','3','4','5','6']), 'px': pd.Series([0.15, 0.2, 0.3, 0.2, 0.1, 0.05], index=['1','2','3','4','5','6'])})
df['px*rx'] = df['rx']*df['px']
exp_return = df['px*rx'].sum()print(df)print('Expected Return is: ', exp_return, '%')
程序的输出结果如下:
px rx px*rx1 0.15 5 0.752 0.20 6 1.203 0.30 8 2.404 0.20 9 1.805 0.10 12 1.206 0.05 15 0.75Expected Return is: 8.1 %
根据上面的计算结果,股票的预期回报率是 8.10%。列 A 中的收益我们可以采用资本资产定价模型(CAPM)来进行计算。
单只股票的风险计算(Risk or Variance)
我们还是用上面的股票 ABC 来作为我们的例子,该股票的投资回报风险可以简单的如下计算:
下表给出了股票 ABC 的风险计算过程:
同样我们可以利用 Python 来计算股票的风险:
df['rx-ri'] = df['rx'] - exp_return
df['variance'] = df['px'] * (df['rx-ri']**2)
var_portfolio = df['variance'].sum()print(df)print("The variance of the portfolio is: ", var_portfolio)
程序的输出结果如下:
px rx px*rx rx-ri variance1 0.15 5 0.75 -3.1 1.44152 0.20 6 1.20 -2.1 0.88203 0.30 8 2.40 -0.1 0.00304 0.20 9 1.80 0.9 0.16205 0.10 12 1.20 3.9 1.52106 0.05 15 0.75 6.9 2.3805The variance of the portfolio is: 6.39
因此,股票 ABC 的回报风险为 6.39。回报的标准偏差可以计算为方差的平方根。
至此,我们已经学会了如何去计算单只股票的投资回报和回报风险,那么接下来我们就可以去学习如何计算投资组合的投资回报和回报风险。并且使用预期投资回报和风险来优化我们的投资组合。我们可以调整我们的股票权重来最大化我们的投资回报和最小化我们的风险。
投资组合的预期回报
任何股票的权重是投资于该股票的金额与投资总额的比率。对于如下的投资组合,权重显示在表中。
让我们看看我们如何使用 Python 来计算这个投资组合的权重。
df_port = pd.DataFrame({'stock': pd.Series(['A','B','C','D','E'], index=['A','B','C','D','E']), 'amount': pd.Series([100,60,200,50,40], index=['A','B','C','D','E'])})
total_invest = df_port['amount'].sum()
df_port['weights'] = df_port['amount'] / total_investprint(df_port)print("The sum of the weights is: ", round(df_port['weights'].sum()))
程序的输出结果如下:
amount stock weightsA 100 A 0.222222B 60 B 0.133333C 200 C 0.444444D 50 D 0.111111E 40 E 0.088889The sum of the weights is: 1.0
投资组合中所有股票的权重总和将总是 1.0。接下来,让我们看看这个投资组合的预期回报。
让我们用 Python 来计算一下投资组合的预期收益,如下:
df_port['stock_ret'] = pd.Series([5, 10, 7,6,6], index=['A','B','C','D','E'])
df_port['wiri']=df_port['stock_ret']*df_port['weights']print(df_port)print("The expected return from the portfolio is: ", round(df_port['wiri'].sum(), 2))
程序的输出结果如下:
amount stock weights stock_ret wiriA 100 A 0.222222 5 1.111111B 60 B 0.133333 10 1.333333C 200 C 0.444444 7 3.111111D 50 D 0.111111 6 0.666667E 40 E 0.088889 6 0.533333The expected return from the portfolio is: 6.76
协方差和回报的相关性
在讨论投资组合的回报风险之前,我们快速的来看一下协方差和相关性的定义(如果你已经对这个了解了,那么你可以跳过这一部分)。协方差(或者相关性)表示任何两只股票的收益相关性。
协方差的大小表示相关的强度。如果协方差(或者相关性)为零,那么就是不存在关系。并且,如果协方差(或者相关性)的值为负数,那么表示两只股票在往不同的方向发展,也就是说一只股票在往涨的方向发展,另一只股票就在往跌的方向发展。以下是给出计算协方差和相关性的等式。
投资组合的风险计算
接下来让我们看看画表格进行方差计算的逐步过程。
df_cov = pd.DataFrame({'A': pd.Series([6.39, -5.74, 3.65, -1.36, 9.25], index=['A','B','C','D','E']), 'B': pd.Series([-5.74, 5.14, 9.36, 5.78, -8.52], index=['A','B','C','D','E']), 'C': pd.Series([3.65, 9.36, 3.58, 7.85, 1.11], index=['A','B','C','D','E']), 'D': pd.Series([-1.36, 5.78, 7.85, 4.87, 7.25], index=['A','B','C','D','E']), 'E': pd.Series([9.25, -8.52, 1.11, 7.25, 4.63], index=['A','B','C','D','E'])})
df_cov['weight']=df_port['weights']print(df_cov)
程序的输出结果如下:
A B C D E weightA 6.39 -5.74 3.65 -1.36 9.25 0.222222B -5.74 5.14 9.36 5.78 -8.52 0.133333C 3.65 9.36 3.58 7.85 1.11 0.444444D -1.36 5.78 7.85 4.87 7.25 0.111111E 9.25 -8.52 1.11 7.25 4.63 0.088889
df_port_var = pd.DataFrame()
df_port_var['A'] = df_cov['A']*df_cov['weight']*df_cov.loc['A', 'weight']
df_port_var['B'] = df_cov['B']*df_cov['weight']*df_cov.loc['B', 'weight']
df_port_var['C'] = df_cov['C']*df_cov['weight']*df_cov.loc['C', 'weight']
df_port_var['D'] = df_cov['D']*df_cov['weight']*df_cov.loc['D', 'weight']
df_port_var['E'] = df_cov['E']*df_cov['weight']*df_cov.loc['E', 'weight']
df_port_var['row_sum'] = df_port_var['A'] + df_port_var['B'] + df_port_var['C'] + df_port_var['D'] + df_port_var['E']
port_var_box = df_port_var['row_sum'].sum()print(df_port_var)print("The variance of the portfolio is: ", round(port_var_box, 2))
程序的输出结果如下:
A B C D E row_sumA 0.315556 -0.170074 0.360494 -0.033580 0.182716 0.655111B -0.170074 0.091378 0.554667 0.085630 -0.100978 0.460622C 0.360494 0.554667 0.707160 0.387654 0.043852 2.053827D -0.033580 0.085630 0.387654 0.060123 0.071605 0.571432E 0.182716 -0.100978 0.043852 0.071605 0.036583 0.233778The variance of the portfolio is: 3.97
投资组合的风险就是该表中所有单元格的总和。因此,两只股票投资组合的风险是:
完全多元化投资组合的特例
去除 N 个对角线元素之后,我们剩下 n^2 - n 个元素,其余元素的总和可以写成:
因此,这种投资组合的风险将是:
对于完全多元化的投资组合,我们可以假设我们已经在投资组合中添加了所有可能的股票。因此,N 值必将倾向于无限大,也就是说 1/N 将倾向于零。因此,完全多元化的投资组合的方差将是协方差的平均值。所以,我们可以说多元化消除了除股票协方差之外的所有风险,也就是所谓的市场风险。