안녕하세요?


지난번 포스팅에서 RLtrader에서 환경모듈을 만드는 것을 보여주었습니다. 이번 포스팅에서는 에이전트(Agent)모듈이라고 해서 주식을 매수하거나 매도하는 투자자 역할을 하는 모듈을 만들 것인데, 이전에 만들었던 환경 모듈과는 다르게 상당히 길어서 다소 정신이 없을 수도 있습니다.



먼저 import라는 명령어는 다른 모듈을 가져와서, 그 모듈에 있는 함수를 쓸 수 있도록 만들어 줄 수 있습니다. 그리고 이 에이전트 모듈에서는 다음과 같은 속성들이 사용이 됩니다.

initial_balance: 초기 투자금, balance: 현금 잔고, num_stocks: 보유 주식수

portfolio_value: 포트 폴리오 가치라고 해서, 투자금 잔고+(주식현재가 * 보유 주식수)=포트 폴리오 가치를 나타냅니다.


그리고 사용이 된 함수는 다음과 같은 역할을 각각 수행합니다.

reset(): 에이전트의 상태의 초기화하는 메소드, set_balance(): 초기 자본금 설정하는 메소드

get_states(): 에이전트 상태를 획득하는 메소드, decide_action(): 탐험 또는 정책 신경망에 의한 행동을 결정하는 메소드

validate_action(): 행동의 유효성 판단이라고 해서 실제로 행동을 할 수 있는지 알아보는 메소드

decide_trading_unit(): 얼마나 많은 수의 주식을 매수 또는 매도할 것인지를 결정하는 메소드

act(): 행동을 수행하는 메소드

이런 식으로 구성이 되어 있습니다.



먼저 위 스크린샷과 같이 초기화 시키는 메소드를 만들어 주도록 합니다.



그리고 나서 delayed_reward_threshold라고 해서 손익률-소위 손실과 수익을 백분률로 나타낸 %인 손익률이 이 값을 넘어가면 지연보상이 발생합니다. 그리고 이어서 초기 자본금을 가져오고, 다음으로 에이전트 상태를 획득하는 메소드를 코딩 하였습니다.




위 스크린샷에서 나오는 rand()라는 함수는 NumPy에서 제공하는 함수로 0~1사이에서 랜덤한 값을 생성하는 메소드이며, 다음으로 randint(low, high)메소드는 high에 값을 입력하면 low에서 high사이의 값 중에서 정수를 랜덤하게 생성하며, high가 입력되지 않으면 0에서 low사이에서 랜덤한 정수를 생성하는 함수입니다.


그리고 나서 argmax(array)라는 메소드인데, 이 메소드는 array안에 있는 가장 큰 값을 찾아내서 index를 구해주는 메소드로써, NumPy에서 제공해 주는 메소드입니다.


일단 RLtrader자체에 있는 문제라면 문제가...... 일단 거래 수수료와 세금을 제외하고 계산을 하기 때문에 실제 수익에 바로 연결이 되지 않는다는 것 입니다. 이를 생각하면 실전에 들어가서는 이를 생각해야 할 듯 합니다.



그리고 나서 act()라는 사용자 정의 함수에서 이미 보상을 받았기 때문에, 보상 자체를 초기화 하도록 하고, 다음으로는 매수 행동의 수행 부분을 코딩 하고자 합니다.



그런데 이상하게 많은 에러가 발생한다 했더니......




바로 이렇게 Tab키를 잘못 눌러서 생기는 상황이 된 것입니다. 일단 여기서는 보유 현금이 모자랄 경우 그 경우에 맞도록 행동을 하도록 일단 설정이 되었습니다.



다음은 매도 행동을 하는 부분입니다. 여기서는 반대로 보유 주식이 모자랄 경우에 맞춰서 행동을 할 수 있도록 만들어 졌으며, 그냥 관망이라고 해서 아무 행동도 하지 않는 것을 또한 보여주고 있습니다. 여기서 하나 파이썬의 특이한 것을 볼 수 있는데, 바로 if문에서 보통은 else if를 쓰나, 파이썬에서는 elif라고 간단하게 줄여서 쓰는 것을 볼 수 있습니다.



마지막으로 보상이라고 해서 수익이 발생하면 잘한 행동이라고 판단을 하고, 손실이 발생하면 잘못된 행동이라고 판단을 하는데, 그 때마다 관여하는 것이 바로 이 보상입니다. 여기서 나오는 수치에 따라서 딮러닝에서 나오는 결과가 달라질 수 있기 때문에, 이에 대해서는 나중에 조절할 일이 있어 보입니다.

+ Recent posts

티스토리 툴바