strong-win / stock-craft

Web game project, casually learning stock trading
8 stars 0 forks source link

[스프린트 #5] sequence 정리 : ML model init, and use, and delete #33

Closed hojunee closed 2 years ago

hojunee commented 2 years ago

기능 Issue

Contents

본 스프린트는 ML서버와 App서버 간의 결정된 JSON spec을 바탕으로 MongoDB와 연동을 통해 stateful한 connection을 유지하는 것을 기반으로 합니다.

핵심 작업사항

  1. API spec을 정의합니다.
  2. MongoDB에 정보를 교환하면서 App Server에 올바른 정보를 전달합니다.

진행사항 체크리스트

  1. Band 기반 데이터 추출 구현코드 작성 (get_current_price() function in #32)

    • [x] @beeetea
  2. API Spec 정의
    endpoint와 payload를 아래에 정리해두었습니다. 문제가 될 만한 부분이 있으면 comment 달아주세요!

    • [x] @beeetea
    • [x] @rxdcxdrnine
  3. 내부 로직 구체화

    • [x] @beeetea
    • [x] @handal95
  4. Mock NoSQL Server(MongoDB Atlas)에 Mock Data를 바탕으로 통신 구현

    • [x] @beeetea
  5. NoSQL Server(dev-database)에 Real Data를 바탕으로 통신 구현

    • [x] #38
  6. 핵심 작업사항 마무리

    • [x] @beeetea

API Spec

POST /model

Client Side : 게임이 시작될 때 호출

REQ body

{
 "gameId": ObjectId
}

RES body

{
 "corps": [
  {corpId: String(6), totalChart: Array[Integer]},
  {corpId: String(6), totalChart: Array[Integer]},
 ]
}

NOTE

PUT /model

Client Side : ?? -> 새벽 시 호출

REQ body

{
 "gameId": ObjectId,
 "event": {
  `corpId`: {
    "increment": Integer,
    "buyingVolume": Integer,
    "sellingVolume": Integer
   }
  ...
 }
}

RES body

{
 "gameId": ObjectId,
 "corps": {
  `corpId`: {
    "info": enum(1, 0)
   }
   ...
 }
}

NOTE

DELETE /model

Client Side : 게임이 종료될 때 호출

REQ body

{
 "gameId": ObjectId
}

RES body

{
 "gameId": ObjectId
 "status": "OK"
}

TO-DO:

매수세/매도세 반영 -> 비율을 바탕으로 random sampling 과정에서 일정한 확률로 반영비 조정 예정


관련 링크

hojunee commented 2 years ago

@handal95 위 API Protocol을 지키기 위해서는 모델 학습 과정에서 config 파일에 해당하는 기업의 정보(ticker)가 담겨야할 것 같은데, 현재는 그냥 open1 이런 형태로 되어있는 것 맞나요?

rxdcxdrnine commented 2 years ago

@beeetea

  1. corpName 을 포함하지 않으면, app 서버 내부에서 랜덤으로 corpName 을 생성해야 하는건가요?
  2. PUT /model 에서 increment 가 어떤 것을 의미하는 건가요?
  3. PUT /model 에서 시간 정보가 포함되어야할 것 같습니다. 편의를 위해 날짜가 넘어갈 때 이전 시간 (prevTime) 과 이후 시간 (nextTime) 을 모두 넘겨드리려고 하는데 어떨까요? 아래와 같은 type 이 될 것 같아요
type TimeState = {
  week: number;
  day: number;
  tick: number;
};

class ChartRequestDto {
  gameId: string;
  prevTime: TimeState;
  nextTime: TimeState;
  corps: {
    [key: string]: {
      increment: number;
      buyQuantity: number;
      sellQuantity: number;
  };
}

([key: string] 에 해당하는 것이 해당 기업의 ID 입니다.)

hojunee commented 2 years ago
  1. 넹 그렇습니다.
  2. PUT /model에서 increment는 최종 변동. 어떤 아이템을 썼다. 이런건 제가 관심이 없어요. (아이템 사용) -> 얼마나 바뀌나? (-INF, INF)의 범위로 주시면 됩니다.
  3. buyQuantity, sellQuantity로 fix합시다. :>
hojunee commented 2 years ago

Market DB document spec:

{
 "gameId": str(6), # 게임 고유번호 
 "modelPath": str(*), # 모델 정보 경로 ("/<...>.pt")
 "modelConfig": object, # 모델에서 사용되는 config
 "companies": [ # 기업 정보를 담고있음
  {
   "corptId": str(6), # 기업 ticker(KOSPI 200)
   "totalChart": list[int] # 주가 정보가 담겨있음
  }
  ...
 ]
}
handal95 commented 2 years ago

데이터 관리 및 모델과의 정확한 매칭은 Market에서 관리하는 것으로 통일합니다.

ML Core가 하나의 파일 및 class 형태로 내부적으로 처리되면서 ML을 별도의 서버에서 운용하지 않고, 각 함수들의 파라미터 및 입출력을 이용하여 관리합니다.

파라미터의 형태 및 가변 요소들에 대해서는 추가적으로 논의합니다.

hojunee commented 2 years ago

@beeetea

  1. corpName 을 포함하지 않으면, app 서버 내부에서 랜덤으로 corpName 을 생성해야 하는건가요?
  2. PUT /model 에서 increment 가 어떤 것을 의미하는 건가요?
  3. PUT /model 에서 시간 정보가 포함되어야할 것 같습니다. 편의를 위해 날짜가 넘어갈 때 이전 시간 (prevTime) 과 이후 시간 (nextTime) 을 모두 넘겨드리려고 하는데 어떨까요? 아래와 같은 type 이 될 것 같아요
type TimeState = {
  week: number;
  day: number;
  tick: number;
};

class ChartRequestDto {
  gameId: string;
  prevTime: TimeState;
  nextTime: TimeState;
  corps: {
    [key: string]: {
      increment: number;
      buyQuantity: number;
      sellQuantity: number;
  };
}

([key: string] 에 해당하는 것이 해당 기업의 ID 입니다.)

여기서 ChartRequestDto에 가격변동을 위한 아이템(기관: 공매도, 찌라시)에 대응되는 param을 넣어야할 것 같아요. 10% 상승과 하락이 최종 가격 생성에 영향을 미칠 수 있도록 하는 로직을 만들고 있는데, 이를 눈치챌 수 있는 payload 속 정보가 없네용

hojunee commented 2 years ago

/PUT model의 res

{
 "gameId": String(6),
 "corps": {
  `corpId`: {
    "info": enum(1, 0)
   }
   ...
 }
}
hojunee commented 2 years ago

해당 작업 끝! issue close합니다. 다들 조금만 더 힘냅시다. :>