程序员炒股,如何计算股票投资组合的风险和收益
单只股票的预期回报
任何股票的风险和回报都是可以通过一些特定的参数进行控制的,所以投资者可以通过调整某些特定的参数将他/她的投资组合的回报率和风险比调整到他能接受的水平。其中一个最常见的措施就是调整投资者投资组合中的股票权重。
在这里我们将讨论个股的权重如何影响投资组合的这两个参数。假设我们有一只股票 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 将倾向于零。因此,完全多元化的投资组合的方差将是协方差的平均值。所以,我们可以说多元化消除了除股票协方差之外的所有风险,也就是所谓的市场风险。
- 归档模式下四种完全恢复的场景(r6笔记第8天)
- Git与Repo快速入门
- 10g,11g中的数据库克隆安装(r6笔记第7天)
- CVE-2017-16943 Exim UAF漏洞分析——后续
- “盲”逆向:iOS 应用 Blind 寻踪
- 根据时间字段导入数据的问题总结 (r6笔记第6天)
- Gnuboard 漏洞分析
- 一次数据库宕机问题的分析(r6笔记第5天)
- PWN学习之house of系列(一)
- 清理session的小插曲(二) (r6笔记第4天)
- 3.训练模型之在GPU上训练的环境安装
- 深度学习对话系统实战篇 -- 简单 chatbot 代码实现
- pangrank算法--PageRank算法并行实现
- 刷爆朋友圈的 deepfakes 视频人物换脸是怎样炼成的?
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- COBBLER无人值守批量安装系统.md
- 使用VSCode 打包你的第一个flutter应用(安卓篇)
- KICKSTART无人值守批量安装系统.md
- Centos7-Firewall防火墙基础讲解
- 优酷iOS插件化页面架构方法
- 处理一次k8s、calico无法分配podIP的心路历程
- 小视频源码,按返回键两次退出
- iOS音视频接入 - TRTC多人音视频通话
- Android平台RTMP推流或轻量级RTSP服务(同屏或摄像头)编码前数据接入类型总结
- 接口测试框架实战(二) | 搞定多环境下的接口测试
- MySQL 案例:“丢失数据”的谜题
- 接口测试框架实战(三) | APIObject 模式、原则与应用
- 接口测试框架实战(四) | 通用 API 封装实战
- 面试字节两轮后被完虐,一份字节跳动面试官给你的Android技术面试指南,请查收!
- 3分钟短文:说说Laravel模型中还算常用的2个“关系”