目录

1. 学习目标

2. 操作讲解

3、作业结果

1.、作业1

2、作业2


1. 学习目标

  1. 使用 Python 实现不同的投资配比
  2. 使用 Python 实现均值-方差模型


2. 操作讲解

通过上一个任务,你对马科维茨的均值-方差投资组合模型已经有所了解了。那么在 Python 中该如何实现呢?整个过程有些复杂,和之前使用Excel的实现也有较大差异。因此我们会将整段代码拆解一下,给你逐个讲解。大体上,这段代码将分为以下几个主要的步骤:

  1. 收集两支股票(阿里巴巴和新东方教育)的信息,主要是从 2020 年初至今,每日的收盘价格
  2. 计算两支股票的每日对数收益率和每日协方差
  3. 设置不同的股票配置比例,例如股票 A 从 0% 到 100%,每次递增 5%,股票 B 从 100% 到 0%,每次递减 5%。并将所有这些不同的配置比例记录在一个列表中,作为最终结果的对照。
  4. 对于每种配置比例,计算综合性的投资对数收益率和基于标准差的不确定性风险。并将它们记录下来
  5. 通过图表,可视化综合收益和综合风险之间的关系,找到最佳平衡点。
    对于之前已经讲述过的代码,这里不再重复,我们只挑出有改变或者新增的部分重点讲解。

首先,我们要收集阿里巴巴和新东方教育这两支股票的信息。接下来,我们需要尝试不同的股票占比。为此,我们尝试从 0% 的阿里巴巴,100% 的新东方教育,到5% 的阿里巴巴,95% 的新东方教育,等等一直到 100% 的阿里巴巴,0% 的新东方教育,一共 20 种可能。代码层面会使用 Python 的循环语句来实现。

# 尝试20种不同的投资配比,例如(0.0, 1.0), (0.05, 0.95), ..., (0.95, 0.05), (1.0, 0.0)
interval = 0.05
rounds = 20
# 定义持股比例的列表,用于存放20种不同投资比例
ratio = []
# 定义综合收益的列表,用于存放20种不同投资比例下的综合收益
combined_returns = []
# 定义综合风险的列表,用于存放20种不同投资比例下的综合风险(标准差)
combined_risks = []for i in range(0, rounds + 1):weight1 = i * intervalweight2 = 1.0 - i * interval# 输出当前的股票占比print(weight1, weight2)

其中,for i in range(0, rounds + 1) 是一种新的循环方式,它将产生一系列的 i,从 0,1,2,…,20。

注意,索引是从 0 开始,而且最后不会到 21,而是到 20 结束。这样第一支股票的占比就是 i * interval,而第二支股票的占比就是 1.0 - i * interval。第一次循环的时候,i=0,这两个比例就分别是 0%和100%。以此类推,具体数据如下表:

当然,你可以设置更小的变化幅度 interval,以及对应的组合次数 rounds。

在循环的过程中,对于每种投资比例,我们都要计算综合收益和综合风险,然后使用列表的数据结构记录下来。

具体代码如下:

# 将持股比例加入列表ratio.append([weight1, weight2])weights = np.array([weight1, weight2])# 按照持股比例,计算预期的年均综合收益combined_return = np.sum(weights * returns.mean()) * 250# 将这个综合收益加入列表combined_returns.append(combined_return)# 按照持股比例,计算年均的综合标准差,作为风险combined_risk = np.sqrt(np.dot(weights.T, np.dot(returns.cov() * 250, weights)))# 将这个综合收益加入列表combined_risks.append(combined_risk)

这里使用了年均的收益率和风险计算。需要注意的是,相比于综合收益率的计算,综合风险的计算稍微复杂一点,我们使用了矩阵的点乘和矩阵的转置。其中,weights.T 表示矩阵(这里是向量)的转置,np.dot(returns.cov() * 250, weights) 将协方差矩阵和权重向量进行点乘,之间让 weights.T 向量点乘np.dot(returns.cov() * 250, weights) 的结果。最终,使用 np.sqrt() 函数开根号,这一步实现的就是如下公式。

格式上不如 Excel 那么直观,需要你仔细对照。为了便于理解,我们也可以使用如下循环进行输出。

for i in range(0, len(ratio)):print('阿里和新东方的股票配比为', ratio[i], '的时候,综合收益为', combined_returns[i], ',综合风险为', combined_risks[i])

请注意,由于Python浮点数精度的原因,可能会出现0.15000…或者0.64999…的情况,实际上分别对应的就是0.15和0.65。

你还可以使用Python进行可视化,使用下述代码将散点图输出。

