前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >程序员炒股,如何计算股票投资组合的风险和收益

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

作者头像
CSDN技术头条
发布于 2018-03-26 10:10:27
发布于 2018-03-26 10:10:27
2.4K00
代码可运行
举报
文章被收录于专栏:CSDN技术头条CSDN技术头条
运行总次数:0
代码可运行
交易过程是一个复杂的过程,包括股票选择,策略设计和投资组合创建等多个步骤。在这里,我们将重点关注其中的一个步骤,即计算具有 n 个股票的投资组合的预期回报和潜在风险。

单只股票的预期回报

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

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

在这里我们将讨论个股的权重如何影响投资组合的这两个参数。假设我们有一只股票 ABC,ri 为股票的预期回报,rx 为有 px 的概率获得的回报。那么预期收益 ri 可以使用如下公式进行计算:

如下图,让我们假设股票 ABC 可以按照列 B 的概率获得列 A 的回报,那么我们可以计算出股票 ABC 所获得的总回报就是列 C,也就是列 A 和列 B 的乘积。

接下来,让我们用代码来计算一下这只股票 ABC 的投资回报。我们从先导入 pandas 包开始,这是我们经常用的一个数据处理的包。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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, '%')

程序的输出结果如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
     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 来计算股票的风险:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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)

程序的输出结果如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
     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 来计算这个投资组合的权重。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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()))

程序的输出结果如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   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 来计算一下投资组合的预期收益,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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))

程序的输出结果如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   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 轴上面的所有股票,如下图所示,每个单元格包含相应列的权重和相应股票的协方差的乘积。

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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)

程序的输出结果如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
      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
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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))

程序的输出结果如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
          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 将倾向于零。因此,完全多元化的投资组合的方差将是协方差的平均值。所以,我们可以说多元化消除了除股票协方差之外的所有风险,也就是所谓的市场风险。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-03-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 CSDN技术头条 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python3对多股票的投资组合进行分析「建议收藏」
