金融衍生品-雪球期权估值(+python实现)

论坛 期权论坛 期权     
期权匿名问答   2022-4-26 20:53   10303   3
一、 雪球期权的基本概念

1、 金融期权

金融期权是一种本身价值由标的金融资产的价值决定的金融衍生品。不同类型的期权取决于其标的资产的选择,比如,当期权以一支股票为标的金融资产时,它就被称为股票期权,类似地,还有债券期权、货币期权等等。
2、 雪球期权

此篇文章主要介绍金融期权中的一种——雪球期权,并对其估值过程和python实践进行介绍。(内容来自俺的实习经验,由于代码都是自己写的,应该也不会涉及到公司侵权吧QAQ)
言归正传,那么雪球期权到底是怎样的呢?
首先,期权的目标。期权被设计出来的原因是为了平衡风险。当投资者进行有风险的投资时,为了避免发生血本无归的情况,他往往会购买一个和此轮投资方向相反的金融衍生品来平衡投资风险。雪球期权就是其中一种。
其次,雪球期权的原理。简单来说,雪球期权会先确定标的资产,以该资产未来的变化为预期,并设置敲出敲入价格。当标的资产未来价格发生变化时(即可能发生敲入敲出事件),根据敲入敲出事件是否发生的各种情况,我们会对这个期权做出相应的定价策略。
3、 相关概念

标的资产:可以是股票、指数、债券等等。比如沪深300、中证500、某具体股票等等;
期限:标的资产未来价格变动的监测时间段;
期初价格:标的资产在期初日的价格(模拟的起点);
敲入观察日:一般是期限内的每一天;
敲出观察日:一般是期限内的特定日期;
敲入事件:在敲入观察日,标的资产价格小于敲入价格(期初价格* %);
敲出事件:在敲出观察日,标的资产价格大于敲入价格(期初价格* %);
蒙特卡洛模拟:由于不知道标的资产未来的真实价格变动,我们会借助传统的蒙特卡洛模拟来模拟该标的资产在期限之内的价格变动,再取平均值作为期权的估值。
二、 雪球期权的估值规则

一般的估值定价逻辑如下:
1、 发生过敲出事件——估值策略1
2、 未发生过敲出事件、但发生过敲入事件——估值策略2
3、 未发生过敲出事件、也未发生敲入事件——估值策略3
其中,三种不同的估值策略要看公司期权的具体条款来定,而且各方案的折现天数应该也不同。
三、 雪球期权估值的python实现

from math import exp,sqrt
import numpy as np
import pandas as pd

def Price(S0,r,T,m,n,price_in,price_out,sigma):
#主要实现函数
    dt=T/m
    S=np.zeros(m+1)
    V=np.zeros(n)
    S[0]=S0
    q=0.03
    str={56,84,116,146,175,207,238,269,299,329,360,385,420,448,481,511,542,572,602,633,664,693,725,756,787,816,847,875,908,938,969,1000}
    #敲出观察日向量
    S_Plus=np.zeros((n,m+1))
    #模拟价格矩阵

    for i in range(n):
        #记录是否发生敲入、敲出
        flag_in=0
        flag_out=0
        t=0
        for j in range(0,m):
            S[j+1]=S[j]*exp((r-q-0.5*sigma**2)*dt+sigma*sqrt(dt)*np.random.randn())
            if S[j+1]>price_out:
                if j+1 in str:
                    t=j+1;
                    #t用来记录出现敲出的时间
                    flag_out=1
                    break
            elif S[j+1]<price_in:
                flag_in=1
        
        S_Plus=S

        #按条约公式得到
        #敲出
        if flag_out==1:
            V=估值策略1
            V=V*exp(-r*t/365)
            #时间是t
        #未敲出但敲入
        elif flag_out==0 and flag_in==1:
            V=估值策略2
            V=V*exp(-r*T)
        #未敲出也未敲入
        elif flag_out==0 and flag_in==0:
            V=估值策略3
            V=V*exp(-r*T)#折现
        
    #平均数
    v=sum(V)/n
    return v,V,S_Plus

主代码如下:
#主代码
#期初价格
t0_price=100
#即期价格
t_price=110
#敲入价格
price_in=t0_price*a
#敲出价格
price_out=t0_price*b
#国债的到期收益率
r=0.2

#起始日-最后观察日
T=1000/365
#观察日
m=1000
#迭代次数
n=5000

sigma=0.02

(price,V,S_Plus)=Price(t_price,r,T,m,n,price_in,price_out,sigma)
分享到 :
0 人收藏

3 个回复

倒序浏览
2#
期权匿名回答  16级独孤 | 2022-4-26 20:54:32 发帖IP地址来自 北京朝阳
随机数也用向量表示比较好。for循环用着简单,但是如果是用于跑生产会很久的时间,要避免在python写多层的for循环了
3#
期权匿名回答  16级独孤 | 2022-4-26 20:55:21 发帖IP地址来自 中国
额,但是这个不是随机数哇,每一个t+1期价格都要在上一个t期价格的基础生成呀,求教不用for循环怎么做?[发呆]
4#
期权匿名回答  16级独孤 | 2022-4-26 20:56:21 发帖IP地址来自 北京邮电大学
https://www.codearmo.com/blog/pricing-options-monte-carlo-simulation-python
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:400157
帖子:80032
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP