如何使用 Pandas 找到股票的平均方向运动?

rap*_*zee 2 python average dataframe pandas

我有 OHLCV 数据的数据框。我想知道是否有人知道任何教程或任何使用 pandas 查找 ADX(平均方向运动)的方法?

import pandas as pd 
import yfinance as yf
import matplotlib.pyplot as plt
import datetime as dt 
import  numpy as nm 


start=dt.datetime.today()-dt.timedelta(59)
end=dt.datetime.today()

df=pd.DataFrame(yf.download("MSFT", start=start, end=end))
Run Code Online (Sandbox Code Playgroud)

平均方向指数(ADX)是由 J. Welles Wilder, Jr. 开发的构成技术交易系统的五个指标中的主要技术指标,并使用构成交易系统的其他指标进行计算。ADX 主要用作动量或趋势强度指标,但整个 ADX 系统也用作方向指标。
方向运动是通过比较两个连续低点之间的差异与其各自高点之间的差异来计算的。

对于 ADX 的 Excel 计算,这是一个非常好的视频:

https://www.youtube.com/watch?v=LKDJQLrXedg&t=387s

小智 7

我稍微研究了一下这个问题,发现了一些可以帮助您解决问题的东西:

def ADX(data: pd.DataFrame, period: int):
    """
    Computes the ADX indicator.
    """
    
    df = data.copy()
    alpha = 1/period

    # TR
    df['H-L'] = df['High'] - df['Low']
    df['H-C'] = np.abs(df['High'] - df['Close'].shift(1))
    df['L-C'] = np.abs(df['Low'] - df['Close'].shift(1))
    df['TR'] = df[['H-L', 'H-C', 'L-C']].max(axis=1)
    del df['H-L'], df['H-C'], df['L-C']

    # ATR
    df['ATR'] = df['TR'].ewm(alpha=alpha, adjust=False).mean()

    # +-DX
    df['H-pH'] = df['High'] - df['High'].shift(1)
    df['pL-L'] = df['Low'].shift(1) - df['Low']
    df['+DX'] = np.where(
        (df['H-pH'] > df['pL-L']) & (df['H-pH']>0),
        df['H-pH'],
        0.0
    )
    df['-DX'] = np.where(
        (df['H-pH'] < df['pL-L']) & (df['pL-L']>0),
        df['pL-L'],
        0.0
    )
    del df['H-pH'], df['pL-L']

    # +- DMI
    df['S+DM'] = df['+DX'].ewm(alpha=alpha, adjust=False).mean()
    df['S-DM'] = df['-DX'].ewm(alpha=alpha, adjust=False).mean()
    df['+DMI'] = (df['S+DM']/df['ATR'])*100
    df['-DMI'] = (df['S-DM']/df['ATR'])*100
    del df['S+DM'], df['S-DM']

    # ADX
    df['DX'] = (np.abs(df['+DMI'] - df['-DMI'])/(df['+DMI'] + df['-DMI']))*100
    df['ADX'] = df['DX'].ewm(alpha=alpha, adjust=False).mean()
    del df['DX'], df['ATR'], df['TR'], df['-DX'], df['+DX'], df['+DMI'], df['-DMI']

    return df
Run Code Online (Sandbox Code Playgroud)

一开始这些值不正确(与 EWM 方法一样),但经过多次计算后,它收敛到正确的值。