目前,金融市场总是变幻莫测,充满了不确定因素,是一个有许多投资风险的市场。这与其本身的市场规律和偶然性有关,金融危机、国家政策以及自然灾难等都会影响到金融市场,均会影响投资的收益情况。所以投资者总是希望能够找到应对的方法来减少投资的风险而增加收益。随着老百姓对合理的财富分配理论有着迫切的需求,学会优化投资理财,做到理性投资,是当前投资者最关心的问题。
全栈程序员站长
2022/09/27
2.7K0
Python3对多股票的投资组合进行分析「建议收藏」
Python计算股票投资组合的风险价值(VaR)
风险价值(VaR)用于尝试量化指定时间范围内公司或投资组合中的财务风险水平。VaR提供了一段时间内投资组合的最大损失的估计,您可以在各种置信度水平上进行计算。
拓端
2020/11/19
4K0
Python计算股票投资组合的风险价值(VaR)
精品教学案例 | 用Python构建有效投资组合
本案例适合作为大数据专业数据清洗或数据可视化课程的配套教学案例。通过本案例,能够达到以下教学效果:
数据酷客
2020/05/19
5.4K1
精品教学案例 | 用Python构建有效投资组合
深度 | 强化学习应用金融投资组合优化(附代码)
我们建立一个观察N只股票的Agent,并在每一阶段根据决策分配给每只股票一定比例的资金。我们希望Agent能够在符合股票市场真实场景假设下做到这一点,例如:有(实质性的)交易成本,股票不遵循标准正态分布等。我们不知道其他的市场参与者所拥有信息的多少等(换句话说,Agent可以处理POMDP模型中尽可能多的PO)。
量化投资与机器学习微信公众号
2019/02/26
3.8K0
R语言马科维茨Markowitz均值-方差(风险投资模型)分析最优投资组合数据预期收益率可视化
证券及其它风险资产的投资首先需要解决的是两个核心问题:即预期收益与风险。 那么如何测定组合投资的风险与收益和如何平衡这两项指标进行资产分配是市场投资者迫切需要解决的问题。正是在这样的背景下,在50年代和60年代初,马科维茨理论应运而生。
拓端
2023/07/07
6180
【进阶】实现最优投资组合有效前沿基于Python(附代码)
良好的投资组合不仅仅是一长串的优质股票和债券。这是一个平衡的整体,为投资者提供各种突发事件方面的保护和机会。——哈里·马克维茨
量化投资与机器学习微信公众号
2019/02/26
13.5K3
股市技术面操作的量化交易--量化交易2-投资方法
根据产业链进行股市的划分,在上中下游进行利润和周期的排序,并根据发展规律,相关性排序,进行行业选择。
嘘、小点声
2020/11/24
8500
股市技术面操作的量化交易--量化交易2-投资方法
资产瞎配模型(一)
大类资产配置是量化中一个重要的领域,本文尝试实现若干资产配置模型。全文纯属瞎配,欢迎指正!
量化小白
2019/01/22
2K1
Man Group最新:动态风险管理在股票投资组合中的应用
今天公众号为大家分享一篇Man Group最新的研究文章,干货满满!重点在第四节~
量化投资与机器学习微信公众号
2020/12/08
1.3K0
Man Group最新:动态风险管理在股票投资组合中的应用
如何更稳健的计算组合最优权重(附代码)
今天分享的论文是Marcos López de Prado 2019年的论文《A ROBUST ESTIMATOR OF THE EFFICIENT FRONTIER》本文主要有两个创新点。
量化投资与机器学习微信公众号
2021/07/29
2.6K0
使用CorrGAN:比较基于网络和最小方差的投资组合(附代码)
许多经济物理学家已经注意到,利用股票(或其他资产)收益估计的经验相关矩阵构建的网络leaves的投资组合,与对同一股票估计的经验协方差进行最小方差优化所得到的投资组合非常相似。
量化投资与机器学习微信公众号
2020/02/27
9700
使用CorrGAN:比较基于网络和最小方差的投资组合(附代码)
分层风险平价:基于图论和机器学习的新资产配置方法(附代码)
风险平价是构建多样化和均衡投资组合十分流行选择。众所周知,大多数资产类别的未来表现很难预测。 通过仅使用资产的风险特征和相关矩阵构建投资组合,风险平价方法克服了这一缺点。Lohre、Rother和Schafer三位作者在经典风险平价基础上,提出了分层风险平价。他们的方法是:
量化投资与机器学习微信公众号
2020/02/26
2K0
R语言风险价值VaR(Value at Risk)和损失期望值ES(Expected shortfall)的估计
风险值(VaR)是在所选概率水平下预测分布分位数的负数。因此,图2和3中的VaR约为110万元。
拓端
2020/10/23
1.8K0
有效前沿—让你的投资收益最大化
大家在不管是在理财或者是在干其他事情的过程中,应该都经常听到的一句话就是高收益意味着高风险,低风险意味着低收益。但有的时候高风险不一定是高收益的,低收益也不一定是低风险的(这就是坑)。在理想情况下收益与风险可能会有如下四种情况,红色部分(高风险低收益)是我们所要避免的,绿色部分(低风险高收益)是我们所追求的,灰色部分是正常事物所遵循的规律。
张俊红
2020/04/14
1K0
有效前沿—让你的投资收益最大化
Markowitz有效边界和投资组合优化基于Python(附代码)
哈里马科维茨对金融和经济学的世界的贡献是怎么强调都不过分的。凭借其于 1952年发表的开创性论文“资产组合选择”,他被广泛的视作现代资产组合理论(MPT)的开拓者。最终在1990年,基于对这一领域的巨大贡献,他获得了诺贝尔经济学奖。
量化投资与机器学习微信公众号
2018/11/16
8.4K1
马科维茨投资组合
https://blog.csdn.net/weixin_44510615/article/details/90377275
润森
2019/10/30
1K0
马科维茨投资组合
【视频】风险价值VaR原理与Python蒙特卡罗Monte Carlo模拟计算投资组合实例|附代码数据
风险价值 (VaR) 是一种统计数据,用于量化公司、投资组合在特定时间范围内可能发生的财务损失程度
拓端
2023/02/08
1.2K0
使用蒙特卡罗模拟的投资组合优化
在金融市场中,优化投资组合对于实现风险与回报之间的预期平衡至关重要。蒙特卡罗模拟提供了一个强大的工具来评估不同的资产配置策略及其在不确定市场条件下的潜在结果。
deephub
2023/11/06
6930
使用蒙特卡罗模拟的投资组合优化
译文 | 量化投资教程:投资组合优化与R实践
本文由CDA作者库成员HarryZhu翻译,并授权发布。 CDA作者库凝聚原创力量,只做更有价值的分享。 Harry Zhu,擅长用Python和R进行数据建模、定量研究,目前就职于量子金服(Quan
CDA数据分析师
2018/02/24
2.1K0
译文 | 量化投资教程:投资组合优化与R实践
R语言马科维茨Markowitz均值-方差(风险投资模型)分析最优投资组合数据预期收益率可视化|附代码数据
最近我们被客户要求撰写关于马科维茨Markowitz均值-方差(风险投资模型)的研究报告,包括一些图形和统计输出。
拓端
2023/11/28
5390
推荐阅读
相关推荐
Python3对多股票的投资组合进行分析「建议收藏」
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验