
雪球产品python蒙特卡洛模拟实现产品定价
首先用蒙特卡洛模拟股票路径(注意要先做正态检验),这个网上资源很多,不再赘述核心是计算出每支股票路径的雪球收益,核心python代码如下:"""计算模拟出的每支股票路径的雪球收益参数:getin_rate : 敲入getout_rate : 敲出ann_rate : 年化收益out_date_list : 每月的观察日pt : 带时间的股票数据返回
·
首先用蒙特卡洛模拟股票路径(注意要先做正态检验),这个网上资源很多,不再赘述
核心是计算出每支股票路径的雪球收益,核心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
并且计算雪球产品的预期收益率,可自己通过收益率重新定价。
结果如下:
完整源代码地址:
点击阅读全文
更多推荐
所有评论(0)