移動平均
SMAとEMAを描画し、計算に使う期間による違いを観察します。
終値の線は、ローソク足1本1本の値動きを追います。連続する複数の終値を平均すると、より滑らかな線になります。この章では、10本を基に2種類の移動平均を作ります。
平均を求める
3つの値の単純平均は、合計を3で割ったものです。100、103、101なら、次のようになります。
(100 + 103 + 101) / 3 = 101.333...移動平均は、計算範囲(ウィンドウ)の大きさを一定にし、その範囲をローソク足とともにずらしていきます。3本のウィンドウなら、次の足で新しい終値が入り、最も古い値が外れます。
新しい終値が105なら、次の平均は(103 + 101 + 105) / 3、つまり103です。最初の100は、このウィンドウには含まれません。
10本の単純移動平均には、現在と過去9本の終値を使います。現在に加えて過去10本ではありません。10は、使う値の総数です。
taの関数
ta名前空間には、用意済みの計算があります。ta.sma(close, 10)は、終値10個の単純移動平均を返します。SMAは「simple moving average」の略です。
呼び出しの2つの引数は、次の意味です。
close:平均を求める元データ。10:ウィンドウの大きさをローソク足の本数で指定。
最初の9本では、終値が10個そろいません。SMAはnaとなり、10本目で初めて有効な値になります。この最初の準備期間をウォームアップと呼ぶこともあります。
大きさは秒数ではありません。日足10本と1時間足10本では、対象期間が異なります。
SMAとEMAを並べる
EMA(指数移動平均)は、新しい値をより重く扱います。ta.ema(close, 10)も長さに10本を指定しますが、計算式は異なります。
EMAは、最初にそろったウィンドウの単純平均から始まります。長さ10なら、両方とも10本目から表示されます。その後は、新しい価格と前のEMAの差に一定の割合を掛け、前のEMAに加えます。その割合は2 / (10 + 1)です。
moving_averages.pyを作ります。
"""
@pyne edge
"""
from pynecore.lib import close, color, plot, script, ta
@script.indicator("Two Moving Averages", overlay=True)
def main():
simple_average = ta.sma(close, 10)
exponential_average = ta.ema(close, 10)
plot(simple_average, "SMA 10", color=color.blue, linewidth=2)
plot(exponential_average, "EMA 10", color=color.orange, linewidth=2)デモデータで実行すると、価格のローソク足に重ねて、青いSMAとオレンジのEMAが表示されます。チャートを動かし、価格が急に方向を変えた場所を見てください。2つの平均が同じ速さで反応するとは限りません。

平均は、過去の値から求めた線です。滑らかな形だけから、これから価格がどちらへ動くかは分かりません。
すべてのローソク足で計算する理由
ta.smaとta.emaは、連続する実行の間で計算状態も使います。この例では、どちらもすべての足で呼び出しています。
後では、特定の場合だけ操作するコードも書きます。例えば、終値が平均より上にあるときだけマーカーを描く、といった処理です。条件とマーカーで学びます。
その場合も、先にすべての足で平均を計算し、それから用途を決めてください。例えば陽線のときだけta.smaを呼ぶと、他の足で計算が抜け、全ローソク足で求めた平均とは異なる場合があります。今は、2つの平均計算をすべての足で実行することを覚えておきましょう。
この2本の線には、自分の変数へのSeries指定は不要です。現在の値を描画するだけで、simple_average[1]は使っていないからです。後で変数の履歴を直接添字で参照する場合は、Series[float]を指定します。
ウィンドウを長く、短くする
長くすると、より多くの過去の価格が平均に影響します。線は一般に滑らかになり、価格の変化を遅れて追います。短くすると、最近の値動きが強く現れます。
同じデータで、次を試してください。
- 長さ10の2本を実行し、分かりやすい反転箇所を見つけます。
- 両方の呼び出しの長さを30に変えます。
- 線の名前も
SMA 30とEMA 30にします。 - 再実行して、同じ時点を探します。
"SMA 10"はラベルにすぎないので、名前も変更します。文字列内の数を変えても計算は変わりません。ウィンドウを決めるのは、呼び出しの2番目の引数です。
自分で試す
5本と20本から計算する2本の単純移動平均を作ってください。短期を青、長期をオレンジにし、それぞれ適切なタイトルを付けます。
解答
main()の本体の計算と描画を、次に置き換えます。
fast_average = ta.sma(close, 5)
slow_average = ta.sma(close, 20)
plot(fast_average, "SMA 5", color=color.blue, linewidth=2)
plot(slow_average, "SMA 20", color=color.orange, linewidth=2)長さ5では最初の4本、20では最初の19本が欠損になります。ウォームアップ後は、同じ終値の列に対し、異なるウィンドウを使って計算します。
ウィンドウを確認する
3本のSMAなら手計算で確認できます。長さを3にし、連続する3つの終値を選んで平均を求めてください。3本目で、チャートも同じ値を示します。最初の2本では、まだウィンドウがそろっていません。