Ghi chép về việc chạy bot giao dịch thuật toán trên Grand Exchange của RuneScape
(tristanrhodes.com)- Grand Exchange của Old School RuneScape là một thị trường trong game có giới hạn mua theo từng vật phẩm và thuế giao dịch, nên là môi trường thị trường bị giới hạn phù hợp để thử nghiệm chiến lược bot giao dịch tự động
- Bot chia xử lý thành các ứng dụng JavaScript, Java và Python riêng biệt cho thu thập giá theo thời gian thực, điều khiển nhân vật và xếp hạng mức sinh lời kỳ vọng theo từng lệnh
- Dữ liệu huấn luyện được tạo bằng cách kết hợp chênh lệch giá và khối lượng giao dịch theo mốc 5 phút·1 giờ với gold/second của các lệnh khớp thực tế, đồng thời tách 14 ngày gần nhất làm tập kiểm định để tránh rò rỉ theo thời gian
- Trong thí nghiệm so sánh kéo dài 1 tuần, lợi nhuận trung bình theo giờ cao nhất thuộc về random forest với 150,892 gold/hr, tiếp theo là neural network với 123,923 gold/hr, còn baseline là 87,353 gold/hr
- Các mô hình machine learning tạo ra lợi nhuận cao hơn cách làm chuẩn, nhưng nếu xét đến ràng buộc về phạm vi dự đoán của random forest thì ở các giao dịch tần suất cao, ROI thấp, độ phân tán dữ liệu và cấu trúc thị trường ảnh hưởng rất lớn đến kết quả
Cấu trúc thị trường và các ràng buộc giao dịch của Grand Exchange
- Grand Exchange của Old School RuneScape là thị trường nơi người chơi có thể đặt lệnh mua và bán cho gần như mọi vật phẩm trong game
- Giống như các thị trường thông thường, nó phức tạp và hỗn loạn, nhưng ở thang thời gian ngắn hoặc mức vi cấu trúc vẫn có những phần có thể mô hình hóa được
- Các lệnh chịu giới hạn mua trong 4 giờ theo từng vật phẩm
- Ví dụ: coal ore có thể mua tối đa 13,000 đơn vị trong 4 giờ
- Các lệnh bán đã khớp chịu thuế 1%
- Áp dụng cho các vật phẩm có giá giao dịch riêng lẻ vượt quá 100 gold
- Giới hạn tối đa 5 million gold cho mỗi lệnh
- Tính theo đơn vị vật phẩm và làm tròn xuống phần thập phân
- Khoản thu thuế được nhà phát triển game dùng để kiểm soát lạm phát
- Nếu bán 10,000 coal ore với giá 142 gold mỗi đơn vị thì thuế sẽ là
math.floor(0.01 * 142) * 10000 = 10,000 gold
Cấu trúc bot và pipeline dữ liệu
- Bot được chia thành ba ứng dụng
- JavaScript API: tương tác với OSRS Wiki real-time price API
- Java client: điều khiển hành vi của nhân vật
- Python API: xếp hạng tập lệnh có thể thực hiện theo mức sinh lời kỳ vọng
- Dự án OSRS Wiki ghi nhận dữ liệu của toàn bộ vật phẩm được giao dịch trên Grand Exchange mỗi 5 phút
- Chênh lệch giá trung bình trong khoảng thời gian quá khứ có thể cấu hình
- Khối lượng giao dịch trong khoảng thời gian quá khứ có thể cấu hình
- Giới hạn mua của từng vật phẩm
- Pipeline dữ liệu phục vụ huấn luyện gồm hai cronjob truy vấn OSRS Wiki API
- Một job truy vấn API mỗi 5 phút
- Job còn lại truy vấn API mỗi 1 giờ
- Mỗi job ghi chênh lệch giá và khối lượng giao dịch của mọi vật phẩm đã được giao dịch trên Grand Exchange trong khoảng thời gian tương ứng vào cơ sở dữ liệu
- Dữ liệu dùng cho huấn luyện mô hình cũng được lưu từ các lệnh khớp thực tế
- gold/second tạo ra
- Lợi nhuận tuyệt đối
- Dấu thời gian khởi tạo lệnh mua
- ID vật phẩm được giao dịch
- Hai bảng được join theo dấu thời gian
- Mỗi hàng chứa dữ liệu giao dịch tổng hợp toàn thị trường Grand Exchange của giai đoạn ngay trước một giao dịch thành công riêng lẻ, cùng với mức sinh lời của giao dịch đó
- Mục tiêu trong hàm mất mát của mô hình là gold/second
- Để ngăn rò rỉ theo thời gian, tập huấn luyện gồm các giao dịch đã gán nhãn từ 63 ngày trước đến 14 ngày trước, còn tập kiểm định dùng 14 ngày gần nhất
Cách tính của phương pháp chuẩn
- Phương pháp chuẩn được dùng như một naive baseline để kiểm tra liệu mô hình không tầm thường có thực sự cải thiện hiệu năng hay không
- Với mỗi vật phẩm, các biến được tính từ chênh lệch giá 5 phút gần nhất và khối lượng giao dịch 1 giờ gần nhất
- ROI:
(sell_total - {1% tax} - buy_total) / buy_total - Tỷ lệ khối lượng giao dịch:
(1h_volume_traded_high_price / 1h_volume_traded_low_price) - Giá trị gold/second trung bình của các giao dịch vật phẩm đó trong 2 tuần gần nhất
- ROI:
- Sau đó phương pháp chuẩn sắp xếp vật phẩm theo thứ tự sau
- Tính Z-score ROI của từng vật phẩm
- Tính Z-score tỷ lệ khối lượng giao dịch của từng vật phẩm
- Loại các vật phẩm có gold/second trung bình trong quá khứ là âm
- Sắp xếp giảm dần theo giá trị
(roi_zscore + volume_ratio_zscore)
Thí nghiệm so sánh các mô hình machine learning
- Sau khi tạo kết quả của phương pháp chuẩn, tác giả so sánh baseline với các mô hình hồi quy random forest và neural network trong 1 tuần
- Để tránh sai lệch về tỷ lệ mẫu, game client chọn ngẫu nhiên đầu ra của từng loại mô hình khi xếp hạng các lệnh tiềm năng
- Kết quả được sắp xếp theo thứ tự giảm dần của lợi nhuận trung bình theo giờ
| 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 |
Diễn giải kết quả thí nghiệm
- Các cách tiếp cận machine learning cho kết quả cao hơn đáng kể so với baseline
- Xét theo từng mô hình, random forest ghi nhận profit/hour cao nhất, nhỉnh hơn neural network một chút
- Kết quả này cũng phù hợp với loss kiểm định của từng mô hình trong quá trình huấn luyện
- Việc random forest tạo ra profit/hour cao nhất là điều khá bất ngờ
- Dự đoán của random forest thường có xu hướng bị giới hạn trong phạm vi giá trị mục tiêu của dữ liệu huấn luyện
- Tuy nhiên, các giao dịch tạo lập thị trường mà các mô hình này dự đoán có đặc tính tần suất cao, ROI thấp, nên độ phân tán của dữ liệu huấn luyện tương đối thấp
- Có thể xem mã dùng để huấn luyện mô hình ở các liên kết trên và trên Github
1 bình luận
Ý kiến trên Hacker News
Tôi cũng đã thử làm điều tương tự bằng Google Sheets, và OSRS Wiki API thật sự rất tuyệt nên khá thú vị
Lợi nhuận theo giờ hiển thị ở đây thảm đến mức, về cơ bản làm gì cũng kiếm được nhiều tiền hơn thế
Tôi cũng muốn xem phân tích xu hướng giá của toàn thị trường hoặc theo từng danh mục. Chẳng hạn như toàn bộ trang bị chiến đấu phép thuật có tăng giá không, hay một số vật phẩm có bám theo vật phẩm khác với độ trễ không
Nếu ai tò mò thì giá có thể đã cũ, nhưng đây là bảng tính lợi nhuận tôi làm bằng API. Nó tốt hơn Wiki vì có thể tính đến giới hạn giao dịch, so sánh phương pháp riêng, chi phí duy trì theo giờ, v.v.: https://docs.google.com/spreadsheets/u/0/d/1iekEqInA2PwEuj1W...
Có lẽ cũng sẽ thấy tôi đang tự động hóa những phương pháp nào, và tôi nhận ra rằng viết bot còn vui hơn chơi thật. Thật tiếc khi các server riêng bị gỡ xuống bằng biện pháp pháp lý, vì ở đó có thể chạy bot mà không phải áy náy về đạo đức
Bạn đang nhầm lẫn giữa lợi nhuận thử nghiệm khi mỗi mô hình chỉ tiếp cận 1/3 giao dịch tiềm năng và lợi nhuận khi chỉ để mô hình tốt nhất giao dịch
Hơn nữa, các bot này chạy gần như hằng ngày trong hơn một năm mà vẫn không bị ban
Vào thời hoàng kim của RuneScape, chỉ cần đặt đồng thời lệnh mua và lệnh bán cho cùng một vật phẩm hiếm trên Grand Exchange thì sau một thời gian cả hai đều khớp và có lời
Theo cách gọi ngày nay thì có lẽ đó là tạo lập thị trường
Đến cuối ngày, lệnh thường đã khớp; rồi tôi lại niêm yết bán cao hơn giá trung bình vài gp, và đến sáng hôm sau thì bán được
Hầu hết các ngày đều có lãi nhỏ, thỉnh thoảng trong ngày giá giảm một chút nên lỗ, nhưng ngược lại những ngày giá tăng thì còn có thêm lợi nhuận
Hơn nữa, giống Bernie Madoff, chủ sở hữu của nhà tạo lập thị trường đó cũng có một quỹ phòng hộ, và quỹ đó năm nào cũng tạo ra lợi nhuận phi lý. Tất nhiên, theo “thiết lập” thì quỹ phòng hộ đó vận hành hoàn toàn tách biệt với mảng tạo lập thị trường /s /s /s
Vì vậy, nhìn từ góc độ nhà tạo lập thị trường, nghe khá sát với cách mọi thứ thực sự vận hành ở Mỹ
Nhớ thời World of Warcraft có ứng dụng di động cho nhà đấu giá. Bạn có thể xem nhà đấu giá, đăng bán hoặc mua vật phẩm, và API cũng dễ reverse engineer nên rất dễ làm bot nhà đấu giá
Tôi không dùng đến thuật toán machine learning nào cả, chỉ nhặt những món bị định giá sai một cách lố bịch hoặc mua bán dựa trên biên độ giá của tuần trước. Điểm mấu chốt là khối lượng giao dịch
Kiếm được khá ổn, mua được thú cưỡi 1 triệu gold rồi nghỉ, và không lâu sau đó ứng dụng cũng bị gỡ. Chắc chắn tôi không phải người duy nhất làm việc này, nên hẳn nó cũng có ảnh hưởng
Để làm thành ứng dụng bên ngoài, có lẽ các tài khoản phải kết nối vào nhà đấu giá, chờ sẵn rồi refresh, sau đó đẩy dữ liệu đó sang ứng dụng
Tôi đã dùng add-on Auctioneer trong game suốt 10 năm
Nói tốt bao nhiêu về RuneScape nói chung cũng không đủ. Tất nhiên, đó là chưa tính những bất mãn chính đáng của cộng đồng về cơ cấu sở hữu
Về cơ bản đây là một game hơn 20 năm tuổi, vậy mà vẫn còn cập nhật, vẫn liên tục thêm vũ khí và nhiệm vụ mới, cũng như nâng giới hạn cấp độ
Tôi từng làm một thứ tương tự trên Hypixel trong khoảng một, hai tháng
Tôi liên tục theo dõi giá nguyên liệu của nhiều công thức chế tạo và giá thành phẩm; khi đạt một mức lợi nhuận nhất định thì phát âm báo, rồi tự vào game để chế tạo
Thông tin có thể lấy dễ dàng từ https://wiki.hypixel.net, và https://wiki.hypixel.net/Travel_Scrolls là thứ thường xuyên cho lợi nhuận tốt nhất
Vì việc chế tạo cần kỹ năng hoặc cấp độ nhất định nên giá không bị cân bằng quá nhanh. Cuối cùng thì game không quá sâu nên tôi chán, nhưng rõ ràng rất vui để nghịch
Bài viết thật sự rất thú vị. Tôi cũng là một nerd có cảm giác như đã chơi RuneScape từ mãi mãi, và giờ phần lớn tương tác của tôi với game diễn ra thông qua lập trình
Tôi chủ yếu dùng hai loại bot: một là bot màu sắc, chụp screenshot rồi phát hiện đối tượng bằng màu pixel xung quanh; loại kia là bot click cơ bản
Trên thực tế, khoảng 100 dòng Python dùng pyautogui là đủ để tự động hóa khá nhiều yếu tố khó chịu trong game
Điều tôi tò mò là liệu Java client đó có phải là một trong nhiều client bot mã nguồn mở gọi trực tiếp vào code của client, hay chỉ là click script thực hiện đầu vào lặp lại
Với trường hợp trước, trải nghiệm bị ban của tôi không tốt lắm
Có thể là do tôi đọc hiểu kém, nhưng tôi không rõ chính xác ở đây đang mô hình hóa cái gì
Nghe như tác giả đang lấy dữ liệu giá tương tự biểu đồ nến
Phần tôi không hiểu là giao dịch diễn ra trong khoảng 5 phút được nhắc đến, hay mô hình đang tìm các mẫu trên nhiều khung thời gian
Mô hình học máy học dữ liệu chênh lệch giá và khối lượng giao dịch được thu thập bằng cron job mỗi 5 phút rồi lưu vào cơ sở dữ liệu, cùng với dữ liệu của từng giao dịch
Tuy nhiên có vẻ nó dùng dữ liệu quá khứ từ 63 ngày trước đến 14 ngày trước để huấn luyện, rồi dùng 14 ngày gần nhất còn lại để kiểm chứng. Có lẽ là để tránh rò rỉ thời gian (temporal leakage); tìm thử thì thấy đó là hiện tượng dữ liệu huấn luyện vô tình chứa thông tin tương lai, làm hỏng dự đoán
Vì vậy để trả lời câu hỏi, có vẻ mô hình tìm mẫu trong dữ liệu trải dài nhiều tuần để xếp hạng các ứng viên giao dịch tối ưu ở thời điểm hiện tại, rồi một thành phần Java thực hiện giao dịch trong game bằng nhân vật người chơi
Cá nhân tôi chưa hiểu là việc thu thập dữ liệu và huấn luyện này có chạy liên tục hay không, hay sau khi huấn luyện một lần thì nó đã đủ thông minh để tiếp tục kiếm lời. Cấu trúc 49 ngày huấn luyện, 14 ngày kiểm chứng tôi cũng chưa hiểu hoàn toàn
Vì vậy mô hình tìm các mẫu dữ liệu giá/khối lượng từng dẫn tới những giao dịch có hiệu quả tốt trong quá khứ
Biến phụ thuộc là lượng vàng mỗi giây được tạo ra từ các giao dịch trong quá khứ
Tôi từng giao dịch trong RuneScape trước khi Grand Exchange được giới thiệu, và kiếm được khoảng 1.000 bảng Anh hồi đầu tuổi teen
Ví dụ, tôi mặc cả mua mũ tiệc xuống còn 6 triệu vàng rồi bán với giá 6,5 triệu, cứ lặp lại như vậy
Khi bỏ game, tôi bán hết trên eBay; mẹ tôi khá ngạc nhiên khi tiền chuyển về
Tỷ suất lợi nhuận theo giờ thì tệ khủng khiếp, nhưng nếu không có trải nghiệm đó, rất có thể tôi đã không trở thành con người hiện tại
"Hai cron job tương tác với OSRS Wiki API: một job polling mỗi 5 phút, job kia polling mỗi giờ"
Không hiểu vì sao cần hai cái. Nếu trong khoảng 5 phút hiện tại đã có cùng thông tin thì polling mỗi giờ chẳng phải là vô dụng sao?
Không biết đã có ai thử nghiệm tương tự trên thị trường của EVE chưa
Kiểu chơi này khá phổ biến, hiệu quả và được chào đón. Tuy nhiên nếu hỏi chi tiết thì ai cũng sẽ nói đó là bí mật vì lý do bảo mật
Nếu muốn biết thêm về nền kinh tế rất sâu và phức tạp của EVE Online, có thể xem Oz, người làm nội dung về thị trường và phân tích thị trường trên YouTube: https://www.youtube.com/@OZeve
Về cơ bản, gần như mọi thứ đều được tạo ra theo chuỗi: người chơi khai thác quặng, chế tạo linh kiện, bán lại cho các đơn vị tích hợp, rồi tiếp tục tới nhà phân phối và khách hàng
Liên quan mật thiết đến chuyện này, EVE Online còn có plugin MS Excel chính thức do Microsoft làm và tích hợp hoàn toàn với EVE Online API. Trò chơi này có thể là một cách hiệu quả để thành thạo các tính năng tích hợp mạnh mẽ với MS Excel
Hướng dẫn nhanh của Oz: https://youtu.be/eAogNNeDZuo
EVE Online cũng có một convention tên là Fanfest, nơi mọi người trình bày các bài TED Talk kiểu EVE giống như defcon. Cũng có bài Fanfest 2023 dài 51 phút "Market Spreadsheet Masterclass": https://www.youtube.com/watch?v=6Ql6IU1eZpM
Nếu có ý tưởng hoặc muốn tự thử, bạn có thể bắt đầu với 0 USD bằng tài khoản miễn phí, với điều kiện là đã có giấy phép MS Excel hoặc có thể tích hợp giải pháp riêng. Tuy vậy sẽ có các hạn chế: bạn không có vốn ban đầu, kiến thức, trực giác, và tài khoản miễn phí không thể đặt nhiều lệnh như một nhân vật đã nâng đủ kỹ năng