돈벌고싶다

파이썬으로 모멘텀 지표 주가추세 매매 백테스팅 본문

코인과코딩, 그리고 인공지능

파이썬으로 모멘텀 지표 주가추세 매매 백테스팅

coinwithpython 2022. 6. 30. 16:31
728x90
반응형

소개

최근에 나름 유용하게 보고 있는 보조지표인 momentum 지표에 대해 소개할까 한다. 심지어 코드 구현이 너무나도 쉽게 때문에, 이를 활용하여 자동매매 프로그램 만들기가 변동성 돌파 전략보다 쉽다.

 

해당 전략은 다음 글에서 사용되는 전략으로, 10일 모멘텀 지표와 그에 대한 9일 이동평균선을 시그널선으로 이용하여 매수매도시점을 포착한다. 백테스팅 결과 생각보다 의미있는 수익률이 나왔다(https://layhope.tistory.com/321)

 

 

모멘텀 지표 (Momentum) 주가추세 매매기법

주식투자시 모멘텀(Momentum) 이라는 말을 많이 들어보셨을 겁니다. 모멘텀의 사전적의미는 탄력,가속도 다른 방향이나 상태로 바뀌는 순간을 의미합니다. 이 뜻과 마찬가지로 주식차트의 모멘텀

layhope.tistory.com

 

자세한 내용은 링크를 참고하도록 하고, 그럼 코드를 통해 백테스팅을 해보자.

 


코드

 

1. 라이브러리

# 라이브러리
from pybit import usdt_perpetual
import numpy as np
import pandas as pd
import schedule
import time
import datetime
import calendar
import math
import matplotlib.pyplot as plt

 

2. 데이터 request 함수

def get_data(symbol, interval, limit):
    if type(interval) == int:
        now = datetime.datetime.utcnow()
        unixtime = calendar.timegm(now.utctimetuple())
        since = unixtime-interval*60*limit;
        response = session.query_kline(symbol=symbol,interval=str(interval), from_time=since, limit=limit)['result']
    elif interval == 'D':
        now = datetime.datetime.utcnow()
        unixtime = calendar.timegm(now.utctimetuple())
        since = unixtime-1440*60*limit;
        response = session.query_kline(symbol=symbol,interval=interval, from_time=since, limit=limit)['result']
    return pd.DataFrame(response)

 

3. 필요 변수 정의

# 필요 변수 정의.
symbol = "BTCUSDT"                               # 코인명
interval = 'D'                                    # 데이터 기준
limit = 200                                      # 데이터양

# api 정보 입력
session = usdt_perpetual.HTTP(
    endpoint="https://api-testnet.bybit.com", 
    api_key='my_api_key', 
    api_secret='my_api_secret',
)

 

4. momentum 지표 생성 및 시각화

data = get_data(symbol, interval, limit)
data['momentum'] = data['open'].pct_change(10)
data['ma_momentum'] = data['momentum'].rolling(window=9).mean()
data[['open_time', 'close', 'momentum', 'ma_momentum']].plot(x='open_time', figsize=(12, 5), secondary_y=['momentum', 'ma_momentum'])
plt.axhline(0, color='lightgray', linestyle='--', linewidth=2)

 

blue line이 종가 데이터로, 왼쪽 축을 사용한다.

 

5. 백테스팅 : 0시 0분에 매수, 23시 59분에 매도

leverage = 1
fees = 0.048

data['long'] = data.apply(lambda x: (x['close']/x['open']-(fees/100)*2-1)*leverage+1 if x['momentum'] > x['ma_momentum'] else 1, axis=1)
data['short'] = data.apply(lambda x: (x['open']/x['close']-(fees/100)*2-1)*leverage+1 if x['momentum'] < x['ma_momentum'] else 1, axis=1)

 

6. 결과

data['long'].cumprod().iloc[-2], data['short'].cumprod().iloc[-2]

 

실행 결과 2021년 12월 12일 ~ 2022년 6월 30일 사이에는 위 시각화 자료에서 볼 수 있듯 하락장이였으며, long으로는 -29프로 수익률을, short으로는 63프로 수익률을 기록하였다. 독립사건으로 50대 50으로 투자를 진행하였다면 34프로의 수익률을 기록한 셈이다. 즉, 모멘텀 지표를 활용한 매매를 할 경우 상승이던 하락이던 추세가 형성될 경우 큰 수익률을 얻을 수 있다.

 


지속적인 테스트를 거치며...

 

아니나 다를까. 역시나 테스트했던 기간이 좋았을 뿐, 장기적으로는 수익을 보기 힘들었다. 결국 횡보장은 자동매매 프로그램에게 있어 극복하기 힘든걸까?

728x90
반응형
Comments