Python金融应用编程:衍生品定价和套期保值的随机过程|附代码数据

分库君
• 阅读 677

全文链接:http://tecdat.cn/?p=5620

最近我们被客户要求撰写关于金融应用编程的研究报告,包括一些图形和统计输出。

在本文中随机过程对定量融资的许多方面都很有用,包括但不限于衍生品定价,风险管理和投资管理

这些应用程序将在本文后面进一步详细讨论。本节介绍了量化融资中使用的一些流行的随机过程及其在Python中的实现。

模型参数

模型参数类包含以下随机过程使用的所有参数。为了便于理解,这些参数的前缀是它们所用的随机过程的名称。随机过程的校准将涉及寻找与某些历史数据相符的参数值。

绘制结果图

下面的代码使用Matplotlib来绘制一组随机过程。

布朗运动随机过程

布朗运动 是由悬浮在气体或液体中的颗粒表现出的随机运动。这种随机运动是由颗粒与液体或气体中的原子或分子碰撞引起的。布朗运动以植物学家罗伯特·布朗的名字命名,他观察了1827年的随机运动。 

在实践中,布朗运动不用于模拟资产价格。我将其包含在内,因为它是本文中讨论的每个其他随机过程的基础。

def plot_stochastic_processes(processes, title):
    """
此方法绘制具有指定标题的随机过程列表
     :return:绘制两个图
    """
    plt.style.use(['bmh'])
    fig, ax = plt.subplots(1)
    fig.suptitle(title, fontsize=16)
    ax.set_xlabel('Time, t')
    ax.set_ylabel('Simulated Asset Price')
    x_axis = numpy.arange(0, len(processes[0]), 1)
    for i in range(len(processes)):
        plt.plot(x_axis, processes[i])
    plt.show()

以下是此方法生成的输出示例。

def brownian_motion_log_returns(param):
 
    sqrt_delta_sigma = math.sqrt(param.all_delta) * param.all_sigma
    return nrand.normal(loc=0, scale=sqrt_delta_sigma, size=param.all_time)


def brownian_motion_levels(param):
   
    return convert_to_prices(param, brownian_motion_log_returns(param))

使用布朗运动随机过程模拟资产价格:5条路径

Python金融应用编程:衍生品定价和套期保值的随机过程|附代码数据


点击标题查阅往期内容

Python金融应用编程:衍生品定价和套期保值的随机过程|附代码数据

Matlab马尔可夫链蒙特卡罗法(MCMC)估计随机波动率(SV,Stochastic Volatility) 模型

Python金融应用编程:衍生品定价和套期保值的随机过程|附代码数据

左右滑动查看更多

Python金融应用编程:衍生品定价和套期保值的随机过程|附代码数据

01

Python金融应用编程:衍生品定价和套期保值的随机过程|附代码数据

02

Python金融应用编程:衍生品定价和套期保值的随机过程|附代码数据

03

Python金融应用编程:衍生品定价和套期保值的随机过程|附代码数据

04

Python金融应用编程:衍生品定价和套期保值的随机过程|附代码数据

使用布朗运动随机过程模拟资产价格:500条路径

Python金融应用编程:衍生品定价和套期保值的随机过程|附代码数据

几何布朗运动随机过程

几何布朗运动(GBM)由费舍尔布莱克和迈伦斯科尔斯推广,他们在1973年的论文“期权定价和公司负债”中使用它来推导出Black Scholes方程。几何布朗运动基本上是布朗运动,具有漂移分量和波动率分量。公式如下

Python金融应用编程:衍生品定价和套期保值的随机过程|附代码数据

其中是资产价格S在时间t的变化 ; μ是每年预期的百分比漂移,dt代表时间,σ是资产价格中预期的每日波动率,Wt是Wiener过程,也称为布朗运动。如下所示,布朗运动代码用于几何布朗运动方法以构造Wt的序列。

以下是此方法生成的输出示例。请注意,平均而言,生成的路径随着时间的推移而向上漂移,并且可能的收盘价格变化较大。在这个例子中,路径以每年14%的平均速率增长,因此预期收益率等于14%,分别为三年和一年(800天)。

Python金融应用编程:衍生品定价和套期保值的随机过程|附代码数据

使用几何布朗运动随机过程模拟资产价格。

Python金融应用编程:衍生品定价和套期保值的随机过程|附代码数据

Merton跳跃扩散随机过程

Robert C. Merton是最早解决Fisher Black和Myron Scholes提出的几何布朗随机过程中一些局限性的学者之一。1997年,默顿和斯科尔斯因其工作获得了诺贝尔经济学奖。

其中是具有速率泊松过程λ和ÿ是对数正态分布的随机变量。

请注意,由于跳跃扩散过程引入了向下的不连续或跳跃,因此资产的平均预期收益率略低。

Python金融应用编程:衍生品定价和套期保值的随机过程|附代码数据

使用默顿跳跃扩散几何布朗运动随机过程模拟资产价格。

Python金融应用编程:衍生品定价和套期保值的随机过程|附代码数据

Heston随机波动率过程

原始的几何布朗运动随机过程假设随时间的波动是恒定的。在1990年代早期,Steven Heston放宽了这个假设,并将几何布朗运动模型扩展到包括随机波动率。 

请注意,随着时间的推移,资产价格会变得更加不稳定,从而导致潜在资产价格在预测结束时飙升。出现这种现象是因为我将长期平均波动率设定为远高于起始波动率的数字。

Python金融应用编程:衍生品定价和套期保值的随机过程|附代码数据

使用Heston随机波动率几何布朗运动随机过程模拟资产价格。

Python金融应用编程:衍生品定价和套期保值的随机过程|附代码数据

COX INGERSOLL ROSS随机过程

在COX INGERSOLL ROSS(CIR) 随机过程是用来描述一段时间的利率变化。

其中是Wiener过程,a是过程均值回复的速率(较大的数字导致更快的均值回复过程),b是长期平均利率,σ是过程的波动率。CIR随机过程如下。 

Python金融应用编程:衍生品定价和套期保值的随机过程|附代码数据

利用Cox Ingersoll Ross均值回归随机过程模拟利率。

Python金融应用编程:衍生品定价和套期保值的随机过程|附代码数据

ORNSTEIN-UHLENBECK随机过程

Ornstein Uhlenbeck过程以Leonard Ornstein和George Eugene Uhlenbeck命名。Ornstein Uhlenbeck随机过程与CIR过程之间的区别在于CIR过程将随机分量乘以前一个利率值的平方根。 

其中是Wiener过程,a是过程均值回复的速率(较大的数字导致更快的均值回复过程),b是长期平均利率,σ是过程的波动率。 

Python金融应用编程:衍生品定价和套期保值的随机过程|附代码数据

利用Ornstein Uhlenbeck均值回归随机过程模拟利率。

Python金融应用编程:衍生品定价和套期保值的随机过程|附代码数据

衍生品定价和套期保值的随机过程

随机过程在量化金融中的最大应用是衍生品定价。

当对衍生品进行定价时,大多数量子将使用两种方法中的一种。要么为他们定价建立Black Scholes模型,要么他们将使用模拟方法来估计导数的值。这两种技术都严重依赖于使用随机过程来模拟底层证券。

===

衍生定价方法一 Black Schole

Black Scholes模型用于在一组假设下对特定类型的衍生品合约进行定价。这些假设包括:(1)存在无风险利率,任何金额可以借入或借出,(2)基础价格根据几何布朗运动随机过程,(3)进化基础不支付股息,(4)市场上没有套利机会,(5)市场交易成本为零,(6)可以买入或卖出任何数量。 

在这些假设下,可以导出着名的Black Scholes偏微分方程。 

Python金融应用编程:衍生品定价和套期保值的随机过程|附代码数据

Black Scholes公式以及各种形式期权定价公式的推导,是过去三十年中衍生品交易所大量增长的主要原因。

导数定价 方法二 - 模拟方法

