Ich habe versucht, die folgenden Funktionen zu implementieren
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/
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
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
■ 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
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
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.
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.
Bestimmen Sie die Regeln bei der Berechnung mit einem genetischen Algorithmus.
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.
Wenn Sie die Berechnung in der 200. Generation nicht abschließen und endlos weiterentwickeln, wird sie teilweise optimiert und die Effizienz sinkt.
Eventuell werden solche Daten gesammelt.
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.
Recommended Posts