Système de trading automatique FX réalisé avec python et algorithme génétique Partie 1

Les choses que j'ai faites

J'ai essayé d'implémenter les fonctions suivantes

  1. Un programme qui ne cesse de bénéficier des derniers taux de change
  2. Programme qui exploite l'IA et achète et vend automatiquement
  3. Un programme qui utilise un algorithme génétique pour générer une nouvelle IA basée sur les dernières données
  4. Un programme qui mesure les performances de l'IA et gère les unités monétaires de retrait et de transaction

Contexte

L'API de trading fournie par OANDA avait l'air plutôt bonne, j'ai donc pu le faire. En particulier, puisque vous pouvez acheter et vendre en 1 unité monétaire (1 unité de dollar), même si vous déplacez 100 IA et répétez des transactions, la perte se situera à quelques dizaines de yens par jour. Il est sûr même si le système commercial devient incontrôlable en raison d'un bug lors du test. Je pense que c'est un bon moment car je ne pourrais pas le réaliser moi-même sans cette API. http://developer.oanda.com/rest-live/development-guide/

Caractéristiques de l'algorithme génétique

La solution semi-optimale du problème d'optimisation peut être résolue en peu de temps. Si vous vous interrogez sur des problèmes d'optimisation ou des solutions sous-optimales, vous pouvez le trouver en regardant une vidéo qui capture Mario avec un algorithme génétique. → [Nikodo] J'ai essayé d'apprendre Super Mario Brothers

Obtenez le tarif

En essayant l'API Oanda avec curl, je l'écrirai avec python lorsque j'aurai fini d'essayer

request


curl -X GET "https://api-sandbox.oanda.com/v1/candles?instrument=EUR_USD&count=100&candleFormat=midpoint&granularity=D&dailyAlignment=0&alignmentTimezone=America%2FNew_York"

response


{
	"instrument" : "EUR_USD",
	"granularity" : "D",
	"candles" : [
		{
			"time" : "2015-06-22T04:00:00.000000Z",
			"openMid" : 1.24121,
			"highMid" : 1.241535,
			"lowMid" : 1.240145,
			"closeMid" : 1.24113,
			"volume" : 24144,
			"complete" : true
		}
	]
}

Code python d'acquisition de taux


base_domain = MODE.get('production')
url_base = 'https://{}/v1/candles?'.format(base_domain)
url = url_base + 'instrument={}&'.format(currency_pair.name) + \
    'count=5000&' +\
    'candleFormat=midpoint&' +\
    'granularity={}&'.format(granularity.name) +\
    'dailyAlignment=0&' +\
    'alignmentTimezone=Asia%2FTokyo&' +\
    'start={}T00%3A00%3A00Z'.format(start)

response = requests_api(url)

def requests_api(url, payload=None):
    auth = 'Bearer {}'.format(get_password('OandaRestAPIToken'))
    headers = {'Accept-Encoding': 'identity, deflate, compress, gzip',
               'Accept': '*/*', 'User-Agent': 'python-requests/1.2.0',
               'Content-type': 'application/json; charset=utf-8',
               'Authorization': auth}
    if payload:
        requests.adapters.DEFAULT_RETRIES = 2
        response = requests.post(url, headers=headers, data=payload, timeout=10)
    else:
        requests.adapters.DEFAULT_RETRIES = 2
        response = requests.get(url, headers=headers, timeout=10)
    print 'REQUEST_API: {}'.format(url)
    return response

Faisons un simple achat et vente d'IA

■ Spécifications Comparez le taux actuel avec le taux moyen sur 24 heures, et s'il y a un écart de 30 pip ou plus, définissez la marge bénéficiaire et la perte de 30 pip et effectuez des transactions.

■ Exemple d'opération Monnaie: Dollar Yen Heure actuelle: 1 octobre 2015 10:00:00 Taux actuel: 120,00 yens Tarif moyen sur 24 heures: 119,40 yens Unité monétaire d'achat: 100 Détails de la commande: 120 yens pour 100 unités ACHETER, prise de bénéfices 120,30 yens, réduction des pertes 119,70 yens

code


# -*- coding: utf-8 -*-
import datetime
from enum import Enum


class OrderType(Enum):
    Buy = 1
    Wait = 0
    Sell = -1


class Rate(object):
    start_at = datetime.datetime(2015, 10, 1, 10, 0, 0)
    bid = float(120.00)
    h24 = float(119.40)
    base_tick = float(0.01)

    @classmethod
    def get(cls, currency=None, start_at=None):
        return Rate()

    def get_rate(self, tick, is_add):
        if is_add:
            return self.bid + float(tick * self.base_tick)
        else:
            return self.bid - float(tick * self.base_tick)


