Vai al contenuto principale

Tutorial sul Trading Algoritmico in R

In questo tutorial su R farai web scraping, userai un'API finanziaria e un htmlwidget per creare un grafico interattivo di serie temporali e applicare una semplice strategia di trading algoritmico
Aggiornato 29 set 2026  · 15 min leggi

Scopri con l'IA

ChatGPTClaudePerplexity

In questo post ti mostrerò come usare R per raccogliere le azioni elencate su loyal3, ottenere dati storici da Yahoo e poi applicare una semplice strategia di trading algoritmico. Lungo il percorso imparerai un po' di web scraping, a chiamare un'API finanziaria e a usare un htmlwidget per creare un grafico interattivo di serie temporali.

Per questo post, un algo di trading è definito come un insieme di regole che attivano un evento di acquisto o vendita, piuttosto che un modello predittivo o una previsione di serie temporali. Questo è il tipo più semplice di algo di trading, ma se vuoi approfondire la finanza con R, ti consiglio di seguire il corso di DataCamp sulla modellazione di una strategia di trading quantitativa in R.

Contesto

Nel 2015 ho iniziato a investire un po' su loyal3. Il loro servizio è particolare ed è un ottimo posto per iniziare il tuo percorso d’investimento. Invece di far pagare all’investitore le operazioni, loyal3 fa pagare le aziende per essere elencate sulla loro piattaforma. L’idea è che chi apprezza i servizi di un’azienda compri anche le sue azioni e, così facendo, diventi un forte sostenitore del marchio. A rendere la piattaforma ancora più interessante c’è il fatto che puoi comprare frazioni di azioni. Quindi puoi entrare in quel titolo Amazon da $800 con soli $10 e acquistare un’altra frazione da $10 ogni volta che ti avanza un po’ di denaro a fine mese. Certo, ci sono costi di frizione perché devi operare in finestre e il tuo portafoglio è limitato a ~70 titoli, ma loyal3 rappresenta un modo divertente e a basso costo per esplorare il trading azionario. Puoi “metterci la pelle” con appena $10!

Per chiarezza, ho i classici conti pensionistici e di investimento, ma mi piace l’interfaccia pulita dell’app di loyal3 e l’assenza di commissioni. Finisco per controllare il mio portafoglio “divertimento” su loyal3 più spesso dei miei fondi comuni semplicemente perché è facile e divertente vedere l’andamento delle azioni che ho scelto direttamente.

trading algoritmico R
I titoli disponibili su www.loyal3.com

Configura il tuo Workspace

Per iniziare, carica le librerie nel tuo ambiente. Quasi sempre uso rvest per il web scraping ultimamente. Esistono altri pacchetti che funzionano, incluso RSelenium, ma mi piace la semplicità con cui si usa rvest.

Il secondo pacchetto, pbapply, è opzionale perché aggiunge semplicemente una barra di avanzamento alle funzioni apply. Dato che potresti effettuare lo scraping di centinaia di pagine web, una barra di avanzamento può aiutarti a stimare i tempi.

Successivamente, TTR è un pacchetto che ho appena iniziato a esplorare. La libreria serve a costruire “Technical Trading Rules”. Anche se in questo post imparerai un semplice algo di trading, il pacchetto TTR può eseguire calcoli più sofisticati ed è utile da conoscere.

La libreria dygraphs è un wrapper per una libreria JavaScript di charting veloce e open source. È uno degli htmlwidget che rende i grafici in R più dinamici e parte di un file HTML invece che un’immagine statica. Infine, il pacchetto lubridate è usato per manipolare facilmente le date.

library(rvest)
library(pbapply)
library(TTR)
library(dygraphs)
library(lubridate)

Raccolta Dati

