📄 yuanma.txt
字号:
module NUMERICAL
use IMSL
implicit none
real ::zero=0.1!可容忍誤差
contains
real function bisect(guess_a,guess_b,ca,s,k,r,q,t)
real ::guess_a !區間值下界
real ::guess_b !區間值上界
real c !用來計算猜測值(A+B)/2
real FA,FB,FC !用來記錄F(a),F(b),F(c)
real ca
real k
real s,r,q,t
C=(guess_a+guess_b)/2.0 ! 先求出C, F(C)的值
FC=func(C,ca,s,k,r,q,t)
DO while (abs(fc)>zero) ! F(C)小於ZERO時,就視 F(C)=0,結束迴圈
FA=func(guess_a,ca,s,k,r,q,t)
FB=func(guess_b,ca,s,k,r,q,t)
if(FA*FC<0) then
guess_b=C ! f(a)*f(c)<0 ,以a,c值為新的區間
C=(guess_a+guess_b)/2.0
else
guess_a=c ! 不然就是以b,c為新的區間
C=(guess_a+guess_b)/2.0
end if
FC=FUNC(C,ca,s,k,r,q,t) ! 求出新的f(c)值
end do
bisect = C
return
end function
real function func(X,ca,s,k,r,q,t) ! 求解用的函數
implicit none
real X
real ca,s,k,r,q,t
FUNC=S*exp(-q*t)*ANORDF((log(s/k)+(r+0.5*X**2)*t)/(x*t**0.5))-K*exp(-r*t)*ANORDF((log(s/k)+(r-0.5*X**2)*t)/(X*t**0.5))-ca
return
end function
end module
program main
use numerical
implicit none
integer i
integer,parameter:: option=5
real::x !要求的隱含波動率
real::guess_a=0.001 !猜測值下限
real::guess_b=1 !猜測值上限
real::ans(option) !最終解
real::caa(option)=(/945,745,446,173,15/) !買權
real,parameter::s=8355.0 !現貨價格
real::kk(option)=(/7400,7600,7900,8200,8500/) !履約價格
real,parameter::T=0.0383562 !存續期間
real,parameter::r=0.02 !無風險利率
real,parameter::q=0.05 !現金股利率
real ca,k
do i=1,option
ca=caa(i)
k=kk(i)
ans(i)=bisect(guess_a,guess_b,ca,s,k,r,q,t)
write(*,"(f14.8)") ans(i)
ca=0
k=0
end do
stop
end program
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -