1 Punkte von GN⁺ 2024-10-28 | 1 Kommentare | Auf WhatsApp teilen
  • Die Grand Exchange von Old School RuneScape ist ein In-Game-Markt mit Kauflimits pro Item und Transaktionssteuer und damit eine eingeschränkte Marktumgebung, die sich gut zum Experimentieren mit Strategien für automatisierte Trading-Bots eignet
  • Der Bot teilt Echtzeit-Preiserfassung, Steuerung des Charakters und Ranking möglicher Orders nach erwarteter Profitabilität auf JavaScript-, Java- und Python-Anwendungen auf
  • Die Trainingsdaten wurden erstellt, indem Preis-Spreads und Handelsvolumen im 5-Minuten- und 1-Stunden-Takt mit dem gold/second tatsächlich ausgeführter Orders kombiniert wurden; die letzten 14 Tage wurden als Validierungsset abgetrennt, um zeitliche Lecks zu vermeiden
  • In einem einwöchigen Vergleichsexperiment erzielte random forest mit 150.892 gold/hr den höchsten durchschnittlichen Stundengewinn, gefolgt von neural network mit 123.923 gold/hr und der baseline mit 87.353 gold/hr
  • Die Machine-Learning-Modelle erzielten höhere Gewinne als der Referenzansatz, doch angesichts der begrenzten Vorhersagespanne von random forest hängen bei hochfrequenten Trades mit niedrigem ROI Datenvarianz und Marktstruktur stark von der Performance ab

Marktstruktur und Handelsbeschränkungen der Grand Exchange

  • Die Grand Exchange von Old School RuneScape ist ein Markt, auf dem Spieler Kauf- und Verkaufsorders für nahezu alle Items im Spiel platzieren können
  • Wie ein normaler Markt ist sie komplex und chaotisch, doch auf kurzen Zeitskalen oder auf Mikrostrukturebene gibt es modellierbare Teilbereiche
  • Für Orders gilt pro Item ein 4-Stunden-Kauflimit
    • Beispiel: Von coal ore können innerhalb von 4 Stunden höchstens 13.000 Stück gekauft werden
  • Auf ausgeführte Verkaufsorders fällt eine Steuer von 1 % an
    • Sie gilt für Items, deren einzelner Transaktionspreis mehr als 100 gold beträgt
    • Sie ist auf maximal 5 million gold pro Order begrenzt
    • Sie wird pro Item berechnet, Nachkommastellen werden abgerundet
    • Die Steuereinnahmen werden vom Spieleentwickler genutzt, um Inflation zu kontrollieren
  • Verkauft man 10.000 coal ore zu je 142 gold, beträgt die Steuer math.floor(0.01 * 142) * 10000 = 10,000 gold

Bot-Architektur und Datenpipeline

  • Der Bot ist in drei Anwendungen aufgeteilt
    • JavaScript-API: interagiert mit der Echtzeitpreis-API des OSRS Wiki
    • Java-Client: steuert die Aktionen des Charakters
    • Python-API: rankt die Menge möglicher Orders nach erwarteter Profitabilität
  • Das OSRS-Wiki-Projekt zeichnet alle 5 Minuten Daten zu allen Items auf, die an der Grand Exchange gehandelt werden
    • durchschnittlicher Preis-Spread über einen konfigurierbaren historischen Zeitraum
    • Handelsvolumen über einen konfigurierbaren historischen Zeitraum
    • Kauflimit jedes Items
  • Die Trainingsdaten-Pipeline besteht aus zwei cronjobs, die die OSRS-Wiki-API abfragen
    • Einer fragt die API alle 5 Minuten ab
    • Der andere fragt die API stündlich ab
    • Jeder Job schreibt für alle in diesem Zeitraum an der Grand Exchange gehandelten Items den Preis-Spread und das Handelsvolumen in eine Datenbank
  • Auch aus tatsächlich ausgeführten Orders werden Daten für das Modelltraining gespeichert
    • generiertes gold/second
    • absoluter Gewinn
    • Zeitstempel der Initialisierung der Kauforder
    • ID des gehandelten Items
  • Die beiden Tabellen werden anhand des Zeitstempels gejoint
    • Jede Zeile enthält aggregierte Handelsdaten der gesamten Grand Exchange aus dem Zeitraum unmittelbar vor einem erfolgreichen Einzeltrade sowie die Profitabilität dieses Trades
  • Ziel der Verlustfunktion des Modells ist gold/second
  • Um zeitliche Lecks zu vermeiden, besteht das Trainingsset aus gelabelten Trades von vor 63 bis vor 14 Tagen; als Validierungsset werden die jüngsten 14 Tage verwendet

