Automatisches FX-Handelssystem mit Python und genetischem Algorithmus Teil 1

Dinge, die ich gemacht habe

Ich habe versucht, die folgenden Funktionen zu implementieren

  1. Ein Programm, das immer die neuesten Wechselkurse erhält
  2. Programm, das KI betreibt und automatisch kauft und verkauft
  3. Ein Programm, das einen genetischen Algorithmus verwendet, um basierend auf den neuesten Daten eine neue KI zu generieren
  4. Ein Programm, das die KI-Leistung misst und Alters- und Transaktionswährungseinheiten verwaltet

Hintergrund

Die von OANDA bereitgestellte Handels-API sah ziemlich gut aus, also konnte ich es tun. Insbesondere da Sie in Einheiten einer Währung (in Einheiten von einem Dollar) kaufen und verkaufen können, liegt der Verlust innerhalb weniger zehn Yen pro Tag, selbst wenn Sie 100 AIs bewegen und Transaktionen wiederholen. Es ist sicher, auch wenn das Handelssystem aufgrund eines Fehlers während des Tests außer Kontrolle gerät. Ich denke, es ist eine gute Zeit, weil ich es ohne diese API nicht alleine realisieren könnte. http://developer.oanda.com/rest-live/development-guide/

Eigenschaften des genetischen Algorithmus

Die halboptimale Lösung des Optimierungsproblems kann in kurzer Zeit gelöst werden. Wenn Sie sich über Optimierungsprobleme oder suboptimale Lösungen wundern, können Sie dies irgendwie finden, indem Sie sich ein Video ansehen, das Mario mit einem genetischen Algorithmus erfasst. → [Nikodo] Ich habe versucht, Super Mario Brothers zu lernen

Holen Sie sich die Rate

Während ich Oanda API mit Curl versuche, schreibe ich es mit Python, wenn ich mit dem Versuch fertig bin

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
		}
	]
}

Rate Acquisition Python-Code


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

Lassen Sie uns eine einfache KI kaufen und verkaufen

■ Technische Daten Vergleichen Sie den aktuellen Kurs mit dem 24-Stunden-Durchschnittskurs. Wenn eine Abweichung von 30 Pip oder mehr vorliegt, setzen Sie die Gewinnspanne und die Verlustsenkung auf 30 Pip und führen Sie den Handel durch.

■ Betriebsbeispiel Währung: Dollar Yen Aktuelle Zeit: 1. Oktober 2015, 10:00:00 Uhr Aktueller Kurs: 120,00 Yen 24-Stunden-Durchschnittskurs: 119,40 Yen Kaufwährungseinheit: 100 Bestelldetails: 120 Yen für 100 Einheiten KAUFEN, Gewinnmitnahme 120,30 Yen, Verlustreduzierung 119,70 Yen

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):
        """
Auftrag.
        """
        if self._can_order():
            order(self._get_order())

    def _can_order(self):
        """
Können Sie bestellen oder zurücksenden?
        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):
        """
Auftragsklasse zurückgeben
        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)

#Rate erhalten
rate = Rate.get(currency='USDJPY', start_at=datetime.datetime.now())

#KI-Generation
ai = AI(rate)

#Auftrag
ai.order()

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

Versuchen Sie, den Kauf und Verkauf von KI zu vergleichen

Lassen Sie uns mit 5-Minuten-Daten vergleichen, um festzustellen, ob diese KI eine gute und profitable KI ist. Ich habe versucht, die Definition von exzellenter KI wie folgt zu definieren

  1. Die Anzahl der Transaktionen betrug in den letzten 10 Jahren 100 oder mehr.
  2. Der Gewinn des Marktpreises der letzten 10 Jahre beträgt mindestens 1 Million Yen
  3. Der maximale Verlust in den letzten 10 Jahren beträgt 500.000 Yen oder weniger

Ein Benchmark, der in die Vergangenheit zurückreicht, wird als Backtest bezeichnet. Beim Kauf und Verkauf von Programmen ist die Bedingung 3 wichtig. Weil es im Grunde unbeaufsichtigt bleibt, verdient es viel Geld, aber ich mag keine Programme, die viel Verlust machen. 3 heißt maximaler Drawdown.

