FC2ブログ
最初
http://blog-imgs-36.fc2.com/a/m/a/amamiyaprog/ImpliedVolatility1.txt

修正1 5/3

# インプライド・ボラティリティ Implied Volatility
# 引数 原資産価格 権利行使価格 残存期間(日) 安全資産利子率(%) 原資産利回り(%) オプションの現在価格 フラグ ($Price, $Strike, $CurrentMaturity, $RiskFreeRate, $DividendYield, $OpPrice, $Flag)
# 戻り値 インプライド・ボラティリティ Implied Volatility ($ImpliedVolatility)
sub IV{
my ($Price, $Strike, $CurrentMaturity, $RiskFreeRate, $DividendYield, $OpPrice, $Flag) = @_;
my $ImpliedVolatility = ();
my $Year = 365;
my $CurrentMaturity_Year = $CurrentMaturity / $Year;
my $RiskFreeRate_100 = $RiskFreeRate / 100;
my $DividendYield_100 = $DividendYield / 100;
my $SqrtCurrentMaturity = sqrt($CurrentMaturity_Year);
my $Ln_PriceStrike = log($Price / $Strike) / log(exp(1));
my $Volatility = (abs($Ln_PriceStrike + ($RiskFreeRate_100 * $CurrentMaturity_Year)) * 2 / $CurrentMaturity_Year) ** 0.5;
my $TempOpPrice = 0;
my $Vega = 0;
my $Pi = atan2(1, 1) * 4;
my $Limit = 100;
my $Epsilon = 1.0e-10;

# 計算
for(my $i = 0; $i < $Limit; $i++){
my $num1 = $Ln_PriceStrike;
my $num2 = ($RiskFreeRate_100 - $DividendYield_100 + (($Volatility * $Volatility) / 2)) * $CurrentMaturity_Year;
my $den = $Volatility * $SqrtCurrentMaturity;
my $d1 = ($num1 + $num2) / $den;
my $d2 = $d1 - ($Volatility * $SqrtCurrentMaturity);
my $nd1 = exp(-($d1 * $d1) / 2) / sqrt(2 * $Pi);

if($Flag == 0){
# Call
my $call_d1 = &NORMDIST($d1);
my $call_d2 = &NORMDIST($d2);
$TempOpPrice = (exp(-($CurrentMaturity_Year * $DividendYield_100)) * ($Price * $call_d1)) - ($Strike * exp(-($CurrentMaturity_Year * $RiskFreeRate_100)) * $call_d2);
}else {
# Put
my $put_d1 = &NORMDIST(-$d1);
my $put_d2 = &NORMDIST(-$d2);
$TempOpPrice = ($Strike * exp(-($CurrentMaturity_Year * $RiskFreeRate_100)) * $put_d2) -(exp(-($CurrentMaturity_Year * $DividendYield_100)) * ($Price * $put_d1));
}

# ベガ
$Vega = $Price * exp(-($CurrentMaturity_Year * $DividendYield_100)) * $nd1 * $SqrtCurrentMaturity;

if($Vega == 0){
die "\$Vega == 0";
}

$Volatility = $Volatility + (($OpPrice - $TempOpPrice) / $Vega);

# 収束判定
last if(abs($OpPrice - $TempOpPrice) < $Epsilon);
}

# インプライド・ボラティリティ Implied Volatility
$ImpliedVolatility = $Volatility * 100;

return $ImpliedVolatility;
}

# 正規分布関数
# 引数 値 ($Price)
# 戻り値 正規分布関数の値 ($normdist)
sub NORMDIST {
my ($Price) = @_;
my $normdist = 0;
my $pi = atan2(1, 1) * 4;
# my $mean = 0;
# my $sigma = 1;
# my $precision = 7;
my $precision = 10**-7;

my $z = $Price;
my $z2 = $z * $z;
my $p = $z * exp(-0.5 * $z2) / sqrt(2 * $pi);
my $s = $p;

for (my $n = 3; abs($s) > $precision; $n += 2) {
$s *= $z2 / $n;
$p += $s;
}

# 正規分布関数
$normdist = 0.5 + $p;

return $normdist;
}


一言
Implied Volatilityで使用するオプション価格は、理論価格ではなく現在の価格

修正1
call putのImplied Volatilityを別々に出すようにした
オンライン コンパイラ/インタプリタ
テクニカル分析
プロフィール

Author:雨宮
Firefoxを使用しているので気づかなかったけど、IE6でソースコードを上手くコピーできない

5/3
携帯用ならIE6でもソースコードをコピーできる
携帯用

検索フォーム


あわせて読みたいブログパーツ
一寸先は闇 RSS