主要内容

使用强化学习工具箱™对冲期权

使用最优期权对冲策略优于传统BSM方法。

基于Black-Scholes-Merton模型的期权建模

布莱克-斯科尔斯-默顿(Black-Scholes-Merton, BSM)模型为金融衍生品或期权的定价和分析提供了一个建模框架,该模型的创建者获得了1997年的诺贝尔经济学奖。期权是一种金融工具,其价值来源于特定的基础资产。的概念动态对冲是BSM模型的基础。动态对冲指的是,通过持续买卖相关标的资产的股票,你可以对冲衍生工具的风险,使风险为零。这种“风险中性”定价框架被用于推导许多不同金融工具的定价公式。

最简单的金融衍生品是欧洲看涨期权,它为买方提供了在先前指定的时间(到期日)以先前指定的价值(执行价格)购买标的资产的权利,但没有义务。

你可以使用BSM模型为欧洲看涨期权定价。BSM模型做了以下简化假设:

  • 标的资产的行为由几何布朗运动(GBM)定义。

  • 没有交易成本。

  • 波动性是恒定的。

BSM动态对冲策略也被称为“delta-对冲”,以数量命名δ,即期权相对于标的资产的敏感性。在满足前面所述BSM假设的环境中,使用delta对冲策略是对冲期权的最佳方法。然而,众所周知,在有交易成本的环境中,使用BSM模型会导致低效率的对冲策略。本例的目标是使用强化学习工具箱™学习在存在交易成本的情况下优于BSM对冲策略的策略。

强化学习(RL)的目标是训练智能体在未知环境中完成任务。代理从环境中接收观察结果和奖励,并向环境发送行动。奖励是衡量一个行动在完成任务目标方面的成功程度。

代理包含两个组件:策略和学习算法。

  • 策略是一种映射,它根据来自环境的观察选择操作。通常,策略是具有可调参数的函数逼近器,例如深度神经网络。

  • 学习算法根据动作、观察和奖励不断更新策略参数。学习算法的目标是找到一个最优策略,使任务期间收到的累积奖励最大化。

换句话说,强化学习涉及到一个智能体在没有人类参与的情况下,通过与环境的反复试错交互来学习最佳行为。有关强化学习的更多信息,请参见什么是强化学习?(强化学习工具箱)

曹(2]将强化学习的设置描述为:

  • 年代 状态在时间上吗

  • 一个 行动是在

  • R + 1 最终的奖励是否及时 + 1

强化学习的目的是最大化预期的未来奖励。在强化学习的金融应用中,最大化预期回报是学习delta对冲策略作为对冲欧洲看涨期权的最佳方法。

这个例子遵循了Cao [2].具体来说,该论文中的会计损益(P&L)公式用于建立强化学习问题,并使用深度确定性策略梯度(DDPG)代理。这个例子并没有完全重现[2因为曹艾尔.本文推荐一种带有两个独立q函数的q学习方法(一个用于对冲成本,另一个用于对冲成本的期望平方),但本例使用简化的奖励函数。

定义培训参数

接下来,指定一个3个月到期的平价期权进行对冲。为了简单起见,利率和股息收益率都设置为0

%选项参数罢工= 100;成熟度= 21*3/250;资产参数SpotPrice = 100;ExpVol = 2;ExpReturn = .05;仿真参数rfRate = 0;dT = 1/250;nSteps =成熟度/dT;nTrials = 5000;%交易成本和成本函数参数C = 1.5;Kappa = .01;InitPosition = 0;为重现性设置随机生成器种子。提高(3)

定义环境

在本节中,动作和观测参数,actInfo而且obsInfo.代理动作是当前的h边缘值,取值范围为0而且1.agent观察中有三个变量:

  • 货币性(现货价格与执行价格的比率)

  • 成熟期

  • 所持有的基础资产的位置或数量

ObservationInfo = rlNumericSpec([3 1],“LowerLimit”0,“UpperLimit”,[10成熟度1]’);ObservationInfo。Name =“对冲状态”;ObservationInfo。描述= [“Moneyness”“TimeToMaturity”“位置”];ActionInfo = rlNumericSpec([1 1],“LowerLimit”0,“UpperLimit”1);ActionInfo。Name =“对冲”

定义的奖励

源自Cao [2],会计损益表的编制和奖励(负成本)是

R + 1 V + 1 - V + H + 1 年代 + 1 - 年代 ) - κ | 年代 + 1 H + 1 - H |

在哪里

R 奖励

V 价值 选项

年代 现货 价格 潜在的 资产

H 持有

κ 事务 成本

最后一步的最终回报就是清算对冲 κ | 年代 n H n |

在这个实现中,奖励( R )的惩罚是奖励乘以一个常数的平方,以惩罚对冲头寸价值的大幅波动:

R + 1 R + 1 - c R + 1 2

奖励定义在stepFcn在模拟的每一步都被调用。

