- Le Grand Exchange d’Old School RuneScape est un marché en jeu avec des limites d’achat par objet et une taxe sur les transactions, ce qui en fait un environnement de marché contraint, idéal pour expérimenter des stratégies de bot de trading automatisé
- Le bot répartit le travail entre des applications JavaScript, Java et Python pour la collecte des prix en temps réel, le contrôle du personnage et le classement des ordres selon leur rentabilité prévisionnelle
- Les données d’entraînement ont été construites en combinant les spreads de prix et volumes échangés sur des fenêtres de 5 minutes et 1 heure avec le gold/second des ordres réellement exécutés, en isolant les 14 derniers jours comme jeu de validation afin d’éviter les fuites temporelles
- Lors d’une expérience comparative sur une semaine, le random forest a affiché le meilleur profit horaire moyen avec 150,892 gold/hr, contre 123,923 gold/hr pour le neural network et 87,353 gold/hr pour le baseline
- Les modèles de machine learning ont généré plus de profit que la méthode de référence, mais si l’on tient compte des limites de plage de prédiction du random forest, la dispersion des données et la structure du marché influencent fortement les performances dans les transactions à haute fréquence et faible ROI
Structure du marché et contraintes de trading du Grand Exchange
- Le Grand Exchange d’Old School RuneScape est un marché où les joueurs peuvent placer des ordres d’achat et de vente sur presque tous les objets du jeu
- Comme un marché classique, il est complexe et chaotique, mais certaines dimensions restent modélisables à court horizon ou au niveau microstructurel
- Les ordres sont soumis à une limite d’achat sur 4 heures propre à chaque objet
- Exemple : on peut acheter au maximum 13,000 coal ore sur une période de 4 heures
- Les ordres de vente exécutés sont soumis à une taxe de 1 %
- Elle s’applique aux objets dont le prix unitaire dépasse 100 gold
- Elle est plafonnée à 5 million gold par ordre
- Elle est calculée unité par unité, avec arrondi à l’inférieur
- Les recettes fiscales sont utilisées par les développeurs du jeu pour contrôler l’inflation
- Si l’on vend 10,000 coal ore à 142 gold l’unité, la taxe est de
math.floor(0.01 * 142) * 10000 = 10,000 gold
Architecture du bot et pipeline de données
- Le bot est divisé en trois applications
- API JavaScript : interagit avec l’API de prix en temps réel de l’OSRS Wiki
- Client Java : contrôle les actions du personnage
- API Python : classe les ensembles d’ordres possibles selon leur rentabilité attendue
- Le projet OSRS Wiki enregistre toutes les 5 minutes les données de tous les objets échangés sur le Grand Exchange
- Spread de prix moyen sur une période historique configurable
- Volume échangé sur une période historique configurable
- Limite d’achat de chaque objet
- Le pipeline de données d’entraînement repose sur deux cronjobs qui interrogent l’API de l’OSRS Wiki
- L’un interroge l’API toutes les 5 minutes
- L’autre interroge l’API toutes les heures
- Chaque tâche enregistre dans la base de données les spreads de prix et volumes de tous les objets échangés sur le Grand Exchange pendant la période correspondante
- Les ordres réellement exécutés fournissent aussi des données utilisées pour l’entraînement du modèle
- gold/second généré
- Profit absolu
- Horodatage d’initialisation de l’ordre d’achat
- ID de l’objet échangé
- Les deux tables sont jointes à partir des horodatages
- Chaque ligne contient à la fois les données agrégées de trading du Grand Exchange pour la période précédant immédiatement une transaction réussie, et la rentabilité de cette transaction
- La cible de la fonction de perte du modèle est le gold/second
- Pour éviter les fuites temporelles, le jeu d’entraînement est composé des transactions labellisées allant de J-63 à J-14, et le jeu de validation utilise les 14 jours les plus récents
Calcul de la méthode de référence
- La méthode de référence sert de naive baseline pour vérifier si un modèle non trivial améliore réellement les performances
- Pour chaque objet, elle calcule des variables à partir du spread de prix des 5 dernières minutes et du volume échangé de la dernière heure
- ROI :
(sell_total - {1% tax} - buy_total) / buy_total - Ratio de volume :
(1h_volume_traded_high_price / 1h_volume_traded_low_price) - Moyenne du gold/second des transactions sur cet objet au cours des deux dernières semaines
- ROI :
- La méthode de référence trie ensuite les objets dans l’ordre suivant
- Calcul du Z-score du ROI pour chaque objet
- Calcul du Z-score du ratio de volume pour chaque objet
- Exclusion des objets dont la moyenne historique du gold/second est négative
- Tri décroissant selon la valeur de
(roi_zscore + volume_ratio_zscore)
Expérience comparative des modèles de machine learning
- Après avoir obtenu les résultats de la méthode de référence, une comparaison a été menée pendant une semaine entre le baseline et des modèles de régression random forest et neural network
- Pour éviter les écarts de ratio d’échantillons, le client du jeu sélectionne aléatoirement la sortie de chaque type de modèle lorsqu’il classe les ordres potentiels
- Les résultats sont présentés par ordre décroissant de profit horaire moyen
| 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 |
Interprétation des résultats
- Les approches de machine learning ont obtenu des performances nettement supérieures au baseline
- Parmi les modèles, le random forest a enregistré le profit/hour le plus élevé, avec une légère avance sur le neural network
- Ce résultat est cohérent avec la perte de validation de chaque modèle pendant l’entraînement
- Le fait que le random forest obtienne le meilleur profit/hour est plutôt surprenant
- Les prédictions d’un random forest ont généralement tendance à rester dans la plage des valeurs cibles observées dans les données d’entraînement
- Toutefois, les transactions de market making prédites par ces modèles relèvent d’un profil haute fréquence et faible ROI, où la dispersion des données d’entraînement est relativement faible
- Le code utilisé pour entraîner les modèles est disponible via les liens ci-dessus et sur Github
1 commentaires
Commentaires sur Hacker News
J’ai essayé de faire la même chose avec Google Sheets, et l’API du wiki OSRS est vraiment excellente, donc c’était assez amusant.
Les gains horaires affichés ici sont lamentables ; en pratique, on peut gagner plus d’argent que ça en faisant à peu près n’importe quoi.
J’aimerais aussi voir une analyse des tendances de prix sur l’ensemble du marché ou par catégorie. Par exemple, savoir si tout l’équipement de combat magique monte, ou si certains objets suivent d’autres objets avec un décalage.
Si ça intéresse quelqu’un, les prix datent peut-être, mais voici ma feuille de calcul de rentabilité faite avec l’API. Elle est meilleure que le wiki, car elle permet de prendre en compte les limites d’échange, de comparer des méthodes non publiques, d’intégrer les coûts de maintenance horaires, etc. : https://docs.google.com/spreadsheets/u/0/d/1iekEqInA2PwEuj1W...
On peut probablement aussi voir quelles méthodes j’automatise ; j’ai découvert qu’écrire des bots était en fait plus amusant que de jouer. C’est dommage que les serveurs privés soient fermés par des moyens légaux, parce qu’on pouvait y faire tourner des bots sans scrupule éthique.
Il y a confusion entre les gains de l’expérience où chaque modèle n’a accès qu’à un tiers des transactions potentielles, et les gains si seul le meilleur modèle avait tradé.
En plus, ces bots ont tourné presque tous les jours pendant plus d’un an sans être bannis.
À l’âge d’or de RuneScape, il suffisait de placer simultanément un ordre d’achat et un ordre de vente sur le même objet rare au Grand Exchange : avec le temps, les deux finissaient par être exécutés et on réalisait un profit.
Aujourd’hui, on appellerait probablement ça du market making.
En général, à la fin de la journée, l’ordre était exécuté ; je les remettais ensuite sur le marché quelques gp au-dessus du prix moyen, et ils étaient vendus d’ici le lendemain matin.
La plupart des jours, je faisais un petit bénéfice ; parfois, le prix baissait un peu pendant la journée et je perdais de l’argent, mais les jours où il montait, je gagnais encore plus.
Et, comme Bernie Madoff, le propriétaire de ce market maker possède aussi un hedge fund, qui réalise chaque année des rendements absurdes. Bien sûr, ce hedge fund est censé être entièrement séparé de l’activité de market making /s /s /s
Donc, du point de vue d’un market maker, ça sonne assez réaliste par rapport à la manière dont les choses fonctionnent vraiment aux États-Unis.
Ça me rappelle l’époque où World of Warcraft avait une appli mobile pour l’hôtel des ventes. On pouvait parcourir l’hôtel des ventes, mettre des objets en vente ou en acheter, et l’API était facile à rétro-ingénierer, ce qui rendait la création de bots pour l’hôtel des ventes assez simple.
Je n’étais pas allé jusqu’à utiliser un quelconque algorithme de machine learning ; je ramassais juste des objets absurdement mal tarifés, ou j’achetais et revendais sur la base des fourchettes de prix de la semaine précédente. Le nerf de la guerre, c’était le volume.
Ça rapportait plutôt bien : j’ai acheté la monture à 1 million de pièces d’or, puis j’ai arrêté, et l’appli a été retirée peu après. Je n’étais sûrement pas le seul à faire ça, donc ça a certainement joué.
Pour faire une appli externe, il fallait sans doute que des comptes restent connectés à l’hôtel des ventes, rafraîchissent les données, puis les poussent vers l’appli.
Moi, j’ai utilisé l’addon Auctioneer en jeu pendant 10 ans.
On ne dira jamais assez de bien de RuneScape dans son ensemble. Évidemment, c’est sans compter les griefs légitimes de la communauté concernant sa structure de propriété.
À la base, c’est un jeu de plus de 20 ans, et pourtant il reçoit encore des mises à jour, avec de nouvelles armes, des quêtes et même des plafonds de niveau qui continuent d’être ajoutés.
J’ai fait quelque chose de similaire sur Hypixel pendant un mois ou deux.
Je surveillais en boucle le prix des ingrédients de plusieurs recettes de craft et le prix des objets obtenus, puis je déclenchais une alerte sonore quand un certain niveau de rentabilité était atteint, et j’allais faire le craft moi-même.
Les infos étaient faciles à récupérer sur https://wiki.hypixel.net, et https://wiki.hypixel.net/Travel_Scrolls était ce qui générait le plus souvent de bons profits.
Comme le craft nécessitait certaines compétences ou certains niveaux, les prix ne se normalisaient pas trop vite. Au final, le jeu n’étant pas très profond, je m’en suis lassé, mais c’est clairement amusant à bidouiller.
L’article était vraiment amusant. Moi aussi, je suis le genre de nerd qui joue à RuneScape depuis une éternité, et désormais la plupart de mes interactions avec le jeu passent par la programmation.
J’utilise principalement deux types de bots : l’un est un bot par couleur, qui prend des captures d’écran et détecte les objets à partir de la couleur des pixels autour, et l’autre est un simple bot de clics.
En pratique, une centaine de lignes de Python avec pyautogui suffisait à automatiser une bonne partie des aspects pénibles du jeu.
Ce qui m’intéresse, c’est de savoir si le client Java est l’un des nombreux clients de bots open source qui appellent directement le code du client, ou bien un script de clics qui répète des entrées.
Avec la première approche, mon expérience des bannissements n’a pas été bonne.
C’est peut-être moi qui manque de compréhension, mais je ne vois pas très bien ce qui est modélisé exactement ici
L’auteur semble récupérer des données de prix proches de celles d’un graphique en chandeliers
Ce que je ne comprends pas, c’est si les transactions ont lieu à l’intérieur de l’intervalle de 5 minutes mentionné, ou si le modèle cherche des motifs sur plusieurs horizons temporels
Le modèle de machine learning apprend à partir des données de spread de prix et de volume collectées toutes les 5 minutes par une tâche cron et stockées dans une base de données, ainsi que des données de chaque transaction
Il semble toutefois être entraîné sur des données historiques allant de 63 jours à 14 jours avant le présent, puis validé sur les 14 jours récents restants. J’imagine que c’est pour éviter la fuite temporelle (temporal leakage) ; d’après ce que j’ai trouvé, cela désigne le fait que les données d’entraînement contiennent involontairement des informations du futur, ce qui fausse les prédictions
Donc, pour répondre à la question, le modèle semble chercher des motifs dans des données couvrant plusieurs semaines afin de classer les meilleurs candidats à la transaction au moment présent, puis un composant Java exécute les transactions dans le jeu via le personnage du joueur
Ce que je ne comprends pas personnellement, c’est si cette collecte de données et cet entraînement tournent en continu, ou si le modèle, une fois entraîné, est suffisamment intelligent pour continuer à générer des profits. Je ne comprends pas non plus complètement la structure 49 jours d’entraînement / 14 jours de validation
Le modèle cherche donc des motifs dans les données de prix et de volume qui ont conduit à des transactions historiquement performantes
La variable dépendante est l’or par seconde généré par les transactions passées
Avant l’introduction du Grand Exchange, je faisais du commerce dans RuneScape et j’ai gagné environ 1 000 livres sterling quand j’étais jeune ado
Par exemple, j’achetais des chapeaux de fête en négociant jusqu’à 6 millions de pièces d’or, puis je les revendais 6,5 millions, et je recommençais
Quand j’ai arrêté le jeu, j’ai tout vendu sur eBay, et ma mère a été assez surprise quand l’argent est arrivé
Le rendement horaire était atroce, mais sans cette expérience, il est très possible que je ne sois pas devenu la personne que je suis aujourd’hui
« Deux tâches cron qui interagissent avec l’API OSRS Wiki : l’une interroge toutes les 5 minutes, l’autre toutes les heures »
Je ne comprends pas pourquoi il en faut deux. Si les mêmes informations sont disponibles dans l’intervalle courant de 5 minutes, le polling horaire n’est-il pas inutile ?
Je me demande si quelqu’un a déjà tenté une expérience similaire sur le marché d’EVE
Ce type de gameplay est assez répandu, viable et bien accueilli. En revanche, si vous demandez des détails, tout le monde répondra que c’est confidentiel pour des raisons de sécurité
Si vous voulez en savoir plus sur l’économie très profonde et complexe d’EVE Online, regardez Oz sur YouTube, qui produit du contenu sur le marché et l’analyse de marché : https://www.youtube.com/@OZeve
En gros, presque tout est fabriqué par des joueurs qui extraient du minerai, produisent des composants, les revendent à des intégrateurs, puis cela passe à des distributeurs et à des clients
Dans le même ordre d’idées, EVE Online dispose aussi d’un plugin MS Excel officiel créé par Microsoft, entièrement intégré à l’API d’EVE Online. Ce jeu peut être un moyen efficace de maîtriser de puissantes intégrations avec MS Excel
Guide rapide d’Oz : https://youtu.be/eAogNNeDZuo
EVE Online a aussi une convention appelée Fanfest, où les participants présentent entre eux des sortes de TED Talks à la sauce EVE, un peu comme à la defcon. Il existe aussi une « Market Spreadsheet Masterclass » de 51 minutes au Fanfest 2023 : https://www.youtube.com/watch?v=6Ql6IU1eZpM
Si vous avez une idée ou voulez essayer vous-même, vous pouvez démarrer pour 0 dollar avec un compte gratuit, à condition d’avoir déjà une licence MS Excel ou de pouvoir intégrer votre propre solution. En revanche, vous n’aurez aucun capital initial, aucune connaissance ni intuition, et un compte gratuit ne peut pas passer autant d’ordres qu’un personnage ayant suffisamment monté ses compétences