Tutte le azioni di loyal3 sono elencate in un’unica pagina. Prima di poter cercare i prezzi giornalieri delle singole azioni per costruire il tuo algoritmo di trading, devi raccogliere tutti i ticker disponibili. La prima cosa da fare è dichiarare stock.list come stringa URL. Poi usa read_html() in modo che la tua sessione R crei una sessione Internet e raccolga tutte le informazioni HTML della pagina come un set di nodi XML. Il CSS della pagina ha un ID chiamato “.company-name”. Usalo come parametro quando chiami html_nodes() per selezionare solo i dati XML associati a questo nodo. Infine, usa html_text() così da estrarre i valori di testo effettivi per i nomi delle aziende.

stock.list<-'https://www.loyal3.com/stocks'
stocks<-read_html(stock.list)
stocks.names<-html_nodes(stocks,'.company-name')
stocks.names<-html_text(stocks.names)

Per esaminare i titoli disponibili su loyal3, puoi stampare l’oggetto stocks.names nella console. Questo restituisce il nome dell’azienda come vettore di testo.

stocks.names 

Per analizzare i prezzi, prima devi ottenere il simbolo ticker. Sul sito loyal3 puoi cliccare sul riquadro dell’azienda per caricare una pagina con il ticker e altre informazioni.

Usando html_nodes() su stocks, estrai tutti i nodi marcati con “a”. In HTML il tag <a> definisce un collegamento ipertestuale usato per passare da una pagina all’altra. All’interno del tag del link, “href” si riferisce all’indirizzo URL esatto. Quindi html_attr() estrarrà l’URL di TUTTI i link sulla pagina se passi “href”.

Dopo un po’ di ispezione manuale, ho scoperto che i link dal 54° al 123° nella pagina rappresentano le pagine aziendali di cui ho bisogno per fare lo scraping del ticker. L’ultima riga usa paste0() per concatenare la stringa dell’URL base ’http://www.loyal3.com` alle pagine specifiche dell’azienda, come “/WALMART”. Per esempio, http://www.loyal3.com/WALMART:

loyal.links<-html_nodes(stocks, "a")
loyal.links<-html_attr(loyal.links, "href")
stock.links<-paste0('http://www.loyal3.com',loyal.links[54:123])

In ciascuna pagina aziendale ci sono una descrizione, un prezzo di chiusura recente e il ticker. Tutte le pagine sono organizzate allo stesso modo, quindi la funzione personalizzata get.ticker() può essere usata per estrarre il simbolo ticker.

All’interno della pagina dell’azienda c’è una tabella chiamata “ticker-price”. La funzione visiterà la pagina dell’azienda, identificherà la tabella appropriata ed estrarrà il testo con html_text(). Infine, usando sub() insieme all’espressione regolare ^([[:alpha:]]*).* e \\1 manterrà solo i caratteri alfabetici. Il risultato è che eventuali caratteri speciali, come $, e i caratteri numerici, come il prezzo di chiusura, vengono rimossi. Mentre la funzione legge ciascuna delle 70 pagine, raccoglierà solo il ticker dell’azione.

 get.ticker<-function(url){
  x<-read_html(url)
  x<-html_node(x,'.ticker-price')
  x<-html_text(x)
  x<-sub("^([[:alpha:]]*).*", "\\1", x)
  return(x)
  } 
pagina titolo loyal3 per Alibaba
la pagina titolo di loyal3 per Alibaba, dove puoi vedere la tabella contenente il ticker del titolo, BABA, sotto il testo in grassetto

Con la tua funzione personalizzata, usa pblapply() per applicarla a ciascuno dei stock.links che contengono la pagina di ogni azienda. L’oggetto risultante, stock.tickers, è un elenco di singoli ticker, con ogni elemento corrispondente a un’azienda.

stock.tickers<-pblapply(stock.links,get.ticker)

Un modo per trasformare una lista di elementi in un oggetto piatto è con do.call(). Qui applichi rbind per unire per righe ciascun elemento della lista in un singolo vettore. Infine, crei un data frame con le informazioni sul simbolo e sul nome dell’azienda.

stock.ticks<-do.call(rbind,stock.tickers)
stock.ticks<-data.frame(symbol=stock.ticks,name=stocks.names)