env = rlFunctionEnv(ObservationInfo,ActionInfo,...@(对冲,LoggedSignals) stepFcn(对冲,LoggedSignals,rfRate,ExpVol,dT,Strike,ExpReturn,c,kappa),...@ () resetFcn (SpotPrice /罢工,成熟,InitPosition));obsInfo = getObservationInfo(env);actInfo = getActionInfo(env);

为RL代理创建环境接口

使用创建DDPG代理rlDDPGAgent(强化学习工具箱).虽然可以创建自定义演员和评论家网络,但本例使用默认网络。

initOpts = rlAgentInitializationOptions“NumHiddenUnit”, 64);criticOpts = rlOptimizerOptions(“LearnRate”1的军医);actorOpts = rlOptimizerOptions(“LearnRate”1的军医);agentOptions = rlDDPGAgentOptions(...“ActorOptimizerOptions”actorOpts,...“CriticOptimizerOptions”criticOpts,...“DiscountFactor”.9995,...“TargetSmoothFactor”5的军医);agent = rlDDPGAgent(obsInfo,actInfo,initOpts,agentOptions);

可视化演员和评论家网络

使用深度网络设计器可视化演员和评论家网络。

deepNetworkDesigner (layerGraph (getModel (getActor(代理))))

DND2.png

火车代理

培训代理使用火车(强化学习工具箱)函数。

