移動平均と標準偏差の算出 ~株価チャート:シグマバンド(ボリンジャーバンド)の作成~

コメントをどうぞ


「Igor:waveの読み込み3」で扱ったデータを元に,株価チャートの一つであるシグマバンド(ボリンジャーバンド)を作成する。

シグマバンドとは,株価の移動平均に対して,移動平均算出区間内での標準偏差σの線を引いて,株価の異常値を見つけるチャートである。

株価の変動について正規分布を仮定すると,平均値±σの範囲には68%±2σの範囲には95.5%±3σの範囲には99.7%の確率で株価は収まることになる。

 

移動平均を表すwave,+2σおよび-2σを表すwaveを作成する。
「Igor:waveの読み込み3」で読み込んだデータ数は250であったので,「Make」コマンドで,

Make /O /N=250 ‘wave_mean’ ‘wave_mean_2stdp’ ‘wave_mean_2stdm’;
AppendToTable wave_mean wave_mean_2stdm wave_mean_2stdp

とする。

移動平均算出のために,以下のマクロ「calc_mean(input_w, output_w)」を作成した。
input_wの移動平均値がoutput_wに代入される。
input_wとして株価の終値であるclosing_priceを代入し,wave_meanにその移動平均値が代入されるように使用する。

平均を算出する関数「 mean(waveName, [x1, x2]) 」を利用した。
waveNameのx1~x2の区間の平均値を算出してくれる関数である。

waveのデータ数が250であり,移動平均算出区間は20データ(定数spanとした)であるため,for文の区間は230とすべきである。例えばi=240の場合,mean(input_w, 240, 260)となり,waveデータが存在しないところを参照してしまう。
ただし,Igorはこのような場合,自動的にmean(input_w, 240, 249)として出力してくれるようである。

標準偏差を算出するために,以下のマクロ「calc_std(input_w, output_w1, output_w2, mean_w)」を作成した。
input_wの標準偏差σの2倍を移動平均値にプラスしたoutput_w1,マイナスしたoutput_w2を算出する。

標準偏差σを算出にあたり,分散σ2を算出する「 Variance(waveName, [x1,x2]) 」を利用した。
waveNameのx1~x2の区間の分散を算出してくれる関数である。

分散の平方根をとることで(sqrt関数),標準偏差を算出した。

移動平均と標準偏差

移動平均と標準偏差

 

以下のように,マクロを実効

calc_mean(closing_price,wave_mean)
calc_std(closing_price,wave_mean_2stdp,wave_mean_2stdm,wave_mean)

メニューバーの[Window]->[New Graph]よりグラフを作成。
XWave:[Day],YWave:closing_price, mean_wave, mean_2stdp, mean_2stdm
を選択。

見栄えは,軸をダブルクリックしていろいろと変更,ラインをダブルクリックしていろいろと変更。
メニューバーの[Graph]->[Add Anotation]から凡例を設定。

これらどのように設定したかは,以下のコマンドラインを参照のこと。

シグマバンドのできあがり

シグマバンドのできあがり

Igor : waveの読み込み3

コメントをどうぞ


Igorでwaveの読み込み方法について記す。前2回も参照のこと。

今回は,ヘッダ部をスキップして読み込むことと,日付データの読み込みを行う。

例として,株価データの読み込みを行う。以下のサイトから個別銘柄の株価データをダウンロードできる。
http://k-db.com/stocks/

直近250日分の日足をcsvファイル形式でダウンロード。

日足データのcsvファイル

日足データ

このcsvファイルは,最初の2行がヘッダ情報になっており,3行目からが日足データの本体。
1行目がタイトル行であり,2行目が各列の列名。

読み込みには,「LoadWave」を用い,

LoadWave /J /E=2 /L={1,2,0,0,0} /R={English,2,2,2,1,”Year-Month-DayOfMonth”,40}

とする。

/Jと/Eフラグは前回も用いたが,ASCIIデータであることと既存のテーブルに追加することを明示している。

/Lでヘッダをスキップすることを明示している。
/L={nameLine, firstLine, numlines, firstColumn, numColumns}という形式で指定する。
日本語でざっくり書くと,
/L={名前行は何行目か, データを何行目から読み込むか, データの行数, データを何列目から読み込むか, データの列数}
となる。

ここで,「0」とするとAutoとなる。numlines(行数)など,指定せずファイルにあるだけ読み込みたいときは0にすればよい。

/L={1,2,0,0,0}としているので,名前行は1行目(0からスタート)。ただしこのファイルは日本語データであり,うまく読み込めないので,0としてもよい。

 

/Rは日付形式を指定する。このcsvデータ(1列目)はIgorでの標準の日付形式でないため,指定してあげる必要がある。
/R={languageName, yearFormat, monthFormat, dayOfMonthFormat, dayOfWeekFormat, layoutStr, pivotYear}という形式で指定する。
今回は,/R={English,2,2,2,1,”Year-Month-DayOfMonth”,40}と指定した。

yearFormat: 1:数字2つで表記,2:数字4つで表記  14 or 2014
monthFormat: 1:数字(0省略),2:数字(0省略なし),3:アルファベット(省略表記,Janなど),4:アルファベット(省略なし,Januaryなど)
dayOfMonthFormat: 1:数字(0省略),2:数字(0省略なし)
dayOfWeekFormat: 1:アルファベット(省略表記,Monなど), 2:アルファベット(省略なし,Mondayなど)
layoutStr: レイアウト例を明示(図参照)
pivotYear: この数字(yyとする)以下ならば,20yy年。以上ならば19yy年。yyは4位上

Rフラグの説明

Rフラグの使い方

Rフラグの例

Rフラグの例

CSV読み込み後のIgor画面は下図。wave0~wave6まで自動で名前付けされた。

CSV読み込み後

CSV読み込み後

読み込み時のダイアログでもwave名は編集できるが,以下のようにRenameコマンドで名称変更してもよい。

Rename wave0,Day; Rename wave1,Opening_price; Rename wave2, high_p; Rename wave3, low_p;Rename wave4,closing_price; Rename wave5,trading_volume; Rename wave6 trading_value;