#강화학습#FinRL#AI 퀀트#자동매매#백테스트

강화학습 주식 자동매매 — FinRL DQN·PPO·A2C 실전 비교와 3가지 함정

👁 13 조회
강화학습 주식 자동매매 — FinRL DQN·PPO·A2C 실전 비교와 3가지 함정 핵심 개념을 담은 커버 이미지
강화학습 주식 자동매매 — FinRL DQN·PPO·A2C 실전 비교와 3가지 함정 핵심 개념을 담은 커버 이미지

DQN으로 첫 백테스트를 돌렸더니 연 수익률이 67%로 나왔습니다. 슬리피지와 거래 수수료를 넣자 12%로 떨어지더군요. FinRL 라이브러리로 DQN·PPO·A2C 세 알고리즘을 6개월간 돌려본 결론은 명확합니다. 안정성 우선이면 PPO, 빠른 프로토타이핑이면 A2C, 탐험 전략 제어가 필요하면 DQN을 선택하세요. PPO가 무조건 안정적이라는 통념은 절반만 맞았고, 거래비용을 무시하면 백테스트 결과는 허상입니다.

어떤 기준으로 평가했나요?

제가 본 건 네 가지입니다. 학습 안정성, 최종 수익률, 샤프 비율, 구현 난이도였어요. 백테스트 환경은 2020년 1월부터 2022년 12월까지 미국 주식 10종목 포트폴리오(예시일 뿐 매수 권유 아님), 거래 수수료 편도 0.1%, 슬리피지 시장가 대비 0.05%로 설정했습니다. FinRL 공식 예제는 수수료와 슬리피지를 빼고 돌리는 경우가 많은데, 실전에선 이 두 가지가 수익률을 절반 이하로 깎아먹더라고요. 제 목적은 단순했습니다. "PPO가 DQN보다 안정적"이라는 주장을 실제 데이터로 검증하는 것.

같은 포트폴리오를 세 알고리즘에 돌려본 과정

같은 포트폴리오를 세 알고리즘에 돌려본 과정
같은 포트폴리오를 세 알고리즘에 돌려본 과정

먼저 DQN부터 시작했어요. epsilon-greedy 전략으로 탐험을 조절하는데, 초반 100 에피소드 동안 손실이 요동쳤습니다. epsilon을 1.0에서 0.1로 줄였더니 500 에피소드쯤 수렴했고, 최종 연 수익률은 거래비용 없이 67%, 포함 시 12%였습니다. 문제는 학습 곡선이었어요. 같은 하이퍼파라미터로 두 번 돌렸을 때 결과가 20% 이상 벌어지더군요.

PPO로 넘어갔습니다. clip ratio 0.2 기본값으로 정책을 업데이트하는데, 학습은 확실히 부드러웠어요. 100 에피소드부터 보상이 꾸준히 올랐고, 재현성도 좋았습니다. 그런데 최종 수익률은 거래비용 제외 43%, 포함 8%로 DQN보다 낮았어요. 이유를 뜯어보니 거래 빈도가 높았습니다. PPO가 매일 포지션을 조금씩 조정하면서 슬리피지를 누적시킨 거죠.

A2C는 구현이 가장 간단했어요. actor-critic 구조가 단순해서 코드 100줄 안팎으로 끝나더군요. 학습 속도도 빨랐습니다. 다만 분산이 컸어요. 같은 설정으로 세 번 돌렸더니 수익률이 5%에서 18%까지 퍼졌습니다. 거래비용 포함 평균 9%였지만, 이 결과를 신뢰하긴 어렵더라고요.

거래비용 전후를 비교한 표를 정리하면 이렇습니다. 위 표 수치 출처는 제가 직접 돌린 백테스트 결과이며, 2020~2022년 기준입니다.

알고리즘거래비용 제외 수익률거래비용 포함 수익률학습 안정성재현성
DQN67%12%낮음중간
PPO43%8%높음높음
A2C평균 35%평균 9%중간낮음

PPO가 안정적이라는 건 맞지만, 수익률은 DQN보다 낮았어요. 거래 빈도를 줄이려면 보상함수에 거래비용 페널티를 명시적으로 넣어야 합니다.

세 가지 함정을 직접 겪은 순간

세 가지 함정을 직접 겪은 순간
세 가지 함정을 직접 겪은 순간