combination = pd.DataFrame({'Return': combined_returns, 'Risk': combined_risks})
combination.plot(x='Risk', y='Return', kind='scatter', figsize=(10, 6))
plt.xlabel('Expected Risk')
plt.ylabel('Expected Return')
plt.show()

从结果可以看到,在持股 55% 的阿里巴巴、45% 的新东方教育的时候,我们达到了一个均衡点,也就是 58.68% 的综合收益和 42.41% 的综合风险。当然,如果你尝试的股票时间周期和这里不同,那么结果也会有所不同。

完整的代码我列在这里,便于你阅读和实践。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt# 使用多个股票代码,构建新的dataframe
BABA = pd.read_csv('./BABA.csv', sep='\t', index_col=0)
EDU = pd.read_csv('./EDU.csv', sep='\t', index_col=0)stock_data = pd.DataFrame()
stock_data['BABA'] = BABA['Adj Close']
stock_data['EDU'] = EDU['Adj Close']# 获取两支股票的每日对数收益率
returns = np.log(stock_data / stock_data.shift(1))
print(returns)# 输出两支股票的协方差矩阵
print(returns.cov())# 尝试20种不同的投资配比,例如(0.0, 1.0), (0.05, 0.95), ..., (0.95, 0.05), (1.0, 0.0)
interval = 0.05
rounds = 20
# 定义持股比例的列表,用于存放20种不同投资比例
ratio = []
# 定义综合收益的列表,用于存放20种不同投资比例下的综合收益
combined_returns = []
# 定义综合风险的列表,用于存放20种不同投资比例下的综合风险(标准差)
combined_risks = []for i in range(0, rounds + 1):weight1 = i * intervalweight2 = 1.0 - i * interval# 输出当前的股票占比print(weight1, weight2)# 将持股比例加入列表ratio.append([weight1, weight2])weights = np.array([weight1, weight2])# 按照持股比例,计算预期的年均综合收益combined_return = np.sum(weights * returns.mean()) * 250# 将这个综合收益加入列表combined_returns.append(combined_return)# 按照持股比例,计算年均的综合标准差,作为风险combined_risk = np.sqrt(np.dot(weights.T, np.dot(returns.cov() * 250, weights)))# 将这个综合收益加入列表combined_risks.append(combined_risk)print('阿里和新东方的股票配比', ratio)
print('综合收益率', combined_returns)
print('综合风险', combined_risks)for i in range(0, len(ratio)):print('阿里和新东方的股票配比为', ratio[i], '的时候,综合收益为', combined_returns[i], ',综合风险为', combined_risks[i])combination = pd.DataFrame({'Return': combined_returns, 'Risk': combined_risks})
combination.plot(x='Risk', y='Return', kind='scatter', figsize=(10, 6))
plt.xlabel('Expected Risk')
plt.ylabel('Expected Return')
plt.show()

好了,内容我讲完了,轮到你来动手练习了,请参照上述 Python 代码的实现,完成下面两个小任务。

  • 请将上述代码中的对数收益率,替换为简单收益率,看看均值-方差模型的结果有何不同;
  • 完成上一步之后,请使用均值-方差模型,分析腾讯和新东方教育这两支股票的投资组合。

在完成练习的同时,请你注意把关键过程和最终结果截图,放到一个文件夹中打包,并用“任务5”来命名,我们在项目的「课后作业」部分为你设置了统一提交的入口。


3、作业结果

1.、作业1