Per essere coerente nell’analisi, potresti voler limitare la quantità di informazioni storiche che raccogli per ciascun titolo. La funzione Sys.Data() memorizzerà un oggetto data come anno, mese e poi giorno. Usare gli anni come intero è un modo per sottrarre una quantità specifica di tempo dall’oggetto start.date.

start.date<-Sys.Date()
end.date<-Sys.Date()-years(3)

Per ottenere i dati di Yahoo Finance, l’oggetto data deve essere trasformato in semplici stringhe senza trattino. Usare la funzione di sostituzione globale gsub() sia su start.date che su end.date cambierà la classe e allo stesso tempo rimuoverà i trattini. All’interno di gsub(), passa il pattern di caratteri da cercare, poi i caratteri di sostituzione. In questo caso il pattern di sostituzione è una stringa vuota tra virgolette. L’ultimo parametro è l’oggetto a cui si applica gsub().

start.date<-gsub('-','', start.date)
end.date<-gsub('-','', end.date)

La funzione TTR() getYahooData() accetta un simbolo azionario, e una data di inizio e fine. La funzione restituisce un data frame con informazioni di serie temporali. Ogni riga è una data e le colonne contengono informazioni come il prezzo di “Open”, “High”, “Low” e “Closing” per un titolo. Poiché stai cercando più aziende, puoi usare lapply() o pblapply(). Passa il vettore dei simboli aziendali, poi la funzione getYahooData() e quindi le informazioni sulle date. Gli oggetti date sono parametri riciclati ogni volta che getYahooData() viene applicata a un simbolo.

 stocks.ts<-pblapply(stock.ticks$symbol,getYahooData,end.date, start.date)

Per rendere più semplice la navigazione della lista restituita, stocks.ts, puoi aggiungere dei nomi agli elementi della lista. Usando names con l’oggetto stocks.ts dichiara i nomi come il vettore originale $symbol.

names(stocks.ts)<-stock.ticks$symbol

Quando lavoro con liste grandi, mi piace esaminare l’oggetto risultante per assicurarmi che l’esito sia quello atteso. Ora che gli elementi hanno i nomi, puoi riferirti a loro direttamente. In questo esempio, stai esaminando le prime 6 righe per AMC Entertainment Holdings (AMC). Usare head() sulla lista mentre fai riferimento a $AMC restituirà una porzione della serie temporale per questo titolo:

head(stocks.ts$AMC)

Esaminare i Dati Azionari

Quando ascolto i commentatori di finanza, si riferiscono spesso ai grafici. Nonostante l’high-frequency trading e la gestione attiva svolta da altri, molti piccoli investitori guardano ancora ai grafici per ottenere insight. L’oggetto di serie temporali può essere visualizzato rapidamente usando plot. Passa la lista riferendoti all’elemento nominato come $AMC e poi la colonna che vuoi mostrare, qui $Close.

plot(stocks.ts$AMZN$Close)
grafico azioni

Il grafico precedente è statico e poco interessante.

Usiamo una libreria JavaScript per creare un grafico esplorabile. In questo snippet potresti notare “%>%”, ovvero l’operatore pipe. L’operatore pipe è un buon modo per scrivere codice conciso. Inoltra un oggetto alla funzione successiva senza costringerti a riscrivere un nome di oggetto come fatto in precedenza nel post.

In questo esempio, crei un dygraph riferendoti al titolo Twitter, $TWTR, e poi la colonna che vuoi tracciare, $Close. All’interno di dygraph, main aggiunge un titolo specificato tra virgolette. Usando “%>%” l’intero oggetto viene passato alla funzione successiva dyRangeSelector(). Puoi specificare un intervallo di date predefinito usando c() con una stringa di inizio e fine. L’oggetto HTML risultante è una serie temporale dinamica per il titolo di Twitter con uno slider delle date in basso.

Ricorda: per cambiare il titolo visualizzato, modifica il simbolo del ticker nella lista stocks.ts e poi il titolo del grafico.

