Python计算股票投资组合的风险价值(VaR)

简介: Python计算股票投资组合的风险价值(VaR)

什么是风险价值(VaR)?

风险价值(VaR)用于尝试量化指定时间范围内公司或投资组合中的财务风险水平。VaR提供了一段时间内投资组合的最大损失的估计,您可以在各种置信度水平上进行计算。

估计投资组合的风险对于长期资本增长和风险管理非常重要,尤其是在大型公司或机构内部。VaR通常按以下格式构架:

  • “我们下个月的投资组合VaR为250,000元 ,置信度为95%”
  • 这意味着,以95%的置信度,我们可以说投资组合的损失在一个月内不会超过250,000元

 

在这篇文章中,我将引导您完成在股票投资组合中计算该指标的步骤。

 

VaR如何计算?

有两种主要方法来计算VaR:

  1. 使用蒙特卡洛模拟
  2. 使用方差-协方差方法

在本文中,我们将重点介绍使用方法(2)(方差-协方差)。简而言之,方差-协方差方法着眼于给定回溯期内给定股票或股票投资组合的历史价格走势(标准差,平均价格),然后使用概率理论来计算指定置信区间内的最大损失。我们将在下面使用Python逐步进行计算。

在开始之前,请注意,标准VaR计算假定以下条件:

  • 收益的正态分布 -VaR假设投资组合的收益是正态分布。对于大多数资产而言,这当然是不现实的,但允许我们使用更为简单的计算来制定基准。

  • (可以对VaR进行修改来说明不同的分布,但是这里我们将重点介绍标准VaR计算)
  • 标准市场条件 -与许多金融工具一样,VaR最适合用于考虑标准市场中的损失,并且不适用于极端/异常事件。

 

 

计算投资组合的VaR的步骤

为了计算投资组合的VaR,您可以按照以下步骤操作:

  1. 计算投资组合中股票的定期收益
  2. 根据收益创建协方差矩阵
  3. 计算投资组合均值和标准差
  • (根据投资组合中每只股票的投资水平加权)
  1. 用指定的置信区间,标准差和均值计算正态累积分布(PPF)的反函数
  2. 通过从步骤(4)的计算中减去初始投资,估算投资组合的风险价值(VaR)

 

1)计算投资组合中股票的定期收益



# 创建我们的股票投资组合


tickers = ['AAPL','FB', 'C', 'DIS']


#设置投资权重


weights = np.array([.25, .3, .15, .3])


# 设定初始投资水平


initial_investment = 1000000


# 下载收盘价


data = pdr.get_data_yahoo(tickers, start="2018-01-01", end=dt.date.today())['Close']


#从收盘价计算定期收益


returns = data.pct_change()
returns.tail()
 

 

2)根据收益建立协方差矩阵

# 生成Var-Cov矩阵
cov_matrix = returns.cov()
cov_matrix

这将使我们能够计算整个投资组合的标准差和收益平均值。

 

3)计算投资组合的平均值和标准差

# 计算每只股票的平均收益
returns.mean()
# 计算整个投资组合的平均回报,
# 对投资权重进行归一化
avg_rets.dot(weights)
# 计算投资组合标准差
np.sqrt(weights.T.dot(cov_matri
# 计算投资平均值
(1+port_mean) * initial_investment
# 计算投资标准差
initial_investment * port_st

接下来,我们可以将这些变量插入下面的百分比函数(PPF)中。

 

4)计算具有指定置信区间,标准偏差和均值的正态累积分布(PPF)的逆



# 选择我们的置信区间(我将在此处选择95%)


conf_level1 = 0.05


#逆累积分布函数为正态分布


#插入我们投资组合的均值,标准差


cutoff1 = norm.ppf(conf_level1, mean_investment, stdev_investment)

5)通过从步骤4的计算中减去初始投资,估算投资组合的风险价值(VaR)




#最后,我们可以在置信区间内计算VaR


var_1d1


#output


#22347.7792230231

在这里,我们有95%的信心说,我们的100万投资组合在一天之内不会超过损失超过2.23万元的损失。

 

n天时间段内的风险价值

如果我们想在更大的时间范围内计算该怎么办?只需获取1天的VaR并将其乘以 时间段的平方根即可 (这是由于股票收益的标准偏差往往随时间的平方根而增加)。



# 计算n天VaR
var_array = []




var_array.append(np.round(var_1d1 * np.sqrt(x),2))








# 绘制图形


plt.title("Max portfolio loss (VaR) over 15-day period")





 
1 day VaR @ 95% confidence: 10635.31


2 day VaR @ 95% confidence: 13534.26


...
14 day VaR @ 95% confidence: 73456.51


15 day VaR @ 95% confidence: 83564.53

 

对照正态分布检查我们的股票分布

如计算部分所述,我们假设在计算VaR时,我们投资组合中股票的收益呈正态分布。

