Apprendimento rinforzato per il trading automatizzato con Python

Contenuti

Questo articolo è stato pubblicato nell'ambito del Blogathon sulla scienza dei dati.

introduzione

Questo ha funzionato convenzionalmente con il piano aziendale e le tendenze delle notizie. Con l'avvento della scienza dei dati e dell'apprendimento automatico, Diversi approcci di ricerca sono stati progettati per automatizzare questo processo manuale. Questo processo di trading automatizzato aiuterà a dare suggerimenti al momento giusto con calcoli migliori.. Una strategia di trading automatizzata che offra il massimo profitto è altamente auspicabile per i fondi comuni di investimento e gli hedge fund.. Il tipo di rendimento redditizio previsto comporterà un potenziale rischio. Progettare una strategia di trading automatizzato redditizia è un compito complesso.

Ogni essere umano vuole guadagnare il suo massimo potenziale in borsa. È molto importante progettare una strategia equilibrata ea basso rischio che possa avvantaggiare la maggior parte delle persone.. Uno de estos enfoques habla sobre el uso de agentes de aprendizaje por refuerzo para proporcionarnos estrategias comerciales automatizadas basadas en datos históricos.

Apprendimento rinforzato

L'apprendimento per rinforzo è un tipo di apprendimento automatico in cui sono presenti ambienti e agenti. Questi agenti intraprendono azioni per massimizzare i premi. L'apprendimento per rinforzo ha un potenziale enorme se utilizzato per le simulazioni per addestrare un modello di intelligenza artificiale. Non ci sono tag associati a nessun dato, l'apprendimento per rinforzo può imparare meglio con pochissimi punti dati. Tutte le decisioni, in questo caso, sono presi in sequenza. L'esempio migliore si trova in Robotica e giochi.

  Immagine di negoziazione automatizzata per l'apprendimento del rinforzo

Q – Apprendimento

Il Q-learning è un algoritmo di apprendimento per rinforzo senza modello. Informa l'agente quale azione intraprendere in base alle circostanze. È un metodo basato sul valore che viene utilizzato per fornire informazioni a un agente per un'azione imminente. È considerato un algoritmo al di fuori della politica, poiché la funzione q-learning apprende da azioni che sono al di fuori della politica attuale, come eseguire azioni casuali e, così, nessuna politica necessaria.

Q qui significa Qualità. La qualità si riferisce alla qualità dell'azione in termini di vantaggio che tale ricompensa sarà basata sull'azione intrapresa.. Viene creata una tabella Q con le dimensioni [stato,azione]Un agente interagisce con l'ambiente in due modi: esplodi ed esplora. Un'opzione di sfruttamento suggerisce di considerare tutte le azioni e di intraprendere quella che dà il massimo valore all'ambiente. Un'opzione di esplorazione è quella in cui viene considerata un'azione casuale senza considerare la massima ricompensa futura.

Matrix q-learning

  Apprendimento per rinforzo Trading automatizzato q formula di apprendimento

Q di st e at è rappresentato da una formula che calcola la massima ricompensa futura scontata quando un'azione viene eseguita in uno stato s.

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

Il commercio può avere le seguenti chiamate: comprare, vendere o tenere

Q-learning valuterà ciascuna delle azioni e verrà selezionata quella con il valore massimo. Q-Learning si basa sull'apprendimento dei valori della Q-table. Funziona bene senza le funzioni di ricompensa e le probabilità di transizione dello stato.

Apprendimento rafforzato nella compravendita di azioni

L'apprendimento per rinforzo può risolvere vari tipi di problemi. Il trading è un'attività continua senza alcun endpoint. La negoziazione è anche un processo decisionale di Markov parzialmente osservabile., poiché non disponiamo di informazioni complete sui trader sul mercato. Come non conosciamo la funzione di ricompensa e la probabilità di transizione, usiamo l'apprendimento per rinforzo senza un modello, cos'è Q-Learning.

Passaggi per eseguire un agente RL:

  1. Installa librerie

  2. Ottieni i dati

  3. Definire l'agente Q-Learning

  4. Formare l'agente

  5. Testare l'agente

  6. Traccia i segnali

Installa librerie

Installare e importare le librerie finanziarie NumPy necessarie, panda, matplotlib, seaborn e 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()