trainOpts = rlTrainingOptions(...“MaxEpisodes”nTrials,...“MaxStepsPerEpisode”nSteps,...“详细”假的,...“ScoreAveragingWindowLength”, 200,...“StopTrainingCriteria”“AverageReward”...“StopTrainingValue”, -40,...“StopOnError”“上”...“UseParallel”、假);doTraining = false;如果doTraining培训代理。trainingStats = train(agent,env,trainOpts);其他的为示例加载预训练的代理。负载(“DeepHedgingDDPG.mat”“代理”结束

为避免等待训练,可以通过设置doTraining旗帜.如果你设置doTraining真正的,“强化学习插曲管理器”显示训练进度。

train.png

验证代理

使用财务工具箱™功能blsdelta而且blsprice以欧洲看涨期权计算价格的常规方法。当将常规方法与RL方法进行比较时,结果与Cao [2]在证据4中。这个例子表明,RL方法显著降低了对冲成本。

仿真参数nTrials = 1000;policy_BSM = @(mR,TTM,Pos) blsdelta(mR,1,rfRate,max(TTM,eps),ExpVol);policy_RL = @(mR,TTM,Pos) arrayfun(@(mR,TTM,Pos) cell2mat(getAction(agent,[mR TTM Pos]')),mR,TTM,Pos);OptionPrice = blsprice(SpotPrice,Strike,rfRate,Maturity,ExpVol);Costs_BSM = computeCosts(policy_BSM,nTrials,nSteps,SpotPrice,Strike,Maturity,rfRate,ExpVol,InitPosition,dT,ExpReturn,kappa);Costs_RL = computeCosts(policy_RL,nTrials,nSteps,SpotPrice,Strike,Maturity,rfRate,ExpVol,InitPosition,dT,ExpReturn,kappa);HedgeComp = table(100*[-mean(Costs_BSM) std(Costs_BSM)]'/OptionPrice,...100 *(意思是(Costs_RL)性病(Costs_RL)]的/ OptionPrice,...“RowNames”,[平均对冲成本(期权价格百分比)STD对冲成本(期权价格的%)),...“VariableNames”,[“BSM”“RL”]);disp (HedgeComp)
BSM RL ______ ______平均对冲成本(期权价格的%)91.259 47.022 STD对冲成本(期权价格的%)35.712 68.119

下面的柱状图显示了两种方法不同套期成本的范围。RL方法的性能更好,但比BSM方法的方差更大。本例中的RL方法可能受益于Cao [2讨论和实现。

figure numBins = 10;直方图(-Costs_RL numBins,“FaceColor”“r”“FaceAlpha”5)举行直方图(-Costs_BSM numBins,“FaceColor”“b”“FaceAlpha”5)包含(“对冲成本”) ylabel (“试验次数”)标题(“RL对冲成本vs. BLS对冲成本”)传说(“RL对冲”“理论BLS Delta”“位置”“最佳”

图中包含一个轴对象。标题为RL对冲成本vs. BLS对冲成本的axes对象包含2个直方图类型的对象。这些对象代表RL对冲,理论BLS Delta。

对冲比率与金钱的关系图显示了BSM和RL方法之间的差异。如《曹》所述[2],在存在交易成本的情况下,代理了解到“当delta对冲要求购买股票时,相对于delta,交易者的对冲不足往往是最优的。类似地,当delta对冲要求卖出股票时,相对于delta过度对冲往往是交易员的最佳选择。”

policy_RL_mR = @(mR,TTM,Pos) cell2mat(getAction(agent,[mR TTM Pos]'));mRange = (.8:.01:1.2)';图t_plot = 2/12;情节(mRange blsdelta (mRange 1 rfRate、t_plot ExpVol),“b”)举行情节(mRange arrayfun (@ (mR) policy_RL_mR(先生、t_plot blsdelta(先生,1 rfRate、t_plot ExpVol)), mRange),“r”) plot(mRange,arrayfun(@(mR) policy_RL_mR(mR,t_plot,blsdelta(mR+.1,1,rfRate,t_plot,ExpVol)),mRange),‘g’) mRange,arrayfun(@(mR) policy_RL_mR(mR,t_plot,blsdelta(mR- 0.1,1,rfRate,t_plot,ExpVol)),mRange),“米”)传说(“理论BLS Delta”“RL对冲——ATM”“RL对冲——卖出”“RL对冲——买入”...“位置”“最佳”)包含(“Moneyness”) ylabel (“对冲比率”)标题(“RL对冲vs. BLS Delta的TTM为2/12”

图中包含一个轴对象。对于TTM为2/12,标题为RL Hedge vs. BLS Delta的axes对象包含4个类型为line的对象。这些对象代表理论BLS Delta, RL对冲—ATM, RL对冲—卖出,RL对冲—买入。

参考文献

[1]比勒H., L.戈农,J.泰希曼,B.伍德。“深对冲。”定量金融学.2019年第8期,第19卷,第1271-91页。

[2]曹军,陈杰,赫尔,普洛斯。“使用强化学习的衍生品深度对冲”金融数据科学杂志.Vol. 3 No. 1, 2021, pp. 10-27。

Halperin I。QLBS: Black-Scholes (-Merton)世界中的q学习者衍生品杂志.第28卷,2020年第1期,第99-122页。

[4] Kolm P.N.和G. Ritter。动态复制和对冲:一种强化学习方法金融数据科学杂志.第1卷,2019年第1期,第159-71页。

本地函数

函数[InitialObservation,LoggedSignals] = resetFcn(Moneyness, timetommaturity,InitPosition)%重置功能,每集开始重置。LoggedSignals。年代tate = [Moneyness TimeToMaturity InitPosition]'; InitialObservation = LoggedSignals.State;结束函数[NextObs,Reward,IsDone,LoggedSignals] = stepFcn(Position_next,LoggedSignals,r,vol,dT,X,mu,c,kappa)在插曲的每一步计算的步骤函数。Moneyness_prev = LoggedSignals.State(1);TTM_prev = LoggedSignals.State(2);Position_prev = LoggedSignals.State(3);S_prev = moneyess_prev *X;% GBM运动S_next = S_prev *((1 +μ* dT) + (randn *卷)。* sqrt (dT));TTM_next = max(0,TTM_prev - dT);IsDone = TTM_next < eps;steppreward = (S_next - S_prev)*Position_prev - abs(Position_next - Position_prev)*S_next*kappa -...blsprice(S_next,X,r,TTM_next,vol) + blsprice(S_prev,X,r,TTM_prev,vol);如果IsDone stepReward = stepReward - Position_next*S_next*kappa;结束Reward = stepReward - c*stepReward.^2;LoggedSignals。年代tate = [S_next/X;TTM_next;Position_next]; NextObs = LoggedSignals.State;结束函数perCosts = computeCosts(policy,nTrials,nSteps,SpotPrice,Strike,T,r,ExpVol,InitPos,dT,mu,kappa)用于计算任何对冲方法的成本的助手函数。rng(0) simOBJ = gbm(mu,ExpVol,“StartState”, SpotPrice);[simPaths,simTimes] =模拟(simOBJ,nSteps,“nTrials”nTrials,“deltaTime”, dT);simPaths = squeeze(simPaths);rew = 0 (nSteps,nTrials);Position_prev = InitPos;Position_next = policy(simPaths(1,:)/Strike,T*ones(1,nTrials),InitPos*ones(1,nTrials));timeidx=2:nSteps+1 rew(timeidx-1,:) = (simPaths(timeidx,:) - simPaths(timeidx-1,:)))。* Position_prev -...abs(Position_next - Position_prev).*simPaths(timeidx,:)*kappa -...blsprice(simPaths(timeidx,:),Strike,r,max(0,T - simTimes(timeidx)),ExpVol) +...blsprice(simPaths(timeidx-1,:),Strike,r,T - simTimes(timeidx-1),ExpVol);如果timeidx == nSteps+1 rew(timeidx-1,:) = rew(timeidx-1,:) - Position_next.*simPaths(timeidx,:,:)*kappa;其他的Position_prev = Position_next;Position_next = policy(simPaths(timeidx,:,:)/Strike,(T - simTimes(timeidx)).*ones(1,nTrials),Position_prev);结束结束perCosts = sum(rew);结束

另请参阅

||(强化学习工具箱)

外部网站

Baidu
map