기본 콘텐츠로 건너뛰기

4월, 2025의 게시물 표시

[matplotlib]quiver()함수

[stock]평균방향성 지수(ADX)

평균방향성 지수(ADX, Average Directional Index) 평균방향성지수(ADX, Average Directional Index)는 추세의 강도를 측정하고 시장에서 잠재적인 진입 및 청산 지점을 파악하기 위해 사용하는 인기 있는 기술 분석 도구입니다. ADX 지표는 방향성을 고려하지 않는 추세 강도 지표로, 0에서 100까지 범위를 가집니다. 이 지표는 추세의 방향에 관계없이 추세의 강도를 정량화하기 위해 설계되었습니다. ADX는 긍정적 방향 지표(+DI)와 부정적 방향 지표(-DI)라는 두 가지 관련 지표를 기반으로합니다. 이 두 지표는 가격의 방향성 움직임을 측정하는 반면, ADX 자체는 추세의 강도를 평가합니다. 핵심 개념: ADX는 0에서 100 사이의 값을 가지며, 높은 값은 강한 추세를, 낮은 값은 약한 추세 또는 횡보 시장을 나타냅니다. ADX 자체는 추세의 방향을 나타내지 않습니다. +DI가 -DI보다 높으면 상승 추세의 강도를, -DI가 +DI보다 높으면 하락 추세의 강도를 나타냅니다. ADX 값이 상승하면 추세 강도가 증가하고 있음을 의미하며, 하락하면 추세 강도가 약화되고 있음을 의미합니다. 계산 방법: True Range (TR) 계산: 현재 고가와 저가의 차이, 현재 고가와 이전 종가의 절대값 차이, 현재 저가와 이전 종가의 절대값 차이 중 가장 큰 값을 TR로 설정합니다. TR = max[(High t -Low t ), |High t - Close t |, |Low t - Close t |] Directional Movement (+DM, -DM) 계산: +DM: 현재 고가 - 이전 고가  (+DM < 0) or (+DM < -DM) → 0 -DM: 이전 저가 - 현재 저가  (-DM > 0) or (-DM < +DM) → 0 Directional Index (+DI, -D...

[stock]ALMA

ALMA (Arnaud Legoux Moving Average) 기존 이동평균선의 단점을 보완하기 위해 개발된 지표로 가격변동에 더 부드럽게 반응하면서 지연(lag)을 줄이는데 중점을 둔 지표입니다. $$\text{ALMA} = \frac{\sum^{n-1}_{i=0} w_i\text{price}_{t-i}}{\sum^{n-1}_{i=0} w_i}$$ n: 기간, 이동평균을 계산하기 위한 가격의 개수입니다. 일반적으로 9를 사용 price t-i : 현재로부터 i 번째 이전의 가격 w i : 가우시안 함수에 의해 결정되는 가중치 가우시안 가중치 $$w_i=\exp\left(-\frac{\left(i-\text{offset}\cdot (n-1)\right)^2}{2\sigma^2} \right)$$ offset: 부드러움과 반응성 사이의 균형을 조절하는 파라미터로 [0, 1]사이의 값입니다. 1에 가까울수록 최근가격에 더 가중치를 부여하고 0에 근접할 술록 과거 가격에 더큰 비중을 부여합니다. (다음 결과는 총 10개의 데이터에 offset을 변화시켰을 경우의 가중치의 변화를 나타낸 것입니다.) 일반적으로 0.85를 사용합니다. σ : 가우시안 분포의 폭을 결정하는 값으로 ALMA의 부드로움 정도를 조절합니다. 값이 클수록 분포가 넓어지고 부드러워 집니다. 기본적으로 6을 설정합니다. import numpy as np import pandas as pd import yfinance as yf import pandas_ta as ta import matplotlib.pyplot as plt plt.rcParams['font.family'] = 'Malgun Gothic' plt.rcParams['axes.unicode_minus'] = False def weight(n, offset, sigma): result=[] for i in range(n): ...

[stock]ADL과 Chaikin Oscillator

ADL과 Chaikin Oscillator ADL(Accumulation/Distribution Line) Chaikin Oscillator ADL(Accumulation/Distribution Line) ADL(누적/분산선)은 거래량 기반의 기술적 지표로 특정기간 동안 가격 변동과 거래량을 분석하여 자금의 흐름(매수, 매도 압력)을 측정하는 것으로 주식, 자산이 매집(Accumulation) 또는 분산(Distribution)되는지를 파악하는데 도움이 됩니다. 매집: 종가가 해당 기간의 고가에 근접할수록 매수 압력이 강하고, 거래량이 많다면 자금의 유입(매집)되고 있다고 해석할 수 있음 분산: 종가가 해당기간의 저가에 근접할수록 매도 압력이 강하고, 거래량이 많다면 자금 유출(분산)이 되고 있다고 해석할 수 있음 Money Flow Multiplier(MFM) 계산: 가격 범위내에서 종가의 위치 $\text{MFM}=\frac{(\text{Close}-\text{Low}) -(\text{HIgh}-\text{Close})}{\text{HIgh}-\text{Low}}$ +1에 근접: 종가가 고가에 근접 -1에 근접: 종가가 저가에 근접 Money FLow Volume(MFV) 계산: 자금 흐름의 크기를 나타냄 MFV = MFM × Volume ADL: MFV의 누적합 추세확인 가격상승, ADL 상승 : 상승 추세가 매수세에 의해 지원되는 것으로 추세 지속 암시 가격하락, ADL 하락: 하락추세를 매도세에 의해 지지되므로 추세 지속 암시 디버전스(Divergence): 가격과 ADL이 반대 방향으로 움직임. 추세 전환 신호일 수 있음 상승 디버전스: 가격 하락, ADL 상승 현상으로 매도세가 약해지고 매수세 유입 가능성 시사 하락 디버...

[stock]가속도 밴드(Acceleration Bands)

가속도 밴드(Acceleration Bands) 가격변동성의 변화를 시각적으로 나타내어 잠재적인 추세반전 시점을 예측하는데 사용되는 기술적 지표입니다. 이 지표는 중심선과 상한, 하한밴드로 구성되며 중심선으로 고가와 저가의 평균을 사용합니다. 구성과 전체적인 형태는 Bollinger bands와 유사하지만 종가의 단순이평을 중심선으로 사용하는데 반해 고가와 저가의 평균으로 중심선을 사용하고 상한과 하한 밴드를 고가, 중심선, 저가로 계산함으로서 가격의 움직임의 가속도에 촛점을 맞춥니다. $$\begin{align} \text{중심가격} &= \frac{\text{고가 + 저가}}{2}\\\text{중심선} &= \text{SMA(중심가격, length)}\\ \text{상한밴드} &= \text{중심선} + (\text{고가 - 중심선})\times \text{width}\\ \text{하한밴드} &= \text{중심선} - (\text{중심선 - 저가})\times \text{width}\end{align}$$ width는 상한 및 하한 밴드가 중심선으로 부터 얼마나 떠러어 있을지를 결정하는 역할을 합니다. 위 식과 같이 상한밴드는 고가와 중심선 사이의 변동성, 하한밴드는 중심선과 저가사이의 변동성을 반영합니다. 그러므로 추세가 강화된다면 고가, 중심선 또는 중심선과 저가의 차가 커질 것입니다. 반대로 이 차가 작아진다면 즉, 밴드의 폭이 좁아진다면 추세의 약화 또는 반전 가능성을 시사할 수 있습니다. 추세 확인: 상승 추세: 밴드의 폭이 넓어지면서 가격이 상한 밴드 근처에서 움직이거나 상한 밴드를 돌파하는 것은 상승 추세가 강하게 지속될 가능성을 나타냅니다. 하락 추세: 밴드의 폭이 넓어지면서 가격이 하한 밴드 근처에서 움직이거나 하한 밴드를 돌파하는 것은 하락 추세가 강하게 지속될 가능성을 나타냅니다. 추세 반전 가능성: 가격이 상한 밴드를 강하게 벗어난 후 다시 밴드 안으로 진입하거나, 상한 밴...

[stock] DEMA(Double EMA)

Double Exponential Moving Average EMA의 지연을 줄이기 위해 개발된 기술적 지표로서 EMA보다 최근 가격에 더 민감하게 반응하므로 단기매매의 추세 전환을 거 빠르게 포착하는 데 도움이 됩니다. 단일 EMA : EMA1 EMA2: EMA1의 지수이동평균 DEMA = (2· EMA1)-EMA2 talib.DEMA(data, timeperiod) 함수를 적용합니다. 다음은 일정기간의 주가에 대한 봉차트에 DEMA 5일, 20일 결과를 작성한 것입니다. 다양한 DEMA 플롯을 작성하기 위해 위 함수를 적용한 결과를 그래프로 작성하기 위한 UDF를 작성 사용하였습니다. def dema_plot(data, periods=[5, 20]): if type(data) == pd.core.series.Series: df = data else: df = data["Close"] result=pd.DataFrame() for i in periods: result[f'dema_{i}']=talib.DEMA(df, timeperiod=i) plt.plot(result[f'dema_{i}'], label=f'dema_{i}') plt.grid(True) plt.legend(loc="upper left") return result import numpy as np import pandas as pd import yfinance as yf import talib import matplotlib.pyplot as plt st=pd.Timestamp(2024,1, 1) et=pd.Timestamp(2025, 4,28) trgnme="000660.KS" trg=yf.download(trgnme, st, et) trg.colu...

[stock] pandas_ta와 TA-Lib 라이브러리에서 제공하는 기술적 지표

pandas_ta와 TA-Lib 라이브러리에서 제공하는 기술적 지표 pandas_ta TA-Lib pandas_ta pandas_ta 함수 함수 full name A apo Absolute Price Oscillator (APO) accbands Acceleration Bands (ACCBANDS) ad Accumulation/Distribution (AD) alma Arnaud Legoux Moving Average (ALMA) aroon Aroon & Aroon Oscillator (AROON) adx Average Directional Movement (ADX) atr Average True Range (ATR) 변동성 지표 ao Awesome Oscillator (AO) B bop Balance of Power (BOP) bias Bias (BIAS) bton Binary to number bbands Bollinger Bands (BBANDS), 변동성 지표 brar BRAR (BRAR) C cg Center of Gravity (CG) cmf Chaikin Money Flow (CMF) cfo Chande Forcast Oscillator (CFO) cksp Chande Kroll Stop (CKSP) cmo Chande Momentum Oscillator (CMO) chop Choppiness Index (CHOP) xex Condition any cci Commodity Channel Index (CCI) xev Condition all counter Condition counter xfl Condition filter coppock Coppock Curve (COPC) cti Correlation Trend Indicator (CTI) D dpo Detrend Price Oscillator (DPO) d...

[time series] 정상성(stationary) 검정

정상성(stationary) 검정 정상성 판단을 위한 일반적인 지침: ACF가 천천히 감소하거나 오랜 기간 유의미한 값을 가지면 비정상적일 가능성이 높습니다. 특히 선형적인 감소는 추세를, 주기적인 스파이크는 계절성을 나타낼 수 있습니다. PACF에서 몇 개의 초기 시차에서만 유의미한 스파이크가 나타나고 이후 급격히 감소하면 정상적일 가능성이 높습니다. import numpy as np import pandas as pd import yfinance as yf import matplotlib.pyplot as plt from statsmodels.tsa.stattools import acf, pacf from statsmodels.graphics.tsaplots import plot_acf, plot_pacf st=pd.Timestamp(2024,1, 1) et=pd.Timestamp(2025, 4,25) trgnme="000660.KS" trg=yf.download(trgnme, st, et) trg.columns=[i[0] for i in trg.columns] close=trg["Close"] 다음은 데이터의 ACF와 PACF를 작성하기 위한 UDF입니다. #ACF, PACF 작성 함수 def acf_pacf_plot(data, lag=10): f, axes=plt.subplots(1,2, figsize=(10, 3), sharey=True) plt.subplots_adjust(wspace=0.1) plot_acf(data, lags=lag, ax=axes[0]) plot_pacf(data, lags=lag, ax=axes[1]) plt.show() #ACF, PACF fig, axes=plt.subplots(1, 2, figsize=(10, 3), sharey=True) plt.subplots_adjust(wspace=0.1) plot_acf(close, lags=30, a...

[time series] ACF와 PACF

ACF(Autocorrelation function)와 PACF(Partial ACF) ACF와 PACF 플롯은 시계열 데이터의 정상성(Statioinary)을 시각적으로 판단하는데 유용한 도구입니다. 정상성 시계열은 시간에 따라 평균, 분산 등 통계적인 속성이 일정하게 유지되는 반면 비정상성인 경우 추세, 계절성 또는 시간에 따라 변동이 존재합니다. ACF ACF는 서로다른 시점의 값들 간의 상관관계를 측정하는 함수입니다. 즉, 특정시점의 값과 그 보다 k 이전(lag k)의 값 사이의 상관계수를 계산하여 시간 순서에 따라 나열되는 데이터들 간의 자기 의존성을 파악하는데 사용합니다. $$\rho(k) = \frac{\text{Cov}(y_t, y_{t-k})}{\sqrt{\text{Var}(y_t) \text{Var}(y_{t-k})}}$$ y t : 시점 t의 시계열 값 Cov(): 공분산 Var(): 분산 정상성을 갖는 다면 평균과 분산이 시간에 따라 변하지 않으므로 Var(y t ) = Var(y t-k )이므로 위 식의 분모는 상수가 됩니다. 즉 자기상관함수는 공분산을 분산으로 정규화한 형대가 됩니다. 계산과정 시계열 평균 $\bar{y} = \frac{1}{n} \sum^n_{t=1} y_t$ 자기공분산 계산 $\gamma_k = \frac{1}{n}\sum^n_{t=k+1} (y_t-\bar{y})(y_{t-k} -\bar{y})$ ACF값 계산: 0차 지연(lag 0)에서의 자기공분산(분산)으로 정규화 $\rho_k =\frac{\gamma_k }{\gamma_0}=\frac{\sum^n_{t=k+1} (y_t-\bar{y})(y_{t-k} -\bar{y})}{\sum^n_{t=1} (y_t-\bar{y})}$ 다양한 k값들을 계산하기 위해 위 과정을 반복합니다. statsmodels.tsa.stattools.acf(x, nlags=None, alpha=None, \hellip;) 함수를 사...

[시계열] 시계열 데이터의 차분(difference)과 역차분(inverse difference)

시계열 데이터의 차분(difference)과 역차분(inverse difference) 시계열 모형은 데이터의 정상성이 요구됩니다. 정상성을 확보하기 위해 데이터의 차분(difference)이 적용됩니다. 차분된 데이터는 현재값에서 이전 값의 차를 사용이므로 원 데이터가 가질 수 있는 추세가 제거될 수 있습니다. 즉, 차분된 데이터의 경우 연속된 데이터들 사이의 자기상관이 최소화되므로 평균이나 분산등의 일정성이 유지되는 정상성(stationary)가 확보될 수 있습니다. 예를 들어 다음 샘플에 대해 차분을 실행합니다. np.random.seed(3) x=pd.Series(np.random.randint(1, 11, 4)) x 0 9 1 10 2 4 3 9 dtype: int32 위 데이터 x의 차분은 다음과 같습니다. pandas객체.diff() 함수를 사용할 수 있습니다. $$\begin{align} 10-9=1 \quad& x_1-x_0=x^1_1\\ 4-10=-6\quad& x_2-x_1=x^1_2\\9-4=6\quad & x_3 - x_2 = x^1_3\\x_i :\quad&\text{원 데이터}\\ x^1_i :\quad&\text{1차 차분된 데이터}\end{align}$$ x1=x.diff() x1 0 NaN 1 1.0 2 -6.0 3 5.0 dtype: float64 위 과정은 1번 차분한 것으로 1차 차분이라합니다. 위 x1을 다시 차분하면 2번 차분, 즉 2차 차분이 됩니다. $$\begin{align} -6 - 1=-7 \quad& x^1_2-x^1_1=x^2_2\\ 5-(-6) = 11\quad& x^1_3-x^1_2=x^2_3\\\ x^2_i :\quad&\text{2차 차분된 데이터}\end{align}$$ x2=x.diff().diff() x2 0 NaN 1 NaN 2 -7.0 3 11....

[stock]EOM(Ease of Movement)

EOM(Ease of Movement) 주가와 거래량 간의 관계를 분석하여 주가 변동에 거래량의 영향 정도를 나타내는 기술적 지표입니다. $$\begin{align}\text{중간점} &= \frac{\text{당일고가} + \text{당일저가}}{2} \\ \text{중간점변화} & = \text{당일 중간점} - \text{전일 중간점}\\ \text{박스비율} & = \frac{\text{거래량}}{(\text{당일고가} - \text{당일저가})\cdot \text{조정계수}}\\EOM &= \frac{\text{중간점변화}}{\text{박스비율}}\\& \text{sma(EOM, n) 사용} \end{align}$$ 조정계수는 일반적으로 100000 또는 1000000과 같은 큰 숫자를 사용하여 EOM 값이 지나치게 작아지는 것을 방지하고 일반적으로 EOM 값보다는 14일 이동평균값을 사용합니다. EOM이 높을수록 적은 거래량으로 가격 변화가 쉽게 일어남을 나타냅니다. > 0 매수세 우세로 가격 상승이 쉬움을 나타냄 EOM ↑ → 작은 거래량에 주가의 상승이 쉽게 일어남 < 0 매도세 우세로 가격 하락이 쉬움을 나타냄 EOM ↓ → 작은 거래량에 주가의 하락이 쉽게 일어남 0선 교차 상향돌파 : 매수신호로 상승추세로의 전환가능성을 시사 하향돌파: 매도신호로 하락추세로 전환 가능성 시사 디버전스 강세 디버전스: 가격 하락, EOM 상승의 경우로 매수신호로 해석 가능 하락 디버전스: 가격 상승, EOM 하락의 경우로 매도신호로 해석 가능 EOM은 거래량을 고려하는 지표이지만, 거래량 자체의 절대적인 크기보다는 가격 변동과의 상대적인 관계를 나타냅니다. EOM은 추세 추종 지표로 분류될 수 있지만, 횡보장에서는 잦은 거짓 신호가 발생할 수 있습니다. 따라서 추세가 명확한 시장에서 사용하는 것이 효과적입니다. EOM은 다른 기술적 지표와 마찬가지로 후행성 ...

[stock]일목균형표(Ichmoku)

일목균형표(Ichmoku) 매수와 매도의 균형을 시각적으로 보여주고, 시간 개념을 도입하여 추세 전환 시점을 예측하는 데 도움을 줍니다. 구성요소 전환선 (Conversion Line): (최고가 + 최저가) / 2 (최근 9일 기준) 최근 9일 동안 최고와 최저의 평균값 단기 추세방향을 나타내며 주가가 단기적인 균형점에서 얼마나 벗어났는지 나타냄 기준선 (Base Line): (최고가 + 최저가) / 2 (최근 26일 기준) 최근 26일 동안의 최고와 최저의 평균 중기 추세 방향을 나타내며 시장의 중심적인 균형가격으로 해석 선행스팬 1 (Leading Span A): (전환선 + 기준선) / 2 (26일 후행 이동) 미래의 지지 또는 저항 영역의 상단을 나타냄 선행스팬 2 (Leading Span B): (최고가 + 최저가) / 2 (최근 52일 기준, 26일 후행 이동) 미래의 지지 또는 저항 영역의 상단을 나타냄 후행스팬 (Lagging Span): 당일 종가 (26일 선행 이동) 당일종사를 26일 전의 위치에 표시 현재의 주가가 26일 전의 주가와 비교하여 강세 또는 약세를 판단 구름대 선행스팬1과 선행스팬2 사이의 영역을 색칠하여 나타냄 미래의 강력한 지지 또는 저항 영역으로 해석, 구름대의 두께는 지지/저항의 강도를 나타냄 양운(선행스팬1> 선행스팬2): 상승추세의 가능성 음운(선행스팬1< 선행스팬2): 하락추세의 가능성 ichimoku(high, low, close, tenkan=None, kijun=None, senkou=None, include_chikou=True, offset=None, **kwargs) 함수를 사용하여 계산할 수 있습니다. tenkan은 전환선기간, kijun는 기준선과 선행스팬1의 기간, senkou는 후행스팬의 기간을 나타내며 각각의 기본값은 9, 26, 52입니다. 이 함수는 2개의 DataFrame을 반환합니다. 첫번째는 자료와 같은 기간...

[Matplotlib]matplotlib.dates 모듈

matplotlib.dates 모듈을 사용한 날짜 수정 import matplotlib.pyplot as plt import matplotlib.dates as mpl_dates 형식: mpl_dates.DateFormatter('%y%m%d') '%Y-%m-%d': YYYY-MM-DD 형식 '%Y/%m/%d': YYYY/MM/DD 형식 '%b %d, %Y': Apr 15, 2025 형식 '%y-%m-%d %H:%M:%S': yy-mm-dd HH:MM:SS 형식 축의 눈금 간격을 조정하기 위해 이 모듈이 Locator 클레스를 함께 사용합니다. DayLocator(): 특정 일 간격으로 눈금을 표시합니다. WeekdayLocator(): 특정 요일마다 눈금을 표시합니다. MonthLocator(): 특정 월마다 눈금을 표시합니다. YearLocator(): 특정 연도마다 눈금을 표시합니다. AutoDateLocator(): 자동으로 최적의 눈금 간격을 설정합니다. 다음은 일정기간의 주가 data에 대해 그래프를 작성한 것으로 x축을 날짜 표시를 첨가한 것입니다. plt.figure(figsize=(6, 3)) plt.plot(df["Close"]) ax=plt.gca() ax.xaxis.set_major_locator(mpl_dates.AutoDateLocator()) ax.xaxis.set_major_formatter(mpl_dates.DateFormatter('%y/%m/%d')) plt.xticks(rotation=45) plt.show() gac() 함수는 현재 활성화된 Axes 객체를 반환합니다. 즉, 그래프내의 데이터를 플롯하는 영역을 나타냅니다. 그러므로 ax=plt.gca()는 작성된 플롯의 축 객체를 ax에 할당한 것으로 ax.xaxis.~()는 그 풀롯의 x축을 조...

[stock]볼린져밴드(Bolinger Band, BB), Band%B,bandwidth

볼린져밴드(Bolinger Band, BB)와 Band%B 볼린져밴드(Bolinger Band, BB) Band%B bandwidth 볼린져밴드(Bolinger Band, BB) 볼린저 밴드(BB, Bollinger Bands)는 시장 변동성을 평가하고 잠재적인 과매수와 과매도 조건을 파악하는 데 사용됩니다. 볼린저 밴드는 가격 차트에 표시되는 세 개의 선으로 구성되며, 이는 단순 이동 평균(SMA)과 SMA 위아래로 두 배의 표준 편차를 포함합니다. 밴드는 시장 변동성에 따라 확장되고 수축되어 트레이더에게 잠재적 가격 움직임에 대한 통찰력을 제공합니다. 구성 요소: 볼린저 밴드는 일반적으로 세 개의 선으로 구성됩니다. 중심선 (Middle Band): 일반적으로 20일 단순이동평균선(SMA) 을 사용합니다. 이는 주가의 중기 추세를 나타냅니다. 상한선 (Upper Band): 중심선에서 위로 2 표준편차 떨어진 선입니다. 하한선 (Lower Band): 중심선에서 아래로 2 표준편차 떨어진 선입니다. 계산 방법: 중심선 (20일 SMA) 계산: 지난 20일 동안의 종가를 모두 더한 후 20으로 나눕니다. 표준편차 계산: 지난 20일 동안의 종가의 표준편차를 계산합니다. 표준편차는 가격 변동성의 정도를 나타냅니다. 상한선 계산: 중심선 + (표준편차 x 2) 하한선 계산: 중심선 - (표준편차 x 2) 볼린저 벤드는 주가가 통계저긍로 상한선과 하한선 사이에서 움직일 가능성이 높다는 전제를 기반으로 합니다. 약 95%의 주가 움직임이 이 밴드내에서 발생한다고 알려 있습니다. 과매수 및 과매도 판단: 주가가 상한선에 근접하거나 상향 돌파 → 과매수 상태로 간주되어 매도 시점으로 볼 수 있습니다. 주가가 하한선에 근접하거나 하향 돌파 → 과매도 상태로 간주되어 매수 시점으로 볼 수 있습니다. 하지만 강한 추세가 형성될 때는 주가가 밴드 밖에...

[stock] 지표계산을 위한 UDF

지표계산을 위한 UDF import numpy as np import pandas as pd import matplotlib.pyplot as plt import matplotlib.dates as mpl_dates x축형식 지정을 위한 UDF def xaxis_form(n=20, format='%y/%m/%d', ax=False): locator = mpl_dates.DayLocator(interval=n) form = mpl_dates.DateFormatter(format) if ax==False: ax=plt.gca() ax.xaxis.set_major_locator(locator) ax.set_xticklabels([]) else: ax=plt.gca() ax.xaxis.set_major_locator(locator) ax.xaxis.set_major_formatter(form) plt.xticks(rotation=45) A ADL def calculate_adl(df, short_period=3, long_period=10): high = df['High'] low = df['Low'] close = df['Close'] volume = df['Volume'] result=pd.DataFrame() result["MFM"] = ((close - low) - (high - close)) / (high - low) result["MFV"] = result["MFM"] * volume result["ADL"] = result["MFV"].cumsum() short_ema=result["ADL"].ewm...