パラボリックSARをPythonで処理してMatplotlibでチャート乗せてみる(Python テクニカル指標シリーズ)
こんにちは、新米データサイエンティスト(@algon_fx)です。今週は時間を見つけて、毎日ジムで走ったのですが、今日は気乗りがしないのでお休みです。
FX APIシリーズが続いたので、今日はPythonでテクニカル指標シリーズとして、トレンド指標のパラボリックSARをPythonで処理を行い、Matplotlibで表示させるまでまとめたいと思います。
Ta-libでも計算は可能なんですが、今回はこちらのコードを参考に、ビットコインのレートを使ってパラボリックSARの処理を書いてみました。
【人気記事】
パラボリックSARとは?
パラボリックSARですが、考案されたのは1978年と、これまた年代物のテクニカル指標です。損切りのタイミングを備えたトレンド系のテクニカル指標です。
パラボリックの特徴としては、途転(ドテン)トレードを考えた指標となっています。途転とは、例えば買い注文を持っていたとすると、シグナルが入った時点で、全てを売りポジションに転換するような、為替レートの上下を最大限に利益を取ることを狙った指標です。
ちなみに、ポラボリックトは日本語で放物線という意味です。ぜんぜん、FXとは関係はありませんが、トレードでパラボリックSARを使うと、なぜか私の頭の中には、パラボナアンテナが毎回登場します。

パラボリックの計算方法
パラボリックSARですが、計算をするには「 AF 」と「 EP 」と呼ばれる2つの計算を行う必要があります。
AFですが、英語ではAcceleration Factorと呼ばれており、日本語では加速因子です。こちらは通常はmin(初期値)とmax(最大値)を設定して、終値が高値を更新するたびに初期値を足し算していきます。
AFの初期値は0.02、最大値は0.2が一般的で、終値が高値を更新した時点で、0.02に0.02つまり0.04へと値が増えていきます。
対して、EPとはExtreme Priceの略で「極大値」と日本語では呼ばれているそうです。計算は非常に単純で、SARが買いシグナルを出している時は、その期間中の最高値。逆にSARが売りシグナルを出している間は、その期間中の最安値となります。
EPとAFがパラボリックSARの計算には非常に重要なのですが、これまた本当にややこしいですよね。色々なページを見て回ったのですが、なぜか若干計算式が異なっていたり、違うこと言っていたりと、混乱しました。
最終的には下記のキャプチャにある通り、マネーパートナーズの公式説明が一番わかりやすかったです。

このAFとEPの計算した値に基づいて、いよいよ主役のSARを算出することが出来ます。SARは英語でStop and Reversalの略で、途転トレードのようにStop(止まれ!=利確しろ)、Reverse(次は反対方向や!=ポジション逆転)という、利益を追求した鬼のようなやつです。
SARの計算方法ですが、下記が式となります。
SAR=(EP−前日のSAR)× (AF) + (前日のSAR)
あれ?SAR自体はとっても簡単な処理ですね(笑)
パラボリックSARの使い方
さて、この計算がめちゃくちゃややこしいパラボリックSARですが、トレードではどのように使われるのかを説明します。
下のチャートですが、ドル円の1分ローソク足にAFを0.0.2 – 0.2設定として計算したSARを表示させたものです。まずは一番左の黒丸1に注目してください。
こちらですが、その少し前の期間ではパラボリックSAR(青線)が相場の下に位置していますが、黒丸1のポイントでパラボリックSARをローソク足が下抜けしました。このタイミングが売りのシングとなります。つまり黒丸1でまずは売り注文を建てます。
次に真ん中の黒丸2を注目ください。パラボリックSAR(青線)をレートが上抜けしています。このポイントが「買いシグナル」で、今まで持っていた売りポジを決済して、次は買いポジに逆転します。同様の流れで黒丸3ではまた、売りシグナルが出たので、買いポジを決済して、今度は売りへ逆転するわけです。
上の例のチャートを見てみると、恐ろしいくらい全てのトレードで利益が確定できそうですが、パラボリックSARには大きな弱点があります。
それは、レンジ相場ではほとんどのケースで「騙し」、つまり、うまく機能しないことです。為替レートが長い期間、一定方向に向かって動いている時ではないと、使えないって訳です。
Pythonを使ってパラボリックSARを計算
さて、この荒々しいテクニカル指標ですが、Pythonで処理をしてみましょう。この荒々しい指標には、同じく荒々しい相場のビットコインのレートをスクレイピングして、パラボリックSARを計算しましょう。(荒々しい)
まずは必要なライブラリをインポートします。最後にMatplotlibを使って、終値とパラボリックSARのチャートも作ってみますので、こちらもインポートしておきます。
1 2 3 4 5 6 7 8 9 |
# パラボリックSARの計算に使うライブラリー import pandas as pd from datetime import datetime import matplotlib.pyplot as plt import time %matplotlib qt |
次に、ビットコインの価格をスクレイピングしましょう。詳細は「ビットコインやらイーサリアムなど仮想通貨の過去レートをスクレイピングする方法」をご参考ください。
1 2 3 4 5 6 |
# コインマーケットキャップからデータをスクレイピング bit = pd.read_html("https://coinmarketcap.com/currencies/bitcoin/historical-data/?start=20180101&end="+time.strftime("%Y%m%d"))[0] bit = bit.assign(Date=pd.to_datetime(bit['Date'])) bit['Volume'] = bit['Volume'].astype('int64') |
これでビットコインのレートが取れたので、次はややこしいSARを処理する関数を作りましょう。AFは終値と高値の位置により変動しますし、EPは上昇・下降トレンドにより変動します。
またiafとしてAFの初期値を0.02、最大値はmaxafとして0.2として設定をしてあげます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
# パラボリックSARを処理する。 def psar(barsdata, iaf = 0.02, maxaf = 0.2): length = len(barsdata) dates = list(barsdata['Date']) high = list(barsdata['High']) low = list(barsdata['Low']) close = list(barsdata['Close']) psar = close[0:len(close)] psarbull = [None] * length psarbear = [None] * length bull = True af = iaf ep = low[0] hp = high[0] lp = low[0] for i in range(2,length): if bull: psar[i] = psar[i - 1] + af * (hp - psar[i - 1]) else: psar[i] = psar[i - 1] + af * (lp - psar[i - 1]) reverse = False if bull: if low[i] < psar[i]: bull = False reverse = True psar[i] = hp lp = low[i] af = iaf else: if high[i] > psar[i]: bull = True reverse = True psar[i] = lp hp = high[i] af = iaf if not reverse: if bull: if high[i] > hp: hp = high[i] af = min(af + iaf, maxaf) if low[i - 1] < psar[i]: psar[i] = low[i - 1] if low[i - 2] < psar[i]: psar[i] = low[i - 2] else: if low[i] < lp: lp = low[i] af = min(af + iaf, maxaf) if high[i - 1] > psar[i]: psar[i] = high[i - 1] if high[i - 2] > psar[i]: psar[i] = high[i - 2] if bull: psarbull[i] = psar[i] else: psarbear[i] = psar[i] return {"dates":dates, "high":high, "low":low, "close":close, "psar":psar, "psarbear":psarbear, "psarbull":psarbull} |
では、先ほどスクレイピングしたビットコインの相場を、こちらの関数で処理してみます。
1 2 3 4 |
# ビットコインの相場からSARを算出 result = psar(bit) |
最後に、resultから値を切り分けて、matplotlibで終値とパラボリックSARのチャートを作って見ましょう!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# Matplotlibを使ってパラボリックSARのチャートを作る startidx = 0 endidx = len(bit) dates = result['dates'][startidx:endidx] close = result['close'][startidx:endidx] psarbear = result['psarbear'][startidx:endidx] psarbull = result['psarbull'][startidx:endidx] plt.plot(dates, close) plt.plot(dates, psarbull) plt.plot(dates, psarbear) plt.grid() plt.show() |
大丈夫そうですね!
まとめと次の課題
今回はテクニカル指標シリーズとして、パラボリックSARの使い方や計算方法、さらにPythonを使って処理をして、Matplotlibでチャートを作りました。
計算方法が非常に複雑なパラボリックSARでしたが、上級者のトレーダーさんからは根強い人気のある指標でもあります。
次への課題としては、パラボリックSARはトレンドがはっきりと出ていないと、上手く機能してくれませんので、トレンドを線形回帰のモデルで予測して、パラボリックSARの検証を行って見たいです。
以上です!勉強にお付き合い頂いてありがとうございます!コメントやTwitterで絡んでもらえると嬉しいです!
ディスカッション
コメント一覧
まだ、コメントがありません