Python プログラミング

【Python】パラボリックSARをビットコインの価格データを元に実装計算する

この記事は約10分で読めます。

 

 

パラボリックとは?

 

「パラボリック」とはテクニカル分析で利用されるテクニカル指標の1つで、J.W.ワイルダー氏が考案しました。

J.W.ワイルダー氏は、同じくテクニカル指標であるRSI・ADXなどを生み出した人物でもあります。

「SAR(ストップ&リバースポイント)」というラインを用いていることから、「バラボリックSAR」と呼ばれることもある、トレンドフォロー型の指標です。

株価の値動きは、上昇もしくは下落の強さ(勢い)が徐々に弱まって、やがて転換点を迎えるということに着目したことで誕生しました。

また、パラボリック(parabolic)に「放物線上の」という意味があるのは、SARのラインがチャート上に放物線を描いているように見えるからです。

株式市場の転換点をSARとして放物線上に設定し、SARと実際の株価の位置関係で売買判断をおこなっていきます。

引用:https://aibashiro.jp/contents/yg00085/

 

パラボリックの計算方法

 

パラボリックSARの計算には「AF」と「EP」という2つの指標まず計算する必要があります。この2つを用いてSARを算出します。

 

  ※ マネーパートナーズ公式より引用

 

まずAF(Acceleration Factor)は加速因子という意味です。こちらは通常はmin(初期値)とmax(最大値)を設定して、終値が高値を更新するたびに初期値を足し算していきます。

 

AFの初期値は0.02、最大値は0.2が一般的で、終値が高値を更新した時点で、0.02に0.02つまり0.04へと値が増えていきます。

 

次にEPとはExtreme Priceの略で「極大値」という意味らしいです。計算は非常に単純で、SARが買いシグナルを出している時は、その期間中の最高値。逆にSARが売りシグナルを出している間は、その期間中の最安値となります。

 

そしてこの2つを用いてSARを以下のように計算するとのことです。

 

SAR=(EP-前日のSAR)×AF+前日のSAR

 

パラボリックの使い方

 

次に、パラボリックの具体的な使い方をご紹介します。

まず、上昇トレンドの場合、株価は常にSARよりも上で推移しています。

このときは、買いポジションを持ち続けてもよいとされています。

株価の値動きの勢いが弱まって、株価とSARが交差したうえで下抜けるとそこが転換点です。

つまり、売りサインとして見るので、現在と反対のポジション(買いポジションを解消するもしくは新たに売りポジションを持つ)をとると良いとされています。

こちらが、上昇トレンド時のパラボリックの使い方です。

下落トレンドの場合はこの逆になり、株価は常にSARよりも下で推移しており、持つべきなのは売りポジションです。

株価の値動きの勢いが弱まって、株価とSARが交差したうえで上抜けると、そこが転換点であり買いサインとなります。

現在と反対のポジション(売りポジションを解消するもしくは新たに買いポジションを持つ)をとりましょう。

このように、パラボリックはSARを転換点として設定し、株価が下抜けたら上昇トレンドが転換するサイン、上抜けたら下落トレンドが転換するサインとして非常に直感的に売買サインを汲み取ることができます。

また、上記で“SAR(ストップ&リバースポイント)”という表記を用いましたが、パラボリックの使い方を理解すると、こちらの意味がわかりやすいです。

まず、ストップには“止める”という意味がありますよね。つまり買いポジションまたは売りポジションを持ち続けるのを止めて、解消するサインだということです。

次に、リバースには“反対”という意味があります。よって、買いポジションから売りポジションに、または売りポジションから買いポジションに、といった具合に反対のポジションをとるサインだということを示しています。

つまり、簡単にいうとバラボリックは、株価がSARと交差して上抜けもしくは下抜ける(株価変動の動きが弱まってトレンドの転換点に入る)ことをサインに、ストップ&リバースをおこなうためのテクニカル指標ということです。

引用:https://aibashiro.jp/contents/yg00085/

 

要はトレンド転換が分かる指標という事みたいです。

イメージとしては↓の画像がすごい分かりやすかったです。

 

引用:https://www.oanda.jp/lab-education/beginners/technical_analysis/parabolic/

 

 

スポンサーリンク
スポンサーリンク

PythonでパラボリックSARを実装する

 

長いコードなのでインデントがバグっている場合は↓を参照して下さい。

Google Colaboratory

 

ビットコインの価格データのスクレイピング

 

import requests
import json
import pandas as pd
from datetime import datetime
from datetime import timedelta

now = datetime.now()
now_f = now.strftime('%Y-%m-%d')
oneday = timedelta(days=1) 
yesterday = now -oneday  
yestterday_f = yesterday.strftime('%Y-%m-%d')

start = datetime.strptime(yestterday_f, '%Y-%m-%d') # 開始日(APIドキュメントによると20210415から)
end   = datetime.strptime(now_f, '%Y-%m-%d')+ timedelta(1) #終了日(本日まで)

endPoint = 'https://api.coin.z.com/public'

def daterange(_start, _end):
    for n in range((_end - _start).days):
        yield _start + timedelta(n)

price_data = []

for d in daterange(start, end):
    path = '/v1/klines?symbol=BTC_JPY&interval=5min&date={}'.format(d.strftime('%Y%m%d'))
    response_1 = requests.get(endPoint + path)
    try:
        for i in response_1.json()['data']:
            price_data.append({"close_time":datetime.fromtimestamp(int(i["openTime"])/1000).strftime("%Y/%m/%d %H:%M:%S"),"open_price": int(i["open"]),
                               "high_price": int(i["high"]), "low_price": int(i["low"]),"close_price": int(i["close"])})
                                #ミリ秒のUNIXの場合は/1000にする
    except:
        pass

pd_data = pd.DataFrame(price_data)
pd_data.head()

 

パラボリックSARを計算する

 

def psar(barsdata, iaf = 0.02, maxaf = 0.2):
    length = len(barsdata)
    dates = barsdata['close_time'].tolist()
    high = barsdata['high_price'].tolist()
    low = barsdata['low_price'].tolist()
    close = barsdata['close_price'].tolist()
    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}

 

 

実行結果

 

参考:http://www.algo-fx-blog.com/parabolic-sar-python/

 

コメント

タイトルとURLをコピーしました