1 pontos por GN⁺ 2024-10-28 | 1 comentários | Compartilhar no WhatsApp
  • O Grand Exchange de Old School RuneScape é um mercado dentro do jogo com limites de compra por item e imposto sobre transações, o que o torna um ambiente de mercado limitado adequado para testar estratégias de bots de negociação automática
  • O bot divide coleta de preços em tempo real, controle do personagem e ranqueamento da rentabilidade esperada por ordem em aplicações separadas em JavaScript, Java e Python
  • Os dados de treinamento foram criados combinando spreads de preço e volumes em intervalos de 5 minutos e 1 hora com o gold/second de ordens realmente executadas; os 14 dias mais recentes foram separados como conjunto de validação para evitar vazamento temporal
  • Em um experimento comparativo de 1 semana, o lucro médio por hora foi maior com random forest, em 150.892 gold/hr; a neural network ficou em 123.923 gold/hr, e o baseline em 87.353 gold/hr
  • Os modelos de machine learning geraram lucro maior que o método de referência, mas, considerando a restrição do intervalo de previsão do random forest, em negociações de alta frequência e baixo ROI a dispersão dos dados e a estrutura do mercado influenciam fortemente o desempenho

Estrutura de mercado e restrições de negociação do Grand Exchange

  • O Grand Exchange de Old School RuneScape é um mercado onde jogadores podem criar ordens de compra e venda para quase todos os itens do jogo
  • Como mercados comuns, ele é complexo e caótico, mas há partes modeláveis em escalas curtas de tempo ou no nível da microestrutura
  • As ordens estão sujeitas a um limite de compra de 4 horas por item
    • Ex.: coal ore pode ser comprado até no máximo 13.000 unidades em 4 horas
  • Ordens de venda executadas estão sujeitas a um imposto de 1%
    • Aplica-se a itens cujo preço individual de transação excede 100 gold
    • É limitado a no máximo 5 million gold por ordem
    • É calculado por unidade de item, com casas decimais arredondadas para baixo
    • A receita do imposto é usada pela desenvolvedora do jogo para controlar a inflação
  • Ao vender 10.000 coal ore por 142 gold cada, o imposto é math.floor(0.01 * 142) * 10000 = 10.000 gold

Composição do bot e pipeline de dados

  • O bot é dividido em três aplicações
    • API em JavaScript: interage com a API de preços em tempo real da OSRS Wiki
    • Cliente em Java: controla as ações do personagem
    • API em Python: ranqueia o conjunto de ordens possíveis com base na rentabilidade esperada
  • O projeto OSRS Wiki registra a cada 5 minutos dados de todos os itens negociados no Grand Exchange
    • Spread médio de preços em um período histórico configurável
    • Volume negociado em um período histórico configurável
    • Limite de compra de cada item
  • O pipeline de dados para treinamento é composto por dois cronjobs que consultam a API da OSRS Wiki
    • Um consulta a API a cada 5 minutos
    • O outro consulta a API a cada 1 hora
    • Cada tarefa registra no banco de dados o spread de preços e o volume de todos os itens negociados no Grand Exchange durante o respectivo período
  • Dados usados no treinamento do modelo também são salvos a partir de ordens realmente executadas
    • gold/second gerado
    • Lucro absoluto
    • Timestamp de inicialização da ordem de compra
    • ID do item negociado
  • As duas tabelas são unidas com base no timestamp
    • Cada linha contém os dados agregados de negociação de todo o Grand Exchange no período imediatamente anterior a uma transação individual bem-sucedida, junto com a rentabilidade dessa transação
  • O alvo da função de perda do modelo é gold/second
  • Para evitar vazamento temporal, o conjunto de treinamento é composto por transações rotuladas de 63 dias atrás até 14 dias atrás, e o conjunto de validação usa os 14 dias mais recentes