Berechnung des Referenzansatzes

  • Der Referenzansatz wird als naive baseline verwendet, um zu prüfen, ob ein nichttriviales Modell die Performance tatsächlich verbessert
  • Für jedes Item werden mit dem Preis-Spread der letzten 5 Minuten und dem Handelsvolumen der letzten Stunde Variablen berechnet
    • ROI: (sell_total - {1% tax} - buy_total) / buy_total
    • Volumenverhältnis: (1h_volume_traded_high_price / 1h_volume_traded_low_price)
    • durchschnittliches gold/second für Trades dieses Items in den letzten 2 Wochen
  • Anschließend sortiert der Referenzansatz die Items in folgender Reihenfolge
    • ROI-Z-Score jedes Items berechnen
    • Z-Score des Volumenverhältnisses jedes Items berechnen
    • Items ausschließen, deren historischer durchschnittlicher gold/second-Wert negativ ist
    • Absteigend nach (roi_zscore + volume_ratio_zscore) sortieren

Vergleichsexperiment der Machine-Learning-Modelle

  • Nachdem die Ergebnisse des Referenzansatzes erstellt waren, wurden über 1 Woche die Regressionsmodelle baseline, random forest und neural network verglichen
  • Um eine Verzerrung durch unterschiedliche Stichprobenanteile zu vermeiden, wählte der Game-Client beim Ranking potenzieller Orders zufällig die Ausgabe eines jeweiligen Modelltyps aus
  • Die Ergebnisse sind absteigend nach durchschnittlichem Stundengewinn sortiert
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

Interpretation der Ergebnisse

  • Die Machine-Learning-Ansätze erzielten deutlich bessere Ergebnisse als die baseline
  • Unter den Modellen erreichte random forest den höchsten profit/hour und lag etwas vor neural network
  • Dieses Ergebnis stimmt auch mit dem Validierungsverlust der jeweiligen Modelle während des Trainings überein
  • Dass random forest den höchsten profit/hour erzielte, ist etwas überraschend
    • Vorhersagen von random forest sind in der Regel auf den Wertebereich der Zielwerte in den Trainingsdaten beschränkt
    • Allerdings haben die Market-Making-Trades, die diese Modelle vorhersagen, einen hochfrequenten Low-ROI-Charakter, sodass die Varianz der Trainingsdaten relativ niedrig ist
  • Der für das Modelltraining verwendete Code ist über die obigen Links und auf Github verfügbar

