룬스케이프 Grand Exchange에서 알고리듬 트레이딩 봇을 돌린 기록
(tristanrhodes.com)- Old School RuneScape의 Grand Exchange는 아이템별 매수 한도와 거래세가 있는 게임 내 시장이라, 자동 매매 봇의 전략을 실험하기 좋은 제한된 시장 환경임
- 봇은 실시간 가격 수집, 캐릭터 조작, 주문별 예상 수익성 순위화를 각각 JavaScript·Java·Python 애플리케이션으로 나눠 처리함
- 학습 데이터는 5분·1시간 단위 가격 스프레드와 거래량에 실제 체결 주문의 gold/second를 결합해 만들었고, 최근 14일을 검증 세트로 분리해 시간 누수를 피함
- 1주일 비교 실험에서 평균 시간당 수익은 random forest가 150,892 gold/hr로 가장 높았고, neural network는 123,923 gold/hr, baseline은 87,353 gold/hr였음
- 머신러닝 모델은 기준 방식보다 높은 수익을 냈지만, random forest의 예측 범위 제약을 고려하면 고빈도·저ROI 거래에서는 데이터 분산과 시장 구조가 성과를 크게 좌우함
Grand Exchange의 시장 구조와 거래 제약
- Old School RuneScape의 Grand Exchange는 플레이어가 게임 내 거의 모든 아이템에 대해 매수·매도 주문을 낼 수 있는 시장임
- 일반 시장처럼 복잡하고 혼란스럽지만, 짧은 시간 규모나 미세구조 수준에서는 모델링 가능한 부분이 있음
- 주문에는 아이템별 4시간 매수 한도가 적용됨
- 예: coal ore는 4시간 동안 최대 13,000개까지 매수 가능함
- 체결된 매도 주문에는 1% 세금이 붙음
- 개별 거래 가격이 100 gold를 초과하는 아이템에 적용됨
- 주문당 최대 5 million gold로 제한됨
- 아이템 단위로 계산하고 소수점은 내림 처리함
- 세금 수익은 게임 개발사가 인플레이션을 통제하는 데 사용함
- coal ore 10,000개를 개당 142 gold에 팔면 세금은
math.floor(0.01 * 142) * 10000 = 10,000 gold가 됨
봇 구성과 데이터 파이프라인
- 봇은 세 개의 애플리케이션으로 나뉨
- JavaScript API: OSRS Wiki 실시간 가격 API와 상호작용함
- Java 클라이언트: 캐릭터 행동을 제어함
- Python API: 가능한 주문 집합을 예상 수익성 기준으로 순위화함
- OSRS Wiki 프로젝트는 5분마다 Grand Exchange에서 거래되는 모든 아이템의 데이터를 기록함
- 설정 가능한 과거 기간의 평균 가격 스프레드
- 설정 가능한 과거 기간의 거래량
- 각 아이템의 매수 한도
- 학습용 데이터 파이프라인은 OSRS Wiki API를 조회하는 두 개의 cronjob으로 구성됨
- 하나는 5분마다 API를 조회함
- 다른 하나는 1시간마다 API를 조회함
- 각 작업은 해당 기간 동안 Grand Exchange에서 거래된 모든 아이템의 가격 스프레드와 거래량을 데이터베이스에 기록함
- 실제 체결 주문에서도 모델 학습에 쓸 데이터를 저장함
- 생성된 gold/second
- 절대 수익
- 매수 주문 초기화 타임스탬프
- 거래된 아이템 ID
- 두 테이블은 타임스탬프 기준으로 조인됨
- 각 행에는 성공한 개별 거래 직전 기간의 Grand Exchange 전체 집계 거래 데이터와 해당 거래의 수익성이 함께 들어감
- 모델 손실 함수의 타깃은 gold/second임
- 시간 누수를 막기 위해 학습 세트는 63일 전부터 14일 전까지의 라벨링된 거래로 구성하고, 검증 세트는 가장 최근 14일을 사용함
기준 방식의 계산 방식
- 기준 방식은 비자명한 모델이 실제로 성능을 개선하는지 확인하기 위한 naive baseline으로 사용됨
- 각 아이템에 대해 최근 5분 가격 스프레드와 최근 1시간 거래량을 사용해 변수를 계산함
- ROI:
(sell_total - {1% tax} - buy_total) / buy_total - 거래량 비율:
(1h_volume_traded_high_price / 1h_volume_traded_low_price) - 최근 2주 동안 해당 아이템 거래의 평균 gold/second
- ROI:
- 이후 기준 방식은 다음 순서로 아이템을 정렬함
- 각 아이템의 ROI Z 점수를 계산함
- 각 아이템의 거래량 비율 Z 점수를 계산함
- 과거 평균 gold/second가 음수인 아이템을 제외함
(roi_zscore + volume_ratio_zscore)값을 기준으로 내림차순 정렬함
머신러닝 모델 비교 실험
- 기준 방식 결과를 만든 뒤, 1주일 동안 baseline과 random forest, neural network 회귀 모델을 비교함
- 샘플 비율 불일치를 피하기 위해 게임 클라이언트는 잠재 주문 순위를 매길 때 각 모델 타입의 출력을 무작위로 선택함
- 결과는 평균 시간당 수익 기준 내림차순으로 정리됨
| Model Type | n | L2 loss | Mean profit/hr | 95% CI profit/hr |
|---|---|---|---|---|
| random forest | 257 | 53 | 150,892 | 129,140 - 172,643 |
| neural network | 191 | 57 | 123,923 | 103,279 - 144,566 |
| baseline | 216 | N/A | 87,353 | 79,493 - 95,212 |
실험 결과 해석
- 머신러닝 방식은 baseline보다 상당히 높은 성과를 냄
- 모델별로는 random forest가 가장 높은 profit/hour를 기록했고, neural network를 약간 앞섬
- 이 결과는 학습 중 각 모델의 검증 손실과도 일치함
- random forest가 가장 높은 profit/hour를 만든 점은 다소 의외임
- random forest 예측은 일반적으로 학습 데이터의 타깃 값 범위 안에 제한되는 경향이 있음
- 다만 이 모델들이 예측하는 시장 조성 거래는 고빈도·저ROI 성격이라 학습 데이터의 분산이 상대적으로 낮음
- 모델 학습에 사용한 코드는 위 링크들과 Github에서 확인 가능함
댓글과 토론
Hacker News 의견들
-
나도 같은 걸 Google Sheets로 해봤는데, OSRS Wiki API가 정말 훌륭해서 꽤 재미있었음
여기 표시된 시간당 수익은 처참한 수준이라, 사실상 뭘 해도 이것보다 돈을 더 벌 수 있음
시장 전체나 카테고리별 가격 추세 분석도 보고 싶음. 예를 들어 모든 마법 전투 장비가 오르는지, 특정 아이템이 다른 아이템을 지연 추종하는지 같은 것
궁금한 사람이 있다면 가격은 오래됐을 수 있지만, API로 만든 내 수익성 스프레드시트가 있음. 거래 제한, 비공개 방식 비교, 시간당 유지비 같은 걸 고려할 수 있어서 Wiki보다 나음: https://docs.google.com/spreadsheets/u/0/d/1iekEqInA2PwEuj1W...
어떤 방식들을 자동화하고 있는지도 아마 보일 텐데, 봇을 짜는 게 실제로 플레이하는 것보다 더 재미있다는 걸 알게 됨. 법적 수단으로 사설 서버들이 내려가는 건 아쉬움. 거기서는 윤리적 부담 없이 봇을 돌릴 수 있었기 때문- 실제 수익은 봇이 각 모델 버전 사이에서 무작위로 고르지 않았다면 시간당 약 60만 골드였을 것임
각 모델이 잠재 거래의 1/3에만 접근하는 실험 수익과, 최고의 모델만 거래했을 때의 수익을 혼동하고 있음
게다가 이 봇들은 1년 넘게 거의 매일 돌았는데도 정지되지 않았음 - 사설 서버에서는 왜 봇이 괜찮은지 궁금함. 다른 플레이어들이 봇 사용을 받아들인다는 뜻인가?
- 실제 수익은 봇이 각 모델 버전 사이에서 무작위로 고르지 않았다면 시간당 약 60만 골드였을 것임
-
RuneScape 전성기에는 Grand Exchange에서 같은 희귀 아이템에 매수 주문과 매도 주문을 동시에 걸어두기만 해도 시간이 지나 둘 다 체결되면서 이익이 났음
요즘 말로는 아마 시장 조성이라고 부를 만함- 학교 가기 전에 일어나서 가진 골드를 전부 Grand Exchange에 넣고, 뼈를 평균가보다 몇 gp 낮게 사는 주문을 걸어뒀음
하루가 끝날 때쯤 보통 주문이 체결됐고, 다시 평균가보다 몇 gp 높게 시장에 내놓으면 다음 날 아침까지 팔렸음
대부분의 날에는 작은 이익이 났고, 가끔 낮 동안 가격이 조금 내려 손해를 보기도 했지만, 반대로 오르는 날에는 추가 수익도 났음 - 실제로 시장 조성은 대체로 그런 식으로 작동함
- 미국 시장도 사실상 이런 방식에 가까움. 압도적으로 큰 시장 조성자가 하나 있고, 그곳이 최대 정치 기부자이기도 함. 공화당에만 연 1억 달러를 낸다고 함
게다가 Bernie Madoff처럼 그 시장 조성자의 소유주도 헤지펀드를 갖고 있고, 그 펀드는 매년 말도 안 되는 수익을 냄. 물론 그 헤지펀드는 시장 조성 사업과 완전히 별개로 운영된다는 설정임 /s /s /s
그래서 시장 조성자 관점에서 보면 미국에서 실제로 일이 돌아가는 방식과 꽤 현실적으로 들림
- 학교 가기 전에 일어나서 가진 골드를 전부 Grand Exchange에 넣고, 뼈를 평균가보다 몇 gp 낮게 사는 주문을 걸어뒀음
-
World of Warcraft에 경매장 모바일 앱이 있던 시절이 떠오름. 경매장을 둘러보고 아이템을 올리거나 살 수 있었고, API도 리버스 엔지니어링하기 쉬워 경매장 봇을 만들기 쉬웠음
어떤 기계학습 알고리즘까지 간 건 아니고, 터무니없이 잘못 가격이 매겨진 아이템을 줍거나 지난주 가격 범위 기준으로 사고팔았음. 핵심은 거래량이었음
꽤 괜찮게 벌어서 100만 골드 탈것을 산 뒤 그만뒀고, 얼마 지나지 않아 앱도 내려갔음. 나만 이런 일을 한 게 아니었을 테니 그 영향도 분명 있었을 것임- WoW는 시장 플레이 자체에는 별로 신경 쓰지 않았고, 아마 구현 방식 때문에 내려갔을 가능성이 큼
외부 앱으로 만들려면 계정들이 경매장에 접속한 채 대기하면서 새로고침하고, 그 데이터를 앱으로 밀어줬을 것임
나는 10년 동안 게임 안에서 Auctioneer 애드온을 썼음
- WoW는 시장 플레이 자체에는 별로 신경 쓰지 않았고, 아마 구현 방식 때문에 내려갔을 가능성이 큼
-
RuneScape 전반에 대해 좋은 말을 아무리 해도 모자랄 정도임. 물론 소유 구조에 대한 커뮤니티의 정당한 불만은 별개임
기본적으로 20년 넘은 게임인데도 아직 업데이트가 나오고, 새 무기와 퀘스트, 레벨 상한도 계속 추가되고 있음 -
Hypixel에서 한두 달 정도 비슷한 걸 해봤음
여러 제작법의 재료 가격과 제작 결과물 가격을 반복해서 감시하다가, 특정 수익 수준에 도달하면 알림음을 울리게 하고 직접 가서 제작을 돌렸음
정보는 https://wiki.hypixel.net에서 쉽게 가져올 수 있었고, https://wiki.hypixel.net/Travel_Scrolls가 가장 자주 좋은 수익을 냈음
제작에 특정 기술이나 레벨이 필요해서 가격이 너무 빨리 평준화되지 않았음. 결국 게임이 아주 깊지는 않아 질렸지만, 가지고 놀기에는 확실히 재미있음- 무위험 이자율이 0일 때 차익거래가 훨씬 더 재미있음
-
글이 정말 재미있었음. 나도 RuneScape를 영원히 해온 것 같은 nerd이고, 이제 게임과의 상호작용 대부분이 프로그래밍을 통해 이뤄짐
주로 두 종류의 봇을 쓰는데, 하나는 스크린샷을 찍고 주변 픽셀 색으로 객체를 감지하는 색상 봇이고, 다른 하나는 기본 클릭 봇임
실제로는 pyautogui를 쓰는 Python 코드 100줄 정도면 게임의 짜증 나는 요소 상당수를 자동화하기에 충분했음
궁금한 건, Java 클라이언트가 클라이언트 코드에 직접 호출하는 여러 오픈소스 봇 클라이언트 중 하나인지, 아니면 반복 입력을 하는 클릭 스크립트인지임
전자는 정지당한 경험이 좋지 않았음 -
독해력이 부족한 걸 수도 있지만, 여기서 정확히 무엇을 모델링하는지 잘 모르겠음
저자는 캔들 차트와 비슷한 가격 데이터를 가져오는 것처럼 들림
이해가 안 되는 부분은, 거래가 언급된 5분 구간 안에서 일어나는지, 아니면 모델이 여러 시간 범위에 걸친 패턴을 찾는지임- 잘 아는 분야는 아니라 방금 읽은 내용을 확률적으로 앵무새처럼 요약해보면 이렇음
기계학습 모델은 5분마다 크론 작업으로 수집해 데이터베이스에 저장한 가격 스프레드와 거래량 데이터, 그리고 각각의 거래 데이터를 학습함
다만 63일 전부터 14일 전까지의 과거 데이터로 학습하고, 나머지 최근 14일 데이터로 검증하는 듯함. 시간 누수(temporal leakage)를 막기 위한 것 같고, 검색해보니 학습 데이터가 의도치 않게 미래 정보를 포함해 예측을 망치는 현상을 뜻함
그래서 질문에 답하자면, 모델은 여러 주에 걸친 데이터에서 패턴을 찾아 현재 시점의 최적 거래 후보를 순위화하고, Java 컴포넌트가 게임 안에서 플레이어 캐릭터로 거래를 실행하는 구조로 보임
개인적으로 이해 안 되는 건 이 데이터 수집과 학습이 계속 굴러가는 방식인지, 아니면 한 번 학습한 뒤에도 충분히 똑똑해서 계속 수익을 내는지임. 49일 학습, 14일 검증 구조도 완전히 이해되지는 않음 - 학습 데이터는 지난 63일 동안 봇이 실제로 실행한 거래에 가격·거래량 데이터를 결합한 것으로 구성됨
따라서 모델은 과거에 성과가 좋았던 거래로 이어진 가격·거래량 데이터 패턴을 찾음
종속 변수는 과거 거래에서 생성된 초당 골드임
- 잘 아는 분야는 아니라 방금 읽은 내용을 확률적으로 앵무새처럼 요약해보면 이렇음
-
Grand Exchange가 도입되기 전 RuneScape에서 거래해서, 어린 십대 시절에 대략 1천 파운드를 벌었음
예를 들어 파티 모자를 600만 골드까지 흥정해서 산 뒤 650만에 팔고, 그걸 반복했음
게임을 접을 때 전부 eBay에 팔았고, 돈이 들어오자 어머니가 꽤 놀라셨음
시간당 수익률은 끔찍했지만, 그 경험이 없었다면 지금의 내가 되지 못했을 가능성이 큼 -
"OSRS Wiki API와 상호작용하는 크론 작업 두 개: 하나는 5분마다 폴링하고, 다른 하나는 매시간 폴링한다"
왜 두 개가 필요한지 모르겠음. 현재 5분 구간에 같은 정보가 있다면 매시간 폴링은 쓸모없는 것 아닌가? -
EVE의 시장에서도 비슷한 실험을 해본 사람이 있는지 궁금함
- 있음. EVE Online에서는 정말 많은 사람이 함
이런 플레이가 꽤 많고, 유효하며 환영받는 플레이 방식임. 다만 자세히 물어보면 모두 보안상 비밀이라고 답할 것임
EVE Online의 매우 깊고 복잡한 경제에 대해 더 알고 싶다면, YouTube에서 시장과 시장 분석 콘텐츠를 만드는 Oz를 보면 됨: https://www.youtube.com/@OZeve
기본적으로 거의 모든 것이 플레이어가 광석을 캐서 부품을 만들고, 그걸 통합 업체에 되팔고, 다시 유통업자와 고객으로 이어지는 식으로 만들어짐
밀접하게 관련해서, EVE Online에는 Microsoft가 만든 공식 MS Excel 플러그인도 있고 EVE Online API와 완전히 통합됨. 이 게임은 MS Excel과 강력한 통합 기능을 숙련하는 효과적인 방법이 될 수 있음
Oz의 빠른 가이드: https://youtu.be/eAogNNeDZuo
EVE Online에는 Fanfest라는 컨벤션도 있는데, defcon처럼 서로 EVE식 TED Talk를 발표함. 51분짜리 Fanfest 2023 "Market Spreadsheet Masterclass"도 있음: https://www.youtube.com/watch?v=6Ql6IU1eZpM
아이디어가 있거나 직접 해보고 싶다면, 이미 MS Excel 라이선스가 있거나 자체 솔루션을 통합할 수 있다는 전제에서 무료 계정으로 0달러에 시작할 수 있음. 다만 초기 자본, 지식, 직감이 전혀 없고, 무료 계정은 충분히 스킬을 올린 캐릭터만큼 많은 주문을 낼 수 없다는 제한이 있음
- 있음. EVE Online에서는 정말 많은 사람이 함