분석 대상이 아직 확실치 않다. 종목 선정이 확실하다고 생각되면 매매 로직 개선에 집중을 한다.
그 외에 추세추종 매매에 추가할 보조지표는 없는지 서치하다가 ADX 라는 지표를 찾았다.
ADX?
Average Directional movement indeX
- 횡보할 때는 0에 가깝고
- 상승/하락 추세일 수록 값이 커진다. 보편적으로 25이상일 때 강하고, 20이하일 때 약하다고 한다.
DX? Directioanl Index
ex)
- +DI: 20 & -DI: 36-> 지난 기간(14일) 중 변동폭에서 20% 상승 & 36%는 하락
- 즉 변동폭은 56% 방향성이고, 44%는 방향성이 없었다.
단독으로 활용하기는 어렵기에 다른 지표와 함께 사용하는 것이 권장된다.
•주가가 고점을 깨면서 상승하는 동시에 ADX도 함께 최고점을 경신하고 있다면, 현재의 상승 추세가 매우 강력하다는 것을 보여준다. 따라서 추세를 거슬러 매도하기보다는 추세를 따라 신규로 매수하거나, 보유중인 비중을 늘리는 것을 고려할 수 있다.
•주가는 최고점을 경신하고 있지만 ADX값이 고점을 형성한 이후 하락하고 있다면, 상승 추세의 강도가 약화되고 있다는 신호이다. 따라서 현재의 상승추세가 곧 하락추세로 전환될 수 있으니, 매도 시기로 볼 수 있다.
•주가가 저점을 깨면서 하락하는 동시에 ADX도 함께 최고점을 경신하고 있다면, 현재의 하락 추세가 매우 강력하다는 것을 의미한다. 따라서 추세를 거슬러 매수하기보다는 보유비중을 줄이거나 매도하는 것을 고려할 수 있다.
•주가는 최저점을 경신하고 있지만, ADX값이 고점을 형성한 이후 하락하고 있다면, 하락 추세가 약해지고 곧 상승 추세로 전환될 수 있음을 암시한다. 따라서 추세 반전을 예상하고 매입하는 전략을 사용할 수 있다.
- 출처: 알파스퀘어
-> ADX가 25이상일 때만 매수하는 조건을 추가하면 어떨까
-> 추세 추종 매매에 활용하면 좋아 보인다. 허수를 없앤다.
1. pandas_ta 라이브러리 지원 여부 확인
있다.
2. Indicator 로직에서 처리
@staticmethod
def _create_adx(df: DataFrame):
adx_cols = ['ADX_14', 'DMP_14', 'DMN_14']
for col in adx_cols:
df[col] = pd.NA
adx = ta.adx(high=df['high'], low=df['low'], close=df['close'])
if adx is not None:
df[adx_cols] = adx[adx_cols]
return df
3. Visualize 로직에도 추가
@staticmethod
def _create_adx_plot(one_day_dataframe: DataFrame):
adx_base = 25 # 기준선
length = len(one_day_dataframe)
add_plots = [
mpf.make_addplot(
one_day_dataframe["ADX_14"], color="black", panel=3, width=2, ylabel="ADX/DMP/DMN"
),
mpf.make_addplot(
one_day_dataframe["DMP_14"], color="red", panel=3, width=1, secondary_y=False
),
mpf.make_addplot(
one_day_dataframe["DMN_14"], color="blue", panel=3, width=1, secondary_y=False
),
mpf.make_addplot(
np.full(length, adx_base), color="gray", panel=3, width=1, linestyle='dashed'
),
]
return add_plots
4. 체크
굳
5. 백테스팅
- 매수 조건 추가
if not pd.isna(row['ADX_14']) and row['ADX_14'] < 25:
return False
ADX 25 미만이면 구매하지 않는다.
결과는
총 거래 수: 37.0
총 순수익: 56,788,745 원
📊 총 수익률: 56.79%
✅ 승률: 48.65%
거래 수는 줄고, 수익률을 올랐다. 그런데 승률은 내려갔다.
거래 수가 너무 적다. 그런데, 또 많이 거래한다고 많이 버는 건 아니니까... 도입해보니 좋다.
거래 수를 늘려보고자 ADX를 20으로 재조정해서 백테스팅 해본다.
총 거래 수: 39.0
총 순수익: 61,689,195 원
📊 총 수익률: 61.69%
✅ 승률: 51.28%
굳
'Quant' 카테고리의 다른 글
Backtrader 리팩토링 (1) | 2025.07.08 |
---|---|
연산 최적화 (2) | 2025.07.07 |
전략 최적화 (3) (1) | 2025.07.05 |
전략 최적화 (2) (4) | 2025.06.30 |
전략 최적화 (1) (6) | 2025.06.29 |