# -*- coding: utf-8 -*-
# @Software: PyCharm
# @File : Task5-1.py
# @Author : Benjamin
# @Time : 2021/9/13 11:45import numpy as np
import pandas as pd
import matplotlib.pyplot as plt# 使用多个股票代码,构建新的dataframe
BABA = pd.read_csv('./BABA.csv', sep='\t', index_col=0)
EDU = pd.read_csv('./EDU.csv', sep='\t', index_col=0)stock_data = pd.DataFrame()
stock_data['BABA'] = BABA['Adj Close']
stock_data['EDU'] = EDU['Adj Close']# 获取两支股票的每日对数收益率
#returns = np.log(stock_data / stock_data.shift(1))
#print(returns)# 获取全部股票的每日简单收益率
returns = stock_data / stock_data.shift(1) - 1
print(returns)# 输出两支股票的协方差矩阵
print(returns.cov())# 尝试20种不同的投资配比,例如(0.0, 1.0), (0.05, 0.95), ..., (0.95, 0.05), (1.0, 0.0)
interval = 0.05
rounds = 20
# 定义持股比例的列表,用于存放20种不同投资比例
ratio = []
# 定义综合收益的列表,用于存放20种不同投资比例下的综合收益
combined_returns = []
# 定义综合风险的列表,用于存放20种不同投资比例下的综合风险(标准差)
combined_risks = []for i in range(0, rounds + 1):weight1 = i * intervalweight2 = 1.0 - i * interval# 输出当前的股票占比print(weight1, weight2)# 将持股比例加入列表ratio.append([weight1, weight2])weights = np.array([weight1, weight2])# 按照持股比例,计算预期的年均综合收益combined_return = np.sum(weights * returns.mean()) * 250# 将这个综合收益加入列表combined_returns.append(combined_return)# 按照持股比例,计算年均的综合标准差,作为风险combined_risk = np.sqrt(np.dot(weights.T, np.dot(returns.cov() * 250, weights)))# 将这个综合收益加入列表combined_risks.append(combined_risk)print('阿里和新东方的股票配比', ratio)
print('综合收益率', combined_returns)
print('综合风险', combined_risks)for i in range(0, len(ratio)):print('阿里和新东方的股票配比为', ratio[i], '的时候,综合收益为', combined_returns[i], ',综合风险为', combined_risks[i])combination = pd.DataFrame({'Return': combined_returns, 'Risk': combined_risks})
combination.plot(x='Risk', y='Return', kind='scatter', figsize=(10, 6))
plt.xlabel('Expected Risk')
plt.ylabel('Expected Return')
plt.show()

2、作业2

# -*- coding: utf-8 -*-
# @Software: PyCharm
# @File : Task5-2.py
# @Author : Benjamin
# @Time : 2021/9/13 11:45import numpy as np
import pandas as pd
import matplotlib.pyplot as plt# 使用多个股票代码,构建新的dataframe
TC = pd.read_csv('./TC.csv', sep='\t', index_col=0)
EDU = pd.read_csv('./EDU.csv', sep='\t', index_col=0)stock_data = pd.DataFrame()
stock_data['TC'] = TC['Adj Close']
stock_data['EDU'] = EDU['Adj Close']# 获取两支股票的每日对数收益率
#returns = np.log(stock_data / stock_data.shift(1))
#print(returns)# 获取全部股票的每日简单收益率
returns = stock_data / stock_data.shift(1) - 1
print(returns)# 输出两支股票的协方差矩阵
print(returns.cov())# 尝试20种不同的投资配比,例如(0.0, 1.0), (0.05, 0.95), ..., (0.95, 0.05), (1.0, 0.0)
interval = 0.05
rounds = 20
# 定义持股比例的列表,用于存放20种不同投资比例
ratio = []
# 定义综合收益的列表,用于存放20种不同投资比例下的综合收益
combined_returns = []
# 定义综合风险的列表,用于存放20种不同投资比例下的综合风险(标准差)
combined_risks = []for i in range(0, rounds + 1):weight1 = i * intervalweight2 = 1.0 - i * interval# 输出当前的股票占比print(weight1, weight2)# 将持股比例加入列表ratio.append([weight1, weight2])weights = np.array([weight1, weight2])# 按照持股比例,计算预期的年均综合收益combined_return = np.sum(weights * returns.mean()) * 250# 将这个综合收益加入列表combined_returns.append(combined_return)# 按照持股比例,计算年均的综合标准差,作为风险combined_risk = np.sqrt(np.dot(weights.T, np.dot(returns.cov() * 250, weights)))# 将这个综合收益加入列表combined_risks.append(combined_risk)print('阿里和新东方的股票配比', ratio)
print('综合收益率', combined_returns)
print('综合风险', combined_risks)for i in range(0, len(ratio)):print('阿里和新东方的股票配比为', ratio[i], '的时候,综合收益为', combined_returns[i], ',综合风险为', combined_risks[i])combination = pd.DataFrame({'Return': combined_returns, 'Risk': combined_risks})
combination.plot(x='Risk', y='Return', kind='scatter', figsize=(10, 6))
plt.xlabel('Expected Risk')
plt.ylabel('Expected Return')
plt.show()

如果觉得文章写不错,那就点个赞,点个收藏吧。

可关注微信公众号,后期有推文


