パラボリック SAR, Parabolic Stop And Reverse は、J.ウェルズ・ワイルダー・ジュニア氏 (J. Welles Wilder, Jr.) によって考案された手法で、証券などの取引商品やFXなどの為替取引において、市場価格の方向性が反転する可能性を見つけるためのものです。
トレンドフォロー(遅行)指標であり、強いトレンドの間、価格がパラボリックカーブ内に留まる傾向にあることに基づいて、トレーリング・ストップ・ロスを設定したり、エントリーポイントやエグジットポイントを決定したりするために使用されます。
先月 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 の算出に流用させていただいたコードは古いものですが、問題なく動作しました。コードの内容を咀嚼し、使いこなせるようにしたいと思います。
参考サイト
- Parabolic SAR implementation in Python – v-frog [2014-12-09]
- パラボリックSAR (SAR) — TradingView
- bitWalk's: 【備忘録】モメンタムとボリンジャーバンド [2024-08-10]
- bitWalk's: 【備忘録】フィボナッチ・リトレースメント [2024-08-12]
- bitWalk's: 【備忘録】一目均衡表 [2024-08-15]
- bitWalk's: 【備忘録】Wilder の RSI [2024-09-05]

にほんブログ村
#オープンソース

0 件のコメント:
コメントを投稿