鉴于Black Scholes公式隐含的局限性和假设,通常采用蒙特卡罗方法(模拟)来为更少的简化假设。

这两个选项在计算复杂性和时间之间进行权衡。每次想要对导数进行定价时,使用模拟方法计算复杂度更高,但是为替代随机过程推导Black Scholes偏微分方程的“等价”更加耗时,然后仍然找到封闭形式的衍生品定价式。因此,大多使用模拟方法。

想要这样做的原因如下图所示。事实上,你如何选择和校准你的随机过程将对期权的预期收益产生重大影响。

Python金融应用编程:衍生品定价和套期保值的随机过程|附代码数据

红色椭圆形显示市场跳跃的位置 。

Python金融应用编程:衍生品定价和套期保值的随机过程|附代码数据Python金融应用编程:衍生品定价和套期保值的随机过程|附代码数据

===

使用衍生工具进行套期保值

套期保值是风险管理战略。可对冲风险包括股票风险,利率风险,货币风险,信用风险,波动风险和商品风险。套期保值是通过投资与投资组合中的基础负相关的资产来完成的。最简单的例子是在股票上买入看跌期权。当股票表现不佳时,看跌期权表现良好,而整体投资组合并没有像没有对冲时那样糟糕。净效应是收益下降。

Python金融应用编程:衍生品定价和套期保值的随机过程|附代码数据

Python金融应用编程:衍生品定价和套期保值的随机过程|附代码数据

公司和基金将尝试确定投资组合所面临的风险因素并对冲这些风险因素。

除了我上面提到的问题之外,还有一些额外的“现实世界”问题。一个例子是一般成本和套期保值程序的复杂性(套期保值可能非常昂贵)。对于组织而言,问题在于,在出现不利损失的情况下,对冲风险或仅仅保留更多资本是否更合理。近年来,诸如Solvency II和Basel III等法规要求银行,对冲基金和保险公司预留更多资金来支持其投资组合。储备通常保留在高流动性证券中,预期收益很低,如国库券。

结论

随机过程对于描述我们世界中的随机过程非常有用。它们用于工程,遗传学,物理学和定量金融。数量使用随机过程来预测市场可能的回报和利率随时间的变化。随机过程通常与蒙特卡罗方法结合使用。

非常感谢您阅读本文,有任何问题请在下面留言!

Python金融应用编程:衍生品定价和套期保值的随机过程|附代码数据

点击文末 “阅读原文”

获取全文完整代码数据资料。

本文选自《Python金融应用编程:衍生品定价和套期保值的随机过程》。

点击标题查阅往期内容

R语言计算资本资产定价模型(CAPM)中的Beta值和可视化
R语言中进行期权定价的Heston随机波动率模型
R语言基于线性回归的资本资产定价模型(CAPM)
R语言对巨灾风险下的再保险合同定价研究案例:广义线性模型和帕累托分布Pareto distributions分析
R语言Black Scholes和Cox-Ross-Rubinstein期权定价模型案例
R语言用多元ARMA,GARCH ,EWMA, ETS,随机波动率SV模型对金融时间序列数据建模
R语言HAR和HEAVY模型分析高频金融数据波动率
R语言ARMA-GARCH-COPULA模型和金融时间序列案例
R语言分析负利率下金融市场:负利率和年金价值的变化
使用R语言随机波动模型SV处理时间序列中的随机波动率
Python随机波动率(SV)模型对标普500指数时间序列波动性预测
R语言预测波动率的实现:ARCH模型与HAR-RV模型
R语言时间序列GARCH模型分析股市波动率
R语言ARMA-EGARCH模型、集成预测算法对SPX实际波动率进行预测

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
Python3:sqlalchemy对mysql数据库操作,非sql语句
Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''
Stella981 Stella981
3年前
PhoneGap设置Icon
参考:http://cordova.apache.org/docs/en/latest/config\_ref/images.html通过config.xml中的<icon标签来设置Icon<iconsrc"res/ios/icon.png"platform"ios"width"57"height"57"densi
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这