[20250612] DQN, Reward Change

완전히 다시 시작.

알고리즘

  • Clean RL 오픈소스 기반으로 전부 재설계. 그래프만 기존 코드 반영
  • DQN부터 시작해서, DQN으로 끝까지 가보고 그 다음 다른 알고리즘으로 넘어가자.

데이터 

  • 비트코인 2020~2025년 5월까지 데이터
  • 1시간 봉 사용

리워드

  • 기존방식은, 초기 투자금과 현재 계좌의 가치 차이만큼 리워드로 부여함
  • reward = (self.net_worth - self.initial_balance) / self.initial_balance
  • 그러나 너무 초반에 사서 들고만 있으려는 성질이 강하다. 비트코인 가격이 계속 올랐기 때문에 들고 있어도 좋았지만, 나는 능동적으로 자주 사고 파는 Agent를 만들고 싶다.
  • 따라서, 어차피 학습시에는 미래 가격을 알 수 있다는 점을 활용하여 특정 시점의 미래 가격 대비해서 현재가 고점인데도 팔지 않았으면 마이너스 리워드를 주고, 저점인데 안샀으면 마찬가지로 마이너스 리워드를 부여했다.

Observation 설계

  • Reward 만큼이나 자유도가 많은 부분..
  • 일단 과거 30일치의 1시간 봉 데이터 + 현재 들고 있는 코인, 현금 정보만 입력
  • 아래는 앞으로 실험해볼 observation
  1. 볼린저 밴드 대비 현재 가격 정보
  2. 이평선 대비 현재 가격 정보
  3. 과거 고점 가격 대비 현재 가격 정보
  4. 거래량 변동 정보
  5. 하이킨 아시 정보
  6. 과거 K 시간 동안의 가격 변동률

위 데이터들을 각각 어떻게 넣을지도 선택지가 너무 많다.. 하나씩 넣어보면서 결과가 좋아지는지 봐야할듯

아키텍처

  • QNetwork(
      (network): Sequential(
        (0): Linear(in_features=724, out_features=3072, bias=True)
        (1): ReLU()
        (2): Linear(in_features=3072, out_features=3072, bias=True)
        (3): ReLU()
        (4): Linear(in_features=3072, out_features=1024, bias=True)
        (5): ReLU()
        (6): Linear(in_features=1024, out_features=3, bias=True)
      )
    )
  • DQN이기 때문에 모델은 하나만 필요
  • 3층보다 더 쌓으면 오히려 결과가 구림
  • LR, Batch, Epoch 등 조절해야 하는 파라미터가 산더미..

중간 결과

  • 24년 12월까지 학습, 25년 이후 데이터로 평가
  • 처음에 하락할 때는 사지 않고 기다리다가, 저점에서 사서 딱 한번만 팔고 계속 가지고 있는 상황, 결국 26%이상 수익