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 计算,这是一个非常好的视频:
小智 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 方法一样),但经过多次计算后,它收敛到正确的值。
归档时间: |
|
查看次数: |
9624 次 |
最近记录: |