前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python金融大数据分析-BSM、Term Struc、Ho-Lee 与Vasicek模型路径仿真

Python金融大数据分析-BSM、Term Struc、Ho-Lee 与Vasicek模型路径仿真

作者头像
钱塘小甲子
发布2019-01-28 15:08:03
1.4K0
发布2019-01-28 15:08:03
举报

        这一篇的代码是之前蒙特卡洛仿真改过来的,大家都知道,用MC绘制路径是一件很好玩的事情。在学习FRM的过程中,遇到了几种利率模型,Term Structure、Ho-Lee与Vasicek。

        这里我们不讨论BSM,只是作为程序的一部分而已,后面仿真也并不用到。

        第一个模型,Term structure model with no drift,也就是,没有趋势的利率波动模型,笔者不知道这里是错误的省略了dt后面的单位正态分布函数,还是故意就是这样的,反正笔者是加上去了,以后如果觉得应该是没有的,那么再来修正吧。

        第二个模型就是带趋势的了,但是趋势是恒定的,如果趋势是不恒定的,那么就是Ho-Lee模型。

最后是大名鼎鼎的Vasicek模型,其实就是一种均值回归模型。

        整个代码如下:

代码语言:javascript
复制
# -*- coding: utf-8 -*-
import numpy as np  
import pandas as pd  
import matplotlib.pyplot as plt  
import scipy.stats as scs  
'''
#initial parameters and introductions
created by luyixiao 2016/12/29
S0 = 100#initial stock price or other value 
r = 0.05#risk-free rate
sigma = 0.25#standard devitaion 
T = 2.0#simulation time
I = 10#the number of path you wanna simluate
M = 50#the step you wanna simulate
'''

def modelSimulation(modelType,S0 = 100,r = 0.05,sigma = 0.25,T = 2.0,I = 10,M = 50,lamda = 0.05,k = 0.1,theta = 102):
    dt = T/M  
    S = np.zeros((M + 1,I))  
    S[0] = S0  
    print S[0]  
    if modelType == 'BSM':
        for t in range(1,M+1):  
            S[t] = S[t-1]*np.exp((r-0.5*sigma**2)*dt+sigma*np.sqrt(dt)*np.random.standard_normal(I))  
    if modelType == 'TSnD':
        for t in range(1,M+1):       
            S[t] = S[t-1]+np.sign(np.random.uniform(-1,1,I))*sigma*np.sqrt(dt)*np.random.standard_normal(I)  
    if modelType == 'TSwD':
        for t in range(1,M+1):       
            S[t] = S[t-1]+lamda*np.sqrt(dt)+np.sign(np.random.uniform(-1,1,I))*sigma*np.sqrt(dt)*np.random.standard_normal(I)  
    if modelType == 'HoLee':
        for t in range(1,M+1):       
            lamdan = np.random.uniform(0.01,0.09)            
            S[t] = S[t-1]+lamdan*np.sqrt(dt)+np.sign(np.random.uniform(-1,1,I))*sigma*np.sqrt(dt)*np.random.standard_normal(I)  
    if modelType == 'Vasicek':
        for t in range(1,M+1):       
            S[t] = S[t-1]+k*(theta-S[t-1])+sigma*np.sqrt(dt)*np.random.standard_normal(I)  
    plt.plot(S[:,:],lw = 1.5)  
    plt.xlabel('time')  
    plt.ylabel('price')
    plt.title(modelType)
    plt.show()  
modelSimulation('TSnD')   
modelSimulation('TSwD')   
modelSimulation('HoLee')    
modelSimulation('Vasicek')

        最后能够显示的效果是这样的:

        相信这里大家就能看出每个模型的区别了。

        最后我们讨论一下Vasicek模型的参数k,也就是均值回归的速度。

代码语言:javascript
复制
for i in range(0,5):
    modelSimulation('Vasicek',k = 0.1*i,theta=100)

        我们来看一下不同的k值下的路径图吧。

        我们看到,k值越大,回归的速度越快,那如果K很大的,读者可以自己试一下,其实就会相当于比例控制中出现系统的不稳定一样的情况。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016年12月29日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档