class AIOrder(object):
    def __init__(self, order_type, limit, stop_limit):
        self.order_type = order_type
        self.limit = limit
        self.stop_limit = stop_limit


class AI(object):
    DIFF = 30
    LIMIT = 30
    STOP_LIMIT = 30

    def __init__(self, rate):
        self.rate = rate

    def order(self):
        """
Commande.
        """
        if self._can_order():
            order(self._get_order())

    def _can_order(self):
        """
Pouvez-vous commander ou retourner
        rtype: bool
        """
        point = (self.rate.bid - self.rate.h24) / self.rate.base_tick
        return int(point / self.DIFF) not in [0]

    def _get_order(self):
        """
Classe d'ordre de retour
        rtype: AIOrder
        """
        limit_rate = self.rate.get_rate(AI.LIMIT, True)
        stop_limit_rate = self.rate.get_rate(AI.STOP_LIMIT, False)
        return AIOrder(self._get_order_type(), limit_rate, stop_limit_rate)

    def _get_order_type(self):
        if self.rate.bid > self.rate.h24:
            return OrderType.Buy
        if self.rate.h24 > self.rate.bid:
            return OrderType.Sell
        return OrderType.Wait


def order(ai_order):
    _base = "OrderDone:{}, Limit:{}, Stop-Limit:{}"
    print _base.format(ai_order.order_type,
                       ai_order.limit,
                       ai_order.stop_limit)

#Obtenir le taux
rate = Rate.get(currency='USDJPY', start_at=datetime.datetime.now())

#Génération IA
ai = AI(rate)

#Commande
ai.order()

>>> OrderDone:True, Limit:120.3, Stop-Limit:119.7

Essayez de comparer l'achat et la vente d'IA

Faisons une analyse comparative avec des données de 5 minutes pour voir si cette IA est une bonne et rentable IA. J'ai essayé de définir la définition d'une excellente IA comme suit

  1. Le nombre de transactions a été d'au moins 100 au cours des 10 dernières années.
  2. Le bénéfice est de 1 million de yens ou plus dans le prix du marché au cours des 10 dernières années
  3. La perte maximale au cours des 10 dernières années est de 500 000 yens ou moins

Un benchmark qui remonte au passé s'appelle un backtest. Dans le cas de l'achat et de la vente de programmes, la condition 3 est importante. Parce qu'il est essentiellement laissé sans surveillance, cela rapporte beaucoup d'argent, mais je n'aime pas les programmes qui font beaucoup de pertes. 3 est appelé tirage maximal.

Optimiser l'achat et la vente d'IA avec des algorithmes génétiques

L'achat et la vente d'IA se composent de trois paramètres. Optimisons cette valeur. En d'autres termes, l'achat et la vente d'IA ont été définis comme un problème d'optimisation.

class AI(object):
    #Le facteur qui détermine l'ordre, la différence par rapport à la moyenne sur 24h est supérieure à cette valeur.
    DIFF = 30
    #Facteurs qui déterminent le taux de prise de bénéfices au moment de la commande
    LIMIT = 30
    #Facteurs qui déterminent le taux de réduction des pertes au moment de la commande
    STOP_LIMIT = 30

En supposant que les limites supérieure et inférieure de ces trois paramètres sont 400 et 10, le nombre de calculs pour tous les modèles est 390 ^ 3 = 59 319 000 fois. Si vous effectuez un backtest pendant 10 ans sur une base de 5 minutes, cela prendra environ 10 secondes car python est lent à calculer. CPU: Le temps de calcul requis pour le calcul parallèle sur un ordinateur personnel à 8 cœurs est le suivant. 59 319 000/8 cpu * 10 secondes / 3600 secondes / 24 heures = 858 jours

Le temps de calcul est de 858 jours. Même si le calcul de la distribution est effectué sur 100 PC, cela prendra 9 jours. Le calcul de tous les modèles est appelé recherche linéaire.

Eh bien, ce n'est pas le numéro un, mais l'IA avec le 30e bénéfice le plus élevé sur 59 319 000 IA est-elle dénuée de sens? Les algorithmes génétiques fonctionnent bien pour trouver des solutions sous-optimales.

Préparation avant de calculer avec un algorithme génétique

Déterminez les règles lors du calcul avec un algorithme génétique.

  1. Déterminez aléatoirement les paramètres initiaux entre 10 et 400
  2. Calculez jusqu'à 200 générations.
  3. Améliorez le profit commercial en tant que score.
  4. Définissez le nombre d'individus dans une génération sur 20
  5. Réglez le taux de mutation sur 1% ... etc.

L'efficacité du calcul varie en fonction du nombre d'individus et du taux de mutation. Il existe également des articles du point de vue des valeurs à utiliser pour l'efficacité, donc si vous êtes intéressé, vous voudrez peut-être les lire.

