Numbers(表計算ソフト)で「Point & Figure」チャートを描画する。
Python で Point&Figureチャート描画モジュールの作成を進める中、チャートを描画する計算過程の論理的ロジックを明確にするため、Numbers(表計算ソフト)で Point&Figureチャートを描画することに挑戦しました。
作成したNumbersシートです。2020年1月1日から1年間の Point&Figureチャートを描画しています。
作成にあたっては以下のサイトを参考にしました。
StockCharts.com で描画したチャートと比較しても遜色なく描画できていますので、計算過程のロジックも問題ないと思います。
Numbers(表計算ソフト)における計算過程は以下のとおりです。
(1) Point&Figureの値幅と転換枠数を指定セルに入力します。
(2) 時系列データは昇順(古い日付から順に)に並び替えてからペーストします。(時系列データの取得・・・実はこれが一番面倒・・・最適な方法を模索しつつ別記事にて作成します。)
(3) F列(当日位置)
Point & Figureの枠の偏移数を計算するために使用します。
当日のレートを設定した値幅で除算、小数点を切り捨てます。
計算式:TRUNC(E6 ÷ $B$2)
TRUNC:指定した数値の小数点以下を切り捨て
(4) G列(基準位置)
H列(Point & Figureの枠の偏移数)を計算するために使用します。
1行目はF6(当日位置)の値をそのままコピーします。2行目以降、前日の基準位置と当日位置の差の絶対値に応じて以下のとおり計算します。
●前日の基準位置と当日位置の差の絶対値が転換枠数(3)以上の場合
>>> 当日位置が基準位置となる。
●前日の基準位置と当日位置の差の絶対値が転換枠数(3)以下の場合
>>> 前日のi列(トレンド)が上昇トレンド「+1」の場合
>>> 前日の基準位置と当日位置を比較して大きい方を基準位置とする。
>>> 前日のi列(トレンド)が上昇トレンド「-1」の場合
>>> 前日の基準位置と当日位置を比較して小さい方を基準位置とする。
計算式:IF(ABS(F7−G6)≥$B$3,F7,IF(I6=1,MAX(G6,F7),MIN(G6,F7)))
ABS:指定した数値の絶対値を返す
MAX:指定した数値や指定した範囲内の数値から最大値を返す
MIN:指定した数値や指定した範囲内の数値から最小値を返す
(5) H列(枠の偏移数)
前日の基準位置と当日位置の差から枠の偏移数を計算します。
(6) i列(トレンド)
上昇トレンドを「+1」、下落トレンドを「-1」と定義します。
前日のトレンドが+1でH列(枠の偏移数)が下落方向の転換枠数(-3)以下の場合、または、前日のトレンドが-1でH列(枠の偏移数)が転換枠数(3)以上の場合にトレンドが変化します。
1行目(i6)はデフォルト値として「1」を入力します。
計算式:IF(D7="","",IF(AND(I6=1,H7≤−$B$3),−1,IF(AND(I6=−1,H7≥$B$3),1,I6)))
(7) J列(Count)
基準位置の変更をカウントしていきます。基準位置が変更されないということはPoint&Figureのマーカー(X・○)が描画されない(枠の推移が発生しない)値動きをしていることになります。その後、再び基準位置が変更された時を参照することによりマーカー(X・○)描画発生のトリガーとすることができます。
1行目(J6)はデフォルト値として「1」を入力し、基準位置が変更された場合、初期値に「+1」を加算していきます。
計算式:IF(G7=G6,J6,J6+1)
(8) K列(Address)
Point&Figureは基準位置が「1」変更されるごとにマーカー(X・○)を書き加えていきます。終値の値動きが小さい場合は何日もチャートが動かないこともありますし、1日で設定した値幅の何倍もレートが動いた場合は一度にいくつものマーカー(X・○)を書くこともあります。
そうしたマーカー描画を実現するためにK列とL列を使用します。
K列(Address)は、L列(Draw_count)及びM列(開始位置)の計算でJ列(Count:基準位置の変更)の参照をする際に使用する数字です。
1つ上の行のL列(Draw_count)のセルが「1」の場合は「+1」を加算、それ以外は前のセルの値を使います。
L列(Draw_count)は「1」の次の行でマーカー描画の個数を計算しているので、K列(Address)はマーカー描画が発生した都度、カウントされていく数字となります。
(9) L列(Draw_count)
K列(Address)と同じくM列(開始位置)の計算でJ列(基準位置の変更)の参照をする際に使用する数字です。
前の行のセルの値が「1」より大きい場合は前のセルの値から「-1」を減算します。
それ以外の場合、つまり、前の行のセルの値が「1」の場合はK列(Address)の同じ行の値からJ列(Count:基準位置の変更)で最初に一致する行番号を抽出し、H列(枠の偏移数)の該当する行番号の値の絶対値を計算します。
計算式:IF(L6>1,L6−1,ABS(INDIRECT("H"&MATCH(K7,$J,0))))
INDIRECT:指定した文字列のセル参照を返します。
MATCH:指定した値を範囲内から検索し、検索範囲の先頭からの行数を返します。
K列(Address)とL列(Draw_count)を組み合わせれば、J列(Count)が1進んだ時(基準位置が変更された時)にマーカー(X・○)を描画する個数をK列とL列の進み具合で示すことができます。
L列(Draw_count)の計算結果は、基準位置が1進んだ時に描画するマーカー(X・○)の個数を表します。
(10) M列(Point&Figure 開始位置)
Point&Figure のマーカー描画の開始位置を計算します。
K列(Address)の同じ行の値からJ列(Count:基準位置の変更)で最初に一致する行番号を抽出し、i列(トレンド)の該当する行番号の値を参照します。トレンドの数字を参照するので、必ず「+1」か「-1」になります。計算結果と値幅を乗算して前の行のセルに加算することで Point&Figure マーカー描画の開始位置を求めることができます。これで値幅分だけマーカーが上下に偏移するようになります。
計算式:M6+INDIRECT("I"&MATCH(K7,J,0))×$B$2
(11) N列(更新後のトレンド)
M列(Point&Figure 開始位置)更新後のトレンド方向を参照します。
計算式:INDIRECT(“I”&MATCH(K7,J,0))
(12) O列(X座標)
散布図のX座標を表します。N列(開始位置更新後のトレンド)が変化した時に「+1」ずつカウントしていきます。
計算式:IF(N7=N6,O6,O6+1)
(13) P列(Y座標/マーカー:X)
レート上昇時のマーカー(X)を描画するY座標を計算します。
N列(更新後のトレンド)が「1」の時にマーカー(X)を描画します。マーカーの描画位置は値幅の中心となるため、M列(Point&Figure 開始位置)に値幅の1/2を加算した値となります。
(14) Q列(Y座標/マーカー:○)
レート下落時のマーカー(○)を描画するY座標を計算します。
マーカー描画位置はP列(Y座標/マーカー:X)と同様に算出します。
ここまでで Point&Figureチャートを描画するデータシートは完成です。
データシートにおける計算の仕組みをまとめました。
(15) 時系列データの入力
Point&Figureは時間軸の影響を受けることなくトレンドを把握するチャートであるため、時系列の日付とマーカー描画はデータシート横軸では一致しません。
したがって、マーカー描画を最後まで計算させるためには、E列(終値)に値が入力されている必要があります。
E列(終値)にはK列(Address)がエラー表示となる行まで、すなわち、時系列データから算出する基準位置の変更が発生しなくなるまでのセル範囲にE列(終値)の最後の値をコピーして貼り付けておきます。
K列(Address)の算出結果により「基準位置の変更が発生しなくなる行」が時系列データが入力されている範囲の最終行から算出された部分となります。
(16) 散布図を描画する。
作成したデータシートを元に散布図で Point&Figureチャートを描画します。
データシートのO列(X座標)、P列(Y座標/マーカー:X)、Q列(Y座標/マーカー:○)のチャートを描画したい範囲を選択し、グラフメニューから「散布図 2D」をクリックして散布図を描画します。
チャートのフォーマットは以下のとおり設定していきます。
今回の記事はかなり作成に時間を要しましたが、Point&Figureを描画するロジックをしっかり理解することができました。
Numbers で作成したチャートは投資分析にそのまま活用することとしつつ、Python のコーディングに復帰します。