自己在别人的基础上改写了一个计算雪球delta的函数,麻烦各位大佬看一看有没有问题

import numpy as np
import pandas as pd
from tqdm import tqdm


# 蒙特卡洛模拟
def generate_stock_path(S, T, sigma, mu, times, seed=None):
    '''
    s:现价
    T:总时间
    sigma:标的收益率波动率
    mu:标的收益率均值
    times:模拟次数
    seed:随机种子

    return:价格矩阵
    '''
    t = np.linspace(0, [T] * times, int(T * 252) + 1)
    if isinstance(seed, int):
        np.random.seed(seed)
    W = np.random.normal(0, 1 / np.sqrt(252), [int(T * 252), times])
    W = np.cumsum(W, axis=0)
    W = np.vstack((np.array([0] * times), W))
    price_metrix = S * np.exp((mu - 1 / 2 * sigma ** 2) * t + sigma * W)
    return price_metrix.T


# 计算净现值
def get_pv(price_metrix, K, T, r, barrier_out, barrier_in, coupon):
    '''
    price_metrix:价格矩阵
    K:行权价
    T:总时间
    r:无风险收益率
    barrier_out:敲出界
    barrier_in:敲入界
    coupon:票息

    return:净现值
    '''
    test_pv_list = []
    for count in tqdm(range(price_metrix.shape[0])):
        a = [price_metrix[count][j] for j in  [i * 21 - 1 for i in range(1, int(12 * T + 1))]]
        knock_out = 0
        for i in range(len(a)):
            if a[i] > K * barrier_out:
                knock_out = a.index(a[i])
                break
            else:
                knock_out = 0
        if (knock_out != 0) :  
            pv = (np.e ** (knock_out  / 12 * coupon) * K - K) / np.e ** (knock_out  / 12 * r)
        elif  all(i >= K * barrier_in for i in a):
            pv = (np.e ** (T * coupon) * K  - K)/ np.e ** (T * r)
        else:
            if (price_metrix[count][-1] > price_metrix[count][0]):
                pv = (np.e ** (T * (-r)) * K) - K
            else: 
                pv = (np.e ** (T * (-r)) * price_metrix[count][-1]) - K
        test_pv_list.append([knock_out, pv])

    pv_list_df = pd.DataFrame(test_pv_list)
    pv_list_df.columns = ['敲出日','PV']
    pv_list_df['敲出日'] = pv_list_df['敲出日'] * 21
    return pv_list_df


# 计算delta
S, T, sigma, mu, r, times = 100, 1, 0.25, 0.14, 0.03, 30000
k_out, k_in, coupon, seed = 1.1, 0.8, 0.15, 0
price_metrix1 = generate_stock_path(S * 0.99, T, sigma, mu, times, seed=seed)
pv1 = get_pv(price_metrix1, 100, T, r, k_out, k_in, coupon).PV.mean()
price_metrix2 = generate_stock_path(S * 1.01, T, sigma, mu, times, seed=seed)
pv2 = get_pv(price_metrix2, 100, T, r, k_out, k_in, coupon).PV.mean()
delta = (pv1 - pv2)/(S * 0.02)
delta

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值