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

交易过程是一个复杂的过程,包括股票选择,策略设计和投资组合创建等多个步骤。在这里,我们将重点关注其中的一个步骤,即计算具有 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 将倾向于零。因此,完全多元化的投资组合的方差将是协方差的平均值。所以,我们可以说多元化消除了除股票协方差之外的所有风险,也就是所谓的市场风险。

原文发布于微信公众号 - CSDN技术头条(CSDN_Tech)

原文发表时间:2018-03-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏AI科技大本营的专栏

图灵奖得主姚期智最新论文出炉!中秋人家看月亮,AI人看论文

参与 | 周翔、reason_W 今年2月,世界著名计算机科学家姚期智放弃外国国籍成为中国公民,正式转为中国科学院院士,加入中国科学院信息技术科学部。 为什么这...

38711
来自专栏机器之心

资源 | Bloomberg推出在线免费课程:《机器学习基础》

课程链接:https://bloomberg.github.io/foml/#home

1032
来自专栏IT派

厉害!超越微软、Google、Facebook ! 旷视科技包揽 COCO、Places 三项世界冠军

如果你觉得好的话,不妨分享到朋友圈。 当地时间10月29日上午,在意大利威尼斯召开的计算机视觉国际顶级会议 International Conference o...

3795
来自专栏新智元

【一张图看疯狂的NIPS 2017】十年数据盘点今年NIPS多项“历史之最”

【新智元导读】要说今年的NIPS有多火?Facebook的Alex LeBurn做了一张图,展示了从2012年到今年NIPS售票情况,今年的门票抢购速度惊人,距...

3558
来自专栏量子位

2018谷歌学术影响因子发布:NIPS首次跃进Top 100,CVPR排名泛AI领域第一

刚刚,谷歌发布了2018年最新版学术指标(Google Scholar Metrics,GSM)榜单。通过综合衡量学术会议和期刊论文中已发表的论文,谷歌对学术出...

2420
来自专栏AI2ML人工智能to机器学习

平均场思想

首先要说明的, 这里的平均场是指机器学习中的平均场, 不是物理里面的平均场(请物理的同胞出门右拐,当然也可以贻笑大方下下)。 有人说,这有什么差异呢? Yan...

1232
来自专栏专知

基于TensorFlow的机器学习速成课程25讲视频全集(23-25讲)

2074
来自专栏专知

《科学》副主编:影响因子不应被用于评价科学家

“影响因子不应被用于评价科学家。”10月29日,《科学》杂志副主编瓦尔达·文森(Valda Vinson)在2018年世界生命科学大会期间接受媒体专访时表示,基...

1052
来自专栏企鹅号快讯

深度学习即将非法?欧盟《一般数据保护条例》五月生效

选自Analytics India 作者:Richa Bhatia 机器之心编译 《欧盟一般数据保护条例》(General Data Protection Re...

2088
来自专栏机器学习算法与理论

智慧医疗终端应用模型与仿真系统设计

摘要:为进一步整合开放医疗数据和社会其他资源,本文提出了一套数据利用方案。以无锡市局部路网为原型,构建了一基于互联网+医疗的用户终端应用模型。该模型包括路径寻优...

42810

扫码关注云+社区

领取腾讯云代金券