Python 数据处理与分析(六) 设计一个高回报的投资组合(投资回报和风险分析)任务 5:使用Python实现均值-方差组合模型相关推荐

  1. hfss和python_利用Python与HFSS联合仿真设计一个微带天线(附详细代码)

    原标题:利用Python与HFSS联合仿真设计一个微带天线(附详细代码) 我们知道HFSS是一款电磁仿真商用软件,用其进行天线的设计十分方便.而该软件也预留了可以运行脚本的接口,使用者可以使用脚本对软 ...

  2. hfss和python_利用Python与HFSS联合仿真设计一个微带天线!

    原标题:利用Python与HFSS联合仿真设计一个微带天线! 我们知道HFSS是一款电磁仿真商用软件,用其进行天线的设计十分方便.而该软件也预留了可以运行脚本的接口,使用者可以使用脚本对软件进行控制, ...

  3. python数据处理与分析(汇总)

    python结构化数据 数据处理与分析 导语 我们所面临的数据 1.读取数据 2.审视数据 2.1 整体 2.2 局部(单行.列,多行.列) 3.数据类型,字段更改 3.1 字符类(object)处理 ...

  4. 【python简易小程序设计】设计一个 python程序,模拟投掷100次色子。若总点数大于300点时,则提前结束 统计最后投掷出的各点数数量(要求使用列表)并输出

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.题目 二.设计思路 三.演示结果 总结 复盘 前言 最近需要使用python设计一个项目,但是之前毫无学习经验,刚 ...

  5. 利用Python与HFSS联合仿真设计一个微带天线

    说明:本文中的微带线设计案例来自李明洋老师的<HFSS电磁仿真设计应用详解>一书的第10章----HFSS微带天线设计实例. 部分api设计参考使用了Matthew Radway在gith ...

  6. python泰坦尼克号案例分析课程设计_让课堂充满人文关怀--《泰坦尼克号》案例分析(网友来稿)...

    山东威海市国际中学 王瑞芹 人教社将<泰坦尼克号>选入了初中语文课本.入选语文课本的是,泰坦尼克沉没后,杰克与罗斯在冰海上漂浮的情景(分镜头剧本)-- 老师.学生好像都喜欢这一课文.在公开 ...

  7. 用python设计一个简易的英汉互译界面_使用python一步一步搭建微信公众平台(二)----搭建一个中英互译的翻译工具...

    距离上次写使用python一步一步搭建微信公众平台(一)已经有几个月了,当中自已也搭建了一个中英文互译的小应用,可是由于英文翻中文好弄,中文翻译成英文一直有问题,知道是编码的问题,但是一直搞不定,于是 ...

  8. java/php/net/python智能手机参数分析平台设计

    本系统带文档lw万字以上+答辩PPT+查重 如果这个题目不合适,可以去我上传的资源里面找题目,找不到的话,评论留下题目,或者站内私信我, 有时间看到机会给您发 系统功能分析和描述 使用智能手机参数分析 ...

  9. Python 数据处理数据挖掘(六):决策树模型 之 CART算法

    声明:本文为学习笔记,侵权删 一.基尼系数&CART算法 CART(Classification And Regression Tree - 分类/回归树)是决策树算法的其中一种,依靠基尼系数 ...

最新文章

  1. poj1740 A New Stone Game
  2. 大数据和python哪个好_大数据语言之争:Java和python哪个好?
  3. 新后缀再开放,投资者应谨慎对待!
  4. 打破云原生时代存储瓶颈,SmartX 发布 K8s 云原生存储 IOMesh
  5. textarea支持a标签_微慕小程序开源版A标签优化说明
  6. 十个模块_专栏 | ABAQUS Part模块的十个小技巧
  7. floquet端口必须沿z轴设置_Ansys Workbench 振动给料机偏心轴的模态分析
  8. zabbix邮件报警
  9. 互联网项目架构经验分享
  10. JavaScript知识梳理总结
  11. mysql 分页查询数据重复出现
  12. PostgreSQL extension 参数
  13. Unity3d中UGUI组件精简复盘(十八)Aspect Ratio Fitter组件
  14. 上海域格CLM920_NC3模块连接oneNET平台
  15. Android仿抖音加载框之两颗小球转动控件
  16. 870987-63-6,Ir[dF(CF3)ppy]2(dtbbpy)PF6,(Ir[dF(CF3)ppy]2(dtbpy))PF6铱催化剂
  17. 理解SVM ——入门SVM和代码实现
  18. SC92F8003读24C64程序
  19. 京东七夕报名要注意什么?四川万顿思
  20. MT6752/MT6755处理器功能介绍,MT6752/MT6755芯片资料分享

热门文章

  1. 计算器的改良(NOIP2000)
  2. 电子邮件客户端软件--foxmail(2)
  3. 农产品进出口成都代办公司注册流程
  4. 5G QoS控制原理专题详解-基础概念
  5. 什么是单点故障与应对措施
  6. 基于阿里云的智能插座——(立创EDA项目)
  7. 树莓派Linux-raspberrypi域名解析失败:Temporary failure in name resolution
  8. uboot源码学习(8)DDR内存时序参数
  9. 计算机组成:cpu的功能和组成
  10. esp32 micropython 控制ws2812 RGB灯带