dygraph(stocks.ts$TWTR$Close, main = "TWTR Stock Price") %>%
  dyRangeSelector(dateWindow = c("2013-12-18", "2016-12-30"))

dygraph di base per il titolo di Twitter
Questo è un dygraph di base per il titolo di Twitter

Una Semplice Strategia di Trading: Trend Following

I trader ad alta frequenza e gli hedge fund usano modelli sofisticati e approcci basati su regole per eseguire le operazioni. Se vuoi saperne di più ti suggerisco di visitare www.quantopian.com per approcci avanzati. Per approcci più semplici inizia da questa pagina su www.Investopedia.com.

Nel codice qui sotto, visualizzerai una semplice strategia di momentum trading. In sostanza, vuoi calcolare le medie mobili a 200 e 50 giorni del prezzo di un’azione. In qualsiasi giorno in cui la media a 50 giorni è sopra quella a 200 giorni, acquisteresti o manterresti la posizione. Nei giorni in cui la media a 200 giorni è superiore a quella a 50 giorni, venderesti le tue azioni. Questa strategia si chiama trend following. La relazione positiva o negativa tra le due medie basate sul tempo rappresenta il momentum del titolo.

Il pacchetto TTR fornisce SMA() per calcolare la media mobile semplice. In questo snippet stai esaminando i primi 6 valori delle medie mobili a 200 e 50 giorni di Twitter. SMA() funziona passando i dati di serie temporali di un titolo e una colonna specifica come Close. Questa è un’unica serie di prezzi di chiusura per il titolo TWTR. Il secondo parametro è un intero che rappresenta il numero di osservazioni per la media mobile. Senza usare head() la funzione SMA() restituirà tutti i valori.

head(SMA(stocks.ts$TWTR$Close, 200))
head(SMA(stocks.ts$TWTR$Close, 50))

Ora che hai esaminato nel dettaglio la funzione di media mobile, devi applicarla a ciascuno dei 70 titoli. stocks.ts è una lista di 70 data frame contenenti i dati dei singoli titoli. La quarta colonna di ogni data frame contiene il prezzo di chiusura che vogliamo usare per le medie mobili.

La funzione personalizzata mov.avgs() accetta un singolo data frame di un titolo per calcolare le medie mobili. La prima riga seleziona i prezzi di chiusura perché indicizza [,4] per creare stock.close. Poi la funzione usa ifelse per controllare il numero di righe nel data frame. In particolare, se le nrow del data frame sono minori di (2*260), allora la funzione creerà un data frame di medie mobili con “NA”.

Ho scelto questo numero perché ci sono circa 250 giorni di contrattazione all’anno, quindi questo verifica che la serie temporale sia di circa 2 anni o più. Loyal3 a volte può ottenere accesso a IPO e, se il titolo è da poco pubblico, non ci sarà abbastanza storico per una media mobile a 200 giorni. Tuttavia, se il valore di nrow è maggiore di 2*260, allora la funzione creerà un data frame con i dati originali insieme alle medie mobili a 200 e 50 giorni come nuove colonne. Usando colnames, dichiaro i nomi delle colonne. L’ultima parte della funzione usa complete.cases per controllare i valori nella colonna della media a 200 giorni. Eventuali righe che non hanno un valore vengono eliminate nel risultato finale.

mov.avgs<-function(stock.df){
  stock.close<-stock.df[,4]
  ifelse((nrow(stock.df)<(2*260)),
         x<-data.frame(stock.df, 'NA', 'NA'),
         x<-data.frame(stock.df, SMA(stock.close, 200), SMA(stock.close, 50)))
  colnames(x)<-c(names(stock.df), 'sma_200','sma_50')
  x<-x[complete.cases(x$sma_200),]
  return(x)
  }

Con questa funzione mov.avgs() puoi usare pblapply() per aggiungere i calcoli delle medie mobili a ciascuno dei 70 data frame.

stocks.ts<-pblapply(stocks.ts, mov.avgs)

