美式期权定价&利率衍生证券

Navigator

支付红利

  • 支付已知红利:在期权的有效期的某些时刻的资产支付红利率
  • 支付连续红利:在期权有效期所有时刻标的资产都支付红利

在支付已知红利的情况下,设前节点股价为 S u j d i − j ( j = 0 , 1 , … , i ) Su^jd^{i-j}(j=0,1,\dots, i) Sujdi−j(j=0,1,…,i),在除息日之后,相应节点的股票价格调整为
S ( 1 − δ ) u j d i − j , j = 0 , 1 , … , i S(1-\delta)u^jd^{i-j}, j=0,1,\dots, i S(1−δ)ujdi−j,j=0,1,…,i
如果在期权有效期内多次支付已知红利,设 δ i \delta_i δi​为0时刻至 i Δ t i\Delta t iΔt时刻之间所有除息日的总红利支付率,则 i Δ t i\Delta t iΔt时刻节点的股票价格为
S ( 1 − δ i ) u j d i − j S(1-\delta_i)u^jd^{i-j} S(1−δi​)ujdi−j

code

#include <cmath>
#include <vector>
#include <iostream>

using namespace std;

double call_option_usa_dvd(
    const double &S, // 标的资产价格 
    const double &X, // 行权价格
    const double &r, // 无风险利率
    const double &sigma, // 波动性
    const double &time, // 权利期
    const int &nsteps, // 二叉树步数
    const vector<double> &dtimes, // 红利发生时间
    const vector<double> &dyields // 红利率
    ){
    int ndvds = dtimes.size();
    if(!ndvds) return 0.00;
    double delta_t = time/nsteps;
    double R = exp(r*delta_t);
    double Rinv = 1.0/R;
    double u = exp(sigma*sqrt(delta_t));
    double uu = u*u;
    double d = 1.0/u;
    double pUp = (R-d)/(u-d);
    double pDown = 1.0-pUp;
    vector<int> dvd_steps(ndvds);
    for(int i=0; i<ndvds; ++i){
        dvd_steps[i]=(int)(dtimes[i]/time*nsteps);
    }
    vector<double> prices(nsteps+1);
    vector<double> call_prices(nsteps+1);
    prices[0]=S*pow(d, nsteps);
    for(int j=0; j<ndvds; ++j){
        prices[0] *= (1.0-dyields[j]);
    }
    for(int k=1; k<=nsteps; ++k){
        prices[k]=uu*prices[k-1];
    }
    for(int m=0; m<=nsteps; ++m) call_prices[m]=max(0.0, prices[m]-X);
    for(int step=nsteps-1; step>=0; --step){
        for(int i=0; i<ndvds; ++i){
            if(step==dvd_steps[i]){
                cout<<"红利率发生步数:"<<step<<endl;
                for(int j=0; j<=(step+1); ++j){
                    prices[j]*=(1.0/(1.0-dyields[i]));
                }
            }   
        }
        for(int n=0; n<=step; ++n){
            call_prices[n]=(pDown*call_prices[n]+pUp*call_prices[n+1])*Rinv;
            prices[n] = d*prices[n+1];
            call_prices[n] = max(call_prices[n], prices[n]-X);
        }
    }
    return call_prices[0];
}

int main(){
    double S=100.0;
    double X=100.0;
    double r=0.1;
    double sigma = 0.25;
    double time = 1.0;
    double nsteps = 100;
    vector<double> dtimes; dtimes.push_back(0.25); dtimes.push_back(0.75);
    vector<double> dyields; dyields.push_back(0.025); dyields.push_back(0.025);
    cout<<"期权价格:"<<call_option_usa_dvd(S, X, r, sigma, time, nsteps, dtimes, dyields)<<endl;
    return 0;
}

支付已知红利额条件下的美式期权定价

假设股票价格由不确定部分 S ∗ S^* S∗和在权利期间所有未来红利额的现值组成,如果在期权有效期内只有一次红利发生,除息日为 τ \tau τ,且 k Δ t ≤ τ ≤ ( k + 1 ) Δ t k\Delta t\leq \tau\leq (k+1)\Delta t kΔt≤τ≤(k+1)Δt,在 x x x时刻,不确定部分价值为
S ∗ ( x ) = { S ( x ) x > τ S ( x ) − D e − r ( τ − Δ t ) x ≤ τ S^*(x)= \begin{cases} S(x) & x>\tau\\ S(x)-De^{-r(\tau-\Delta t)} & x\leq \tau \end{cases} S∗(x)={S(x)S(x)−De−r(τ−Δt)​x>τx≤τ​
其中 D D D是红利额, S ∗ S^* S∗的标准差为 σ ∗ \sigma^* σ∗,且 σ ∗ > σ \sigma^*>\sigma σ∗>σ。在每个Node上将未来红利额的现值加回到股票价格上,可以将 S ∗ S^* S∗还原为 S S S的二叉树。

有限差分法

有限差分法主要包括内含有限差分法和外推有限差分法。基本思想是将衍生证券满足的偏微分方程转化为一系列近似差分方程,再使用迭代法求解这些差分方程,最后得到衍生证券的价格
∂ f ∂ t + r ∂ f ∂ S S + 1 2 ∂ 2 f ∂ S 2 σ 2 S 2 = r f (1) \frac{\partial f}{\partial t}+r\frac{\partial f}{\partial S}S+\frac{1}{2}\frac{\partial^2f}{\partial S^2}\sigma^2S^2=rf\tag{1} ∂t∂f​+r∂S∂f​S+21​∂S2∂2f​σ2S2=rf(1)
离散化时间节点得到序列 0 , Δ t , 2 Δ t , … , T 0, \Delta t, 2\Delta t, \dots, T 0,Δt,2Δt,…,T
离散化价格节点得到序列 0 , Δ S , 2 Δ S , … , S max ⁡ 0, \Delta S, 2\Delta S, \dots, S_{\max} 0,ΔS,2ΔS,…,Smax​
构成一个 ( M + 1 ) × ( N + 1 ) (M+1)\times (N+1) (M+1)×(N+1)坐标点的方格,其中任意点 ( i , j ) (i, j) (i,j)对应的时间为 i Δ t i\Delta t iΔt,股票价格为 j Δ S j\Delta S jΔS. 令 f i j f_{ij} fij​表示期权的价格,可以使用离散算子逼近 ∂ f ∂ t , ∂ f ∂ S , ∂ 2 f ∂ S 2 \frac{\partial f}{\partial t},\frac{\partial f}{\partial S}, \frac{\partial^2 f}{\partial S^2} ∂t∂f​,∂S∂f​,∂S2∂2f​,将偏微分方程转化为离散方程。

内含有限差分法

在 i Δ t i\Delta t iΔt时刻的三个不同的期权价格 f i , j − 1 , f i j f_{i, j-1}, f_{ij} fi,j−1​,fij​和 f i , j + 1 f_{i, j+1} fi,j+1​对应 ( i + 1 ) Δ t (i+1)\Delta t (i+1)Δt时刻的一个期权价格 f i + 1 , j f_{i+1, j} fi+1,j​,得到内含有限差分法表达式
a j f i , j − 1 + b j f i j + c j f i , j + 1 = f i + 1 , j a_jf_{i,j-1}+b_jf_{ij}+c_jf_{i, j+1}=f_{i+1, j} aj​fi,j−1​+bj​fij​+cj​fi,j+1​=fi+1,j​
其中
{ a j = 1 2 r j Δ t − 1 2 σ 2 j 2 Δ t b j = 1 + σ 2 j 2 Δ t + r Δ t c j = − 1 2 r j Δ t − 1 2 σ 2 j 2 Δ t \left\{ \begin{aligned} &a_j=\frac{1}{2}rj\Delta t-\frac{1}{2}\sigma^2j^2\Delta t\\ &b_j=1+\sigma^2j^2\Delta t+r\Delta t\\ &c_j=-\frac{1}{2}rj\Delta t-\frac{1}{2}\sigma^2j^2\Delta t \end{aligned} \right. ⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧​​aj​=21​rjΔt−21​σ2j2Δtbj​=1+σ2j2Δt+rΔtcj​=−21​rjΔt−21​σ2j2Δt​

外推有限差分法

在 i Δ t i\Delta t iΔt时刻的一个期权价格 f i j f_{ij} fij​对应着 ( i + 1 ) Δ t (i+1)\Delta t (i+1)Δt时刻的三个不同期权价格 f i + 1 , j + 1 , f i + 1 , j , f i + 1 , j − 1 f_{i+1, j+1}, f_{i+1, j}, f_{i+1, j-1} fi+1,j+1​,fi+1,j​,fi+1,j−1​,得到外推有限差分法表达式
a j f i , j − 1 + b j f i j + c j f i , j + 1 = f i + 1 , j a_jf_{i, j-1}+b_j f_{ij}+c_j f_{i, j+1}=f_{i+1, j} aj​fi,j−1​+bj​fij​+cj​fi,j+1​=fi+1,j​
其中
{ a j = 1 1 + r Δ t ( − 1 2 r j Δ t + 1 2 σ 2 j 2 Δ t ) b j = 1 1 + r Δ t ( 1 − σ 2 j 2 Δ t ) c j = 1 1 + r Δ t ( 1 2 r j Δ t + 1 2 σ 2 j 2 Δ t ) \left\{ \begin{aligned} &a_j=\frac{1}{1+r\Delta t}(-\frac{1}{2}rj\Delta t+\frac{1}{2}\sigma^2j^2\Delta t)\\ &b_j=\frac{1}{1+r\Delta t}(1-\sigma^2 j^2\Delta t)\\ &c_j=\frac{1}{1+r\Delta t}(\frac{1}{2}rj\Delta t+\frac{1}{2}\sigma^2j^2\Delta t) \end{aligned} \right. ⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧​​aj​=1+rΔt1​(−21​rjΔt+21​σ2j2Δt)bj​=1+rΔt1​(1−σ2j2Δt)cj​=1+rΔt1​(21​rjΔt+21​σ2j2Δt)​

利率衍生证券

利率上限:为了保证浮动利率贷款的利率不超过某一利率水平,其保证贷款者在任何给定时刻所支付的贷款利率是市场当前利率与上限利率中的最小者。
利率下限:为了保证浮动利率不低于某一利率水平而设置的下限。
利率双限:为了使利率水平维持在某一区间而设置。

利率上限定价

利率上限可以看做基于浮动利率的看涨期权组合,设利率上限为 R x R_x Rx​,本金为 L L L,利率上限有效期开始在 τ , 2 τ , … , n τ \tau, 2\tau, \dots, n\tau τ,2τ,…,nτ时刻支付利息,则利率上限出售方在 k + 1 k+1 k+1时刻需要支付的金额为
τ L max ⁡ { R k − R x , 0 } \tau L\max\{R_k-R_x, 0\} τLmax{Rk​−Rx​,0}
其中 R k R_k Rk​是 k τ k\tau kτ时刻将被利率上限盯住的利率值,设 F k F_k Fk​是 k τ k\tau kτ至 ( k + 1 ) τ (k+1)\tau (k+1)τ时刻之间的远期利率,在 ( k + 1 ) τ (k+1)\tau (k+1)τ时刻的支付等于在 k τ k\tau kτ时刻的支付
τ L 1 + τ F k max ⁡ { R k − R x , 0 } \frac{\tau L}{1+\tau F_k}\max\{R_k-R_x, 0\} 1+τFk​τL​max{Rk​−Rx​,0}
可以将利率上限看做是一个基于 τ \tau τ期间的欧式看涨期权,该期权的标的资产是远期利率 F k F_k Fk​,在到期日 τ \tau τ取得回报,期权的本金为 τ L / ( 1 + τ F k ) \tau L/(1+\tau F_k) τL/(1+τFk​),假设远期利率 F k F_k Fk​的标准差为 σ F \sigma_F σF​,则根据B-S期权定价公式,看涨期权的价格为
c = τ L 1 + τ F k e − r k τ [ F k N ( d 1 ) − R x N ( d 2 ) ] c = \frac{\tau L}{1+\tau F_k}e^{-rk\tau}[F_kN(d_1)-R_x N(d_2)] c=1+τFk​τL​e−rkτ[Fk​N(d1​)−Rx​N(d2​)]
其中 N ( x ) N(x) N(x)是正态累积分布函数,且
{ d 1 = ln ⁡ ( F k / R x ) + σ F 2 k τ / 2 σ F k τ d 2 = d 1 − σ F k τ \begin{cases} d_1=\frac{\ln(F_k/R_x)+\sigma_F^2k\tau/2}{\sigma_F\sqrt{k\tau}}\\ d_2=d_1-\sigma_F\sqrt{k\tau} \end{cases} {d1​=σF​kτ ​ln(Fk​/Rx​)+σF2​kτ/2​d2​=d1​−σF​kτ ​​

上一篇:数学基础扫盲


下一篇:二维高斯滤波器的两种实现