L'IA arrive et nous n'en avons pas peur. Je propose de le casse-tête en gagnant du chou en bourse. Pour commencer, nous verrons.
Termes
Un agent est un programme qui a des comptes dans différentes devises sur une seule bourse, dont le travail devrait entraîner une augmentation de leur valeur totale.
Actif de l'agent - une liste de comptes avec la disponibilité des fonds sur eux A = [A1, A2, ..] où A1, A2, ... le montant dans la devise correspondante.
Valeur d'actif. Nous devons avoir une mesure universelle de l'actif qui nous permet de mesurer l'actif. Tenez pour acquis qu'il s'agit de $. Un $ (compte) fait partie de l'actif. Nous supposons également que nous avons une capacité d'algorithme pour estimer la valeur de chaque compte dans la liste via $.
Un agent peut être fermé (ne compter que sur ses propres actifs) ou ouvert (emprunter). Pour simplifier, nous supposons que nous en avons un fermé.
Chaque opération d'agent a sa propre valeur So (Ax-> Ay, Sum) que nous mesurerons avec notre mesure $ et le temps To (Ax-> Ay).
Environnement d'agent - autres agents ou personnes avec des algorithmes de travail similaires ou différents + toute information valide à ce moment.
Stratégie d'agent. Il s'agit d'un algorithme qui reçoit des informations sur l'état des comptes, l'historique de l'activité de la bourse, son activité, l'activité actuelle de la bourse (lunettes) et, en réponse, exécute ou n'effectue pas un ensemble d'actions.
Les stratégies ne peuvent être basées que sur l'activité actuelle de l'échange (primitive),
prendre en compte les informations des autres échanges (moyen), prendre en compte l'historique de l'activité et les patrons statistiques détectés (profond). Pessimiste ou optimiste - diffèrent dans l'évaluation du risque des opérations. Partiel ou complet. Une stratégie complète couvre tous les aspects du fonctionnement de l'agent. Le partiel peut être combiné pour en former un complet.
Optimalité des stratégies et de leur choix. Normalement, l'agent a plusieurs stratégies, la commutation entre elles se produit avec un changement stable (plus d'un certain intervalle de temps) dans l'environnement.
Inertie de l'agent - durée pendant laquelle l'agent ignore un changement d'environnement. Ou une stratégie qui détermine sa résistance aux perturbations environnementales. Un agent plus inerte peut à la fois gagner et perdre, sans succomber à la «panique» de l'environnement.
Supposons que nous ayons trois ensembles de stratégies incomplètes:
St = [1,2,3,4] St = [5,6,7,8] St = [9,10,11,12]
La combinaison de ces stratégies fournit 64 comportements d'agent uniques qui
Elle s'avère correcte (utile) pour les environnements [O1, O2, O3] et inutile pour [O4, O5, O6] ou nuisible pour [O7, ..]
Analyser le travail des stratégies et leurs combinaisons dans divers environnements
Nous pouvons créer une métastratégie qui changera le comportement de l'agent en fonction de l'environnement actuellement détecté.
La plateforme d'agent (ci-après dénommée plateforme, MetaBot) est un agent spécifique qui crée, coordonne et supprime des agents sur les échanges connectés. Comme un agent, il consiste architecturalement en un ensemble de stratégies de contrôle qui peuvent être combinées pour améliorer le fonctionnement de l'ensemble du système dans son ensemble. La plate-forme stocke l'historique de toutes les opérations et d'autres données utiles qui permettent à ses stratégies constitutives de gérer efficacement (en $) les agents subordonnés, d'analyser les modèles statistiques généraux et l'historique de l'impact des combinaisons de stratégies sur le succès dans des environnements spécifiques. La plateforme est pilotée par la métastratégie, dont les paramètres évoluent dans le temps pour maximiser les profits.
L'environnement de l'agent d'échange se compose d'autres agents et d'informations actuelles. Les changements environnementaux pour l'agent sont divisés en optimaux, normaux, critiques, catastrophiques, etc. par le degré de réussite des opérations. Informant la plateforme de son état et de ses opérations, l'agent agit tant que la plateforme est «Satisfaite» de l'état et de la dynamique de ses comptes, sinon elle la ferme. La plate-forme évalue différemment le total des actifs et peut prendre des décisions sur le transfert d'un actif d'un agent à un autre, qui peut opérer sur un échange ou sur différents. La tâche de la plateforme est de maximiser l'actif total détenu par tous les agents.
Considérons le contenu d'une implémentation simple d'une stratégie d'agent (sur Scala) pour traiter un échange de carnet de commandes:
Nous apportons un génome qui se développera pendant le fonctionnement du système.
StrategyParams est le génome de la stratégie du bot qui contient beaucoup de gènes pour paramétrer la stratégie:
case class StrategyParams(low: IntGene, middle: IntGene, high: IntGene, intense: DoubleGene, threshold: DoubleGene, delay: IntGene)
où bas, moyen, haut sont les périodes en minutes pour les valeurs d'actif moyennes sur celui-ci.
Ils sont utilisés pour prédire le mouvement de la valeur.
Intense signifie activité de bot ou agressivité. Avec de grandes valeurs de paramètres, le bot effectue des transactions pour des montants importants et (ou) évalue les prévisions avec un grand optimisme.
Seuil signifie la confiance minimale du bot dans la prédiction, ce qui le pousse à terminer l'opération. Retard - inertie, le temps minimum entre les activations.
Il est postulé qu'il existe une stratégie de bot optimale pour toute période décrite par les paramètres StrategyParams qui peut être calculée à partir de l'historique du taux de l'actif. Ses paramètres peuvent être calculés à l'aide de l'algorithme de sélection du génome évolutif. Le calcul a la forme:
def evalBots(trs: Seq[TimeRate]) = EvolutionFactory( candidate = defaultBotStrategyParams, populationConfig = PopulationConfig(500), evolutionConfig = EvolutionConfig(100), errorRate = (c: StrategyParams) => {errorBot(c, trs)} ).
trs - Historique du carnet de commandes,
populationConfig - combien de robots en même temps rivalisent pour survivre entre eux, evolutionConfig - combien d'itérations de vie et de reproduction à faire. Au cours des itérations, les bots avec moins d'actifs sont moins susceptibles de produire une progéniture avec d'autres bots, ce qui, finalement, avec une population suffisamment grande et le nombre d'évolution-dégénérescence, devrait nous conduire au bot idéal (bots).
Après avoir reçu et calculé ces robots pour une certaine période (historique), vous devez en quelque sorte les utiliser pour un trading efficace à l'avenir. Platform-Metabot et sa MetaStrategy traiteront ce problème.
Considérez le contenu d'une implémentation de stratégie de plate-forme simple:
MetaStrategy(rateSensitivity: DoubleGene, volumeSensitivity: DoubleGene, profitSensitivity: DoubleGene, criticalForce: DoubleGene, volumesSize: IntGene, delaySwitching: IntGene)
où rateSensitivity, volumeSensitivity, profitSensitivity décrivent la sensibilité du comportement de la Plateforme aux changements des paramètres du prix des actifs, du volume des transactions et d'une diminution du bénéfice d'exploitation attendu.
criticalForce définit une valeur seuil basée sur une évaluation complète des paramètres ci-dessus, dépassant ce qui est un signal d'inefficacité de la stratégie de bot actuelle (pas la plate-forme) et calculant sa (stratégie de bot actuelle) version la plus réussie.
Fragment de mise en œuvre:
val force = rateForce * volumeForce * profitForce if (force >= strategy.criticalForce.value.get) changeBot(force / strategy.criticalForce.value.get, extremeBot, tr)
Après avoir décrit l'algorithme de stratégie de plate-forme en utilisant les paramètres MetaStrategy, nous pouvons commencer un processus évolutif similaire pour augmenter une population de métabots-plateforme efficaces, dont les plus efficaces deviendront la base du système commercial.
Pour tester l'efficacité de ces idées, un prototype de système d'échange de crypto-monnaie a été créé qui peut être utilisé comme terrain d'essai. La décharge nécessite des données sur l'historique des cours et leurs valeurs moyennes au cours des périodes, qui sont stockées dans Influx et générées par la décharge elle-même par extraction via l'API d'échange bitfinex ouverte. Voir l'objet HistoryExtractor.
Résultats des tests

Pendant les essais, nous avons réussi à trouver des stratégies simples pour les agents qui, sans l'aide du gestionnaire Metabot, ont montré un bénéfice de 14% par an pour un test de 2,5 ans d'histoire. Bien qu'impressionnant, il ne garantit pas le même intérêt sur les périodes futures. Le comportement du système en temps réel n'a pas été testé. L'utilisation de stratégies Metabot conçues pour de courtes périodes (un mois ou moins) n'a pas généré de bénéfices, mais pour de longues périodes, des méta-stratégies efficaces sont tout à fait possibles. Leur calcul a été difficile en raison de la grande complexité de calcul (mois de fonctionnement ininterrompu d'un PC moyen). Les taux de crypto-monnaie chaotiques ne peuvent être ajustés que dans une faible mesure, mais ... en utilisant cette approche pour négocier d'autres actifs, dont la volatilité n'est pas si chaotique et a des périodes saisonnières, peut donner de meilleurs résultats.
Les sources de polygones sont disponibles ici .