삶의 공유

[Python] brute함수를 이용하여 자동 매매 이동평균선 전략 최적화 하기 본문

Data Scientist/Python

[Python] brute함수를 이용하여 자동 매매 이동평균선 전략 최적화 하기

dkrehd 2022. 6. 7. 22:56
728x90
반응형

안녕하세요 ~ 

 

이번 포스팅에서는 scipy라이브러리 내에 있는 brute함수에 이용하여 최적화된 이동평균선 값을 구하여 수익률을 극대화 하는 알고리즘을 구현해보겠습니다.

 

먼저 데이터를 Load하겠습니다. 저는 미리 다운 받아 둔 ohlcv데이터를 이용할 것입니다. 여러분들은 여러 증권사 API를 이용하여 데이터를 가져오셔도 무방 할 것 같습니다.

 

ohlcv중에 close 컬럼만 가져오시면 됩니다.

 

df = pd.read_csv("eurusd.csv", parse_dates = ["Date"], index_col = "Date")

 

 

자 이제 데이터는 준비가 되었습니다. 이제 SMA전략을 코드로 구현해보겠습니다.

코드는 어렵지 않습니다. SMA_S가 단기 이평선, SMA_L가 장기 이평선이고 단기 이평선이 장기 이평선을 돌파하면 매수, 반대 상황은 매도 하는 전략입니다.

 

def run_strategy(SMA):
    data = df.copy()
    data["returns"] = np.log(data.price.div(data.price.shift(1)))
    data["SMA_S"] = data.price.rolling(int(SMA[0])).mean()
    data["SMA_L"] = data.price.rolling(int(SMA[1])).mean()
    data.dropna(inplace = True)
    
    data["position"] = np.where(data["SMA_S"] > data["SMA_L"], 1, -1)
    data["strategy"] = data.position.shift(1) * data["returns"]
    data.dropna(inplace = True)
    
    
    return -data[["returns", "strategy"]].sum().apply(np.exp)[-1]

 

먼저 brute 함수에 대해서 간략 하게 말씀드리면, 하기 그래프 처럼 x값에 떄라 대응 되는 y값들 중 최저 값이 나오는 x값을 찾는 것 입니다.

그래서 return 할때 - 를 붙여서 리턴값을 반환합니다.

 

brute 함수를 사용해보겠습니다.

from scipy.optimize import brute
brute(run_strategy, ((10, 50, 1), (100, 252, 1)))

brute(함수명, (SMA 튜플형)) 이 들어가는 유형이고 (10, 50, 1)의 의미는 10 부터 50까지 1씩 증가하면서 대입하겠다는 의미입니다.

즉 x 값으로 (10, 100) ->  (10, 101) 이런식으로 1씩 증가하면서 그에 대응 되는 y값, 즉 수익률이 높은 값 (앞에 -가 붙어 있으니 높은 값이 결국은 가장 낮은 값이 되는 것입니다)을 찾고 그에 해당 하는 x값의 조합을 리턴해주게 되는 것 입니다.

 

46, 137 조합으로 리턴을 해주었네요

 

이 조합을 하였을때으 수익률을 확인해보겠습니다.

 

-run_strategy((46, 137))

 

2.52배의 수익률을 나오는 조합을 찾은것을 볼 수 있습니다.

 

앞서 언급 한 것처럼 종목마다 잘 맞는 이평선 최적값이 다르기 때문에 brute 함수를 이용하여 최적값을 찾아 전략에 넣으면 수익률을 극대화하는 도움이 될 것이라고 생각합니다.

 

오늘의 포스팅은 여기까지 입니다.

 

읽어주셔서 감사합니다.

 

반응형