【日経先物】自動収集した価格情報を使って簡単な分析をしてみよう
こんにちは、ジャド弟です。以前、日経先物の価格情報を自動的に収集する仕組みの作り方をご紹介しました。
今回はその記事の続きとして、収集した価格情報を使って簡単な分析をする方法をご紹介したいと思います。
事前準備
本記事では前回の記事で作成したGoogleスプレッドシートを使いますので、前回の記事を読んでいらっしゃらない方は、記事を読んでいただいて日経先物の価格情報を自動収集するためのGoogleスプレッドシートを作っておいて下さい。
また、前回の記事を読んでいただいてGoogleスプレッドシートを作成済みの方でも、作成したスプレッドシートに「前回終値」の列がない場合はスクリプトの更新と列の追加が必要になります。スクリプトについては、前回記事の最新のスクリプト(Ver. 4以上であればOKです)に置き換えてください。列の追加については、「終値」列の右隣に「前回終値」の列を追加し(G列になります)、前回終値の値を入力しておいて下さい。
前回終値の値は、F列の値をコピーして1行ずらしてG列にペーストしてもいいですし、G列の各セルに1行上のF列を参照するような式を入力するようにしても構いません。
式を入力する場合は、① G2セルに「=IF(ROW(A2)=2,"",F1)」という式を入力し、G2セルをコピーする、② G2セルから下方向に、価格情報が存在する最終行までを選択してペーストする、という操作をすることで入力することができます。
これで準備が整いました。それでは本題に入りましょう!
視覚的に値動きを分析する
分析というと難しいイメージを持たれるかもしれませんが、例えば「この後どう動くのかな?」とチャートを眺める。これも立派な分析です。今回は、価格情報をいくつかの種類のチャートとして視覚化して、値動きの傾向を感じ取ってみます。
Googleスプレッドシートにはローソク足のチャートを描画する機能がありますが、やや癖があって思い通りのチャートを描画するのに手間がかかります。そこで、ローソク足のチャートを簡単に描画するためのスクリプトを用意しました。
以下のスクリプトをコピーし、スクリプトの末尾に追加して下さい。置き換えではなく、追加ですのでご注意下さい。
/*
* チャート描画用のスクリプト
*
* Ver. 2
* ・チャートの上下の余白の幅を動的に決めるようにしました。
* Ver. 1
* ・最初のバージョンです。
*/
// 通常のチャートを描画する
function drawNormalChart() {
drawChart([['$E2', '$C2', '$F2', '$D2']]);
}
// 相対足チャートを描画する
function drawRelativeChart() {
drawChart([['$E2-$C2+$K2', 'IF($G2="",0,$C2-$G2)', '$F2-$C2+$K2', '$D2-$C2+$K2']]);
}
// 積み上げ足チャートを描画する
function drawStackedChart() {
drawChart([['$E2-$C2+$K2', 'IF(ROW($G2)=2,IF($G2="",0,$C2-$G2),$L1+$C2-$G2)', '$F2-$C2+$K2', '$D2-$C2+$K2']]);
}
// 積み上げ足チャート(始値比)を描画する
function drawOpenBasedStackedChart() {
drawChart([['$E2-$C2+$K2', 'IF(ROW($G2)=2,0,$L1)', '$F2-$C2+$K2', '$D2-$C2+$K2']]);
}
// チャートを描画する
function drawChart(formulas) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
var tmpSheet = getTmpSheet(ss);
copyOriginalDataAndPrepareForXSeries(sheet, tmpSheet);
prepareForYSeries(tmpSheet, formulas);
drawCandlestickChart(sheet, tmpSheet);
}
// チャート描画用のデータを準備するための一時的なシートを返す
function getTmpSheet(spreadsheet) {
var tmpSheet = spreadsheet.getSheetByName("tmp");
if (tmpSheet) {
tmpSheet.clear();
} else {
tmpSheet = spreadsheet.insertSheet("tmp", 1);
}
return tmpSheet;
}
// 元データを一時シートにコピーし、X系列のデータを準備する
function copyOriginalDataAndPrepareForXSeries(sheet, tmpSheet) {
sheet.getRange('A1:G1').activate();
sheet.getSelection().getNextDataRange(SpreadsheetApp.Direction.DOWN).activate();
sheet.getActiveRange().copyTo(tmpSheet.getRange('A1'), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
sheet.getRange('A1').activateAsCurrentCell();
tmpSheet.getRange('I2').setFormula('=TEXT(A2, "yyyy-mm-dd")&" "&B2');
tmpSheet.getRange(2, 9, getNumRows(tmpSheet), 1).activate();
tmpSheet.getRange('I2').copyTo(tmpSheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
}
// 指定されたシートのA列の行数を返す
function getNumRows(sheet) {
sheet.getRange('A2').activate();
var currentCell = sheet.getCurrentCell();
sheet.getSelection().getNextDataRange(SpreadsheetApp.Direction.DOWN).activate();
return sheet.getActiveRange().getNumRows();
}
// Y系列のデータを準備する
function prepareForYSeries(tmpSheet,formulas) {
tmpSheet.getRange('J2:M2').setFormulas(formulas);
tmpSheet.getRange(2, 10, getNumRows(tmpSheet), 4).activate();
tmpSheet.getRange('J2:M2').copyTo(tmpSheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
}
// tmpシートのデータを使ってローソク足のチャートを描画する
function drawCandlestickChart(sheet, tmpSheet) {
var numRows = getNumRows(tmpSheet);
var values = tmpSheet.getRange(2, 11, numRows, 2).getValues();
var minValue = Infinity;
var maxValue = 0;
for (var i = 0; i < values.length; i++) {
var high = values[i][0];
var low = values[i][1];
if (low < minValue) {
minValue = low;
}
if (maxValue < high) {
maxValue = high;
}
}
var padding = (maxValue - minValue) * 0.2;
var chart = sheet.newChart()
.setChartType(Charts.ChartType.CANDLESTICK)
.addRange(tmpSheet.getRange('I2:M' + (numRows + 1)))
.setTransposeRowsAndColumns(false)
.setNumHeaders(0)
.setHiddenDimensionStrategy(Charts.ChartHiddenDimensionStrategy.IGNORE_BOTH)
.setOption('bubble.stroke', '#000000')
.setOption('useFirstColumnAsDomain', true)
.setOption('isStacked', 'false')
.setOption('annotations.domain.textStyle.color', '#808080')
.setOption('textStyle.color', '#000000')
.setOption('legend.textStyle.color', '#1a1a1a')
.setOption('titleTextStyle.color', '#757575')
.setOption('annotations.total.textStyle.color', '#808080')
.setOption('hAxis.textStyle.color', '#000000')
.setOption('vAxes.0.viewWindow.min', minValue - padding)
.setOption('vAxes.0.viewWindow.max', maxValue + padding)
.setOption('vAxes.0.textStyle.color', '#000000')
.setOption('hAxis.slantedText', true)
.setOption('hAxis.slantedTextAngle', 60)
.setOption('height', 400)
.setOption('width', 1000)
.setPosition(2, 3, 0, 0)
.build();
var charts = sheet.getCharts();
for (var i = 0; i < charts.length; i++) {
sheet.removeChart(charts[i]);
}
sheet.insertChart(chart);
sheet.activate();
}
また、以下のようにonOpen関数に行を追加して下さい。
function onOpen() {
var ui = SpreadsheetApp.getUi();
var menu = ui.createMenu('拡張機能');
menu.addItem('日経先物の夜間四本値を取得する', 'addNk225NightCandle');
menu.addItem('日経先物の日中四本値を取得する', 'addNk225DaytimeCandle');
// 追加〜ここから
menu.addItem('チャートを表示する', 'drawNormalChart');
menu.addItem('相対足チャートを表示する', 'drawRelativeChart');
menu.addItem('積み上げ足チャートを表示する', 'drawStackedChart');
menu.addItem('積み上げ足チャート(始値比)を表示する', 'drawOpenBasedStackedChart');
// 追加〜ここまで
menu.addToUi();
}
スクリプトを保存し、Googleスプレッドシートを再読み込みして下さい。「拡張機能」メニューに以下のようにチャートを表示するためのメニューが追加されていればOKです。
チャートを表示する
まずは普通のチャートを表示してみましょう。メニューから「チャートを表示する」を選んで下さい。何やら画面がバタバタ動きますが、最終的に次のようなチャートが表示されると思います。
表示されるチャートは、何もしなければセッション足のチャート(夜間、日中を別々の足として表示するチャート)になります。
Googleスプレッドシートのローソク足チャートでは、陽線が青の塗りつぶし、陰線が白抜きになるため、普段使っているチャートツールと違っていてちょっと違和感がある方もいるかもしれません。僕も、普段使っているチャートツールでは陽線が白、陰線が黒なのでこのチャートは違和感があるんですが、見た目の変え方が分からず…。もし変え方をご存じの方がいらっしゃったらぜひ教えて下さい。
なお、チャートを表示するにはデータの加工が必要なため、「tmp」という名前のシートを自動的に作成してその上でデータの加工をしています。このシートの中身を書き換えたりシートを削除したりするとチャートが崩れてしまいますのでご注意下さい。もしうっかりいじってしまってチャートが崩れてしまっても、再度メニューからチャートを表示すれば元に戻りますのでご心配なく。チャート自身も、表示するたびに再生成されますので、邪魔であれば削除してしまって構いません。
相対足チャートを表示する
次は相対足チャートを表示してみましょう。相対足チャートとは僕の造語で、相対足(前回終値比の始値、高値、安値、終値で作ったローソク足)を描画したものです。
例えば2021年4月2日の夜間は、前回終値が29400円、始値29450円、高値29720円、安値29440円、終値29700円でした。
前日終値比の始値は29450-29400=50円、高値は29720-29400=320円、安値は29440-29400=40円、終値は29700-29400=300円ですので、相対足は次のようになります。
このような相対足を並べたものが相対足チャートです。
相対足チャートを表示するには、メニューから「相対足チャートを表示する」を選んで下さい。次のようなチャートが表示されます。
相対足チャートでは、日々の前回終値比の騰落を視覚的に確認することができます。後ほど実際に相対足チャートを使ってみることにしましょう。
積み上げ足チャートを表示する
次は積み上げ足チャートです。積み上げ足チャートも僕の造語で、次のルールでローソク足を積み上げていって描画するチャートです。
最初は、前回終値比の始値、高値、安値、終値で作ったローソク足を0の位置に置きます。次は、同じように作ったローソク足を、1つ前に置いたローソク足の終値の位置に置きます。同様のことを繰り返してローソク足を並べていきます。図示すると下のような感じです。
勘の良い方なら気づいたかもしれませんが、積み上げ足チャートは「あるセッションの終値で買って次のセッションの終値で閉じる」ということを繰り返した場合の損益グラフと同じ形になります。そのため、特定のセッションの引けでエントリして次のセッションの引けで手仕舞いする戦略の損益を確認したい時に使えるチャートです。
積み上げ足チャートを表示するには、メニューから「積み上げ足チャートを表示する」を選んで下さい。
0から始まっていることを除けば、普通のチャートと同じ形になっていますね。積み上げ足チャートが真価を発揮するのは、足を絞り込んだ時です。この後実際に積み上げ足チャートを使ってみることにしましょう。
始値比の積み上げ足チャートを表示する
最後は始値比の積み上げ足チャートです。先ほどの積み上げ足チャートでは前回終値比の始値、高値、安値、終値で作ったローソク足を並べていきましたが、始値比の積み上げ足チャートでは始値比のローソク足を並べていきます。つまり、ローソク足の始値が前に置いた足の終値と一致する位置に並べていきます。
始値比の積み上げ足チャートは「セッションの始値で買って終値で閉じる」ということを繰り返した場合の損益グラフと同じ形になります。こちらは特定のセッションの寄りでエントリして引けで手仕舞う戦略の損益を確認したい時に使えるチャートです。
始値比の積み上げ足チャートを表示するには、メニューから「積み上げ足チャート(始値比)を表示する」を選んで下さい。
分析の実例その1:夜間の値動きを確認する
以上で道具は揃いました。それでは実際に分析をしてみましょう。
何年か前、「日経平均の上昇は夜間に作られている」という話がありました。日経の上昇の寄与度合いを見ると、日中の上昇分よりも、終値から翌日の始値までのギャップアップ分の方が多い、という話です。この話を日経先物に当てはめると、日中セッションの上昇分よりも夜間セッションの上昇分の方が多い、ということになります。さてこの傾向、今でもそうなのでしょうか?早速調べてみましょう。
まず、既にチャートが表示されているなら邪魔なので削除してしまってください。メニューから「グラフを削除」を選べば削除できます。
次に、シートを全選択して下さい。シートの左上をクリックすると全選択できます。
その状態でフィルタボタンを押してフィルタをONにして下さい。
すると、このような表示になります。
ここで、「セッション」の右側の逆三角形の記号をクリックして下さい。
次のようなメニューが表示されるので、「(空白)」と「日中」をクリックしてチェックを外し、「夜間」だけにチェックが付いた状態にして下さい。
このようになっていればOKです。
「OK」ボタンを押すと、「セッション」列が「夜間」である行だけが表示された状態になります。
さて、まずは普通のチャートを見てみましょう。メニューから「チャートを表示する」を選んで下さい。
このようになりました。実は、今回追加したチャート表示機能では画面に表示されているデータだけを使ってチャートを表示するようになっていますので、このように夜間の足だけが表示されます。
次に、相対足チャートを見てみましょう。メニューから「相対足チャートを表示する」を選んで下さい。
このようになりました。夜間は陽線が多いように見えますね。相対足チャートでは余計な高低差を均してローソク足を表示しているため、それぞれの足の傾向を比較しやすくなっていますね。
最後に積み上げ足チャートを表示してみましょう。メニューから「積み上げ足チャートを表示する」を選んで下さい。
最近は下げていますが、4月19日まではきれいに上昇していたことが分かります。
また、このチャートは4月1日から4月23日まで「日中の引けで買って夜間の引けで閉じる」というトレードを繰り返した時の損益を表しています。4月26日の夜間引けの時点で420円の利益になっていた、というわけです。(ローソク足にマウスカーソルを乗せると値が表示されます。上から安値、高値、始値、終値です。)
ところで最初確認しようとしていた「日中セッションの上昇分よりも夜間セッションの上昇分の方が多い」が本当なのかは、データが少ないせいか良く分かりませんでしたね。折角なので、手元のデータをシートに貼り付けて長期の夜間の積み上げ足チャートを表示してみました。(ちなみに、同じことをしたい方には今のシートの内容を消すのではなく、シートを追加して作業することをオススメします。そうすれば後で追加したシートを削除するだけで元通りになります。)
一方、日中の積み上げ足チャートはこうなりました。
こうしてみると、確かに「日経平均の上昇は夜間に作られている」ように見えますね。
分析の実例その2:曜日ごとの値動きを確認する
分析の実例として、もう一つ分析をやってみたいと思います。
「日経先物って月曜はいつも寄り天だよね」とか「日経先物って月曜の夜間は大抵上昇して終わってない?」のように、特定の曜日にこう動いている気がする、と感じることはありませんか?相対足や積み上げ足のチャートを見ることで、感じたことが本当なのかを視覚的に確認することができます。
今回は月曜日の日中について値動きを確認することにしましょう。まず準備として、シートのH2セルに次のような式を入力してコピーし、列の下まで選択してペーストして下さい。
最終的な形はこのようになります。
H列は曜日を表していて、月曜が2、火曜が3、という感じになります。
先ほどと同じようにフィルタをONにし、まずセッション列について「日中」だけが表示されるようにして下さい。次にH列で「2」だけが表示されるようにして下さい。すると、このようになるはずです。
まずは相対足チャートを見てみます。
4本のうち3本は陰線になっていますね。
4本だけだと分かりづらいので、手元の2021年のデータを使って月曜の日中足の相対足チャートを表示してみました。
2月22日以降はほぼ陰線ですね。「寄り天」とまでは言えないかもしれませんが、2月22日以降は「月曜の日中はいつも寄り天」は割と当たっていると言えそうです。
次に積み上げ足チャートを見てみましょう。こちらは2021年のデータについてのみ結果を貼ることにします。
2月に入ってからは「金曜の夜間引けに買って月曜の日中引けで閉じる」というトレードが有効でしたが、3月からは逆に「金曜の夜間引けに売って月曜の日中引けで閉じる」というトレードが有効だったことが分かりますね。
また、始値比の積み上げ足チャートはこうなりました。
2月22日からは「月曜の日中寄りに売って引けで閉じる」という戦略も有効だったことが分かります。
おわりに
収集した価格情報といくつかの種類のチャートを使って簡単に分析する方法を紹介し、今回は分析の例として夜間のチャートや月曜の日中のチャートを表示してみました。
やった手順はどちらも「絞り込む条件を決め、その条件で値をフィルタし、フィルタした値をいろいろなチャートで視覚的に確認すること」で、この手順は条件が変わっても同じです。皆さんも、ぜひオリジナルの条件を考えて相対足や積み上げ足チャートを表示してみて下さい。素晴らしいトレード戦略が見つかるかもしれませんよ?
最後まで読んでいただきありがとうございました!
追記:日経先物以外の価格情報を収集・分析したい方へ
本記事では日経先物を対象としましたが、日経先物以外のいろいろな銘柄の価格情報を収集・分析できるスクリプトを作成しました(有料)。興味のある方はぜひ購入を検討してみて下さい。
この記事が気に入ったらサポートをしてみませんか?