基于PYTHON的场外期权动态对冲回测工具

更新时间:2023-05-26 07:43:29 阅读: 评论:0

基于PYTHON的场外期权动态对冲回测⼯具通经甘露丸
周四⾯试了某⽐较想去的公司的⾦融衍⽣品部门,技术⾯的项⽬是在交易所市场买卖期货,⽤以对冲卖出场外期权。我采⽤的是Delta区间
动态对冲的⽅法,记录⼀下这次技术⾯中编写的策略回测⼯具,之后以备使⽤。时间较少,代码结构与变量命名较为随意。
hedge.py
⽤来计算在特定阈值下的对冲的效果,输⼊⽂件:marketinfo.xlsx为期货⼀分钟级⾏情数据,输出⽂件trade.xlsx和result.xlsx分别为期货
端交易记录和分钟级对冲时的各项参数与损益指标。
import math
import pandas as pd
from scipy.stats import norm
def bsm(pnow,k,rf,remainingday,yearvol):
#输⼊:(现价,执⾏价,连续⽆风险利率3%,剩余天数100天,年波动率0.15)
#输出:看涨期权价格[0],看涨期权delta[1]
d1 = ((math.log(pnow/k))+(rf+0.5*yearvol*yearvol)*(remainingday/255))/(yearvol*math.sqrt(remainingday/255))
d2 = ((math.log(pnow/k))+(rf-0.5*yearvol*yearvol)*(remainingday/255))/(yearvol*math.sqrt(remainingday/255))
nd1 = norm.cdf(d1)
nd2 = norm.cdf(d2)
exprt = p(-rf*remainingday/255)
pri = pnow*nd1-k*exprt*nd2
return [pri,nd1]
# getbsm = bsm(3400,3400,0.03,100,0.15)
# print("看涨期权的价格为",getbsm[0],"看涨期权的delta为",getbsm[1])
#BSM参数设定
k=3400
rf=0.03#连续复利⽆风险利率
firstremaingday=93#第⼀天开始交易时剩余交易⽇,假设期权4⽉15⽇到期,距离12⽉1⽇还有93个交易⽇
yearvol=0.1257
#其他参数设定
marginrate=0.1#期货保证⾦率
rr=0.07#年化单利公司资⾦成本
gap=0.076#组合delta偏差容忍值
feerate=0.0001#期货交易⼿续费
#要记录的参数
#分钟期货交易损益
#分钟保证⾦利息
老年哮喘特效药
marketinfo = pd.read_excel(pd.ExcelFile('marketinfo.xlsx'),'Sheet1')
#记录净值表格
result = pd.DataFrame(columns=('时间','期权损益','期货损益','息前损益','利息','息后损益','净买⼊期货份额','剔除时间价值期权损益','剔除时间价值对冲净收益','累计期#输出交易记录表格
trade = pd.DataFrame(columns=('时间','期货买⼊净额','调整前组合Delta','调整后组合Delta'))
totalfee = 0#统计⼿续费⽀出
futureposition = 0
lastprice = marketinfo.iloc[0]['price']
lastbsmprice = bsm(marketinfo.iloc[0]['price'],k,rf,firstremaingday,yearvol)[0]
lastbsmpriceCT = bsm(marketinfo.iloc[0]['price'],k,rf,firstremaingday,yearvol)[0]#剔除时间价值流逝期权价格
for day in range(0,22):
#21个交易⽇遍历交易观察蜗牛
for minute in range(0,345):
if day == 21 and minute == 225:品质提升改善方案
#12⽉31⽇⽆夜盘
break
nowprice = marketinfo.iloc[day*345+minute]['price']
nowprice = marketinfo.iloc[day*345+minute]['price']
nowtime = marketinfo.iloc[day*345+minute]['time']
95年属啥
getbsm = bsm(nowprice,k,rf,firstremaingday-day-minute/345,yearvol)
bsmpriceCT = bsm(nowprice,k,rf,firstremaingday,yearvol)[0]#剔除时间价值变化期权价
optionbsmprice = getbsm[0]
optionbsmdelta = -getbsm[1]
profoliodelta = optionbsmdelta + futureposition
#print("在",nowtime,"时刻的期权价值=",getbsm[0])
#结算本分钟的期货头⼨和期权头⼨的盈亏
futureprofit = futureposition*(nowprice-lastprice)
optionprofit = -(optionbsmprice - lastbsmprice)
netprofitbeforeinterest = futureprofit + optionprofit
netbuy = 0
#调整仓位
if abs(profoliodelta) > gap:
netbuy = -profoliodelta
futureposition = futureposition + netbuy
totalfee = totalfee + nowprice*feerate*abs(netbuy)
#记录交易记录
trade = trade.append([{'时间':nowtime,'期货买⼊净额':netbuy,'调整前组合Delta':profoliodelta,'调整后组合Delta':futureposition+optionbsmdelta}])
#计算本分钟保证利息占⽤
interest = futureposition*nowprice*marginrate*rr/255/345
netprofitafterinterest = netprofitbeforeinterest - interest
#记录本分钟交易数据 '时间','期权损益','期货损益','息前损益','利息','息后损益','净买⼊期货份额'
result = result.append([{'时间':nowtime,'期权损益':optionprofit,'期货损益':futureprofit,'息前损益':netprofitbeforeinterest,'利息':interest,'息后损益':netprofitafterint
lastprice = nowprice
lastbsmprice = optionbsmprice#记录本分钟bsm价格给下⼀分钟使⽤
lastbsmpriceCT = bsm(nowprice,k,rf,firstremaingday,yearvol)[0]
#print(marketinfo.iloc[day*345+minute]['time'])
#导出结果
<_excel('result.xlsx')
<_excel('trade.xlsx')
MonteCarlo.py
在给定期权gamma值与分布律的情况下,以⼀段⾏情的分布特征为分布律,⽤蒙特卡洛模拟求下⼀段事件的最优阈值。
import numpy as np
import pandas as pd
import math
#参数设定
minute = 200000#模拟多少分钟
死亡的近义词
feerate = 0.0001
诚请#期权参数
pnow = 3400
k = 3400
rf = 0.03
remainingday = 93
yearvol = 0.1257
#获取期权gamma值
def getgamma(pnow,k,rf,remainingday,yearvol):
d1 = ((math.log(pnow/k))+(rf+0.5*yearvol*yearvol)*(remainingday/255))/(yearvol*math.sqrt(remainingday/255))
gamma = np.exp(-0.5*d1*d1)/(pnow*yearvol*np.sqrt(2*np.pi*remainingday/255))
return gamma
gamma = getgamma(pnow,k,rf,remainingday,yearvol)
difdelta = pd.read_excel(pd.ExcelFile('delta差分序列.xlsx'),'Sheet1')
result = pd.DataFrame(columns=('阈值','gamma损失','交易次数','交易⼿续费损失','总期望损失'))
for gap in range(1,101):
gap = gap/1000
lo = 0#记录损失数
hedge = 0#记录对冲次数
nowplace = 0
for i in range(0,minute):
nowplace = nowplace + difdelta['difdelta'][np.random.randint(0,7468)]
if np.abs(nowplace) > gap:
changep = nowplace / gamma
lo = lo + 0.5*gamma*changep*changep
nowplace = 0
hedge = hedge + 1
if range == minute-1 and nowplace !=0:
#最后⼀分钟结转所有损失
lo = lo + 0.5*gamma*changep*changep
result = result.append([{'阈值':gap,'gamma损失':lo,'交易次数':hedge,'交易⼿续费损失':hedge*pnow*feerate,'总期望损失':hedge*pnow*feerate+lo}]) _excel('寻找最优阈值.xlsx')
⾯试总结:
技术⾯问的很细,要求对理论有深刻理解。在讨论过程中修正了⼀些之前的错误认识:
1.应该⽤收益率的变动,⽽不是价格差的变动来进⾏蒙特卡洛模拟。
2.在偏向平值的看涨看跌期权快要到期的时候,对冲时留部分头⼨暴露以应对标的资产往不同⽅向运动的⽅法,不能减少损失,但在未来收益率是对称的分布的假设下,可以减少收益率波动率。
3.根据风险中性定价原理,长期来看,⽆论选何阈值的期望都是相同的。只是在假设历史⾏情下的特定分布律的情况下,才会存在⼀个最优阈值。汽车led大灯

本文发布于:2023-05-26 07:43:29,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/932031.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:期权   交易   时间   对冲   期货   损益   记录   价值
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图