Como o método de referência é calculado

  • O método de referência é usado como um naive baseline para verificar se um modelo não trivial realmente melhora o desempenho
  • Para cada item, são usadas o spread de preços dos últimos 5 minutos e o volume da última 1 hora para calcular variáveis
    • ROI: (sell_total - {1% tax} - buy_total) / buy_total
    • Razão de volume: (1h_volume_traded_high_price / 1h_volume_traded_low_price)
    • gold/second médio das negociações desse item nas últimas 2 semanas
  • Em seguida, o método de referência ordena os itens na seguinte sequência
    • Calcula o Z-score de ROI de cada item
    • Calcula o Z-score da razão de volume de cada item
    • Exclui itens cujo gold/second médio histórico é negativo
    • Ordena em ordem decrescente pelo valor de (roi_zscore + volume_ratio_zscore)

Experimento de comparação dos modelos de machine learning

  • Depois de gerar os resultados do método de referência, foram comparados durante 1 semana o baseline e os modelos de regressão random forest e neural network
  • Para evitar incompatibilidade na proporção de amostras, o cliente do jogo escolhia aleatoriamente a saída de cada tipo de modelo ao ranquear ordens potenciais
  • Os resultados estão organizados em ordem decrescente pelo lucro médio por hora
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

Interpretação dos resultados do experimento

  • Os métodos de machine learning tiveram desempenho consideravelmente superior ao baseline
  • Entre os modelos, o random forest registrou o maior profit/hour, ficando um pouco à frente da neural network
  • Esse resultado também é consistente com a perda de validação de cada modelo durante o treinamento
  • O fato de o random forest ter gerado o maior profit/hour é um tanto inesperado
    • Previsões de random forest geralmente tendem a ficar restritas ao intervalo dos valores-alvo dos dados de treinamento
    • No entanto, as operações de market making previstas por esses modelos têm caráter de alta frequência e baixo ROI, então a dispersão dos dados de treinamento é relativamente baixa
  • O código usado para treinar os modelos está disponível nos links acima e no Github