Optimieren Sie den Kauf und Verkauf von KI mit genetischen Algorithmen

Der Kauf und Verkauf von KI besteht aus drei Parametern. Lassen Sie uns diesen Wert optimieren. Mit anderen Worten, der Kauf und Verkauf von KI wurde als Optimierungsproblem definiert.

class AI(object):
    #Der Faktor, der die Reihenfolge bestimmt, die Differenz zum 24-Stunden-Durchschnitt ist größer als dieser Wert.
    DIFF = 30
    #Faktoren, die die Gewinnmitnahme zum Zeitpunkt der Bestellung bestimmen
    LIMIT = 30
    #Faktoren, die die Verlustreduzierungsrate zum Zeitpunkt der Bestellung bestimmen
    STOP_LIMIT = 30

Unter der Annahme, dass die oberen und unteren Grenzen dieser drei Parameter 400 und 10 sind, beträgt die Anzahl der Berechnungen für alle Muster 390 ^ 3 = 59.319.000 mal. Wenn Sie 10 Jahre lang 5 Minuten lang einen Backtest durchführen, dauert dies ungefähr 10 Sekunden, da die Berechnung von Python langsam ist. CPU: Die für die parallele Berechnung auf einem 8-Kern-Personal Computer erforderliche Berechnungszeit ist wie folgt. 59.319.000 / 8 CPU * 10 Sekunden / 3600 Sekunden / 24 Stunden = 858 Tage

Die Berechnungszeit beträgt 858 Tage. Die Berechnung der Verteilung auf 100 PCs dauert 9 Tage. Das Berechnen aller Muster wird als lineare Suche bezeichnet.

Nun, es ist nicht die Nummer eins, aber ist die KI mit dem 30. höchsten Gewinn von 59.319.000 KIs bedeutungslos? Genetische Algorithmen funktionieren gut, um suboptimale Lösungen zu finden.

Vorbereitung vor der Berechnung mit einem genetischen Algorithmus

Bestimmen Sie die Regeln bei der Berechnung mit einem genetischen Algorithmus.

  1. Bestimmen Sie die Anfangsparameter zufällig zwischen 10 und 400
  2. Berechnen Sie bis zu 200 Generationen.
  3. Verbessern Sie den Handelsgewinn als Punktzahl.
  4. Stellen Sie die Anzahl der Personen in einer Generation auf 20 ein
  5. Stellen Sie die Mutationsrate auf 1% ... usw.

Die Berechnungseffizienz hängt von der Anzahl der Personen und der Mutationsrate ab. Es gibt auch Artikel aus der Perspektive, welche Werte für die Effizienz verwendet werden sollten. Wenn Sie also interessiert sind, können Sie sie lesen.

Häufige Fehler bei genetischen Algorithmen Teiloptimierung

Wenn Sie die Berechnung in der 200. Generation nicht abschließen und endlos weiterentwickeln, wird sie teilweise optimiert und die Effizienz sinkt. スクリーンショット 2015-09-30 14.57.54.png

Berechnungsergebnis durch genetischen Algorithmus

Eventuell werden solche Daten gesammelt. スクリーンショット 2015-09-30 14.58.53.png

Implementierung mit genetischem Algorithmus

Implementierung von Crossover / Mutation im genetischen Algorithmus So generieren Sie die Grundgesamtheit Backtest-Algorithmus Tatsächlicher Aufbau des Handelssystems

Ich habe es noch nicht fertig geschrieben, daher möchte ich es zu einem späteren Zeitpunkt in Teil 2 vorstellen.

Ich habe den nächsten Artikel geschrieben

Automatischer FX-Handel mit genetischem Algorithmus Teil 2 Implementierung der sich entwickelnden Handels-KI

Recommended Posts