Échecs courants dans l'optimisation partielle des algorithmes génétiques

Si vous ne terminez pas le calcul à la 200ème génération et que vous ne le faites pas évoluer à l'infini, il sera partiellement optimisé et l'efficacité diminuera. スクリーンショット 2015-09-30 14.57.54.png

Résultat du calcul par algorithme génétique

Finalement, des données comme celles-ci seront collectées. スクリーンショット 2015-09-30 14.58.53.png

Implémentation avec algorithme génétique

Comment implémenter le croisement / mutation dans l'algorithme génétique Comment générer la population initiale Algorithme de backtest Construction réelle du système commercial

Je n'ai pas encore fini de l'écrire, je voudrais donc l'introduire dans la partie 2 à une date ultérieure.

J'ai écrit le prochain article

Trading automatique FX avec algorithme génétique Partie 2 Implémentation de l'IA de trading en évolution

Recommended Posts

Système de trading automatique FX réalisé avec python et algorithme génétique Partie 1
Trading automatique FX avec algorithme génétique Partie 2 Mise en œuvre d'une IA de trading en évolution
Trading automatique FX avec algorithme génétique Partie 3 Trading réel avec l'API Oanda
Trading système commençant par Python 3: investissement et risque
[Python] Essayez d'optimiser les paramètres de systole FX avec un algorithme génétique
Commerce système à partir de Python3: investissement à long terme
Modulation et démodulation FM avec Python Partie 3
Modulation et démodulation FM avec Python Partie 2
[Python] Python et sécurité-② Outil d'analyse de port réalisé avec Python
Pages HTML dynamiques créées avec AWS Lambda et Python
Algorithme génétique en python
Suivi automatique sur Twitter avec python et sélénium! (RPA)
[Introduction au trading système] J'ai dessiné un oscillateur stochastique avec python et joué avec ♬
J'ai essayé de faire LINE BOT avec Python et Heroku
Application Web réalisée avec Python3.4 + Django (Construction de l'environnement Part.1)
Commerce système à partir de Python 3: hedge fund et CTA
Un exemple de python pour apprendre XOR avec un algorithme génétique sur un réseau neuronal
J'ai évalué la stratégie de négociation du système boursier avec Python.
Résolvez le livre en spirale (algorithme et structure de données) avec python!
Traitement d'image avec Python (partie 2)
Programmation avec Python et Tkinter
Chiffrement et déchiffrement avec Python
Etudier Python avec freeCodeCamp part1
Images en bordure avec python Partie 1
Python et matériel - Utilisation de RS232C avec Python -
Grattage avec Selenium + Python Partie 1
Etudier Python avec freeCodeCamp part2
Traitement d'image avec Python (partie 1)
Résolution de Nampre avec Python (partie 2)
Backtesting FX Systre avec Python (2)
[Python3] Méthode Dikstra avec 14 lignes
Traitement d'image avec Python (3)
Grattage avec Selenium + Python Partie 2
python avec pyenv et venv
J'ai fait un blackjack avec Python.
Système de support de présentation avec Python3
Othello fait avec python (comme GUI)
J'ai créé wordcloud avec Python.
Fonctionne avec Python et R
Créez une application de gestion automatique des notes pour Tenho Private Room avec le bot LINE et Python Partie 1
Créez une application de gestion automatique des notes pour Tenho Private Room avec le bot LINE et Python Partie 2
Créez une application de gestion automatique des notes pour la salle privée Tenho avec le bot LINE et la partie Python ③
J'ai fait un circuit simple avec Python (AND, OR, NOR, etc.)
Système de notation IPynb réalisé avec TA d'introduction à la programmation (Python)
Interpolation automatique des images avec OpenCV et Python (méthode de marche rapide, Navier-Stokes)
Trouvez la valeur optimale de la fonction à l'aide d'un algorithme génétique (partie 2)
J'ai créé un formulaire de tweet Nyanko avec Python, Flask et Heroku
Résolution de l'introduction d'AOJ aux algorithmes et aux structures de données en Python -Partie2-
Résolution de l'introduction d'AOJ aux algorithmes et aux structures de données en Python -Partie4-
Résolution de l'introduction d'AOJ aux algorithmes et aux structures de données en Python -Partie3-
Communiquez avec FX-5204PS avec Python et PyUSB
Jouez des nombres manuscrits avec Python Partie 1
Robot fonctionnant avec Arduino et python
Installez Python 2.7.9 et Python 3.4.x avec pip.
Bases de SNS Python faites avec Flask
objet perl et classe python partie 2.
Réseau neuronal avec OpenCV 3 et Python 3
Modulation et démodulation AM avec python