1 comentários

 
GN⁺ 2024-10-28
Comentários do Hacker News
  • Eu também tentei fazer a mesma coisa com Google Sheets, e a API da OSRS Wiki é realmente excelente, então foi bem divertido
    O lucro por hora mostrado aqui é lamentável; na prática, dá para ganhar mais dinheiro do que isso fazendo praticamente qualquer coisa
    Também gostaria de ver uma análise das tendências de preço do mercado inteiro ou por categoria. Por exemplo, se todos os equipamentos de combate mágico estão subindo, ou se certos itens seguem outros com atraso
    Para quem tiver curiosidade, os preços podem estar desatualizados, mas tenho uma planilha de rentabilidade que fiz com a API. Ela é melhor que a Wiki porque permite levar em conta limites de negociação, comparar métodos privados, custo de manutenção por hora etc.: https://docs.google.com/spreadsheets/u/0/d/1iekEqInA2PwEuj1W...
    Provavelmente também dá para ver quais métodos estou automatizando, e percebi que escrever bots é mais divertido do que jogar de fato. É uma pena que os servidores privados sejam derrubados por meios legais, porque neles dava para rodar bots sem peso na consciência

    • O lucro real teria sido de cerca de 600 mil moedas de ouro por hora se o bot não tivesse escolhido aleatoriamente entre cada versão do modelo
      Estão confundindo o lucro do experimento em que cada modelo só tinha acesso a 1/3 das transações potenciais com o lucro de quando apenas o melhor modelo negociava
      Além disso, esses bots rodaram quase todos os dias por mais de um ano e mesmo assim não foram banidos
    • Fico curioso por que bots seriam aceitáveis em servidores privados. Isso quer dizer que os outros jogadores aceitam o uso de bots?
  • No auge do RuneScape, só de colocar ao mesmo tempo ordens de compra e de venda para o mesmo item raro no Grand Exchange, com o tempo as duas eram executadas e dava lucro
    Hoje em dia provavelmente chamaríamos isso de market making

    • Eu acordava antes de ir para a escola, colocava todo o ouro que tinha no Grand Exchange e deixava uma ordem para comprar ossos alguns gp abaixo do preço médio
      No fim do dia, normalmente a ordem tinha sido executada; então eu colocava os ossos de volta no mercado alguns gp acima do preço médio, e eles eram vendidos até a manhã seguinte
      Na maioria dos dias eu tinha um pequeno lucro; às vezes o preço caía um pouco durante o dia e eu perdia dinheiro, mas nos dias em que subia eu também ganhava um extra
    • Na prática, market making geralmente funciona mais ou menos assim
    • O mercado dos EUA também é, na prática, bem parecido com isso. Há um market maker esmagadoramente grande, que também é o maior doador político. Dizem que doa 100 milhões de dólares por ano só para os republicanos
      Além disso, assim como Bernie Madoff, o dono desse market maker também tem um hedge fund, e esse fundo tem retornos absurdos todos os anos. Claro que a narrativa é que esse hedge fund opera totalmente separado do negócio de market making /s /s /s
      Então, do ponto de vista de um market maker, isso soa bastante realista em relação a como as coisas realmente funcionam nos EUA
  • Lembro da época em que World of Warcraft tinha um app móvel da casa de leilões. Dava para navegar pela casa de leilões e listar ou comprar itens, e a API também era fácil de fazer engenharia reversa, então era fácil criar bots para a casa de leilões
    Não cheguei a usar nenhum algoritmo de aprendizado de máquina; eu só pegava itens com preços absurdamente errados ou comprava e vendia com base na faixa de preços da semana anterior. O essencial era o volume
    Ganhei bem o bastante para comprar a montaria de 1 milhão de ouro e depois parei; pouco tempo depois, o app também saiu do ar. Eu certamente não era o único fazendo esse tipo de coisa, então isso com certeza teve alguma influência

    • WoW não se importava muito com a jogabilidade de mercado em si; é mais provável que tenha sido encerrado por causa da forma como era implementado
      Para transformar isso em um app externo, provavelmente havia contas conectadas à casa de leilões, esperando e atualizando a página, e então empurrando esses dados para o app
      Eu usei o addon Auctioneer dentro do jogo por 10 anos
  • Nunca é demais falar bem de RuneScape como um todo. Claro, isso à parte das reclamações legítimas da comunidade sobre a estrutura de propriedade
    No fundo, é um jogo com mais de 20 anos, e ainda assim continua recebendo atualizações, novas armas, missões e aumentos de limite de nível

  • Fiz algo parecido no Hypixel por um ou dois meses
    Eu monitorava repetidamente os preços dos materiais de várias receitas de criação e os preços dos itens resultantes; quando atingia determinado nível de lucro, tocava um alerta e eu ia pessoalmente fazer o craft
    As informações eram fáceis de obter em https://wiki.hypixel.net, e https://wiki.hypixel.net/Travel_Scrolls era o que mais frequentemente dava bons lucros
    Como o craft exigia habilidades ou níveis específicos, os preços não se equalizavam rápido demais. No fim, o jogo não era tão profundo e acabei enjoando, mas com certeza era divertido para brincar

    • Arbitragem é muito mais divertida quando a taxa livre de risco é 0
  • O texto foi muito divertido. Eu também sou um nerd que parece jogar RuneScape desde sempre, e agora a maior parte da minha interação com o jogo acontece por meio de programação
    Uso principalmente dois tipos de bots: um é um bot de cores, que tira screenshots e detecta objetos pela cor dos pixels ao redor; o outro é um bot básico de cliques
    Na prática, cerca de 100 linhas de código Python usando pyautogui já foram suficientes para automatizar boa parte dos elementos irritantes do jogo
    O que me pergunto é se o cliente Java é um daqueles vários clientes de bot open source que chamam diretamente o código do cliente, ou se é um script de cliques que repete entradas
    Com o primeiro tipo, minha experiência de ser banido não foi boa

  • Talvez seja falta de compreensão de leitura da minha parte, mas não entendo exatamente o que está sendo modelado aqui
    O autor parece estar obtendo dados de preço parecidos com um gráfico de candles
    O que não entendo é se as negociações acontecem dentro do intervalo de 5 minutos mencionado, ou se o modelo procura padrões ao longo de vários horizontes de tempo

    • Não é uma área que eu domine, então, para resumir meio que “papagaiando” probabilisticamente o que acabei de ler, seria isto:
      O modelo de machine learning é treinado com dados de spread de preços e volume coletados por um cron job a cada 5 minutos e armazenados em um banco de dados, além dos dados de cada negociação
      Porém, ele parece treinar com dados históricos de 63 dias atrás até 14 dias atrás, e validar com os 14 dias mais recentes restantes. Imagino que seja para evitar vazamento temporal (temporal leakage); pesquisando, isso significa um fenômeno em que os dados de treinamento incluem, sem querer, informações do futuro e prejudicam as previsões
      Então, para responder à pergunta, o modelo parece encontrar padrões em dados ao longo de várias semanas, ranquear os melhores candidatos a negociação no momento atual, e um componente Java executa as negociações dentro do jogo usando o personagem do jogador
      O que eu pessoalmente não entendo é se essa coleta de dados e treinamento continuam rodando continuamente, ou se, depois de treinado uma vez, o modelo já é esperto o suficiente para continuar gerando lucro. Também não entendo completamente a estrutura de 49 dias de treinamento e 14 dias de validação
    • Os dados de treinamento consistem nas negociações que o bot realmente executou nos últimos 63 dias, combinadas com dados de preço e volume
      Portanto, o modelo procura padrões em dados de preço e volume que, no passado, levaram a negociações com bom desempenho
      A variável dependente é o ouro por segundo gerado em negociações passadas
  • Eu negociava no RuneScape antes da introdução do Grand Exchange e ganhei cerca de 1.000 libras quando era um pré-adolescente
    Por exemplo, comprava party hats pechinchando até 6 milhões de ouro, depois vendia por 6,5 milhões, e repetia isso
    Quando parei de jogar, vendi tudo no eBay, e minha mãe ficou bem surpresa quando o dinheiro entrou
    O retorno por hora era horrível, mas é bem possível que eu não tivesse me tornado quem sou hoje sem essa experiência

  • "Dois cron jobs que interagem com a OSRS Wiki API: um faz polling a cada 5 minutos, e o outro faz polling a cada hora"
    Não entendo por que são necessários dois. Se o intervalo atual de 5 minutos tem a mesma informação, o polling a cada hora não seria inútil?

  • Fico curioso se alguém já fez um experimento parecido no mercado de EVE

    • Sim. No EVE Online, muita gente faz isso
      Esse tipo de jogo é bastante comum, viável e bem-vindo. Mas, se você perguntar detalhes, todo mundo vai responder que é segredo por motivos de segurança
      Se quiser saber mais sobre a economia extremamente profunda e complexa de EVE Online, veja o Oz, que cria conteúdo sobre mercado e análise de mercado no YouTube: https://www.youtube.com/@OZeve
      Basicamente, quase tudo é feito por jogadores minerando minério, fabricando peças, revendendo isso para integradores, e então seguindo para distribuidores e clientes
      Em um ponto intimamente relacionado, EVE Online também tem um plugin oficial do MS Excel feito pela Microsoft e totalmente integrado à EVE Online API. Esse jogo pode ser uma forma eficaz de dominar integrações avançadas com o MS Excel
      Guia rápido do Oz: https://youtu.be/eAogNNeDZuo
      EVE Online também tem uma convenção chamada Fanfest, onde as pessoas apresentam TED Talks no estilo EVE, meio como na defcon. Há também uma "Market Spreadsheet Masterclass" de 51 minutos da Fanfest 2023: https://www.youtube.com/watch?v=6Ql6IU1eZpM
      Se você tiver uma ideia ou quiser tentar por conta própria, pode começar com uma conta gratuita por US$ 0, supondo que já tenha uma licença do MS Excel ou consiga integrar uma solução própria. Mas há limitações: você não terá capital inicial, conhecimento ou intuição nenhuma, e uma conta gratuita não consegue colocar tantas ordens quanto um personagem com habilidades suficientemente evoluídas