第1回目でCSVデータを時系列データに変換して、第2回目でグラフ描画をしました。
今回は、移動平均とゴールデンクロスやデッドクロスを求めて、グラフに描画します。
データの変換は第1回目
グラフ描画は第2回目
必要パッケージのインストール
追加で必要なパッケージは、
- Statistics.jl
REPLからはパッケージモード
(@v1.7) pkg>add Plots
Jupternotebookなどからは、パッケージを使って
using Pkg
Pkg.add("Plots")
それぞれインストールしてください。
データの準備
前回同様にトヨタの株価データ使います。
toyota = csv2ohlc("toyota.csv")
移動平均を求める
移動平均を求めていきます。
TimeSeries.jlには、moveっていう関数があります。
moving(処理,株価,期間)
これを使って、トヨタの終値の移動平均を求めましょう。
5日移動平均を求めてみます。
sma = moving(mean,toyota.close,5)
できました。
このままだと列の名前がcloseになっていて、普通のcloseと区別がつかないので、名前を変えておきましょう
sma = TimeSeries.rename(sma,:sma5)
では、グラフにプロットしてみましょう
2020年1月から12月までの1年間分をプロットしてみましょう。
まずは、終値を描画します。
plot(toyota.close[Date(2020,1,1):Day(1):Date(2020,12,31)])
次に5日移動平均を重ね合わせます。このときは、「!」付きのplotを使います。
plot!(sma[Date(2020,1,1):Day(1):Date(2020,12,31)])
移動平均が描けました。
株価データに追加する
求めた移動平均の値をOHLCの株価データに追加していきます。
merge関数を使って、結合します。
toyota=merge(toyota,sma,method=:outer)
closeの後ろに sma5が追加されました。
5日移動平均なので、前の4日はデータがないのでNaN(欠損値)です。
移動平均の関数化
移動平均を求めるのはとても簡単でした。
移動平均は短期トレンドや長期トレンドを見るためにいくつか求めることがあります。
そしてこの後、ゴールデンクロスやデッドクロスを求めるのにも複数の移動平均が必要になります。
そこで、移動平均を複数求める関数を作って作業を自動化しましょう。
ここまでやってきた一連の処理をひとまとめにするだけです
- 移動平均を求める
- 列名を変更する
- 元のデータに結合する
この3つです。
ではやっていきましょう
引数にTimeArrayと期間を取ります。終値の移動平均を求める関数を作ります。
function sma(ta,n)
sma = moving(mean,ta.close,n)
colname = "sma$(n)"
sma = TimeSeries.rename(sma,colname)
ta = merge(ta,sma,method=:outer)
return ta
end
colname = “sma$(n)”は、smaの後に何日なのかっていう数字を付けた列名を作ってます。
n=5ならsma5, n=10ならsma10という列名です。
関数のアップグレード
今作ったのは、1回に1つしか移動平均が求められませんでした。
けど、複数作る必要があるので、一気に複数求められる関数にアップグレードしましょう
複数のnを与えて、それをループで回して、複数の移動平均を求める処理をします。
function sma(ta,n...)
for i in n
sma = moving(mean,ta.close,i)
colname = "sma$(i)"
sma = TimeSeries.rename(sma,colname)
ta = merge(ta,sma,method=:outer)
end
return ta
end
変更点は引数nを「n…」としたところ。これで、複数の値をカンマ切りで渡すことができます。
あとは、それをforで回します。その後の処理は同じです。
こんな感じで、複数の値をカンマ切りで渡すことで、一気に求めることができます。
ちょっとプロットしてみましょう
plot(toyota[Date(2020,1,1):Day(1):Date(2020,12,31)][:close,:sma5,:sma10,:sma15,:sma20])
ゴールデンクロス・デッドクロスを求める
移動平均を求めることができたので、ゴールデンクロスとデッドクロスを求めていきます。
株価のテクニカル分析でまず最初に出てくるやつですね。
ゴールデンクロスは長期移動平均を短期移動平均が下から上にクロスするところです。
デッドクロスは逆に長期移動平均を上から下に短期移動へ近がクロスするところです。
これを数字で考えると、ゴールデンクロスは短期と長期の差がプラスからマイナスになるところで、デッドクロスはその逆です。
5日移動平均と20日移動平均を使って求めていきます。
長期と短期の差を求める
まずは差を求めましょう
smadiff = toyota.sma5 .- toyota.sma20
行列の各要素ごとの計算なので、「.-」ドット演算子付きで処理します。
計算した一部を見てみましょう
さて、今回ほしいのは、差の大きさではなくて、正か負かという情報でいいので、それに変更します。
sign()関数を使います。正なら1,負なら-1、ゼロは0を返す関数です。
smadiff = sign.(toyota.sma5 .- toyota.sma20)
データを見てみるとこんな感じ。
正は1,負はー1になりました。グラフを見ると一目瞭然です
ゴールデンクロスを求める
ゴールデンクロスは、前日が短期と長期の差が負で、当日が正になるところでした。デッドクロスはその逆です
色々求め方はありますが、一つの考え方として、次のものがあります。
当日が正(+1)、前日が負(ー1)の差を求めて、(+1)ー(ー1)=(+2)になる日がゴールデンクロス。
当日が負(ー1)、前日が正(+1)の差を求めて(ー1)ー(+1)=(+2)になる日がデッドクロス。
ここでは、前日との差を求めるのにdiff()関数を使います。
cross = diff(smadiff)
グラフで確認
グラフと値を見てみましょう
赤がゴールデンクロス、青がデッドクロスです。
ここに先ほどのクロスの結果を追加してみます。
crossのグラフがちょうど、ゴールデンクロスとデッドクロスのところに来てます
ゴールデンクロスの日を確認する
次にゴールデンクロスとデッドクロスの日を確認しましょう。
TimeSeriesのfindallやfindwhenをつかいます。
データのインデックス番号が必要な場合はfindall、日付が欲しい場合はfindwhenを使います。
findwhen(条件)
findall(条件)
ゴールデンクロスを抽出します。
ゴールデンクロスは値が2になるときです
golden = findwhen(cross .== 2)
もしくは
golden = findall(cross .== 2)
実際にその日付の頃を見てみましょう
2018年7月17日、8月30日、9月19日にゴールデンクロスになっているので、7月1日から10月31日までを描画してみます。
3回ゴールデンクロスが現われてるのが確認できます。
まとめ
今回は移動平均線とゴールデンクロ、スデッドクロスを扱いました。
株価のテクニカル分析では、まず最初に出てくる移動平均とゴールデンクロスとデッドクロス。
他にもいろいろなテクニカル指標はありますが、自分で関数を作って、求めることで、自分でシグナルを出すプログラムや自動売買にも繋げていけます。
コメント