Ottieni i dati

Utilizzare la libreria di Yahoo Finance per ottenere i dati per un particolare titolo. Le azioni utilizzate qui per la nostra analisi sono le azioni di Infosys.

yf.pdr_override()
df_full = pdr.get_data_yahoo("INFY", inizio="2018-01-01").reset_index()
df_full.to_csv('INFY.csv',indice=Falso)
df_full.head()

Questo codice creerà un framework di dati chiamato df_full che conterrà i prezzi delle azioni di INFY nel corso del 2 anni.

Definire l'agente Q-Learning

La prima funzione è la classe agente che definisce la dimensione dello stato, dimensione della finestra, Dimensione del lotto, deque qual è la memoria utilizzata, inventario come elenco. Definisci anche alcune variabili statiche come epsilon, decadimento, gamma, eccetera. Se definen dos capas de neuronale rosso para la compra, metti in attesa e vendi chiamate. Viene utilizzato anche GradientDescentOptimizer.

L'agente ha funzioni definite per le opzioni call e put. La funzione get_state e act utilizza la rete neurale per generare lo stato successivo della rete neurale. I premi vengono successivamente calcolati sommando o sottraendo il valore generato dall'esecuzione dell'opzione call. L'azione intrapresa nello stato successivo è influenzata dall'azione intrapresa nello stato precedente. 1 si riferisce a una chiamata di acquisto, mentre 2 si riferisce a una chiamata di vendita. In ogni iterazione, el estado se determina sobre la base del cual se toma una acción que comprará o venderá algunas acciones. Las recompensas generales se almacenan en la variabile de beneficio total.