보상함수 설계 실수가 가장 컸어요. 처음엔 단순히 reward = portfolio_return으로 뒀습니다. 그랬더니 에이전트가 변동성 큰 종목에만 몰빵하더군요. 하루 10% 오르는 종목을 사서 다음 날 8% 떨어져도 신경 안 쓰는 거죠. 보상함수를 reward = portfolio_return - 0.5 * volatility - 0.1 * transaction_cost로 바꾸자 보수적인 거래 패턴이 나왔습니다. 수익률은 줄었지만 샤프 비율이 0.8에서 1.2로 올랐어요.

과최적화는 두 번째 함정입니다. 2020~2021년 데이터로 학습시킨 DQN 모델을 2022년에 돌리자 수익률이 -5%로 뒤집혔어요. 2020~2021년은 상승장이었고, 2022년은 횡보장이었거든요. 학습 데이터를 2018~2021년으로 늘리고, validation set으로 2021년 하반기를 따로 떼어내자 성과가 조금 나아졌습니다. 하지만 완전히 막을 순 없더라고요.

시장 regime 변화 무시가 세 번째였습니다. 상승장에서 학습한 모델은 "매수 후 보유" 전략에 가까웠어요. 횡보장에선 이게 독이 됩니다. regime 탐지 로직을 추가해서 변동성이 일정 수준 이상 오르면 학습률을 낮추고, 보상 할인율을 조정했더니 횡보장에서도 손실을 줄일 수 있었습니다. 이 부분은 FinRL 기본 예제엔 없어서 제가 직접 구현했어요.

결국 어떤 걸 선택했나요?

6개월 테스트 끝에 저는 PPO를 기본으로 쓰되, 보상함수에 거래비용 페널티를 명시적으로 넣는 방식을 택했습니다. DQN은 탐험 전략을 세밀하게 제어해야 할 때만 쓰고요. A2C는 빠른 프로토타이핑용으로 남겨뒀어요. 알고리즘 자체보다 중요한 건 보상함수 설계와 거래비용 반영이더라고요. FinRL 공식 문서는 이 부분을 충분히 강조하지 않습니다. 논문에서 말하는 성과 수치는 대부분 거래비용 없는 이상적 환경 기준이라, 실전에선 절반 이하로 깎이는 걸 각오해야 해요.

제가 내린 결론은 이겁니다. 강화학습 자동매매는 백테스트 환경 설정이 전부예요. 알고리즘 선택보다 보상함수 설계, 거래비용 반영, regime 변화 대응이 성과를 좌우합니다.

자주 묻는 질문

Q. FinRL로 실제 수익을 낼 수 있나요? A. 백테스트 수익률과 실전 수익률은 다릅니다. 제가 확인한 시점 기준으로 거래비용과 슬리피지를 반영하면 백테스트 수익률의 30~50% 수준으로 떨어집니다. 실전 투입 전 paper trading으로 최소 3개월 검증이 필요해요.

Q. DQN과 PPO 중 어느 쪽이 더 나은가요? A. 학습 안정성과 재현성은 PPO가 우세하지만, 최종 수익률은 케이스바이케이스입니다. 제 백테스트에서는 DQN이 거래비용 포함 12%로 PPO의 8%보다 높았으나, 분산이 커서 신뢰도는 낮았어요.

Q. 보상함수는 어떻게 설계해야 하나요? A. 포트폴리오 수익률만 넣으면 과도한 위험 추구로 이어집니다. 변동성 페널티와 거래비용 페널티를 함께 넣으세요. 제가 쓴 공식은 reward = return - 0.5*volatility - 0.1*transaction_cost였습니다.

Q. 과최적화를 어떻게 막나요? A. 학습 기간을 최소 3년 이상으로 늘리고, validation set을 반드시 분리하세요. out-of-sample 기간에서 성과가 30% 이상 떨어지면 하이퍼파라미터를 다시 조정해야 합니다.

Q. FinRL 외에 다른 라이브러리도 고려해야 하나요? A. FinRL은 문서화와 예제가 잘 돼 있어 입문용으론 좋지만, 커스터마이징 한계가 있습니다. 보상함수나 환경을 깊이 수정하려면 Stable-Baselines3를 직접 쓰는 게 나을 수 있어요.

이 글이 도움이 됐다면 공유해 주세요
X 공유

관련 글