Automatisches FX-Handelssystem mit Python und genetischem Algorithmus Teil 1
FX automatischer Handel mit genetischem Algorithmus Teil 2 Implementierung der sich entwickelnden Handels-KI
FX automatischer Handel mit genetischem Algorithmus Teil 3 Tatsächlicher Handel mit Oanda API
Systemhandel ab Python 3: Investition und Risiko
[Python] Versuchen Sie, die FX-Systolenparameter mit einem genetischen Algorithmus zu optimieren
Systemhandel ab Python3: langfristige Investition
FM-Modulation und Demodulation mit Python Part 3
FM-Modulation und Demodulation mit Python Part 2
[Python] Python und Sicherheit - Port-Scan-Tool mit Python
Dynamische HTML-Seiten mit AWS Lambda und Python
Genetischer Algorithmus in Python
Automatisches Folgen auf Twitter mit Python und Selen! (RPA)
[Einführung in den Systemhandel] Ich habe einen Stochastic Oscillator mit Python gezeichnet und damit gespielt ♬
Ich habe versucht, LINE BOT mit Python und Heroku zu machen
Webanwendung erstellt mit Python3.4 + Django (Teil.1 Umgebungskonstruktion)
Systemhandel ab Python 3: Hedge Fund und CTA
Eine Python-Probe zum Lernen von XOR mit einem genetischen Algorithmus in einem neuronalen Netz
Ich habe die Strategie des Aktiensystemhandels mit Python evaluiert.
Löse das Spiralbuch (Algorithmus und Datenstruktur) mit Python!
Bildverarbeitung mit Python (Teil 2)
Programmieren mit Python und Tkinter
Ver- und Entschlüsselung mit Python
Python mit freeCodeCamp Teil1 studieren
Angrenzende Bilder mit Python Teil 1
Python und Hardware-Verwenden von RS232C mit Python-
Schaben mit Selen + Python Teil 1
Python studieren mit freeCodeCamp part2
Bildverarbeitung mit Python (Teil 1)
Nampre mit Python lösen (Teil 2)
Backtesting von FX Systre mit Python (2)
[Python3] Dikstra-Methode mit 14 Zeilen
Bildverarbeitung mit Python (3)
Schaben mit Selen + Python Teil 2
Python mit Pyenv und Venv
Ich habe mit Python einen Blackjack gemacht.
Präsentationsunterstützungssystem mit Python3
Othello gemacht mit Python (wie GUI)
Ich habe Wordcloud mit Python gemacht.
Funktioniert mit Python und R.
Erstellen Sie eine automatische Klassenverwaltungs-App für Tenho Private Room mit LINE Bot und Python Part 1
Erstellen Sie mit LINE Bot und Python Part 2 eine automatische Klassenverwaltungs-App für Tenho Private Room
Erstellen Sie eine automatische Klassenverwaltungs-App für Tenho Private Room mit LINE Bot und Python Part ③
Ich habe eine einfache Schaltung mit Python gemacht (AND, OR, NOR, etc.)
IPynb-Bewertungssystem mit TA von Introduction to Programming (Python)
Automatische Bildinterpolation mit OpenCV und Python (Fast Marching Method, Navier-Stokes)
Finden Sie den optimalen Wert der Funktion mit einem genetischen Algorithmus (Teil 2)
Ich habe mit Python, Flask und Heroku ein Nyanko-Tweet-Formular erstellt
Lösen der Einführung von AOJ in Algorithmen und Datenstrukturen in Python -Part2-
Lösen der Einführung von AOJ in Algorithmen und Datenstrukturen in Python -Part4-
Lösen der Einführung von AOJ in Algorithmen und Datenstrukturen in Python -Part3-
Kommunizieren Sie mit FX-5204PS mit Python und PyUSB
Spielen Sie handschriftliche Zahlen mit Python Part 1
Roboter läuft mit Arduino und Python
Installieren Sie Python 2.7.9 und Python 3.4.x mit pip.
Mit Flask erstellte SNS Python-Grundlagen
Perl-Objekt und Python-Klasse Teil 2.
Neuronales Netzwerk mit OpenCV 3 und Python 3
AM-Modulation und Demodulation mit Python