Aprendizaje reforzado para el comercio automatizado con Python

Inhalt

Dieser Artikel wurde im Rahmen der Data Science Blogathon.

Einführung

Esto ha estado trabajando convencionalmente con el plan comercial y las tendencias de noticias. Con la llegada de la ciencia de datos y el aprendizaje automático, se han diseñado varios enfoques de investigación para automatizar este proceso manual. Este proceso de negociación automatizado ayudará a dar sugerencias en el momento adecuado con mejores cálculos. Una estrategia de negociación automatizada que ofrezca el máximo beneficio es muy deseable para los fondos mutuos y los fondos de cobertura. El tipo de rendimiento rentable que se espera conllevará cierto riesgo potencial. Diseñar una estrategia comercial automatizada rentable es una tarea compleja.

Todo ser humano quiere ganar su máximo potencial en el mercado de valores. Es muy importante diseñar una estrategia equilibrada y de bajo riesgo que pueda beneficiar a la mayoría de las personas. Uno de estos enfoques habla sobre el uso de agentes de Verstärkungslernen para proporcionarnos estrategias comercialas automatizadas basadas en datos históricos.

Verstärktes Lernen

El aprendizaje por refuerzo es un tipo de aprendizaje automático en el que hay entornos y agentes. Estos agentes toman acciones para maximizar las recompensas. El aprendizaje por refuerzo tiene un potencial enorme cuando se utiliza para simulaciones para entrenar un modelo de IA. No hay una etiqueta asociada con ningún dato, el aprendizaje por refuerzo puede aprender mejor con muy pocos puntos de datos. Todas las decisiones, in diesem Fall, se toman de forma secuencial. El mejor ejemplo se encontraría en Robótica y Juegos.

  Imagen de negociación automatizada de aprendizaje por refuerzo

Q – Aprendizaje

Q-learning es un algoritmo de aprendizaje por refuerzo sin modelos. Informa al agente qué acción emprender según las circunstancias. Es un método basado en valores que se utiliza para proporcionar información a un agente para la acción inminente. Se considera un algoritmo fuera de la política, ya que la función q-learning aprende de acciones que están fuera de la política actual, como tomar acciones aleatorias y, Daher, no se necesita una política.

Q aquí significa Calidad. La calidad se refiere a la calidad de la acción en cuanto a qué tan beneficiosa será esa recompensa de acuerdo con la acción tomada. Se crea una Q-table con dimensiones [Zustand,Aktion]Un agente interactúa con el medio ambiente en cualquiera de las dos formas: explotar y explorar. Una opción de explotación sugiere que se consideren todas las acciones y se tome la que le dé el máximo valor al medio ambiente. Una opción de exploración es aquella en la que se considera una acción aleatoria sin considerar la recompensa máxima futura.

Matrix q-aprendizaje

  Aprendizaje por refuerzo Fórmula de aprendizaje q de comercio automatizado

Q de st y at está representado por una fórmula que calcula la recompensa futura descontada máxima cuando se realiza una acción en un estado s.

La función definida nos proporcionará la recompensa máxima al final del número n de ciclos de Ausbildung o iteraciones.

Der Handel kann die folgenden Aktionen haben: kaufen, verkaufen oder behalten

Q-Learning bewertet jede einzelne Aktion und es wird diejenige ausgewählt, die den höchsten Wert hat. Q-Learning basiert darauf, die Werte der Q-Tabelle zu lernen. Es funktioniert gut ohne Belohnungsfunktionen und Zustandsübergangswahrscheinlichkeiten.

Verstärkendes Lernen im Aktienhandel

Verstärkendes Lernen kann verschiedene Arten von Problemen lösen. Handel ist eine kontinuierliche Aufgabe ohne definierten Endpunkt. Handeln ist auch ein teilweise beobachtbarer Markow-Entscheidungsprozess, da wir keine vollständigen Informationen über die Händler auf dem Markt haben. Da wir die Belohnungsfunktion und die Übergangswahrscheinlichkeit nicht kennen, wir verwenden modellfreies Reinforcement Learning, was Q-Learning ist.

Schritte zur Ausführung eines RL-Agenten:

  1. Bibliotheken installieren

  2. Holen Sie sich die Daten

  3. Definieren Sie den Q-Learning-Agenten

  4. Den Agenten ausbilden

  5. Testen Sie den Agenten

  6. Signale darstellen

Bibliotheken installieren

Installieren und importieren Sie die erforderlichen Finanzbibliotheken von NumPy, Pandas, matplotlib, seaborn und yahoo.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
sns.set()
!pip install yfinance --upgrade --no-cache-dir
from pandas_datareader import data as pdr
import fix_yahoo_finance as yf
from collections import deque
import random
Import tensorflow.compat.v1 as tf
tf.compat.v1.disable_eager_execution()

Holen Sie sich die Daten