Usa il codice seguente per visualizzare le medie mobili di un titolo con un dygraph. Anche qui il codice usa l’operatore “%>%” per passare gli oggetti. La funzione dygraph() accetta il data frame stocks.ts$FOX. Nello specifico, il data frame è indicizzato per nome di colonna con c('sma_200','sma_50'). Questo oggetto è passato a dySeries() nelle 2 righe successive. Puoi riferirti a una colonna per nome, quindi dySeries() traccia una linea per i valori “sma_50” e “sma_200” nelle righe 2 e 3. Questo oggetto è passato di nuovo a dyRangeSelector() per regolare l’altezza del selettore. Infine ho aggiunto un po’ di shading per definire i periodi in cui avresti voluto acquistare o mantenere il titolo e un periodo in cui avresti dovuto vendere le azioni o restare fuori a seconda della tua posizione.

dygraph(stocks.ts$FOX[,c('sma_200','sma_50')],main = 'FOX Moving Averages') %>%
  dySeries('sma_50', label = 'sma 50') %>%
  dySeries('sma_200', label = 'sma 200') %>%
  dyRangeSelector(height = 30) %>%
  dyShading(from = '2016-4-28', to = '2016-7-27', color = '#CCEBD6') %>%
  dyShading(from = '2016-7-28', to = '2016-12-30', color = '#FFE6E6')

Ecco il risultato finale in una serie temporale interattiva.

medie mobili fox
Le medie mobili di FOX con aree ombreggiate per acquisto/holding rispetto a vendita

Conclusione

Come aspirante trader algoritmico, non è necessario tracciare tutti i 70 titoli. Piuttosto, vorresti eseguire il codice ogni giorno e aggiungere un modo programmatico per identificare i titoli che rispettano il metodo basato su regole: “compra se la media mobile a 50 giorni è sopra la media mobile a 200 giorni”. Riguardando il grafico precedente, la sezione verde è un periodo in cui avresti comprato l’azione FOX. La sezione rossa rappresenta il momento di vendere le azioni e non rientrare.

Poiché il grafico è interattivo, puoi usare lo slider per ridimensionare la visualizzazione. Basandoti su questo semplice approccio di algo trading, ora potrebbe essere un buon momento per comprare FOX! Il 30 dicembre 2016 è stato un giorno di contrattazione in cui la media mobile a 50 giorni è salita di $0,01 sopra la media a 200 giorni!

equity fox
La sezione zoomata dell’equity FOX

Naturalmente, ricorda che tutti gli investimenti possono perdere valore. Per saperne di più su finanza e algo trading, dai un’occhiata ai corsi di DataCamp qui.

Dai un’occhiata al nostro tutorial Competenze di programmazione di base in R.

Argomenti
R
Data Science

Scopri di più su R

Corso

Introduzione a R

4 ore
3.1M
Impara le basi dell'analisi dei dati in R, compresi vettori, liste e data frame, e fai pratica con R con set di dati reali.
Vedi i dettagliRight Arrow
Inizia Il Corso
Mostra altroRight Arrow
Correlato

blog

Tokenizzazione nel NLP: come funziona, sfide e casi d'uso

Guida al preprocessing NLP nel machine learning. Copriamo spaCy, i transformer di Hugging Face e come funziona la tokenizzazione in casi d'uso reali.
Abid Ali Awan's photo

Abid Ali Awan

10 min

blog

I 15 migliori server MCP remoti che ogni AI builder dovrebbe conoscere nel 2026

Scopri i 15 migliori server MCP remoti che stanno trasformando lo sviluppo AI nel 2026. Scopri come migliorano automazione, ragionamento, sicurezza e velocità dei workflow.
Abid Ali Awan's photo

Abid Ali Awan

15 min

blog

Che cos'è Snowflake? Guida per principianti alla piattaforma dati cloud

Esplora le basi di Snowflake, la piattaforma dati cloud. Scopri la sua architettura, le sue funzionalità e come integrarla nelle tue pipeline di dati.
Tim Lu's photo

Tim Lu

12 min

Mostra AltroMostra Altro