삶의 공유
[Python] brute함수를 이용하여 자동 매매 이동평균선 전략 최적화 하기 본문
안녕하세요 ~
이번 포스팅에서는 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 함수를 이용하여 최적값을 찾아 전략에 넣으면 수익률을 극대화하는 도움이 될 것이라고 생각합니다.
오늘의 포스팅은 여기까지 입니다.
읽어주셔서 감사합니다.
'Data Scientist > Python' 카테고리의 다른 글
[파이썬] 투자를 위한 경제 지표 데이터 수집 및 시각화 (장, 단기 금리) (0) | 2022.09.04 |
---|---|
[Python] Turtle 객체를 이용하여 그림 그리기 (0) | 2022.08.15 |
[파이썬] Customizing Plotly Chart (0) | 2022.05.23 |
[파이썬] Daily 수익률 표준 편차와 누적 수익률과의 관계 확인 (0) | 2022.05.22 |
[파이썬] pandas datareader 라이브러리를 이용한 데이터 로딩 및 시각화 (0) | 2022.05.16 |