I have recently tried to use the Parabolic Stop and Reverse indicator to track the VIX index (volatility on the S&P 500). A while back, I had used TA-lib and many of its indicators, but it was a while back. And I found it fairly painful to setup for Python this time. Given that I only needed this indicator, and that it is often better to have your own code for this kind of analysis, I simply translated an implementation from AmiBroker to Python. And here is a quick overview of what it looks like: The full code can be downloaded from my GitHub account.
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}