2024-09-06

【備忘録】パラボリック SAR

パラボリック SAR, Parabolic Stop And Reverse は、J.ウェルズ・ワイルダー・ジュニア氏 (J. Welles Wilder, Jr.) によって考案された手法で、証券などの取引商品やFXなどの為替取引において、市場価格の方向性が反転する可能性を見つけるためのものです。

トレンドフォロー(遅行)指標であり、強いトレンドの間、価格がパラボリックカーブ内に留まる傾向にあることに基づいて、トレーリング・ストップ・ロスを設定したり、エントリーポイントやエグジットポイントを決定したりするために使用されます。

Wikipedia より引用、翻訳・編集

先月 8 月 5 日の東京市場の歴史的な暴落を経験して、今さらながら先達が開発したテクニカル分析の手法を、自分でもプログラムを作って分析できるようにしようと思い、いろいろ調べています。

今回は上記 パラボリック SAR です。SAR の計算式は以下の通りです。

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

AF(Acceleration Factor): 加速因数

EP(Extreme Point): 買い持ちしている期間の最高値、または売り持ちしている期間の最安値

下記の OS 環境で動作確認をしています。

RHEL 9.4 x86_64
Python 3.12.1
jupyterlab 4.2.5
matplotlib 3.9.2
mplfinance 0.12.10b0
numpy 2.1.1
pandas 2.2.2
yfinance 0.2.43

以下の作業は JupyterLab 上でおこなっています。

まず、必要なパッケージをインポートします。

import matplotlib.pyplot as plt
import mplfinance as mpf
import numpy as np
import pandas as pd
import yfinance as yf

パラボリック SAR を算出する関数です。コードは、参考サイト [1] で紹介されているものを流用しました。

def psar(ohlc: pd.DataFrame, iaf: float = 0.02, maxaf: float = 0.2) -> dict:
    length = len(ohlc)
    high = ohlc['High'].tolist()
    low = ohlc['Low'].tolist()
    close = ohlc['Close'].tolist()

    psar = close[0:len(close)]
    psarbull = [None] * length
    psarbear = [None] * length

    bull = True
    af = iaf
    ep = low[0]
    price_high = high[0]
    price_low = low[0]

    for i in range(2, length):
        if bull:
            psar[i] = psar[i - 1] + af * (price_high - psar[i - 1])
        else:
            psar[i] = psar[i - 1] + af * (price_low - psar[i - 1])
        reverse = False

        if bull:
            if low[i] < psar[i]:
                bull = False
                reverse = True
                psar[i] = price_high
                price_low = low[i]
                af = iaf
        else:
            if high[i] > psar[i]:
                bull = True
                reverse = True
                psar[i] = price_low
                price_high = high[i]
                af = iaf

        if not reverse:
            if bull:
                if high[i] > price_high:
                    price_high = 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] < price_low:
                    price_low = 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 {
        'bear': np.array(psarbear, dtype='float64'),
        'bull': np.array(psarbull, dtype='float64'),
    }

過去半年分の日経平均株価 (^N225) の日足データを取得します。

symbol = '^N225'
ticker = yf.Ticker(symbol)
df = ticker.history(period='6mo')

mplfinance でローソク足チャート、SAR の下降トレンド (downtrend)、上昇トレンド (uptrend) をプロットしています。

dict_psar = psar(df)

fig, ax = plt.subplots(figsize=(12, 5))

apds  = [
    mpf.make_addplot(
        dict_psar['bear'],
        type='scatter',
        marker='o',
        markersize=5,
        color='magenta',
        label='downtrend',
        ax=ax
    ),
    mpf.make_addplot(
        dict_psar['bull'],
        type='scatter',
        marker='o',
        markersize=5,
        color='darkcyan',
        label='uptrend',
        ax=ax
    ),
]   

mpf.plot(
    df,
    type='candle',
    style='yahoo',
    addplot=apds,
    xrotation=0,
    ax=ax
)

ax.set_title('%s (%s)' % (ticker.info['longName'], symbol))
ax.legend(loc='best', fontsize=8, frameon=True)
ax.grid('both')

plt.subplots_adjust(left=0.15, right=0.85, bottom=0.05, top=0.95)
# plt.savefig('parabolic_sar_n225.png')
plt.show()

 

パラボリック SAR の算出に流用させていただいたコードは古いものですが、問題なく動作しました。コードの内容を咀嚼し、使いこなせるようにしたいと思います。

参考サイト

  1. Parabolic SAR implementation in Python – v-frog [2014-12-09]
  2. パラボリックSAR (SAR) — TradingView
  3. bitWalk's: 【備忘録】モメンタムとボリンジャーバンド [2024-08-10]
  4. bitWalk's: 【備忘録】フィボナッチ・リトレースメント [2024-08-12]
  5. bitWalk's: 【備忘録】一目均衡表 [2024-08-15]
  6. bitWalk's: 【備忘録】Wilder の RSI [2024-09-05]

 

ブログランキング・にほんブログ村へ bitWalk's - にほんブログ村 にほんブログ村 IT技術ブログ オープンソースへ
にほんブログ村

オープンソース - ブログ村ハッシュタグ
#オープンソース



このエントリーをはてなブックマークに追加

0 件のコメント: