google apps script:相関係数を計算する

Posted on January 2nd, 2017Updated on April 7th, 2019
google apps script:相関係数を計算する

※ この記事は最終更新日から5年以上が経過しています。

どんな記事

先日、記事にした相関係数を算出するプログラムを少し掘り下げて解説してみます。ちなみに、JavaScriptとgoogle apps scriptは一緒だと思ってください(バージョンの違いはあるけど記述は一緒)。

相関係数の計算式

相関係数=共分散(Xの標準偏差×Yの標準偏差)\text{相関係数} = \cfrac{\text{共分散}}{(\text{Xの標準偏差} \times \text{Yの標準偏差})}
X、Yは配列

順を追って説明します(自分の復習もかねて)。

標準偏差を求める手順

  1. 平均 数値の合計/数値の個数
  2. 偏差 それぞれの 数値−平均
  3. 分散 偏差の二乗の合計/数値の個数
  4. 標準偏差 分散の平方根

偏差は、数値から平均を引くだけ、つまり、平均からみた偏りです。分散は、データのバラつきのことで、偏差の平均を算出すれば良さそうですが、偏差は合計するとゼロになってしまうので、二乗して平均しています。標準偏差はそれを平方根でもとに戻す感覚でしょうか。

共分散は、XとY、それぞれの偏差を順番に掛けあわせたものの平均

  • Xの配列の1つ目の偏差 × Yの配列の1つ目の偏差
  • Xの配列の2つ目の偏差 × Yの配列の2つ目の偏差
  • ―――これらの平均を算出する。

求めた共分散を、Xの標準偏差にY標準偏差を乗じた数値で除することで、相関係数を算出することができます。

コード

相関係数の計算
function Correl(xx,yy){
  var m = Math
     ,n;
  if (xx.length==yy.length){
    n = xx.length;
    var sumx=0, sumy=0, sumxx=0, sumyy=0, sumxy=0
       ,xm ,ym ,xxi ,yyi
       ,sumxxm=0, sumyym=0, sumxym=0
       ,i;
    for(i=0; i<n; i++){
      sumx += (xx[i]-0);
      sumy += (yy[i]-0);
    }
    xm = sumx/n;
    ym = sumy/n;
    for(i=0; i<n; i++){
      xxi = (xx[i]-0);
      yyi = (yy[i]-0);
      sumxxm += (xxi-xm) * (xxi-xm);
      sumyym += (yyi-ym) * (yyi-ym);
      sumxym += (xxi-xm) * (yyi-ym);
    }                                  
    return sumxym / m.sqrt(sumxxm) / m.sqrt(sumyym);
  }else{
    throw new Error("Array length is not same.");
  }
}

プログラムの解説

簡単にですが、順を追って解説していきます。

例外をなくす
function Correl(xx,yy){
  var m = Math
     ,n;
  if (xx.length==yy.length){



  }else{
    throw new Error("Array length is not same.");
  }
}

これは、ただの例外の処理ですね。配列Xの数と配列Yの数は一緒でなければいけません。違う場合はエラーを返します。

続いてメインの処理の解説です。

メイン処理

    n = xx.length;

    var sumx=0, sumy=0, sumxx=0, sumyy=0, sumxy=0
       ,xm ,ym ,xxi ,yyi
       ,sumxxm=0, sumyym=0, sumxym=0
       ,i;

    for(i=0; i<n; i++){
      sumx += (xx[i]-0);
      sumy += (yy[i]-0);
    }

    xm = sumx/n;
    ym = sumy/n;

    for(i=0; i<n; i++){
      xxi = (xx[i]-0);
      yyi = (yy[i]-0);

      sumxxm += (xxi-xm) * (xxi-xm);
      sumyym += (yyi-ym) * (yyi-ym);

      sumxym += (xxi-xm) * (yyi-ym);
    }                            

    return sumxym / m.sqrt(sumxxm) / m.sqrt(sumyym);

まとめ

活用事例は以前の記事で少し触れています。

テスト用のスプレッドシートも作成しました。

表計算にはあらかじめCORREL関数があるので、それと算出結果の比較です。関数があるので、表計算上でコードは不要ですが、自動処理に組み込むには必要です。

分からないことがあったり、ご指摘があれば、どしどしコメントください^^

開発を承っています

  • Pineスクリプト(インジケーターやストラテジー)
  • Google Apps Script
  • Python
  • MQL4

などの開発を承っています。とくに投資関連が得意です。過去の事例は「実績ページ(不定期更新)」でご確認ください。ご相談は「お問い合わせ」からお願いします。

yuya takahashi

タカハシ / 11年目の兼業投資家

投資やプログラミング、動画コンテンツの撮影・制作・編集などが得意。更新のお知らせは、LINE、メールで行っています。

このブログと筆者についてご質問はこちら

  • 記事をシェア
© Investment Tech Hack 2023.