df= df_full.copy()
nome="Agente Q-learning"
classe Agent:
    def __init__(se stesso, state_size, window_size, tendenza, saltare, dimensione del lotto):
        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()
        stesso. X = tf.segnaposto(tf.float32, [Nessuno, self.state_size])
        stesso. Y = tf.segnaposto(tf.float32, [Nessuno, self.action_size])
        feed = tf.layers.dense(stesso. X, 256, attivazione = tf.nn.relu)
        self.logits = tf.layers.dense(Nutrire, self.action_size)
        self.cost = tf.reduce_mean(tf.quadrato(stesso. Y - self.logits))
        self.optimizer = tf.train.GradientDescentOptimizer(1e-5 ·).minimizzare(
            self.cost
        )
        self.sess.run(tf.global_variables_initializer())
    def atto(se stesso, stato):
        se random.random() <= self.epsilon:
            restituire random.randrange(self.action_size)
        restituire np.argmax(
            self.sess.run(self.logits, feed_dict = {stesso. X: stato})[0]
        )
    def get_state(se stesso, T):
        window_size = self.window_size + 1
        d = t - window_size + 1
        blocco = self.trend[D : T + 1] se d >= 0 else -d * [self.trend[0]] + self.trend[0 : T + 1]
        res = []
        per io nel raggio d'azione(window_size - 1):
            res.append(blocco[io + 1] - blocco[io])
        restituire np.array([res])
    def replay(se stesso, dimensione del lotto):
        mini_batch = []
        l = len(self.memory)
        per io nel raggio d'azione(io - dimensione del lotto, io):
            mini_batch.append(self.memory[io])
        replay_size = len(mini_batch)
        X = np.empty((replay_size, self.state_size))
        Y = np.empty((replay_size, self.action_size))
        states = np.array([un[0][0] per un in mini_batch])
        new_states = np.array([un[3][0] per un in mini_batch])
        Q = self.sess.run(self.logits, feed_dict = {stesso. X: stati})
        Q_new = self.sess.run(self.logits, feed_dict = {stesso. X: new_states})
        per io nel raggio d'azione(len(mini_batch)):
            stato, azione, ricompensa, next_state, fatto = mini_batch[io]
            target = Q[io]
            obbiettivo[azione] = reward
            if not done:
                obbiettivo[azione] += self.gamma * np.amax(Q_new[io])
            X[io] = state
            Y[io] = target
        cost, _ = self.sess.run(
            [self.cost, self.optimizer], feed_dict = {stesso. X: X, stesso. Y: E}
        )
        se self.epsilon > self.epsilon_min:
            self.epsilon *= self.epsilon_decay
        return cost
    def buy(se stesso, initial_money):
        starting_money = initial_money
        states_sell = []
        states_buy = []
        inventario = []
        stato = self.get_state(0)
        per t nell'intervallo(0, len(self.trend) - 1, self.skip):
            azione = self.act(stato)
            next_state = self.get_state(T + 1)
            se azione == 1 e initial_money >= self.trend inventory.append(self.trend initial_money -= self.trend states_buy.append print(«giorno %d: comprare 1 unità al prezzo %f, saldo totale %f'% (T, self.trend elif azione == 2 e len(inventario):
                bought_price = inventory.pop(0)
                initial_money += self.trend states_sell.append prova:
                    investire = ((chiudi tranne:
                    investire = 0
                Stampa(
                    «giorno %d, vendere 1 unità al prezzo %f, investimento %f %%, saldo totale %f,'
                    % (T, chiudere
                )
            state = next_state
        invest = ((initial_money - starting_money) / starting_money) * 100
        total_gains = initial_money - starting_money
        return states_buy, states_sell, total_gains, invest
    def train(se stesso, Iterazioni, posto di blocco, initial_money):
        per io nel raggio d'azione(Iterazioni):
            total_profit = 0
            inventario = []
            stato = self.get_state(0)
            starting_money = initial_money
            for t in range(0, len(self.trend) - 1, self.skip):
                azione = self.act(stato)
                next_state = self.get_state(T + 1)
                se azione == 1 e starting_money >= self.trend inventory.append(self.trend starting_money -= self.trend elif action == 2 e len(inventario) > 0:
                    bought_price = inventory.pop(0)
                    total_profit += self.trend starting_money += self.trend invest = ((starting_money - initial_money) / initial_money)
                self.memory.append((stato, azione, investire, 
                                    next_state, starting_money < initial_money))
                state = next_state
                batch_size = min(self.batch_size, len(self.memory))
                costo = self.replay(dimensione del lotto)
            Se (i+1) % checkpoint == 0:
                Stampa('epoca: %D, ricompense totali: %f.3, costo: %F, denaro totale: %f'%(io + 1, total_profit, costo,
                                                                                  starting_money))

Formare l'agente

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

close = df. Chiudi.valori.tolist()
initial_money = 10000
window_size = 30
salta = 1
batch_size = 32
agente = Agente(state_size = window_size, 
              window_size = window_size, 
              trend = chiudi, 
              skip = salta, 
              batch_size = batch_size)
agent.train(iterazioni = 200, checkpoint = 10, initial_money = initial_money)

Produzione –

1-1-2306661

Testare l'agente

La función de compra devolverá las cifras de compra, saldi, profitto e investimento.

States_buy, states_sell, total_gains, investi = agente.acquista(initial_money = initial_money)

Traccia le chiamate

Traccia i guadagni totali rispetto alle cifre investite. Tutte le chiamate di acquisto e vendita sono state contrassegnate correttamente in base alle opzioni di acquisto / vendita suggerita dalla rete neurale.

fig = plt.figure(dimensione del fico = (15,5))
plt.trama(chiudere, colore="R", lw=2.)
plt.trama(chiudere, '^', dimensione dell'indicatore = 10, colore="m", etichetta="segnale di acquisto", markevery = States_buy)
plt.trama(chiudere, 'v', dimensione dell'indicatore = 10, colore="K", etichetta="segnale di vendita", markevery = States_sell)
plt.titolo('guadagno totale %f, investimento totale %f%%'%(total_gains, investire))
plt.legend()
plt.savefig(nome+'.png')
plt.mostra()

Produzione –

3-7229887

2-1-8007510

Note finali

Q-Learning è una tecnica che ti aiuta a sviluppare una strategia di trading automatizzata. Può essere utilizzato per sperimentare opzioni call o put. Ci sono molti altri agenti di apprendimento per rinforzo commerciale con cui sperimentare. Prova a giocare con i diversi tipi di agenti RL con azioni diverse.

Il supporto mostrato in questo articolo non è di proprietà di DataPeaker e viene utilizzato a discrezione dell'autore.

Iscriviti alla nostra Newsletter

Non ti invieremo posta SPAM. Lo odiamo quanto te.