강화학습에서는 에이전트에 주는 보상 정책을 많이 신경써줘야한다.
칭찬받을 짓을 했는데 뺨때리면 사람이 악해지듯이.. 어쨌든 보상과 패널티를 잘 줘야한다.
주식 도메인에서 보상을 어떻게 유형화할 수 있을까?
<매수, 매도 시 보상 지급>
어떤 케이스는 <매수, 매도 시 보상 지급>을 discrete하게 하는데,
이 방법이 효과적인 방법인지는 의문인 것이,
아무리 많이 벌었을 때도 1이라는 보상을 주기 때문에
모델이 Greedy하게 학습하지 못할 수 있다는 것이다.
<초기 잔고 대비 포트폴리오 가치>
그래서 <초기 잔고 대비 포트폴리오 가치>
즉, 내 씨드머니에 비해 현재 스텝에서 얼만큼의 수익률을 올리고 있는가?를 reward로 책정했다.
prototype으로 삼성전자를 몇 에피소드 돌려봤는데
에피소드가 지날수록 수익실현을 잘 하는 것으로 보이긴한다
<사실 신뢰성은 없다. validation도 안해봤기 때문이다>
근데 다시 생각해보니 reward가 오용되고 있다는 것을 느꼈다.
핵심은 "어쨌든 초기 자본금보다 높은 수익률을 유지 중이라면,
어떤 행동을 해도 <+> reward를 받게되는 것이다"
물론 reward가 극대화되는 방향으로만 잘 학습이 된다면 문제가 없겠지만,
다음과 같은 사례에선 '아 이 방법은 안되겠구나'라는 생각이 들것이다
잔고 : 1000
state | action | reward | protfolio_value | portfolio
s0(100) buy 0 1000 900(seed) / 100(stock)
s1(200) hold 0.1 1100 900(seed) / 200(stock) -- 초기 자본 대비 10% 상승
s2(150) hold 0.05 1050 900(seed) / 150(stock) -- 초기 자본 대비 5% 상승
이미 초기 자본보다 오른 상태(s1)라면 가격이 떨어져도,
s2에서 hold하는 방법이 양의 보상을 가진다는 것을 의미한다.
우리는 고점에서 팔기를 원하는데, reward 산정의 기준(anchor)를
내 씨드머니로 설정해버리면, 모델은 이렇게 생각한다
"아 어차피 너 처음 가진 돈보다만 많이 벌면되잖아~"
과장했지만, 가격이 떨어지는 상황에서 하는 패널티를 받을만한 행동들이
긍정적인 평가를 받을 수 있게되는 상황이 생기는 것이다.
<존버는 사람만 해야하는 행동이지, 모델은 존버보다는 저점에서 사고 고점에서 파는 학습을 해야한다>
<전일 포트폴리오 가치 대비 당일 포트폴리오 가치>
문제가 되었던 건 초기 자본금이 anchor 역할을 했을 때라고 요약할 수 있겠다.
그렇다면 기준점을 전일까지의 포트폴리오 가치라고 생각하면 어떨까?
다시 똑같은 상황으로 가보자
잔고 : 1000
state | action | reward | protfolio_value | portfolio
s0(100) buy 0 1000 900(seed) / 100(stock)
s1(200) hold 0.1 1100 900(seed) / 200(stock) -- 전일 자본 대비 10% 하락
s2(150) hold -0.454.. 1050 900(seed) / 150(stock) -- 전일 자본 대비 5% 하락
이 경우 패널티를 더 정확하게 계산할 수 있는 것처럼 보인다.
s2로 넘어오면서 주식 가격이 150원으로 하락하니 hold가 아닌 sell을 했어야했던 것이다.
그런데 치명적인 문제가 하나있다.
바로 "즉시 보상 산정의 어려움"이다
위 사례에서 reward를 주는 방식을 보면,
현재 스텝에서 주어지는 보상이 이전 스텝의 행동에 종속되어있음을 볼 수 있다.
쉽게 말하면 s0에서 했던 buy의 결과가 s1에서의 즉시 보상으로 주어진다는 것이다.
<100(stock)을 s0에서 사서 s1에서 200(stock)으로 올랐기 때문에>
이게 왜 문제냐하면, s1에서 주어지는 즉각적인 보상이 액션과 관계없이 정해져있다는 소리다.
즉, s1에서 buy를 하건, sell을 하건, hold를 하건 간에, 이미 s0에서 발생한 보상이 reward로 들어온다.
서로 다른 action을 해도 reward, 즉 전일 대비 당일 포트폴리오의 가치가 변하지 않는 원인은
reward를 매기는 포트폴리오의 가치는 [현금+주식가치]로 매겨지기 때문이다.
잔고 : 1000
state | action | reward | protfolio_value | portfolio
s0(100) buy 0 1000 900(seed) / 100(stock)
s1(200) hold 0.1 1100 900(seed) / 200(stock) -- 전일 자본 대비 10% 상승
s2(150) buy -0.454.. 1050 750(seed) / 300(stock) -- 전일 자본 대비 5% 하락
잔고 : 1000
state | action | reward | protfolio_value | portfolio
s0(100) buy 0 1000 900(seed) / 100(stock)
s1(200) hold 0.1 1100 900(seed) / 200(stock) -- 전일 자본 대비 10% 상승
s2(150) hold -0.454.. 1050 900(seed) / 150(stock) -- 전일 자본 대비 5% 하락
잔고 : 1000
state | action | reward | protfolio_value | portfolio
s0(100) buy 0 1000 900(seed) / 100(stock)
s1(200) hold 0.1 1100 900(seed) / 200(stock) -- 전일 자본 대비 10% 상승
s2(150) sell -0.454.. 1050 1050(seed) / 0(stock) -- 전일 자본 대비 5% 하락
[현금+주식가치]로 portfolio가치를 매기게되면 다음과 같은 잘못된 가정이 전제된다.
"안전자산인 현금과 위험자산인 주식의 가치는 같다"는 것이다
s2에서 action을 했을 때 portfolio의 가치는 모두 변하지 않았지만
리스크 수준은 모두 달라졌다.
s3에서 가격이 더 하락하면 sell한 액션은 긍정적으로 평가받을 것이고,
buy 액션은 부정적으로 평가받을 것이다.
과연 포트폴리오의 가치의 변동 자체를 보상함수로 나타내도 되는가에 대한 의문을 품게된다.
다시 돌아와서..
위와 같은 보상함수들은 보상의 정의와 어긋난다고 나는 생각했다.
분명 보상은 "현재 state에서 진행한 action에 따른 보상"이 되어야한다.
내가 이 고민을 할 수 밖에 없었던 이유는,
실제 주식 시장에서 거래를 할 때, 그 누구도 즉시 보상을 줄 수 없는 환경이다.
생각을 해보자.
올라갈지 떨어질지도 모르는 주식을 오늘 샀다고해서
나에게 돌아오는 수익은 발생하지 않는다.
게임의 경우는 다르다.
내가 오른쪽으로 갔을 때 절벽으로 떨어진다면 나에겐 엄청난 패널티를 준다.
하지만 주식은 즉각적으로 그 누구도 즉각적으로 피드백을 주지 않는다.
그럼 이쯤에서 다시 생각해본다
"즉각적인 보상은 정말 필요한가?"
내 결론은 "필요하게 만들면 된다"이다.
<평단가 대비 수익률>
본질로 돌아와서 우리가 주식 거래를 할 때,
가장 초점을 맞추고 있는 것은 "내가 산 주식의 수익률"이다.
물론 나의 초기 자본금에 비해서 얼만큼 수익을 내고있는지도 의미가 있지만,
에이전트를 통해 수익률을 극대화하기 위해 이 방법이 제일 적절하다고 생각했다.
1. 즉시 보상 산정의 어려움 해결
AS-IS : 내 포트폴리오 가치를 reward로 주게되면,
이전 스텝에서 혹은 그 이전 스텝에서 실행했던
액션과 종속적인 관계를 맺을 수 밖에 없다.
TO-BE : 현실 세계에서도 즉시 보상을 결정하기 어려운 상황
Buy, Hold할 때의 reward를 0으로 없애버린다
2. 즉시 보상을 줄 수 있는 상황 조성
AS-IS : 이전 보상체계는 내가 가진 주식을 Sell 해도
즉시 보상값이 바뀌지 않는 문제가 있었다.<이미 이전 action에서 정해졌기 때문>
TO-BE : 평단가 개념을 이용해서 Sell Event가 발생할 때만
얻은 수익률을 즉시 보상으로 주자.
수익률 = [현재가 - 평단가] / 평단가
$ advantage func. : Buy = 0 + \gamma V(s_{t+1}) - V(s_{t}) $
$ advantage func. : Hold = 0 + \gamma V(s_{t+1}) - V(s_{t}) $
$ advantage func. : Hold = reward + \gamma V(s_{t+1}) - V(s_{t}) $
$ reward = (current price - avg_buy_price) / avg_but_price $
* buy와 hold는 현실 세계처럼 오로지 미래에 대한 기대 보상에 의존하여 학습하게된다.
'Data Analysis > [Project] Financial Reinforce Agent' 카테고리의 다른 글
주식 강화학습 에이전트 만들기 - 전체 리뷰 (7) | 2023.12.05 |
---|---|
강화학습 REINFORCE ALGORITHM의 업데이트 (3) | 2023.10.23 |
Policy Based Reinforce Learning in Stock Trading - 정책기반 강화학습과 주식 (0) | 2023.10.22 |
Financial Time-Series Overview<1> (0) | 2023.08.18 |
투자 용어 간단 정리 - 물가연동국채, 전환사채, 권리락 (1) | 2023.07.11 |