1 Kommentare

 
GN⁺ 2024-10-28
Hacker-News-Kommentare
  • Ich habe dasselbe auch mit Google Sheets ausprobiert, und die OSRS Wiki API ist wirklich hervorragend, also hat das ziemlich Spaß gemacht.
    Der hier angezeigte Gewinn pro Stunde ist miserabel; praktisch mit allem anderen kann man mehr Geld verdienen.
    Ich würde auch gern Analysen zu Preistrends für den gesamten Markt oder nach Kategorien sehen. Zum Beispiel, ob die gesamte magische Kampfausrüstung steigt oder ob bestimmte Items anderen mit Verzögerung folgen.
    Falls jemand neugierig ist: Die Preise könnten veraltet sein, aber ich habe eine mit der API erstellte Rentabilitäts-Tabelle. Sie ist besser als das Wiki, weil man Handelslimits, Vergleiche mit nicht veröffentlichten Methoden und Wartungskosten pro Stunde berücksichtigen kann: https://docs.google.com/spreadsheets/u/0/d/1iekEqInA2PwEuj1W...
    Man sieht vermutlich auch, welche Methoden ich automatisiere; dabei habe ich festgestellt, dass es mehr Spaß macht, Bots zu schreiben, als tatsächlich zu spielen. Schade, dass private Server mit rechtlichen Mitteln abgeschaltet werden. Dort konnte man ohne ethische Bedenken Bots laufen lassen.

    • Der tatsächliche Gewinn hätte bei etwa 600.000 Gold pro Stunde gelegen, wenn der Bot nicht zufällig zwischen den einzelnen Modellversionen ausgewählt hätte.
      Hier werden die Erträge aus einem Experiment, bei dem jedes Modell nur Zugriff auf ein Drittel der potenziellen Trades hatte, mit den Erträgen verwechselt, die entstanden wären, wenn nur das beste Modell gehandelt hätte.
      Außerdem liefen diese Bots über mehr als ein Jahr fast täglich, ohne gesperrt zu werden.
    • Ich frage mich, warum Bots auf privaten Servern in Ordnung sind. Bedeutet das, dass andere Spieler Bot-Nutzung akzeptieren?
  • In der Blütezeit von RuneScape reichte es, im Grand Exchange gleichzeitig Kauf- und Verkaufsaufträge für dasselbe seltene Item einzustellen; mit der Zeit wurden beide ausgeführt, und man machte Gewinn.
    Heute würde man das vermutlich Market Making nennen.

    • Vor der Schule bin ich aufgestanden, habe all mein Gold in den Grand Exchange gesteckt und Kaufaufträge für Knochen ein paar gp unter dem Durchschnittspreis eingestellt.
      Gegen Ende des Tages waren die Aufträge meistens ausgeführt, und wenn ich sie dann ein paar gp über dem Durchschnittspreis wieder auf den Markt stellte, waren sie bis zum nächsten Morgen verkauft.
      An den meisten Tagen gab es einen kleinen Gewinn; manchmal fiel der Preis tagsüber etwas und ich machte Verlust, aber an Tagen mit steigenden Preisen gab es entsprechend Zusatzgewinn.
    • Tatsächlich funktioniert Market Making im Großen und Ganzen genau so.
    • Auch der US-Markt funktioniert im Grunde ziemlich ähnlich. Es gibt einen überwältigend großen Market Maker, der zugleich einer der größten politischen Spender ist. Angeblich spendet er allein den Republikanern 100 Millionen Dollar pro Jahr.
      Außerdem besitzt der Eigentümer dieses Market Makers, ähnlich wie Bernie Madoff, auch einen Hedgefonds, und dieser Fonds erzielt jedes Jahr absurd hohe Renditen. Natürlich wird dieser Hedgefonds völlig getrennt vom Market-Making-Geschäft betrieben — so lautet jedenfalls die Prämisse /s /s /s
      Aus Sicht eines Market Makers klingt das also ziemlich realistisch dafür, wie die Dinge in den USA tatsächlich laufen.
  • Das erinnert mich an die Zeit, als World of Warcraft eine mobile Auktionshaus-App hatte. Man konnte das Auktionshaus durchstöbern, Items einstellen oder kaufen, und die API war leicht zu reverse engineeren, sodass sich Auktionshaus-Bots einfach bauen ließen.
    Ich bin nicht bis zu irgendeinem Machine-Learning-Algorithmus gegangen; ich habe nur absurd falsch bepreiste Items aufgesammelt oder auf Basis der Preisspanne der Vorwoche gekauft und verkauft. Entscheidend war das Handelsvolumen.
    Ich habe damit ziemlich gut verdient, mir das Reittier für eine Million Gold gekauft und dann aufgehört; kurz darauf wurde auch die App eingestellt. Ich war sicher nicht der Einzige, der so etwas gemacht hat, also hatte das bestimmt ebenfalls Einfluss.

    • WoW interessierte sich für das Spielen des Marktes selbst eher wenig; vermutlich wurde die App wegen der Implementierung eingestellt.
      Um sie als externe App zu bauen, mussten Accounts wohl im Auktionshaus eingeloggt warten, ständig aktualisieren und diese Daten an die App weiterreichen.
      Ich habe zehn Jahre lang das Auctioneer-Addon im Spiel genutzt.
  • Man kann gar nicht genug Gutes über RuneScape insgesamt sagen. Die berechtigten Beschwerden der Community über die Eigentümerstruktur stehen natürlich auf einem anderen Blatt.
    Im Kern ist es ein über 20 Jahre altes Spiel, und trotzdem kommen weiterhin Updates, neue Waffen und Quests sowie höhere Levelgrenzen hinzu.

  • Ich habe ein, zwei Monate lang etwas Ähnliches auf Hypixel gemacht.
    Ich habe wiederholt die Materialpreise verschiedener Crafting-Rezepte und die Preise der hergestellten Ergebnisse überwacht; sobald ein bestimmtes Gewinnniveau erreicht war, ließ ich einen Alarmton abspielen und ging dann selbst hin, um das Crafting anzustoßen.
    Die Informationen ließen sich leicht von https://wiki.hypixel.net holen, und https://wiki.hypixel.net/Travel_Scrolls brachte am häufigsten gute Gewinne.
    Weil für die Herstellung bestimmte Skills oder Level nötig waren, glichen sich die Preise nicht allzu schnell an. Am Ende wurde mir das Spiel zu wenig tiefgründig und ich verlor das Interesse, aber zum Herumspielen war es definitiv unterhaltsam.

    • Arbitrage macht deutlich mehr Spaß, wenn der risikofreie Zinssatz 0 ist.
  • Der Artikel war wirklich unterhaltsam. Ich bin ebenfalls so ein Nerd, der gefühlt schon ewig RuneScape spielt, und inzwischen läuft der Großteil meiner Interaktion mit dem Spiel über Programmierung.
    Ich nutze hauptsächlich zwei Arten von Bots: einen Farb-Bot, der Screenshots macht und Objekte anhand der Pixelfarben in der Umgebung erkennt, und einen einfachen Klick-Bot.
    In der Praxis reichten etwa 100 Zeilen Python-Code mit pyautogui, um einen erheblichen Teil der nervigen Aspekte des Spiels zu automatisieren.
    Mich würde interessieren, ob der Java-Client einer der Open-Source-Bot-Clients ist, die direkt Aufrufe in den Client-Code machen, oder ob es sich um ein Klickskript handelt, das wiederholte Eingaben ausführt.
    Mit Ersterem habe ich schlechte Erfahrungen gemacht, was Sperren angeht.

  • Vielleicht liegt es an mangelndem Leseverständnis, aber ich bin mir nicht sicher, was hier genau modelliert wird.
    Es klingt so, als würde der Autor Preisdaten abrufen, die einem Candlestick-Chart ähneln.
    Was ich nicht verstehe: Finden die Trades innerhalb des erwähnten 5-Minuten-Intervalls statt, oder sucht das Modell nach Mustern über mehrere Zeiträume hinweg?

    • Das ist nicht gerade mein Fachgebiet, aber wenn ich das gerade Gelesene probabilistisch nachplappere, klingt es etwa so:
      Das Machine-Learning-Modell lernt aus Preis-Spreads und Volumendaten, die alle 5 Minuten per Cron-Job gesammelt und in einer Datenbank gespeichert werden, sowie aus den einzelnen Trades.
      Offenbar wird aber mit historischen Daten von vor 63 bis vor 14 Tagen trainiert, während die übrigen letzten 14 Tage zur Validierung dienen. Vermutlich soll das temporal leakage verhindern; nach kurzer Suche bedeutet das, dass Trainingsdaten unbeabsichtigt Zukunftsinformationen enthalten und dadurch die Vorhersage verderben.
      Um die Frage zu beantworten: Das Modell scheint in Daten über mehrere Wochen hinweg Muster zu finden, die besten aktuellen Trade-Kandidaten zu ranken, und eine Java-Komponente führt die Trades im Spiel über die Spielfigur aus.
      Was ich persönlich nicht verstehe: ob diese Datensammlung und das Training kontinuierlich weiterlaufen oder ob das Modell nach einmaligem Training schon schlau genug ist, dauerhaft Gewinn zu machen. Auch die Struktur mit 49 Tagen Training und 14 Tagen Validierung verstehe ich nicht ganz.
    • Die Trainingsdaten bestehen aus den Trades, die der Bot in den letzten 63 Tagen tatsächlich ausgeführt hat, kombiniert mit Preis- und Volumendaten.
      Das Modell sucht also nach Mustern in Preis- und Volumendaten, die in der Vergangenheit zu erfolgreichen Trades geführt haben.
      Die abhängige Variable ist Gold pro Sekunde, das durch frühere Trades erzeugt wurde.
  • Ich habe vor Einführung der Grand Exchange in RuneScape gehandelt und als junger Teenager ungefähr 1.000 Pfund verdient.
    Zum Beispiel habe ich Partyhüte auf 6 Millionen Gold heruntergehandelt, sie dann für 6,5 Millionen verkauft und das wiederholt.
    Als ich mit dem Spiel aufgehört habe, habe ich alles auf eBay verkauft, und meine Mutter war ziemlich überrascht, als das Geld einging.
    Der Stundenlohn war furchtbar, aber ohne diese Erfahrung wäre ich wahrscheinlich nicht der, der ich heute bin.

  • „Zwei Cron-Jobs, die mit der OSRS Wiki API interagieren: einer pollt alle 5 Minuten, der andere stündlich“
    Ich verstehe nicht, warum man zwei braucht. Wenn im aktuellen 5-Minuten-Intervall dieselben Informationen enthalten sind, ist das stündliche Polling dann nicht nutzlos?

  • Ich frage mich, ob jemand auf dem Markt von EVE schon ähnliche Experimente gemacht hat.

    • Ja. In EVE Online machen das wirklich viele Leute.
      Diese Art zu spielen ist ziemlich verbreitet, effektiv und willkommen. Wenn man genauer nachfragt, werden aber alle sagen, dass die Details aus Sicherheitsgründen geheim sind.
      Wenn du mehr über die sehr tiefgehende und komplexe Wirtschaft von EVE Online erfahren willst, schau dir Oz auf YouTube an; er macht Inhalte zu Märkten und Marktanalysen: https://www.youtube.com/@OZeve
      Im Grunde wird fast alles dadurch hergestellt, dass Spieler Erz abbauen, daraus Teile fertigen, diese an Integratoren weiterverkaufen und es dann über Distributoren zu Kunden gelangt.
      Eng damit verbunden gibt es für EVE Online auch ein offizielles, von Microsoft erstelltes MS-Excel-Plugin, das vollständig in die EVE-Online-API integriert ist. Das Spiel kann eine effektive Möglichkeit sein, leistungsfähige Integrationen mit MS Excel zu meistern.
      Oz’ Schnellguide: https://youtu.be/eAogNNeDZuo
      EVE Online hat auch eine Convention namens Fanfest, auf der Leute einander EVE-artige TED Talks präsentieren, ähnlich wie bei der defcon. Es gibt auch eine 51-minütige Fanfest-2023-Session „Market Spreadsheet Masterclass“: https://www.youtube.com/watch?v=6Ql6IU1eZpM
      Wenn du eine Idee hast oder es selbst ausprobieren willst, kannst du mit einem kostenlosen Account für 0 Dollar anfangen, vorausgesetzt, du hast bereits eine MS-Excel-Lizenz oder kannst deine eigene Lösung integrieren. Allerdings gibt es Einschränkungen: Du hast kein Startkapital, kein Wissen und keine Intuition, und ein kostenloser Account kann nicht so viele Orders einstellen wie ein ausreichend hoch geskillter Charakter.