Verwenden Sie die Yahoo Finance-Bibliothek, um die Daten einer bestimmten Aktie zu erhalten. Die hier für unsere Analyse verwendeten Aktien sind die Aktien von Infosys.

yf.pdr_override()
df_full = pdr.get_data_yahoo("INFY", start="2018-01-01").reset_index()
df_full.to_csv(‘INFY.csv',index=Falsch)
df_full.head()

Dieser Code erstellt einen DataFrame namens df_full, der die Aktienkurse von INFY im Verlauf enthält 2 Jahre.

Definieren Sie den Q-Learning-Agenten

Die erste Funktion ist die Agentenklasse, die die Größe des Zustands definiert, Fenstergröße, Losgröße, deque, das als verwendeter Speicher dient, Inventar als Liste. Es werden auch einige statische Variablen wie Epsilon definiert, Abnahme, Gamma, etc. Es werden zwei Schichten definiert rotes neuronales für Kauf, Halten und Verkauf von Optionen. GradientDescentOptimizer wird auch verwendet.

Der Agent hat definierte Funktionen für Kauf- und Verkaufsoptionen. Die Funktion get_state und act verwendet das neuronale Netzwerk, um den nächsten Zustand des neuronalen Netzes zu erzeugen. Die Belohnungen werden anschließend berechnet, indem der Wert, der bei der Ausführung der Call-Option erzeugt wurde, addiert oder subtrahiert wird. Die im nächsten Zustand getroffene Handlung wird von der im vorherigen Zustand getroffenen Handlung beeinflusst. 1 bezieht sich auf einen Kaufaufruf, während 2 bezieht sich auf einen Verkaufsaufruf. In jeder Iteration, Der Zustand wird auf Grundlage bestimmt, auf deren Basis eine Handlung getroffen wird, die einige Aktien kaufen oder verkaufen wird. Die allgemeinen Belohnungen werden in der gespeichert Variable vom Gesamtgewinn.

df = df_full.copy()
name="Q-Learning-Agent"
Klasse Agent:
    def __init__(selbst, state_size, window_size, Trend, überspringen, batch_size):
        self.state_size = state_size
        self.window_size = window_size
        self.half_window = window_size // 2
        self.trend = trend
        self.skip = skip
        self.action_size = 3
        self.batch_size = batch_size
        self.memory = deque(maxlen = 1000)
        self.inventory = []
        self.gamma = 0.95
        self.epsilon = 0.5
        self.epsilon_min = 0.01
        self.epsilon_decay = 0.999
        tf.reset_default_graph()
        self.sess = tf. InteractiveSession()
        selbst. X = tf.platzhalter(tf.float32, [Keiner, self.state_size])
        selbst. Y = tf.placeholder(tf.float32, [Keiner, self.action_size])
        feed = tf.layers.dense(self. X, 256, Aktiverung = tf.nn.relu)
        self.logits = tf.layers.dense(feed, self.action_size)
        self.cost = tf.reduce_mean(tf.square(self. Y - self.logits))
        self.optimizer = tf.train.GradientDescentOptimizer(1e-5).minimize(
            self.cost
        )
        self.sess.run(tf.global_variables_initializer())
    def act(selbst, Zustand):
        if random.random() <= self.epsilon:
            return random.randrange(self.action_size)
        np.argmax zurückgeben(
            self.sess.run(self.logits, feed_dict = {self. X: Zustand})[0]
        )
    def get_state(selbst, T):
        window_size = self.window_size + 1
        d = t - window_size + 1
        block = self.trend[D : T + 1] wenn d >= 0 else -d * [self.trend[0]] + self.trend[0 : T + 1]
        res = []
        für mich in Reichweite(window_size - 1):
            res.append(Block[ich + 1] - Block[ich])
        np.array zurückgeben([res])
    def replay(selbst, batch_size):
        mini_batch = []
        l = len(self.memory)
        für mich in Reichweite(l - batch_size, l):
            mini_batch.append(self.memory[ich])
        replay_size = len(mini_batch)
        X = np.empty((replay_size, self.state_size))
        Y = np.empty((replay_size, self.action_size))
        states = np.array([ein[0][0] für a in mini_batch])
        new_states = np.array([ein[3][0] für a in mini_batch])
        Q = self.sess.run(self.logits, feed_dict = {self. X: Zustände})
        Q_new = selbst.sess.run(self.logits, feed_dict = {self. X: new_states})
        für mich in Reichweite(len(mini_batch)):
            Zustand, Aktion, Belohnung, next_state, fertig = mini_batch[ich]
            Ziel = Q[ich]
            Ziel[Aktion] = reward
            if not done:
                Ziel[Aktion] += selbst.gamma * np.amax(Q_new[ich])
            x[ich] = state
            Y[ich] = target
        cost, _ = self.sess.run(
            [self.cost, self.optimizer], feed_dict = {self. X: x, self. Y: Ja}
        )
        if self.epsilon > self.epsilon_min:
            self.epsilon *= self.epsilon_decay
        return cost
    def buy(selbst, anfängliches_Geld):
        starting_money = initial_money
        states_sell = []
        Zustände_kaufen = []
        Inventar = []
        Zustand = self.get_state(0)
        für T im Bereich(0, len(self.trend) - 1, self.überspringen):
            Aktion = self.act(Zustand)
            nächster_Zustand = self.get_state(T + 1)
            wenn Aktion == 1 und anfängliches_Geld >= self.Trend
                Inventar.append(self.Trend
                anfängliches_Geld -= self.Trend
                Zustände_kaufen.append
                drucken('Tag %d: kaufen 1 Einheit zum Preis %f, Gesamtsaldo %f'% (T, self.Trend
            elif Aktion == 2 und len(Inventar):
                gekaufter_Preis = Inventar.pop(0)
                initial_money += self.trend
 states_sell.append
 try:
                    invest = ((close
 except:
                    invest = 0
                drucken(
                    'Tag %d, sell 1 Einheit zum Preis %f, investment %f %%, Gesamtsaldo %f,'
                    % (T, schließen
                )
            state = next_state
        invest = ((anfängliches_Geld - starting_money) / starting_money) * 100
        total_gains = initial_money - starting_money
        return states_buy, states_sell, total_gains, invest
    def train(selbst, Iterationen, Kontrollpunkt, anfängliches_Geld):
        für mich in Reichweite(Iterationen):
            total_profit = 0
            Inventar = []
            Zustand = self.get_state(0)
            starting_money = initial_money
            for t in range(0, len(self.trend) - 1, self.überspringen):
                Aktion = self.act(Zustand)
                nächster_Zustand = self.get_state(T + 1)
                wenn Aktion == 1 und starting_money >= selbst.trend
 Inventar.append(self.trend
 starting_money -= self.trend
 elif action == 2 und len(Inventar) > 0:
                    gekaufter_Preis = Inventar.pop(0)
                    total_profit += self.trend
 starting_money += self.trend
 invest = ((starting_money - anfängliches_Geld) / anfängliches_Geld)
                self.memory.append((Zustand, Aktion, invest, 
                                    next_state, starting_money < anfängliches_Geld))
                state = next_state
                batch_size = min(self.batch_size, len(self.memory))
                cost = self.replay(batch_size)
            Wenn (ich+1) % checkpoint == 0:
                drucken('epoch: %D, total rewards: %f.3, Kosten: %F, total money: %f'%(ich + 1, total_profit, Kosten,
                                                                                  starting_money))

Den Agenten ausbilden

Una vez definido el agente, inicialícelo. Especifique el número de iteraciones, dinero inicial, etc. para capacitar al agente para que decida las opciones de compra o venta.

Nahe = DF. Close.values.tolist()
initial_money = 10000
window_size = 30
skip = 1
batch_size = 32
Agent = Agent(state_size = window_size, 
              window_size = window_size, 
              trend = close, 
              skip = skip, 
              batch_size = batch_size)
agent.train(Iterationen = 200, checkpoint = 10, initial_money = initial_money)

Produktion –

1-1-2306661

Testen Sie den Agenten

La función de compra devolverá las cifras de compra, Verkauf, beneficio e inversión.

states_buy, states_sell, total_gains, investieren = agent.buy(initial_money = initial_money)

Trazar las llamadas

Grafique las ganancias totales frente a las cifras invertidas. Todas las llamadas de compra y venta se han marcado adecuadamente de acuerdo con las opciones de compra / venta sugeridas por la red neuronal.

fig = plt.figur(Feigengröße = (15,5))
plt.plot(schließen, Farbe="R", lw=2.)
plt.plot(schließen, '^', markersize=10, Farbe="m", Etikett="Buying Signal", Markevery = states_buy)
plt.plot(schließen, 'v', markersize=10, Farbe="k", Etikett="Selling Signal", Markevery = states_sell)
plt.titel('Total Gains %f, Total Investment %f%%'%(total_gains, invest))
plt.legende()
plt.savefig(name+'.png')
plt.zeigen()

Produktion –

3-7229887

2-1-8007510

Abschließende Anmerkungen

Q-Learning es una técnica que le ayuda a desarrollar una estrategia comercial automatizada. Se puede utilizar para experimentar con las opciones de compra o venta. Hay muchos más agentes comerciales de aprendizaje por refuerzo con los que se puede experimentar. Intente jugar con los diferentes tipos de agentes de RL con diferentes acciones.

Die in diesem Artikel gezeigten Medien sind nicht Eigentum von DataPeaker und werden nach Ermessen des Autors verwendet.

Abonniere unseren Newsletter

Wir senden Ihnen keine SPAM-Mail. Wir hassen es genauso wie du.

Datenlautsprecher