FC2ブログ

# スピアマンの順位相関係数 Spearman's Rank Correlation Coefficient
# 引数 期間 値 値 ($Period, \@Price1, \@Price2)
# 戻り値 スピアマンの順位相関係数 (@srcc)
sub SRCC{
my ($Period, $Price1, $Price2) = @_;
my @srcc = ();
my $count = @$Price1 - $Period;

# 期間と配列数の確認
if(($Period <= 0) || ($count < 0) || (@$Price1 != @$Price2)){
return 0;
}

# 計算
my $den = ($Period * $Period * $Period) - $Period;
for(my $i = $count; $i >= 0; $i--){

# 使用する値
my @SortPrice1 = ();
my @SortPrice2 = ();
for(my $j = 0; $j < $Period; $j++){
$SortPrice1[$j][0] = $$Price1[$i + $j];
$SortPrice1[$j][1] = $j;
$SortPrice2[$j][0] = $$Price2[$i + $j];
$SortPrice2[$j][1] = $j;
}

# 降順ソート
@SortPrice1 = sort {$b->[0] <=> $a->[0]} @SortPrice1;
@SortPrice2 = sort {$b->[0] <=> $a->[0]} @SortPrice2;

# 同順位の場合には、平均値を使用する
&RANKAVG($Period, \@SortPrice1);
&RANKAVG($Period, \@SortPrice2);

# 順位
my @Rank1 = ();
my @Rank2 = ();
my $r = 0;
for(my $j = 0; $j < $Period; $j++){
$r = $SortPrice1[$j][1];
$Rank1[$r] = $SortPrice1[$j][2];
$r = $SortPrice2[$j][1];
$Rank2[$r] = $SortPrice2[$j][2];
}

# 差
my $d = 0;
for(my $j = 0; $j < $Period; $j++){
my $tmp = $Rank1[$j] - $Rank2[$j];
$d += $tmp * $tmp;
}

# スピアマンの順位相関係数
$srcc[$i] = 1 - ((6 * $d) / $den);
}

return @srcc;
}


# RANKAVG
# 引数 期間 値 ($Period, \@Price)
# 戻り値 なし
sub RANKAVG{
my ($Period, $Price) = @_;

for(my $i = 0; $i < $Period; $i++){
my $p = $$Price[$i][0];
my $r = $i + 1;
my $k = 1;
$$Price[$i][2] = $r;

while((($i + $k) < ($Period - 1)) && ($p == $$Price[$i + $k][0])){
$r += ($i + 1) + $k;
$k++;
}

if($k != 1){
my $avg = $r / $k;
$k = $k - 1;
$i = $i + $k;
while($k >= 0){
$$Price[$i - $k][2] = $avg;
$k--;
}
}
}
}


参考URL
スピアマンの順位相関係数 - Wikipedia
オンライン コンパイラ/インタプリタ
テクニカル分析
プロフィール

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

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

検索フォーム


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