Navigator
支付红利code
支付已知红利额条件下的美式期权定价有限差分法内含有限差分法外推有限差分法
利率衍生证券利率上限定价
支付红利
支付已知红利:在期权的有效期的某些时刻的资产支付红利率支付连续红利:在期权有效期所有时刻标的资产都支付红利
在支付已知红利的情况下,设前节点股价为
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
#include
#include
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 &dtimes, // 红利发生时间
const vector &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 dvd_steps(ndvds);
for(int i=0; i
prices[0] *= (1.0-dyields[j]);
}
for(int k=1; k
for(int i=0; i
cout
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 dtimes; dtimes.push_back(0.25); dtimes.push_back(0.75);
vector dyields; dyields.push_back(0.025); dyields.push_back(0.025);
coutRk−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τLmax{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τLe−rkτ[FkN(d1)−RxN(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=σFkτ
ln(Fk/Rx)+σF2kτ/2d2=d1−σFkτ
|