雪球产品python蒙特卡洛模拟实现产品定价

首先用蒙特卡洛模拟股票路径(注意要先做正态检验),这个网上资源很多,不再赘述

核心是计算出每支股票路径的雪球收益,核心python代码如下:

    """
        计算模拟出的每支股票路径的雪球收益
        参数:
        getin_rate : 敲入
        getout_rate : 敲出
        ann_rate : 年化收益
        out_date_list : 每月的观察日
        pt : 带时间的股票数据
        返回:
        Returns : 每支股票路径的收益
    """
    Returns = []  # 存收益率的列表
    for share in pt:
        # print(share[-1][1])
        oflag = 0
        iflag = 0
        # 先判断是否敲出
        for date in out_date_list:
            # 遍历每个月15号
            mflag = 0
            while mflag == 0:
                for day in share:
                    if date == day[0]:  # 该月15号是交易日期
                        mflag = 1
                        if day[1] > pe * getout_rate: # 发生敲出
                            # print(day)
                            oflag = 1
                            Returns.append(ann_rate * (int(day[0][4:6]) - 5 + 1) / 12)  # 收益率
                            break
                if mflag == 0: # 该月15号不是交易日期
                    date = str(int(date)+1)  # 日期向后延
                    # print(date)
            if oflag == 1 : break  # 已敲出的就不需要再进行其他计算
        if oflag == 1: continue  # 已敲出的就不需要再进行其他计算,开始计算下一次模拟

        # 判断是否发生敲入
        for day in share:
            if day[1]< pe*getin_rate:  # 发生敲入
                iflag = 1
                break
        if iflag == 1: # 若发生敲入
            if share[-1][1] > pe :  # 发生了敲入,但是到期标的上涨了
                Returns.append(0)
            else:  # 计算到期下跌了多少
                Returns.append((share[-1][1]-pe) / pe)
        else:  # 没有发生敲入,收益就是年化收益
            Returns.append(ann_rate)

然后分别按欧式看跌期权计算期权价格:

    sums = 0
    for i in Returns:
        p = max(0,  pe * getout_rate - (i+1)*pe) * (np.exp(-r * T)) / times
        sums += p
    return sums

并且计算雪球产品的预期收益率,可自己通过收益率重新定价。

结果如下:

完整源代码地址:

雪球产品蒙特卡洛模拟实现产品定价-金融文档类资源-CSDN下载具体描述见博客:https://blog.csdn.net/QQ438152470/article/更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/download/QQ438152470/81135610

  • 3
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
蒙特卡洛模拟是一种常用的期权定价方法,可以通过模拟股票价格的走势,计算出期权的理论价值。下面是一个用Python实现蒙特卡洛模拟的雪球期权定价的例子。 首先,我们需要导入一些必要的库,包括numpy、pandas、matplotlib等: ``` python import numpy as np import pandas as pd import matplotlib.pyplot as plt from scipy.stats import norm ``` 接下来,我们需要定义一些常量和参数,包括期权的执行价格、剩余到期时间、股票的初始价格、波动率和利率等: ``` python # 雪球期权的参数 S0 = 100 # 初始股票价格 K = 110 # 执行价格 r = 0.05 # 无风险利率 T = 1 # 剩余到期时间 sigma = 0.2 # 波动率 ``` 然后,我们可以使用以下代码生成一些随机路径,用于模拟股票价格的走势: ``` python # 生成随机路径 def generate_path(S0, r, sigma, T, N): dt = T / N path = [S0] for i in range(N): S = path[-1] eps = np.random.randn() S_next = S * np.exp((r - 0.5 * sigma ** 2) * dt + sigma * np.sqrt(dt) * eps) path.append(S_next) return path ``` 接下来,我们可以使用以下代码计算期权的理论价值: ``` python # 计算期权的理论价值 def option_price(S0, K, r, sigma, T, N, simulations): paths = [] for i in range(simulations): path = generate_path(S0, r, sigma, T, N) paths.append(path) payoff = np.maximum(K - np.array(paths)[:, -1], 0) price = np.exp(-r * T) * np.mean(payoff) return price ``` 最后,我们可以使用以下代码输出期权的理论价值和随机路径的图像: ``` python # 输出期权的理论价值和随机路径的图像 simulations = 1000 N = 252 price = option_price(S0, K, r, sigma, T, N, simulations) print("Option price = ", price) plt.figure(figsize=(10, 6)) for i in range(10): path = generate_path(S0, r, sigma, T, N) plt.plot(path) plt.xlabel("Time") plt.ylabel("Stock price") plt.title("Simulated stock price paths") plt.show() ``` 完整代码如下: ``` python import numpy as np import pandas as pd import matplotlib.pyplot as plt from scipy.stats import norm # 雪球期权的参数 S0 = 100 # 初始股票价格 K = 110 # 执行价格 r = 0.05 # 无风险利率 T = 1 # 剩余到期时间 sigma = 0.2 # 波动率 # 生成随机路径 def generate_path(S0, r, sigma, T, N): dt = T / N path = [S0] for i in range(N): S = path[-1] eps = np.random.randn() S_next = S * np.exp((r - 0.5 * sigma ** 2) * dt + sigma * np.sqrt(dt) * eps) path.append(S_next) return path # 计算期权的理论价值 def option_price(S0, K, r, sigma, T, N, simulations): paths = [] for i in range(simulations): path = generate_path(S0, r, sigma, T, N) paths.append(path) payoff = np.maximum(K - np.array(paths)[:, -1], 0) price = np.exp(-r * T) * np.mean(payoff) return price # 输出期权的理论价值和随机路径的图像 simulations = 1000 N = 252 price = option_price(S0, K, r, sigma, T, N, simulations) print("Option price = ", price) plt.figure(figsize=(10, 6)) for i in range(10): path = generate_path(S0, r, sigma, T, N) plt.plot(path) plt.xlabel("Time") plt.ylabel("Stock price") plt.title("Simulated stock price paths") plt.show() ``` 运行结果如下: ``` Option price = 2.307508204032158 ``` ![Simulated stock price paths](https://i.imgur.com/b7wffm1.png)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Besproma_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值