当然,我们无法预测这种情况,但我们至少可以检查历史收益如何分配,以帮助我们评估VaR是否适合用于我们的投资组合。

plt.plot(x, scipy.stats.norm.pdf(x, port_mean, port_stdev), "r")


plt.show()

收益与正态分布比较

 

 

 

 

从上面我们可以看到,自2018年以来,我们选择的股票的收益都已经符合正态分布。


相关文章
|
1月前
|
Python
【10月更文挑战第10天】「Mac上学Python 19」小学奥数篇5 - 圆和矩形的面积计算
本篇将通过 Python 和 Cangjie 双语解决简单的几何问题:计算圆的面积和矩形的面积。通过这道题,学生将掌握如何使用公式解决几何问题,并学会用编程实现数学公式。
160 60
|
16天前
|
机器学习/深度学习 算法 编译器
Python程序到计算图一键转化,详解清华开源深度学习编译器MagPy
【10月更文挑战第26天】MagPy是一款由清华大学研发的开源深度学习编译器,可将Python程序一键转化为计算图,简化模型构建和优化过程。它支持多种深度学习框架,具备自动化、灵活性、优化性能好和易于扩展等特点,适用于模型构建、迁移、部署及教学研究。尽管MagPy具有诸多优势,但在算子支持、优化策略等方面仍面临挑战。
43 3
|
28天前
|
Python
【10月更文挑战第15天】「Mac上学Python 26」小学奥数篇12 - 图形变换与坐标计算
本篇将通过 Python 和 Cangjie 双语实现图形变换与坐标计算。这个题目帮助学生理解平面几何中的旋转、平移和对称变换,并学会用编程实现坐标变化。
63 1
|
1月前
|
机器学习/深度学习 移动开发 Python
【10月更文挑战第11天】「Mac上学Python 22」小学奥数篇8 - 排列组合计算
本篇将通过 Python 和 Cangjie 双语讲解如何计算排列与组合。这道题目旨在让学生学会使用排列组合公式解决实际问题,并加深对数学知识和编程逻辑的理解。
61 4
|
1月前
|
数据可视化 Python
【10月更文挑战第12天】「Mac上学Python 23」小学奥数篇9 - 基础概率计算
本篇将通过 Python 和 Cangjie 双语实现基础概率的计算,帮助学生学习如何解决简单的概率问题,并培养逻辑推理和编程思维。
48 1
|
4天前
|
机器学习/深度学习 人工智能 TensorFlow
人工智能浪潮下的自我修养:从Python编程入门到深度学习实践
【10月更文挑战第39天】本文旨在为初学者提供一条清晰的道路,从Python基础语法的掌握到深度学习领域的探索。我们将通过简明扼要的语言和实际代码示例,引导读者逐步构建起对人工智能技术的理解和应用能力。文章不仅涵盖Python编程的基础,还将深入探讨深度学习的核心概念、工具和实战技巧,帮助读者在AI的浪潮中找到自己的位置。
|
4天前
|
机器学习/深度学习 数据挖掘 Python
Python编程入门——从零开始构建你的第一个程序
【10月更文挑战第39天】本文将带你走进Python的世界,通过简单易懂的语言和实际的代码示例,让你快速掌握Python的基础语法。无论你是编程新手还是想学习新语言的老手,这篇文章都能为你提供有价值的信息。我们将从变量、数据类型、控制结构等基本概念入手,逐步过渡到函数、模块等高级特性,最后通过一个综合示例来巩固所学知识。让我们一起开启Python编程之旅吧!
|
4天前
|
存储 Python
Python编程入门:打造你的第一个程序
【10月更文挑战第39天】在数字时代的浪潮中,掌握编程技能如同掌握了一门新时代的语言。本文将引导你步入Python编程的奇妙世界,从零基础出发,一步步构建你的第一个程序。我们将探索编程的基本概念,通过简单示例理解变量、数据类型和控制结构,最终实现一个简单的猜数字游戏。这不仅是一段代码的旅程,更是逻辑思维和问题解决能力的锻炼之旅。准备好了吗?让我们开始吧!
|
6天前
|
设计模式 算法 搜索推荐
Python编程中的设计模式:优雅解决复杂问题的钥匙####
本文将探讨Python编程中几种核心设计模式的应用实例与优势,不涉及具体代码示例,而是聚焦于每种模式背后的设计理念、适用场景及其如何促进代码的可维护性和扩展性。通过理解这些设计模式,开发者可以更加高效地构建软件系统,实现代码复用,提升项目质量。 ####
|
5天前
|
机器学习/深度学习 存储 算法
探索Python编程:从基础到高级应用
【10月更文挑战第38天】本文旨在引导读者从Python的基础知识出发,逐渐深入到高级编程概念。通过简明的语言和实际代码示例,我们将一起探索这门语言的魅力和潜力,理解它如何帮助解决现实问题,并启发我们思考编程在现代社会中的作用和意义。