程序员炒股,如何计算股票投资组合的风险和收益

时间:2022-05-06
本文章向大家介绍程序员炒股,如何计算股票投资组合的风险和收益,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
交易过程是一个复杂的过程,包括股票选择,策略设计和投资组合创建等多个步骤。在这里,我们将重点关注其中的一个步骤,即计算具有 n 个股票的投资组合的预期回报和潜在风险。

单只股票的预期回报

投资组合的预期收益提供了可以从投资组合中获得多少回报的估计。风险评估给出了投资者在持有这个投资组合时所需要承担的风险估计。投资组合的回报和风险都是取决于单只股票的回报和风险,及其单只股票在整个投资组合中的组成份额。

任何股票的风险和回报都是可以通过一些特定的参数进行控制的,所以投资者可以通过调整某些特定的参数将他/她的投资组合的回报率和风险比调整到他能接受的水平。其中一个最常见的措施就是调整投资者投资组合中的股票权重。

在这里我们将讨论个股的权重如何影响投资组合的这两个参数。假设我们有一只股票 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。回报的标准偏差可以计算为方差的平方根。

至此,我们已经学会了如何去计算单只股票的投资回报和回报风险,那么接下来我们就可以去学习如何计算投资组合的投资回报和回报风险。并且使用预期投资回报和风险来优化我们的投资组合。我们可以调整我们的股票权重来最大化我们的投资回报和最小化我们的风险。

投资组合的预期回报

让我们拿 N 只股票来做一个投资组合,我们假设第 i 只股票的预期回报是 ri,那么投资组合的预期收益将是:

任何股票的权重是投资于该股票的金额与投资总额的比率。对于如下的投资组合,权重显示在表中。

让我们看看我们如何使用 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

协方差和回报的相关性

在讨论投资组合的回报风险之前,我们快速的来看一下协方差和相关性的定义(如果你已经对这个了解了,那么你可以跳过这一部分)。协方差(或者相关性)表示任何两只股票的收益相关性。

协方差的大小表示相关的强度。如果协方差(或者相关性)为零,那么就是不存在关系。并且,如果协方差(或者相关性)的值为负数,那么表示两只股票在往不同的方向发展,也就是说一只股票在往涨的方向发展,另一只股票就在往跌的方向发展。以下是给出计算协方差和相关性的等式。

投资组合的风险计算

对于投资组合的风险,我们可以使用画表格的方法来进行计算。对于 N 只股票的投资组合,我们会创建一个 N*N 的矩阵,其中包含 X 和 Y 轴上面的所有股票,如下图所示,每个单元格包含相应列的权重和相应股票的协方差的乘积。

接下来让我们看看画表格进行方差计算的逐步过程。

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 只股票,所有股票的权重相等。因此,每只股票的权重将是 1/N。我们使用上述画表格的方法,我们可以将所有对角元素的和写为:

去除 N 个对角线元素之后,我们剩下 n^2 - n 个元素,其余元素的总和可以写成:

因此,这种投资组合的风险将是:

对于完全多元化的投资组合,我们可以假设我们已经在投资组合中添加了所有可能的股票。因此,N 值必将倾向于无限大,也就是说 1/N 将倾向于零。因此,完全多元化的投资组合的方差将是协方差的平均值。所以,我们可以说多元化消除了除股票协方差之外的所有风险,也就是所谓的市场风险。