精华内容
下载资源
问答
  • 浅谈delta对冲和gamma对冲的核心思想
    千次阅读
    2021-01-17 02:10:50

    delta hedge的运用思路很简单,虽然无法单独预测option价格或者股票价格在下一时刻会涨还是会跌,也无法预测涨跌的绝对幅度。但是B-S方程解的微分形式给出了当前option价格涨跌幅度相对于当前股价涨跌幅度的一个比例系数,即dOption/dS, 而且这个比例系数是个确定的值。这个比例系数就称作 delta。换句话说,delta hedge 就是用delta个股票和一个Option构成一个组合,在接下来一个足够小的时间段内(delta可以被认为保持不变),这个组合中股票和OPTION涨跌相反,涨幅相同,因此就完全hedge了股价在接下来这个时段不确定所带来的风险。由于delta在每个时刻都不断变化,所以一个理想的delta hedge就是不断的根据当前价格计算delta,然后及时调整股票仓位到最新的delta值。很显然,这样的频繁调整仓位在实际操作中不现实,而且交易成本巨大。可是如果调整仓位时间的间隔过长的话,hedge就会不充分,因为在较长间隔间隔内,不能近似认delta保持不变,这样delta hedge本身没法hedge 在调整仓位间隔内delta发生变化带来的风险。

    这个时候就要采取gamma hedge来弥补。 gamma系数的定义是 d(dOption/dS)/dS, 即option 价格对股价的两阶偏微分。gamma hedge的作用就是使delta 在较长时间间隔内可以近似保持不变,这样在实际操作当中,即使较长时间调整仓位也能得到充分的hedge。可以这么去理解delta 和gamma这两个参数:以股票价格为横轴,Option价格为纵轴,可以画出一条option 价格随股价变动的曲线。而delta就是曲线上每个点的切线斜率,gamma则是曲线上每个点的曲率。曲线有一个很显而易见的特点:相邻每个点的斜率变化很快,但曲率的变化相对慢很多。(举一个极端的例子,如果曲线是个圆弧,则每个点的斜率都不一样,但曲率却是个常数。)。

    如果我们在原曲线上合并另外一条曲线,使它的曲率正好等于原曲线曲率的负数。则两条曲线就合并成一条直线,这时候每个点的斜率锯都一样了。gamma hedge 其实就是这样操作的:在原来delta hedge的基础上,计算当前gamma,由于以上论述,gamma变化比delta慢得多,即在较长时间间隔内gamma可认为不变。然后在市场上选择一个组合,使这个组合的gamma等于原组合当前gamma的负数,这个组合加到原组合构成一个新的hedge。在这个新的hedge 下,delta在较长时间间隔内保持不变(因为新组合的gamma为零了)。这样,通过gamma hedge的调整,偶们就实现了即使在较长时间内调整仓位也能够做到充分hedge。在实际操作中,delta hedge 和gammahedge 经常是每天一次调整。gamma hedge中用到的组合是一组Option的组合,因为Option的价格相对于股票价格来说是非线性的,反映到图形上看就是曲线,能提供gamma。综上所述,通过delta hedge 和 gamma hedge,我们就完全抵御了股价未来不确定所带来的风险,而且可以在较长时间间隔内进行hedge。

    祝大家工作顺利!

    更多相关内容
  • 函数 HEDGEDEMO 旨在帮助金融专业的学生和讲师将简单的静态或动态价值对冲策略的交易需求可视化。 在单因素设置中,构造2-资产对冲投资组合以在时间点上匹配被对冲投资组合的价值和增量,该对冲投资组合由1-2个资产...
  • 其做法是,首先为对冲策略定义一个效用函数,然后最大化该效用函数的期望值来确定具体的对冲策略的参数。 (一)效用理论 效用理论是领导者进行决策方案选择时采用的一种理论。经济学将市场参加者的风险偏好分为三类...

    保护性卖权策略是一种比较简单的避险策略,它是指投资者期初在购买股票的同时,直接购买欧式卖权的保险策略。由于目前我国没有场内期权市场,因此保护性卖权无法实施,不过通过期权复制的思想可以间接实施该策略。

    1973 年 ,Fischer Black 与 Myron Scholes 发表了关于期权定价模型的经典文章———《The Priceing Of Options And Corporate Liabilities》,提出了具有划时代意义的期权定价模型———“Black-Scholes 模型”(简称BS)。同年,芝加哥期权交易所开始进行期权交易。 自此之后,期权市场及其他金融衍生工具市场便蓬勃发展起来。 现在全球衍生产品市场的规模已经超过了国际银行间市场及股票市场,其庞大的交易规模以及快速的增长,充分说明了这一市场在当前金融市场中的重要地位。

    BS公式的推导中使用了对冲的概念,在实际交易中,使用对冲手段来消除标的资产的价格风险敞口是很有必要的。此外,我们也需要用对冲来隔离波动率敞口。廉价且有效的对冲手段的重要性不言而喻,成功的对冲是以最小的成本移除尽可能多的风险。

    非系统对冲方法

    不同交易员都有各自的方法来决定什么时候调整对冲头寸,在期权定价理论之后很长一段时间内,对冲都没有被定量化,因此早期的对冲策略都属于非系统化对冲。

    (一)以固定的时间间隔进行对冲

    最简单的对冲策略就是在固定的时间间隔进行对冲。在每个时段的末尾,执行交易以保证组合的总Delta值为0(由于受到交易单位为离散值的限制,Delta值尽可能接近于0)。这个办法实施起来比较简单,而且易于理解,但是在选择对冲的时间间隔时显得有些随意。很显然,提高对冲频率可以降低风险,但反之,降低对冲频率可以降低成本。

    (二)对冲至一个Delta带

    这种方法首先应该确定一个固定的能容忍的Delta敞口,当Delta超过这个数值时,交易员就进行对冲。这个Delta带就是一个无需对冲的区间。交易员需要主观确定这个Delta区间的大小,且确定的Delta区间不是固定不变的,而是取决于期权头寸。因此这个方法需要随时进行调整才能实现。

    (三)根据标的资产价格变化来对冲

    使用这个策略的时候,交易员在标的资产价格变化到一定量之后,才对Delta进行相应的调整。但是此方法需要主观确定适合触发平衡的价格变化量,以及刻画价格变化指标的选择,如百分比变化、绝对价格变化、重要的技术水平、隐含波动率、历史波动率等。

    基于效用最大化的对冲方法

    对冲实际上必须在降低风险和产生成本两者之间进行权衡。经济学家研究类似的权衡问题时,通常会使用效用的概念,作为在不同方法之间进行比较和选择的框架基础。

    效用最大化策略试图寻求一种全局最优的对冲策略。其做法是,首先为对冲策略定义一个效用函数,然后最大化该效用函数的期望值来确定具体的对冲策略的参数。

    (一)效用理论

    效用理论是领导者进行决策方案选择时采用的一种理论。经济学将市场参加者的风险偏好分为三类:风险厌恶、风险爱好和风险中性。

    对交易员来说,合理的效用函数最重要的是:(1)函数曲线的斜率为正,因为钱总是越多越好;(2)函数是向下凹的,因为当交易涉及更多的金额时,交易员会逐渐变得厌恶风险。可以通过Arrow-Pratt绝对风险厌恶系数来量化风险厌恶的程度。

    (二)Hodges-Neuberger方法

    Hodges和Neuberger采用指数效用函数,利用随机控制中求效用最大化的方法对期权进行定价,得到一个无需对冲的区间。当对冲头寸低于无需对冲区域的下线时,必须买进标的股票使之达到该下线值;反之,如果对冲头寸高于无需对冲区域的上限时,需卖出标的股票使之等于该上限值;当对冲头寸处于无需对冲区域时则不进行任何交易。

    关于这个无需对冲的区间:1.空头和多头要区别对待,用不同的方法对冲。空头的对冲带要更窄一些,即对空头头寸的对冲更为保守。2.最优的Delta对冲带未完全覆盖BSM模型中的Delta。在交易成本存在的情况下,由BSM得到的完美对冲头寸量是需要调整的。

    遗憾的是,该方法的估计等式没有解析解,而即使是数值求解也非常的复杂,因此在实践中难以实施。

    (三)Whalley-Wilmott的渐进解

    Whalley和Wilmott(1997)在假设交易成本相对于BSM公式中的期权价格而言很小的情况下,通过对最优系统的渐进分析,提出一个相对容易实行的对冲算法。他们采用的是Global-in-time方法,即通过提供一个决策规则,在每个时间瞬间监控股价并决定是否进行对冲头寸调整,解决因连续交易而带来的交易成本问题。

    渐进分析的结果是,得到一个相对简单的用以计算无需对冲区域的公式。

    (四)Zakamouline的双渐进解

    Zakamouline(2006)研究了基于效用的对冲策略的特性,并提出了一个对冲策略公式,他能够保持Hodges-Neuberger模型最重要的特性。这个对冲带不是以BSM Delta为中心的,而是根据修正后的波动率计算出的BSM Delta为中心的。对于深度价外期权而言,对冲带的宽度也不等于0,这与Hodges-Neuberger模型的精确数值解的结果一致。

    蒙特卡罗模拟介绍

    蒙特卡洛(Monte Carlo)方法又称统计模拟法、随机抽样技术,是一种随机模拟方法,以概率和统计理论方法为基础的一种计算方法,是使用随机数(或更常见的伪随机数)来解决很多计算问题的方法,以是否在计算机上使用为重要标志,因此,它虽然属于计算方法,但又与一般计算方法有很大区别。它将所求解的问题同一定的概率模型相联系,用电子计算机实现随机抽样或统计模拟,以获得问题的近似解。

    金融市场上的金融创新、金融自由化和金融全球一体化促使了期权等主要金融衍生品的品种变得越来越多样化,同时各类客户对金融工具的个性化需求也越来越多,新型奇异衍生产品迅速发展起来,以期权定价理论为基础的实物期权方法也越来越受到重视,这些发展动向,使得金融市场迫切需要一种强有力的数学工具来解决金融衍生品的定价问题。

    根据现有的金融资产定价理论,除了少数一些简单衍生证券的价格可以得到比较简单的理论计算公式以外,绝大部分期权价格则必须通过数值分析方法来加以确定。因此,数值分析方法就成为解决衍生证券定价问题的十分必要的手段。

    利用蒙特卡洛模拟股票生成路径对冲

    我们选取初始股票价格为240.45,无风险利率为3%,波动率为15%,交割价格为240.45,对其采取每天对冲一次,模拟一万次。下表为我们选取每日固定对冲一次的方法,不同的VAR得到的不同模拟对冲结果:

    对其采取区间对冲,取值区间变换超过0.3时才对冲,模拟一万次。下表为我们选取区间对冲的方法,不同的VAR得到的不同模拟对冲结果

    通过以上两个表格,我们得出通过区间对冲的成本明显高于每日对冲成本,分析其原因得知:虽然通过区间对冲降低了交易手续费,但是在对冲精度方面也降低了,而且交易成本占整个的对冲成本的比例很小,所以区间对冲在某些时候并不比每日对冲效果好。

    总结

    期权的非系统对冲方法(以固定时间间隔进行对冲,对冲至一个Delta带,根据标的资产价格变化的对冲)有各种缺陷。基于效用最大化的方法Hodges-Neuberger范式从理论上解决了对冲问题,但是在实践中难以实施,于是有了Whalley-Wilmott渐进方法和Zakamouline双渐进方法。本文详细介绍了Whalley-Wilmott渐进方法和Zakamouline双渐进方法的特性。并分别通过Monte Carlo模拟进行动态对冲模拟对比分析了三种方法(以固定时间间隔进行对冲和区间对冲)的对冲效果。实证分析结果表明,以固定时点对冲和区间对冲相比,不能够绝对分清方法优劣。数据显示,区间对冲能够有效减少交易成本,但降低了对冲精度,所以要根据具体情况采用什么方法对冲。

    后续我们对带有交易成本Delta复制可以继续研究,分别对Whalley-Wilmott渐进方法和Zakamouline双渐进方法进行实证分析,比较各种复制方法的好坏,最终得到最优Delta对冲方法。

    (来源:期货日报     作者:卢磊)

    展开全文
  • 研究了使对冲基金管理者和投资者收益最大化的对冲基金最优投资模型,考虑了通胀因素列其投资收益的影响.首先,定义投资者和管理者的价值函数.刻画基金管理者的最优投资问题.其次.通过随机分析和动态规划的方法...
  • 股指期货对冲策略

    2021-06-06 08:56:17
    Alpha 对冲背景 作为普通的投资者,大部分投资者都会选择基金这一投资渠道。而面对眼花缭乱的基金产品,投资者如何选择出符合自己风险偏好的基金就显得十分重要。这一选择的过程可能就需要我们对基金产品做一个绩效...

    Alpha 对冲背景

    作为普通的投资者,大部分投资者都会选择基金这一投资渠道。而面对眼花缭乱的基金产品,投资者如何选择出符合自己风险偏好的基金就显得十分重要。这一选择的过程可能就需要我们对基金产品做一个绩效评价,选出其中表现最好的作为我们的投资组合。而最常见的三个评价标准有下述三个:

    1、夏普 (Sharpe) 指数:
    美国经济学家威廉•夏普于 1966 年发表《共同基金的业绩》一文,提出用基金承担单位总风险(包括系统风险和非系统风险)所带来的超额收益来衡量基金业绩,这就是夏普指数。夏普指数通过一定评价期内,基金投资组合的平均收益超过无风险收益率部分与基金收益率的标准差之比来衡量基金的绩效。计算公式为:

    Sp=Rp−Rfσp

    Sp=Rp−RfσpSp=Rp−Rfσp


    其中,SpSpSp 为夏普指数,RpRpRp 为基金组合的实际收益,RfRfRf 为无风险收益率,σpσpσp 为基金收益率所对应的标准差(σpσpσp 里既包括了系统风险也包括了特有风险);也可见 CAPM 模型
    其直观含义是资产组合承担一单位的风险能够获得多少单位的额外收益。因此,可以认为,夏普业绩指数越大,基金绩效就越好;反之,基金绩效就越差。我们也可以通过图形做一个说明,以 CML(资本市场线)为例:在资本市场线以上的组合,其夏普比率较高,也就意味着承担单位的风险能获得更高的收益。

     

    2、特雷诺 (Treynor) 指数简介
    杰克•特雷诺 1965 年发表《如何评价投资基金的管理》一文,认为足够的证券组合可以消除单一资产的非系统性风险,那么系统风险就可以较好地刻画基金的风险,即与收益率变动相联系应为系统性风险。因此,特雷诺指数采用在一段时间内证券组合的平均风险报酬与其系统性风险对比的方法来评价投资基金的绩效。这就是特雷诺指数,它等于基金的超额收益与其系统风险测度β之比。
    计算公式为:

    Tp=Rp−Rfβp

    Tp=Rp−RfβpTp=Rp−Rfβp


    其中,TpTpTp 为特雷诺指数,βpβpβp 表示基金投资组合的 βββ 系数,是投资组合要承担的系统风险。
    特雷诺业绩指数的理论依据也是资本资产定价模型(CAPM 模型),但是是以证券市场线(SML)为评价的基点,当市场处于平衡时,所有的资产组合都落在 SML 上,即 SML 的斜率就表示市场证券组合的特雷诺指数。当基金投资组合的特雷诺指数大于 SML 的斜率时, 该投资组合就位于 SML 线之上,表明其表现优于市场表现;反之,当基金投资组合的特雷诺指数小于 SML 的斜率时,该投资基金组合位于 SML 线之下,表明其表现劣于市场表现。所以,特雷诺业绩指数越大,基金的绩效就越好;反之,基金的绩效就越差。

     

    3、詹森 (Jensen) 指数简介
    美国经济学家迈克尔•詹森 1968 年发表《1945-1964年间共同基金的业绩》一文,提出了一种评价基金业绩德绝对指标,即詹森指数。他认为,基金投资组合的额外收益可衡量基金额外信息的价值,因而可以衡量基金的投资业绩,其计算公式为:

    Jp=Rp−[Rf+βp⋅(Rm−Rf)]

    Jp=Rp−[Rf+βp⋅(Rm−Rf)]Jp=Rp−[Rf+βp⋅(Rm−Rf)]


    这里 JpJpJp 为詹森指数,其他符号如之前所定义。
    詹森业绩指数,又称为 ααα 值,它反映了基金与市场整体之间的绩效差异。詹森指数也以资本资产定价模型为基础,根据 SML 来估计基金的超额收益率。其实质是反映证券投资组合收益率与按该组合的 βββ 系数算出来的均衡收益率之间的差额。当然,差额越大,也就是詹森系数越大,反映基金运作效果越好。如果 ααα 为正值,则说明基金经理有超常的选股能力,被评价基金与市场相比,高于市场平均水平,投资业绩良好;ααα 为负值则说明基金经理的选股能力欠佳,不能跑过指数,被评价基金的表现与市场相比较整体表现差;ααα 为零则说明基金经理的选股能力一般,只能与指数持平。

     

    在策略中的应用

    基于上面的逻辑,我们可以先选出一个 Alpha 较高并且稳定的交易策略组合,然后用沪深 300 股指期货进行对冲,以此以抵消掉系统性风险 βββ,并只剩下 ααα 的部分,使得我们的组合无论在牛熊市都能够获得稳定的收益。思路如下:假设策略选出的股票组合的超额收益为 ααα,组合收益 RpRpRp 与指数收益 RmRmRm 的线性相关系数为

    βp=Cov(Rp,Rm)Var(Rm),

    βp=Cov(Rp,Rm)Var(Rm),βp=Cov(Rp,Rm)Var(Rm),


    (具体可见 CAPM 公式。)组合的收益可以用公式表示为:

    Rp=α+βp⋅Rm.

    Rp=α+βp⋅Rm.Rp=α+βp⋅Rm.


    所以对于一单位的股票组合,卖空 βpβpβp 单位的股指期货可得到的收益为 ααα,按照这样的操作即可获得 ααα 的超额收益。

     

    根据这个思路,我们构建一个策略:
    (1) 首先找一个 Alpha 比较高的投资组合(此处我们以因子研究系列中的 ALR 因子为例)
    (2) 设置两个仓位,一个用来交易股票,另一个用来交易股指期货。此外由于期货合约采取每日结算,并且当日卖出股票得到的现金要第二日才能转入期货账户,因此期货仓位中的钱除了满足保证金要求外,还要预留出能够扛两个涨停日的准备金。
    (3) 设置调仓频率,根据资产负债率选择 ALR 指标最大的 3% 的股票作为新的股票组合。
    (4) 每日跟踪期货账户准备金情况,如果发现准备金不足,应卖出一定量的股票来补充准备金并调整对冲的仓位。

    回测结果

    先看看我们不做 Alpha 对冲,回测的结果:
    不对冲.png
    可以看出从 10 年 5 月到 16 年 11 月这一阶段,不做 Alpha 对冲可得的收益为 278%,但回撤较大,有 40%。做过对冲之后的结果如下:
    对冲.png
    可以发现后者放弃了很多的收益,但做过对冲后系统性风险基本为零,并且回撤回测明显减小,仅为 13%,而且完全没有受到股灾的影响。

    结语

    股指期货的规则和对冲的细节实际上比较复杂。比如说当指数发生变化之后,仓位里股票和股指期货空单就会分别发生一涨一跌的情况,对冲比例发生变化,应该及时调整仓位。又比如说任何时间点都有四个不同交割日期的沪深300期货合约,它们有着不同程度的折价或溢价,选择不同的日期的合约会带来一些差异。本文中没有考虑太多的细节,但这些都是值得考虑的,所以还有很大的提升空间。

    函数和变量说明书

    1122.PNG

    展开全文
  • Deribit期权Delta动态对冲策略

    千次阅读 2021-06-16 18:27:57
    Deribit期权Delta动态对冲策略 本次FMZ量化带来的策略是Deribit期权Delta动态对冲策略,简称DDH(dynamic delta hedging)策略。 对于期权交易的学习,我们通常要掌握这几个方面的概念: 期权定价模型,B-S模型,...

    Deribit期权Delta动态对冲策略

    本次FMZ量化带来的策略是Deribit期权Delta动态对冲策略,简称DDH(dynamic delta hedging)策略。

    对于期权交易的学习,我们通常要掌握这几个方面的概念:

    期权定价模型,B-S模型,期权价格根据【标的物价格】、【行权价】、【到期剩余时间】、【(隐含)波动率】、【无风险利率】确定价格。期权的风险敞口:
    1、Delta — 期权的方向风险。如果Delta为+0.50,那这个期权,在标的价格涨跌时的盈亏表现,可视为0.50个现货。
    2、Gamma — 方向风险的加速度。比如看涨期权,由于Gamma的作用,从标的价格位于行权价开始,价格不断上涨的过程中,Delta会从+0.50逐渐向+1.00靠拢。
    3、Theta— 时间敞口。当你买入期权时,如果标的价格不动,每过一天,你会支付Theta金额所示的费用(Deribit以USD计价)。
    当你卖出期权时,如果标的价格不动,每过一天,你会收到Theta金额所示的费用。
    4、Vega — 波动率敞口。当你买入期权时,Vega为正,即做多波动率。隐含波动率提高时,你会在Vega敞口获得收益。反之亦然,当你卖出期权时,隐含波动率降低,你会获得收益。

    DDH策略讲解:

    DDH 原理讲解
    通过配平期权和期货的Delta,达到交易方向的风险中性。由于期权的Delta是会跟随标的物价格变动而变动的,期货和现货的Delta是不变的。在持有期权合约仓位,并用期货对冲配平Delta之后,随着标的物价格变动,总体Delta会再次出现不平衡的状态。对于期权仓位和期货仓位这样的组合就需要持续的动态对冲配平Delta。

    举个例子:
    当我们买入了一张看涨期权,此时就持有了一个看多方向的头寸。此时需要做空期货来对冲期权的Delta,达到总体Delta中性(0或者接近于0)。我们先不考虑期权合约到期剩余时间、波动率等因素。
    情况1:
    标的物价格上涨,期权部分的Delta增大,总体Delta向正数移动,需要期货再次对冲,开一部分空头仓继续做空期货,使总体Delta再次平衡。(再次平衡前,此时期权的Delta大,期货的Delta相对小,看涨期权的边际盈利超过合约空头的边际损失,整个组合会出现收益)

    情况2:
    标的物价格下跌,期权部分的Delta减小,总体Delta向负数移动,平仓一部分空头的期货持仓,使总体Delta再次平衡。(再次平衡前,此时期权的Delta小,期货的Delta相对大,看涨期权的边际损失小于合约空头的边际盈利,整个组合还是会出现收益)。所以理想状态,标的物涨跌都会带来收益,只要市场有波动即可。然而还需要考虑的因素还有:时间价值、交易成本等因素。所以引用知乎大牛的解释:

    Gamma Scalping 的关注点并不是delta,dynamic delta hedging 只是过程中规避underlying价格风险的一种做法而已。
    Gamma Scalping 关注的是Alpha,此Alpha不是选股的Alpha,这里的Alpha = Gamma/Theta也就是单位Theta的时间损耗换来多少Gamma,
    这个是关注的点。可以构建出上涨和下跌都浮盈的组合,但一定伴随时间损耗,那问题就在于性价比了。
    
    作者:许哲
    链接:https://www.zhihu.com/question/51630805/answer/128096385
    

    DDH 策略设计讲解

    • 聚合行情接口封装,框架设计
    • 策略UI设计
    • 策略交互设计
    • 自动对冲功能设计

    源码:

    // 构造函数
    function createManager(e, subscribeList, msg) {
    	var self = {}
        self.supportList = ["Futures_Binance", "Huobi", "Futures_Deribit"]  // 支持的交易所的
    
        // 对象属性
        self.e = e
        self.msg = msg
        self.name = e.GetName()
        self.type = self.name.includes("Futures_") ? "Futures" : "Spot"
        self.label = e.GetLabel()
        self.quoteCurrency = ""  
        self.subscribeList = subscribeList   // subscribeList : [strSymbol1, strSymbol2, ...]
        self.tickers = []                    // 接口获取的所有行情数据,定义数据格式:{bid1: 123, ask1: 123, symbol: "xxx"}}
        self.subscribeTickers = []           // 需要的行情数据,定义数据格式:{bid1: 123, ask1: 123, symbol: "xxx"}}
        self.accData = null 
        self.pos = null 
    
        // 初始化函数
        self.init = function() { 
        	// 判断是否支持该交易所
            if (!_.contains(self.supportList, self.name)) {        	
            	throw "not support"
            }
        }
    
        self.setBase = function(base) {
            // 切换基地址,用于切换为模拟盘
            self.e.SetBase(base)
            Log(self.name, self.label, "切换为模拟盘:", base)
        }
    
        // 判断数据精度
        self.judgePrecision = function (p) {
            var arr = p.toString().split(".")
            if (arr.length != 2) {
                if (arr.length == 1) {
                    return 0
                }
                throw "judgePrecision error, p:" + String(p)
            }
            
            return arr[1].length
        }
    
        // 更新资产
        self.updateAcc = function(callBackFuncGetAcc) {
            var ret = callBackFuncGetAcc(self)
            if (!ret) {
            	return false 
            }
            self.accData = ret 
            return true 
        }
    
        // 更新持仓
        self.updatePos = function(httpMethod, url, params) {
            var pos = self.e.IO("api", httpMethod, url, params)
            var ret = []
            if (!pos) {
                return false 
            } else {
                // 整理数据
                // {"jsonrpc":"2.0","result":[],"usIn":1616484238870404,"usOut":1616484238870970,"usDiff":566,"testnet":true}
                try {
                    _.each(pos.result, function(ele) {
                        ret.push(ele)
                    })
                } catch(err) {
                    Log("错误:", err)
                    return false 
                }
                self.pos = ret
            }
            return true 
        }
    
        // 更新行情数据
        self.updateTicker = function(url, callBackFuncGetArr, callBackFuncGetTicker) {
        	var tickers = []
        	var subscribeTickers = []
        	var ret = self.httpQuery(url)
        	if (!ret) {
        		return false 
        	}
        	// Log("测试", ret)// 测试
        	try {
                _.each(callBackFuncGetArr(ret), function(ele) {
                	var ticker = callBackFuncGetTicker(ele)
                	tickers.push(ticker)
                    if (self.subscribeList.length == 0) {
                        subscribeTickers.push(ticker)
                    } else {
                    	for (var i = 0 ; i < self.subscribeList.length ; i++) {                        
                        	if (self.subscribeList[i] == ticker.symbol) {
                        		subscribeTickers.push(ticker)
                        	}
                    	}
                    }
                })
            } catch(err) {
            	Log("错误:", err)
            	return false 
            }
    
            self.tickers = tickers
            self.subscribeTickers = subscribeTickers
            return true 
        }
    
        self.getTicker = function(symbol) {
        	var ret = null 
        	_.each(self.subscribeTickers, function(ticker) {
        		if (ticker.symbol == symbol) {
        			ret = ticker
        		}
        	})
        	return ret 
        }
    
        self.httpQuery = function(url) {
        	var ret = null
            try {
                var retHttpQuery = HttpQuery(url)
                ret = JSON.parse(retHttpQuery)
            } catch (err) {
                // Log("错误:", err)
                ret = null
            }
            return ret 
        }
    
        self.returnTickersTbl = function() {
            var tickersTbl = {
            	type : "table", 
            	title : "tickers",
            	cols : ["symbol", "ask1", "bid1"], 
            	rows : []
            }
            _.each(self.subscribeTickers, function(ticker) {        
            	tickersTbl.rows.push([ticker.symbol, ticker.ask1, ticker.bid1])
            })
            return tickersTbl
        }
        
        // 返回持仓表格
        self.returnPosTbl = function() {
            var posTbl = {
                type : "table", 
                title : "pos|" + self.msg,
                cols : ["instrument_name", "mark_price", "direction", "size", "delta", "index_price", "average_price", "settlement_price", "average_price_usd", "total_profit_loss"], 
                rows : []
            }
            /* 接口返回的持仓数据格式
            {
                "mark_price":0.1401105,"maintenance_margin":0,"instrument_name":"BTC-25JUN21-28000-P","direction":"buy",
                "vega":5.66031,"total_profit_loss":0.01226105,"size":0.1,"realized_profit_loss":0,"delta":-0.01166,"kind":"option",
                "initial_margin":0,"index_price":54151.77,"floating_profit_loss_usd":664,"floating_profit_loss":0.000035976,
                "average_price_usd":947.22,"average_price":0.0175,"theta":-7.39514,"settlement_price":0.13975074,"open_orders_margin":0,"gamma":0
            }
            */
            _.each(self.pos, function(ele) {
            	if(ele.direction != "zero") {
                    posTbl.rows.push([ele.instrument_name, ele.mark_price, ele.direction, ele.size, ele.delta, ele.index_price, ele.average_price, ele.settlement_price, ele.average_price_usd, ele.total_profit_loss])
                }
            })
            return posTbl
        }
    
        self.returnOptionTickersTbls = function() {
            var arr = []
            var arrDeliveryDate = []
            _.each(self.subscribeTickers, function(ticker) {
                if (self.name == "Futures_Deribit") {
                    var arrInstrument_name = ticker.symbol.split("-")
                    var currency = arrInstrument_name[0]
                    var deliveryDate = arrInstrument_name[1]
                    var deliveryPrice = arrInstrument_name[2]
                    var optionType = arrInstrument_name[3]
    
                    if (!_.contains(arrDeliveryDate, deliveryDate)) {
                        arr.push({
                            type : "table", 
                            title : arrInstrument_name[1],
                            cols : ["PUT symbol", "ask1", "bid1", "mark_price", "underlying_price", "CALL symbol", "ask1", "bid1", "mark_price", "underlying_price"], 
                            rows : []
                        })
                        arrDeliveryDate.push(arrInstrument_name[1])
                    }
                    // 遍历arr
                    _.each(arr, function(tbl) {
                        if (tbl.title == deliveryDate) {
                            if (tbl.rows.length == 0 && optionType == "P") {
                                tbl.rows.push([ticker.symbol, ticker.ask1, ticker.bid1, ticker.mark_price, ticker.underlying_price, "", "", "", "", ""])
                                return 
                            } else if (tbl.rows.length == 0 && optionType == "C") {
                                tbl.rows.push(["", "", "", "", "", ticker.symbol, ticker.ask1, ticker.bid1, ticker.mark_price, ticker.underlying_price])
                                return 
                            }                        
                            for (var i = 0 ; i < tbl.rows.length ; i++) {
                                if (tbl.rows[i][0] == "" && optionType == "P") {
                                    tbl.rows[i][0] = ticker.symbol
                                    tbl.rows[i][1] = ticker.ask1
                                    tbl.rows[i][2] = ticker.bid1
                                    tbl.rows[i][3] = ticker.mark_price
                                    tbl.rows[i][4] = ticker.underlying_price
                                    return 
                                } else if(tbl.rows[i][5] == "" && optionType == "C") {
                                    tbl.rows[i][5] = ticker.symbol
                                    tbl.rows[i][6] = ticker.ask1
                                    tbl.rows[i][7] = ticker.bid1
                                    tbl.rows[i][8] = ticker.mark_price
                                    tbl.rows[i][9] = ticker.underlying_price
                                    return 
                                }
                            }
                            if (optionType == "P") {
                                tbl.rows.push([ticker.symbol, ticker.ask1, ticker.bid1, ticker.mark_price, ticker.underlying_price, "", "", "", "", ""])
                            } else if(optionType == "C") {
                                tbl.rows.push(["", "", "", "", "", ticker.symbol, ticker.ask1, ticker.bid1, ticker.mark_price, ticker.underlying_price])
                            }
                        }
                    })
                }
            })
            return arr 
        }
    
        // 初始化
        self.init()
    	return self 
    }
    
    
    function main() {
        // 初始化,清空日志
        if(isResetLog) {
        	LogReset(1)
        }
    
        var m1 = createManager(exchanges[0], [], "option")
        var m2 = createManager(exchanges[1], ["BTC-PERPETUAL"], "future")
    
        // 切换为模拟盘
        var base = "https://www.deribit.com"
        if (isTestNet) {    
            m1.setBase(testNetBase)    
            m2.setBase(testNetBase)
            base = testNetBase
        }
    
        while(true) {
            // 期权
            var ticker1GetSucc = m1.updateTicker(base + "/api/v2/public/get_book_summary_by_currency?currency=BTC&kind=option", 
                function(data) {return data.result}, 
                function(ele) {return {bid1: ele.bid_price, ask1: ele.ask_price, symbol: ele.instrument_name, underlying_price: ele.underlying_price, mark_price: ele.mark_price}}) 
            
            // 永续期货
            var ticker2GetSucc = m2.updateTicker(base + "/api/v2/public/get_book_summary_by_currency?currency=BTC&kind=future", 
                function(data) {return data.result}, 
                function(ele) {return {bid1: ele.bid_price, ask1: ele.ask_price, symbol: ele.instrument_name}})
            if (!ticker1GetSucc || !ticker2GetSucc) {
                Sleep(5000)
                continue
            }
    
            // 更新持仓
            var pos1GetSucc = m1.updatePos("GET", "/api/v2/private/get_positions", "currency=BTC&kind=option")
            var pos2GetSucc = m2.updatePos("GET", "/api/v2/private/get_positions", "currency=BTC&kind=future")
    
            if (!pos1GetSucc || !pos2GetSucc) {
                Sleep(5000)
                continue
            }
    
            // 交互
            var cmd = GetCommand()
            if(cmd) {
                // 处理交互
                Log("交互命令:", cmd)
                var arr = cmd.split(":")
                // cmdClearLog 
                if(arr[0] == "setContractType") {
                    // parseFloat(arr[1])
                    m1.e.SetContractType(arr[1])
                    Log("exchanges[0]交易所对象设置合约:", arr[1])
                } else if (arr[0] == "buyOption") {
                    var actionData = arr[1].split(",")
                    var price = parseFloat(actionData[0])
                    var amount = parseFloat(actionData[1])
                    m1.e.SetDirection("buy")
                    m1.e.Buy(price, amount)
                    Log("执行价格:", price, "执行数量:", amount, "执行方向:", arr[0])
                } else if (arr[0] == "sellOption") {
                    var actionData = arr[1].split(",")
                    var price = parseFloat(actionData[0])
                    var amount = parseFloat(actionData[1])
                    m1.e.SetDirection("sell")
                    m1.e.Sell(price, amount)                
                    Log("执行价格:", price, "执行数量:", amount, "执行方向:", arr[0])
                } else if (arr[0] == "setHedgeDeltaStep") {
                    hedgeDeltaStep = parseFloat(arr[1])
                    Log("设置参数hedgeDeltaStep:", hedgeDeltaStep)
                } 
            }
            
            // 获取期货合约价格
            var perpetualTicker = m2.getTicker("BTC-PERPETUAL")
            var hedgeMsg = " PERPETUAL:" + JSON.stringify(perpetualTicker)
    
            // 从账户数据中获取delta总值        
            var acc1GetSucc = m1.updateAcc(function(self) {
            	self.e.SetCurrency("BTC_USD")        
            	return self.e.GetAccount()
            })
            if (!acc1GetSucc) {
            	Sleep(5000)
            	continue
            }
            var sumDelta = m1.accData.Info.result.delta_total
    
            if (Math.abs(sumDelta) > hedgeDeltaStep && perpetualTicker) {
                if (sumDelta < 0) {
                    // delta 大于0 对冲期货做空                
                    var amount = _N(Math.abs(sumDelta) * perpetualTicker.ask1, -1)                
                    if (amount > 10) {
                        Log("超过对冲阈值,当前总delta:", sumDelta, "买入期货")
                        m2.e.SetContractType("BTC-PERPETUAL")                    
                        m2.e.SetDirection("buy")
                        m2.e.Buy(-1, amount)
                    } else {
                    	hedgeMsg += ", 对冲下单量小于10"
                    }
                } else {
                    // delta 小于0 对冲期货做多
                    var amount = _N(Math.abs(sumDelta) * perpetualTicker.bid1, -1)
                    if (amount > 10) {
                        Log("超过对冲阈值,当前总delta:", sumDelta, "卖出期货")
                        m2.e.SetContractType("BTC-PERPETUAL")
                        m2.e.SetDirection("sell")
                        m2.e.Sell(-1, amount)
                    } else {
                    	hedgeMsg += ", 对冲下单量小于10"
                    }
                }
            }
    
            LogStatus(_D(), "sumDelta:", sumDelta, hedgeMsg, 
            	"\n`" + JSON.stringify([m1.returnPosTbl(), m2.returnPosTbl()]) + "`", "\n`" + JSON.stringify(m2.returnTickersTbl()) + "`", "\n`" + JSON.stringify(m1.returnOptionTickersTbls()) + "`")
            Sleep(10000)
        }
    }
    
    
    

    策略参数:

    策略地址:https://www.fmz.com/strategy/265090

    策略运行:

    本策略为教学策略,学习为主,实盘请谨慎使用。

    展开全文
  • self.data_price_diff=self.__combine(self.data_price_iron_diff,self.data_future_diff,col='期货价格变化')#将期货价格变化拼接至钢铁价格后面 #定义基本变量 def __basic_parameters(self): self.list_date = ...
  • delta动态对冲的python代码实现(1)

    千次阅读 2021-12-21 15:24:12
    delta动态对冲的python代码实现
  • 根据国内一些公开的量化对冲类公募基金产品的历史业绩表现来看,该策略在国内A股市场的有效性已经得到了极大的实操验证。另一方面,随着股市扩容持续保持在较高节奏,中国经济也步入降速...阿尔法对冲策略的定义 ...
  • plt.title('看涨期权多头') plt.grid(True) # 采用期权对冲 # 投资者5月持有1000股价值28元的股票,投资者担心股票价格下跌,买入看跌期权进行对冲 # 7月合约,买入10手看跌期权,期权执行价为27.5元,期权报价为1元...
  • 期权希腊字母与风险对冲计算
  • 摘自:Handbook of Hedge Fund 目录: 1. 股票多空 2. 单向做空 3. 市场中性 货币中性 Beta中性 行业中性 因子中性 配对交易 ...股票多空是对冲基金最常使用,也是目前管理规模最大的一种...
  • 第十四节 三角对冲指标编写 这节课我们要挑战一下稍微有点难度的三角对冲指标编写,相信大家认真学习完这次的指标编写后,其他的指标也基本上可以自己写了。 三角对冲交易策略 三角对冲可谓是相当出名的策略了,...
  • 《The Hedge Fund Journal》于近日公布了2021年版(第六版)明日对冲基金巨人50榜单,该榜单强调了投资经理策略的独特性,及具有良好的业绩和增长资产的潜力。提名来自《The Hedge Fund Journal》的读者网络,包括...
  • 期权理论基础1 对冲法两期对冲法定价看涨期权的对冲法看跌期权的对冲法多期对冲法定价看涨期权的对冲法看跌期权的对冲法 这个系列介绍期权定价的理论基础,需要一点点概率基础,不需要任何的金融基础。我们先从最...
  • 带你学习硬核策略 之 「C++ 版 OKEX合约对冲策略」 说起对冲策略,在各个市场中有多种多样的策略、多种多样的组合、多种多样的思路。我们从最经典的跨期对冲来初探对冲策略的设计思路、理念。如今,数字货币市场活跃...
  • 47 4.3.2 基础定义 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 4.4 离散时间模型的主要结果 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 4.5 连续时间模型 . . . . ....
  • 期权、期货及其他衍生产品 第三章读书笔记 利用期货的对冲策略基本原理空头对冲多头对冲对冲对成本的锁定(基差为0)拥护与反对对冲的观点基差风险基差卖出资产所得实际价格买入资产支付实际价格基差风险风险资产和...
  • 经过我们长期的跟单结果来定义一个跟单软件的好坏取决于每手平均滑点大小和软件的稳定性,因为行情是有波动的,而且我们每次开仓平仓的波动大小又不同,跟单的滑点问题咱们是可以通过跟几个范本数据来把控其中的一个...
  • 导读 最近有一档综艺节目不知道大家有没有看过,具体什么名字我就不在这里说了,免去广告的嫌疑,里面的一个明星嘉宾是黄晓明,几档节目下来,通过秦海璐、...桥水基金是一家对冲基金,大家可能以为基金公司...
  • 通货膨胀101 美联储将通货膨胀定义为“经济中商品和服务总体价格水平的普遍上涨”。由于供应和需求的基本面驱动着商品的价格,通货膨胀通常是由于消费者需求增加和/或生产成本增加(即供应减少)而发生的。 虽然可...
  • 全球宏观策略很难被准确定义,因为每种策略都不一样,并且都是主观的和基于市场机会的,主要包括了两个特点: 1、策略是基于全球化的,包括了在各个流动性好的市场分析其趋势、市场偏差、经济周期和特殊地区的...
  • 这10个对冲基金策略你必须烂熟于心

    千次阅读 2019-12-30 10:43:11
    股票多空是对冲基金最常使用,也是目前管理规模最大的一种策略,它是通过多头和空头的组合,来减少市场波动的风险。与纯多头策略相比,多空策略虽然也是使用股票,但事实上却完全不同:它是传统权益资产的延伸,或者...
  • 在2014-至2015上半年,股指反向跟单的投资者确实获得很大的利润,使金融市场的盈利模式重新被定义,期货反向跟单成为继主观交易、程序化交易之后的第三种以人为本的自动化交易。 期货反向跟单现状 自2015年8月,...
  • 期限结构与carry大致定义 简单来说,展期收益就是不同月间合约的价差。这种收益也被称为carry收益,一般意义上的carry是指票息所得和资金成本之间的差。举例说,如果你借钱5%成本买企业债并收到了利息7%,债券利息...
  • 今天用深度学习的序列模型预测股价已经取得了不错的效果,尤其是在对冲基金中。股价数据是典型的时间序列数据。什么是序列数据呢?语音、文字等这些前后关联、存在内有顺序的数据都可以被视为序列数据。将序列模型...
  • 【前沿】来认识一下新的量化对冲基金之王——Two Sigma 2018-01-27 Career In 投行PEVC 在主动交易式微、被动交易崛起的当下,传统对冲基金饱受业绩下滑、资金外流的困扰。然而,一家依赖大数据和人工智能的量化...
  • 北京时间 20 日早间 CNBC 称,虽然越来越多对冲基金开始改用电脑取代人工选股,但在电脑完全接管该行业之前,它们还需要克服一个小小的障碍:投资回报率。根据数据提供商 Preqin 的统计,今年上半年,电脑生成的投资...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,532
精华内容 1,012
关键字:

对冲的定义

友情链接: mutiwsn.rar