GenAI e Normative: come si muove la comunità Europea

Oggi (13 febbraio) il comitato europeo sull’intelligenza artificiale dovrebbe approvare un nuovo regolamento in materia Intelligenza Artificiale che sarà successivamente votato dal parlamento Europeo nel mese di marzo per diventare legge europea. Sono i passi finali di un percorso iniziato nel 2022

Il testo approvato già in bozza il 2 febbraio 2024 per l’Atto sull’Intelligenza Artificiale (AI Act) dell’UE segna un passo significativo nella regolamentazione dell’uso dell’intelligenza artificiale. Questa legislazione mira a stabilire uno standard globale per una tecnologia impiegata in una vasta gamma di settori, dal bancario e al dettaglio fino ai settori automobilistico e aereo, nonché per usi militari, nella lotta alla criminalità e per scopi di sicurezza​. L’Atto sull’IA stabilisce anche che i fornitori di sistemi AI ad alto rischio dovranno effettuare valutazioni di impatto sui diritti fondamentali e sulla protezione dei dati, oltre a implementare sistemi di gestione del rischio durante tutto il ciclo di vita del prodotto​​. Questo è particolarmente importante in contesti come il riconoscimento biometrico, dove la raccolta e l’uso dei dati biometrici sollevano significative preoccupazioni per la privacy.

Il testo definisce una nuova classificazione dei rischi per i sistemi AI, stabilendo obblighi specifici per le categorie ad alto rischio e vietando alcune applicazioni ritenute inaccettabili a causa dei loro rischi. Ad esempio, saranno vietate le tecniche subliminali per modificare il comportamento individuale, il targeting e lo sfruttamento delle vulnerabilità di gruppi specifici, i sistemi di punteggio sociale, il riconoscimento biometrico in tempo reale in spazi pubblici per l’applicazione della legge, tra gli altri. I sistemi AI ad alto rischio, stimati dalla Commissione Europea essere circa il 5-15% dei sistemi AI, dovranno soddisfare obblighi sostanziali, inclusi valutazioni di conformità da parte di terzi e la registrazione in un database dell’UE​

​È importante notare che l’Atto sull’IA introduce regole specifiche anche per i modelli di AI di uso generale (GPAI), con requisiti per la classificazione dei modelli con rischio sistemico e obblighi procedurali per i loro fornitori. Questo include l’obbligo di redigere e mantenere aggiornata la documentazione tecnica del modello e fornire un riassunto dettagliato del contenuto utilizzato per l’addestramento del modello. I fornitori di GPAI con rischio sistemico dovranno inoltre valutare e mitigare i possibili rischi sistemici e garantire un adeguato livello di protezione della cybersecurity​

​L’accordo raggiunto il 2 febbraio sembra essere stato accolto positivamente, per l’equilibrio espresso tra innovazione e sicurezza, ciò nonostante alcune delle regole proposte dell’IA sono restrittive e potrebbero rallentare lo sviluppo e lo sviluppo di applicazioni AI innovative in Europa. L’implementazione dell’Atto e le modalità attuative saranno fondamentali per garantire che le regole dell’IA non gravino eccessivamente sulle aziende nella loro ricerca di innovazione e competitività in un mercato vivace e altamente dinamico​. Per ora il rischio quindi un’innovazione a due marce tra Europa e resto del mondo sembra concreto, con l’Europe che potrebbe procedere rallentata.

Il prossimo passo per l’Atto sull’IA per diventare legislazione è un voto da parte di un comitato chiave di legislatori dell’UE il 13 febbraio e il voto del Parlamento Europeo, previsto per marzo o aprile. Si prevede che entri in vigore prima dell’estate e dovrebbe essere applicato nel 2026. Tempi lunghi per una innovazione che corre.

Già l’Europa ha poca capacità di innovazione in ambito informatico e il rischio di un ulteriore rallentamento dell’innovazione è concreto.  La necessità di tutela dei cittadini e una mancata comprensione delle dinamiche globali, rende l’Euorpa cieca rispetto ai rischi delle interazioni globali. La vicenda dei trattori dovrebbe aver insegnato all’Europa l’insensatezza di regole locali Europee stringenti senza la possibilità di controllare ciò che viene fatto fuori dai propri confini Europei. Stiamo a vedere.

rocm e una calcolatrice con rete neurale

Circa sei mesi fa, per esigenze di gaming di mio figlio, ho deciso di cambiare la scheda video e già che c’ero ho pensato di comprarne una che sia supportata come acceleratore negli apprendimenti di machine learning tra cui keras.

Potevo scegliere una scheda Nvidia con cuda, come la precedente, ma ho optato per una scheda AMD per non avere tra i piedi driver proprietari. Dedicherò una riflessione su questo tipo di scelta, opensource vs proprietario. Le recenti recensione ne parlavano bene e sembrava che il driver rocm funzionasse bene out-of-the-box anche su Ubuntu. Nulla di più sbagliato, nemmeno la versione su docker, quella che doveva essere pronta all’uso, funzionava. Ci ho messo sei mesi per far sistemare tutto correttamente, ovviamente non a tempo pieno, solo nei ritagli di tempo e finalmente tutto funziona.

Step 1: Disinstallare tutti i driver video

sa nvidia con cuda che amd, facendo questo passo ho perso metà del sistema operativo perché tramite il meccanismo delle dipendenze ha disinstallato quasi tutto. Per la mia esperienza è l’unico modo per evitare di rimanere letteralmente incastrati con le dipendenze del driver AMD

Step2: Installazione dei driver AMD

Processo non è banale, o meglio lo è seguendo il processo indicato sul sito, ma rocm non funziona. Almeno per la mia scheda video “AMD Radeon RX 6650 XT”. Dopo l’installazione dell’installer dell’AMD ho modificato a mano i repository da cui scarica i pacchetti, dalla versione 5.7.2 alla versione 6.0.0 “deb https://repo.radeon.com/amdgpu/6.0/ubuntu jammy main”. Le altre versioni non si agganciavano a Keras/tensorflow

Step 3: Installazione di tensorflow

Trovare il giuso match è stata la cosa più complicata. Tensorflow va installato compatibile con la versione rocm presente. Anche qui ho dovuto disinstallare tutte le precedenti versioni e, non so come mai, avevo una libreria pip installata come root, che ovviamente mi ha dato problemi. Anche quella rimossa. La libreria Pythn da installare è tensorflow-rocm 2.13.1.600. Il numero finale 600 indica la versione del driver rocm (600=rocm-6.0.0). L’ultima versione 2.14.0.600 di tensorflow non va con la mia scheda.

Step 4: Configurazione

Siamo alla fine. Il mio è una scheda 6650 con deviceid gfx1032, rocm riconosce solo la scheda 6600 con deviceid gfx1030, quindi è stato necessario forzare il device id. Si può fare o con le variabili d’ambiente o direttamente in pyton con “os.environ[‘HSA_OVERRIDE_GFX_VERSION’] = ‘10.3.0’”, anche qui 10.3.0 indica la versione che corrisponde a gfx1030.

Finalmente la calcolatrice

Per provare ho usato una semplice calcolatrice, ma prima imposto l variabile e verifico che tutto si carichi correttamente

import os
import tensorflow as tf
from tensorflow.python.client import device_lib

os.environ['HSA_OVERRIDE_GFX_VERSION'] = '10.3.0'
print(f'tensorflow version: {tf.version.VERSION}')

tf.config.list_physical_devices('GPU')
device_lib.list_local_devices()

Il risultato mostra i dispositivi che tensorflow può utilizzare e quindi:

name: "/device:CPU:0"

name: "/device:GPU:0"

Ora il codice della calcolatrice:

import numpy as np
import tensorflow as tf
from tensorflow import keras
import time
start_time = time.time()
with tf.device('gpu:0'):
# Genera dati di training
input_data = np.random.rand(50000, 2)
target_data = np.sum(input_data, axis=1)
# Creo un modello semplice
model = keras.Sequential([
    keras.layers.Dense(20, activation='relu', input_shape=(2,)),
    keras.layers.Dense(20, activation='relu'),
    keras.layers.Dense(1)
])

# Compila il modello
model.compile(optimizer='adam', loss='mean_squared_error')

# Addestra il modello
model.fit(input_data, target_data, epochs=5)

Infine faccio un po’ di somme

# Testa il modello con nuovi dati
test_data = np.array([[0.3, 0.7], [0.05, 0.10],[5, 10], [1.2, 2.3]])# Testa il modello con nuovi dati
predictions = model.predict(test_data)
# Stampa i risultati
for i, prediction in enumerate(predictions):
print(f"{test_data[i]} = {prediction[0]:.2f}")

1/1 [==============================] - 0s 28ms/step
[0.3 0.7] = 1.00
[0.05 0.1 ] = 0.15
[ 5. 10.] = 14.38
[1.2 2.3] = 3.50

Il risultato della calcolatrice non è preciso, come accde sui modelli di reti neurali su cui non è stato fatto tuning, ma serviva per testare la scheda video.

Effetti collaterali

La scheda video è montata sul mio hmetheater-TV come si usava negli anni 2000, monta 2 ricevitori sattelitari, 2 tuner per DVB e controller dei giochi perché viene usato anche come postazione gaming e un device touch per rendere il monitor TV touchscreen. Usare la scheda video per tensorflow fa saltare i buffer video e la tv può essere vsta solo a a una risoluzione HD-rady di 1280×720…. Dedicherò una riflessione sulla scelta dell’opensource

LSTM & le false promesse

Di recente mi sono imbattuto in un articolo che mostra come l’applicazione si tecniche di ML basate su LSTM possano generare risultati migliori rispetto a una strategia B&H. La prima osservazione è che il singolo titolo non fa testo, occorre avere un paniere sufficientemente ampio per dimostrare che un algoritmo di ML sia efficace.

Subito dopo ho voluto provare l’algoritmo, conscio dei risultati scadenti che ho sempre ottenuto tramite LSTM mi sono chiesto quali fossero gli elementi che rendono quest’implementazione LSTM così efficace, anche solo per un singolo caso. Soprattutto perché risultati così buoni li ho ottenuti solo con ‘lookahead bias’ ossia i dati che alimentano il calcolo contengono informazioni sullo stato futuro.

Questo ovviamente è possibile solo per errori o sviste di programmazione. Quindi mi sono messo a caccia della chiave vincente o dell’errore. Devo essere sincero il codice è di buona qualità e trovare la chiave di volta non è stato semplice. Le serie temporali sono sempre ostiche, basta uno shift sbagliato e salta tutto, in questo caso non c’è stato bisogno di uno shift per fare la magia, che si verifica nel punto in cui viene preparato il dataset di test e il risultato. Precisamente il passaggio magico (o incriminato che dir si voglia) è quello indicato con In [17]

scaler=MinMaxScaler(feature_range=(0,1))
dg=pd.DataFrame(scaler.fit_transform(dfm[["High","Low","Open","Close","Volume","fd_cm_open",\
                                          "mv_avg_12","mv_avg_24","fd_nm_open"]].values))
dg0=dg[[0,1,2,3,4,5,6,7]]


window=4
dfw=create_window(dg0,window)

X_dfw=np.reshape(dfw.values,(dfw.shape[0],window+1,8))
print(X_dfw.shape)
print(dfw.iloc[:4,:])
print(X_dfw[0,:,:])

y_dfw=np.array(dg[8][window:])

Guardando nel dettaglio come vengono costruiti i vari campi scopriamo che i valori in ingresso per High, Low, Open, Close sono il valore medio del mese corrente, ossia dal primo giorno del mese all’ultimo giorno del mese e che il valore di cui si vuole fare la previsione è il primo valore del mese successivo. Va da se che la previsione è falsata dai valori medi del mese corrente.

L’errore è indotto dal fatto che l’algoritmo lavora sul primo giorno mese. Intuitivamente se a gennaio stimo il mese di febbraio, un conto è stimare il valore del primo giorno di febbraio, un conto è stimare il valore l’ultimo giorno di febbraio. Una correzione veloce consiste nel shiftare i due valore relativi all’apertura del mese corrente e del prossimo mese di -1. E’ quindi sufficiente inserire questo blocco di codice

#run once
dfm["fd_nm_open"] = dfm["fd_nm_open"].shift(-1)
dfm["fd_cm_open"] = dfm["fd_cm_open"].shift(-1)
dfm=dfm.dropna()

E quindi la verifica visiva che stiamo guardando i dati giusti

print(dfm[["High","Low","Open","Close","Volume","fd_cm_open", "mv_avg_12","mv_avg_24","fd_nm_open"]].head(1))
print(df.loc['1975-02'].mean())
print(df.loc['1975-02'].iloc[0].loc['Close'])
print(df.loc['1975-03'].iloc[0].loc['Close'])

Il risultato è il seguente:

                                High        Low  Open      Close  \
Date                                                               
1975-01-31 00:00:00-05:00  73.546817  71.442273   0.0  72.564091   

                                 Volume  fd_cm_open  mv_avg_12  mv_avg_24  \
Date                                                                        
1975-01-31 00:00:00-05:00  1.966136e+07       77.82   82.84377  95.136477   

                           fd_nm_open  
Date                                   
1975-01-31 00:00:00-05:00   83.029999  
Open      0.000000e+00
High      8.098842e+01
Low       7.889211e+01
Close     8.009684e+01
Volume    2.229684e+07
dtype: float64
77.81999969482422
83.02999877929688

il campo fd_cm_open per il 31 gennaio 1975 contiene il valore di apertura del mese di febbraio, mentre il campo fd_nm_open contiene il valore di apertura del mese di marzo. In pratica posizionandoci il primo giorno di febbraio ci stiamo chiedendo se il primo marzo avremo guadagnato o perso. Per farlo utilizziamo la madia 12 e 24 calcolate sulla media mensile compreso il mese di Gennaio. Ora facciamo girare l’algoritmo con il solito fit e …. vediamo se il risultato rimane positivo.

Atteso il tempo per completare il training ecco a confronto i grafici prima e dopo.

Versione originale
Versione corretta
Versione originale
Versione corretta

Il risultato ottenuto adesso è in linea con le mie aspettative. Non ci sono dati sufficiente per un training che possa generare i risultati così positivi come quelli presentati nell’articolo.

Valgono sempre le considerazioni di base per tutti gli algoritmi che si trovano in giro, se fossero efficaci non verrebbero pubblicati ma sfruttati dal creatore e pubblicati sono quando hanno terminato la loro efficacia. Ossia, non è tutto oro ciò che lucica.

Buy & Hold la stretegia vincente

Ho analizzato il comportamento di un paniere di titoli per vederne il comportamento complessivo nel tempo. In particolare già in passato avevo analizzato la strategia buy & hold verificando che è difficile trovare una strategia di trading migliore di quella B&H.

Con l’occasione ho voluto sperimentare backtesting alternativi rispetto a Backtrader. Credo che Backtrader sia una delle piattaforme migliori sul mercato, in grado di simulare in odo molto fedele il comportamento dei broker e anche di agganciarsi a broker reali per algotrading direttamente a mercato. Per fare però delle semplici simulazioni occorre qualcosa di più snello, una volta verificata la bontà di una strategia attraverso un sistema snello si può implementare su backtrader che aggiunge tutti gli orpelli onerosi quali slippage, tobin tax, commissioni e vincoli su ordini in base alla disponibilità economica.

Per implementare un metodo snello ci sono tre framework che ci aiutano:

  • ta-lib: una collezione di funzione per l’analisi tecnica, comprende anche l’identificazione di candlestick e numerosi indicatori
  • pandas-ta, estende in modo semplice le funzioni di pandas aggiungendo diverse funzioni per applciare sul set di dati gli indicatori ta-lib
  • vector-bt: una libreria semplice di backtesting che consente di definire gli entry e exit point di una strategia. In base a questi elementi

Tornando alla strategia B&H, le prime prove fatte coinvolgono la librerie pandas-ta e, dato l’insieme dei titoli, calcolo in guadagno nel tempo per ciascun titolo. Il codice è molto semplice, per prima cosa carico i dati:

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import pandas_ta as ta
df = pd.DataFrame() # Empty DataFrame
assets =["A2A.MI", "AMP.MI", "ATL.MI", "AZM.MI", "BGN.MI", "BMED.MI", "BAMI.MI", "BPE.MI", "BZU.MI",
"CPR.MI", "CNHI.MI", "DIA.MI", "ENEL.MI", "ENI.MI", "EXO.MI", "RACE.MI", "FBK.MI", "G.MI",
"HER.MI", "IP.MI", "ISP.MI", "INW.MI", "IG.MI", "LDO.MI", "MB.MI", "MONC.MI", "NEXI.MI",
"PIRC.MI", "PST.MI", "PRY.MI", "REC.MI", "SPM.MI", "SRG.MI", "STLA.MI", "STM.MI", "TIT.MI",
"TEN.MI", "TRN.MI", "UCG.MI", "UNI.MI"]
dfs = {}
for name in assets:
dfs[name]=pd.read_json(f"{name}_reg_5-60")
dfs[name].set_index(pd.DatetimeIndex(dfs[name]["Date"]), inplace=True)

I dati lì ho in locale per comodità, ma volendoli caricare con pandas-ta è sufficiente sostituire con questo:

dfs[name]=df.ta.ticker(name)

A questo punto calcolo il guadagno nel tempo per ciascun asset e creo una tabella di sintesi:

assets =["A2A.MI", "AMP.MI", "ATL.MI", "AZM.MI", "BGN.MI", "BMED.MI", "BAMI.MI", "BPE.MI", "BZU.MI", 
      "CPR.MI", "CNHI.MI", "DIA.MI", "ENEL.MI", "ENI.MI", "EXO.MI", "RACE.MI", "FBK.MI", "G.MI", 
      "HER.MI", "IP.MI", "ISP.MI", "INW.MI", "IG.MI", "LDO.MI", "MB.MI", "MONC.MI", "NEXI.MI", 
      "PIRC.MI", "PST.MI", "PRY.MI", "REC.MI", "SPM.MI", "SRG.MI", "STLA.MI", "STM.MI", "TIT.MI", 
      "TEN.MI", "TRN.MI", "UCG.MI", "UNI.MI"]

gains = {}
res = pd.DataFrame(columns=["start","end","initial","final","percret","logret"])
total = 0
for name in assets:
    df =dfs[name].copy()
    df.ta.log_return(cumulative=True, append=True)
    df.ta.percent_return(cumulative=True, append=True)
    gains[name] = df["CUMPCTRET_1"][len(df)-1]
    total +=gains[name]
    print(f"Guadagno {name} dal {df.index[0]:%m/%d/%Y} al {df.index[-1]:%m/%d/%Y} di {gains[name]*100:.02f} %")
    p = pd.DataFrame([[df.index[0],df.index[-1],df["Close"][0],df["Close"][len(df)-1],
                             df["CUMPCTRET_1"][len(df)-1],df["CUMLOGRET_1"][len(df)-1]]],
                            columns=["start","end","initial","final","percret","logret"],
                            index=[name])
    
    res = pd.concat([res,p])

print(f"Guadagno medio {total*100/len(gains)} %")



Il risultato mostra come alcuni titoli hanno performato molto, altri molto male:

Guadagno A2A.MI dal 01/03/2000 al 05/05/2022 di -56.15 %
Guadagno AMP.MI dal 10/01/2001 al 05/05/2022 di 2256.41 %
Guadagno ATL.MI dal 09/22/2003 al 05/05/2022 di 88.79 %
Guadagno AZM.MI dal 07/07/2004 al 10/27/2021 di 634.51 %
Guadagno BGN.MI dal 11/15/2006 al 05/05/2022 di 244.51 %
Guadagno BMED.MI dal 01/03/2000 al 05/05/2022 di -45.43 %
Guadagno BAMI.MI dal 01/03/2000 al 05/05/2022 di -97.02 %
Guadagno BPE.MI dal 01/03/2000 al 05/05/2022 di -88.98 %
Guadagno BZU.MI dal 01/03/2000 al 05/05/2022 di 62.49 %
Guadagno CPR.MI dal 07/06/2001 al 05/05/2022 di 6961.02 %
Guadagno CNHI.MI dal 09/30/2013 al 05/05/2022 di 44.78 %
Guadagno DIA.MI dal 07/19/2007 al 05/05/2022 di 868.90 %
Guadagno ENEL.MI dal 01/03/2000 al 05/05/2022 di 1.35 %
Guadagno ENI.MI dal 01/03/2000 al 05/05/2022 di 28.91 %
Guadagno EXO.MI dal 01/03/2000 al 05/05/2022 di 81.08 %
Guadagno RACE.MI dal 01/04/2016 al 05/05/2022 di 339.43 %
Guadagno FBK.MI dal 07/02/2014 al 05/05/2022 di 223.87 %
Guadagno G.MI dal 01/03/2000 al 05/05/2022 di -36.47 %
Guadagno HER.MI dal 03/28/2003 al 05/05/2022 di 95.84 %
Guadagno IP.MI dal 01/03/2000 al 05/05/2022 di 746.27 %
Guadagno ISP.MI dal 01/03/2000 al 05/05/2022 di -44.43 %
Guadagno INW.MI dal 06/22/2015 al 05/05/2022 di 151.35 %
Guadagno IG.MI dal 11/07/2016 al 05/05/2022 di 54.03 %
Guadagno LDO.MI dal 07/18/2005 al 05/05/2022 di -29.44 %
Guadagno MB.MI dal 01/03/2000 al 05/05/2022 di 8.58 %
Guadagno MONC.MI dal 12/16/2013 al 05/05/2022 di 197.93 %
Guadagno NEXI.MI dal 04/18/2019 al 05/05/2022 di 12.75 %
Guadagno PIRC.MI dal 10/04/2017 al 05/05/2022 di -31.25 %
Guadagno PST.MI dal 10/27/2015 al 05/05/2022 di 36.39 %
Guadagno PRY.MI dal 05/03/2007 al 05/05/2022 di 98.21 %
Guadagno REC.MI dal 01/03/2000 al 05/05/2022 di 4034.14 %
Guadagno SPM.MI dal 01/03/2000 al 05/05/2022 di -75.09 %
Guadagno SRG.MI dal 12/06/2001 al 05/05/2022 di 119.76 %
Guadagno STLA.MI dal 01/03/2000 al 05/05/2022 di 58.00 %
Guadagno STM.MI dal 01/03/2000 al 05/05/2022 di -30.69 %
Guadagno TIT.MI dal 01/03/2000 al 05/05/2022 di -93.51 %
Guadagno TEN.MI dal 12/17/2002 al 05/05/2022 di 704.95 %
Guadagno TRN.MI dal 06/23/2004 al 05/05/2022 di 337.61 %
Guadagno UCG.MI dal 01/03/2000 al 05/05/2022 di -93.24 %
Guadagno UNI.MI dal 01/03/2000 al 05/05/2022 di -90.98 %
Guadagno medio 441.97885234421864 %

Il peggiore è stato BAMI con una perdita del 97.02% mentre il migliore è stato CPR con un guadagno del 6961.02%. Per capire l’entità dei due scostamenti, se avessi investito 10.000€ su BAMI oggi avrei 298€, mentre se avessi investito 10.000€ su CPR oggi avrei 706.102€. Sottolineo la precisazione, l’analisi è semplificata, non si considerano un insieme di fattori, oltre ai costi operativi evidenziati sopra (commissioni, ecc. ) non considero i dividendi distribuiti, gli split, gli aumenti di capitale e tutte quelle operazioni di capitale che portano guadagni o perdite all’azionista.

Il punto da capire è se il risultato di 6961.02% è da considerarsi un anomalia o meno. Vediamo altri outperformer come AMP e REC, anche questi sono un’eccezione. Il primo passo per affrontare quest’analisi è il passaggio alla scala logaritmica. Un titolo che perde ogni giorno l’ 1% perde in termini monetari assoluti sempre meno, un titolo che guadagna 1% ogni giorno guadagna in termini monetari assoluti sempre di più. Rispetto alla scala logaritmica i guadagni (e le perdite) seguono un andamento lineare. I risultati visti sopra, calcolati secondo una scala logaritmica diventano:

Guadagno A2A.MI dal 01/03/2000 al 05/05/2022 di -0.82 log
Guadagno AMP.MI dal 10/01/2001 al 05/05/2022 di 3.16 log
Guadagno ATL.MI dal 09/22/2003 al 05/05/2022 di 0.64 log
Guadagno AZM.MI dal 07/07/2004 al 10/27/2021 di 1.99 log
Guadagno BGN.MI dal 11/15/2006 al 05/05/2022 di 1.24 log
Guadagno BMED.MI dal 01/03/2000 al 05/05/2022 di -0.61 log
Guadagno BAMI.MI dal 01/03/2000 al 05/05/2022 di -3.51 log
Guadagno BPE.MI dal 01/03/2000 al 05/05/2022 di -2.21 log
Guadagno BZU.MI dal 01/03/2000 al 05/05/2022 di 0.49 log
Guadagno CPR.MI dal 07/06/2001 al 05/05/2022 di 4.26 log
Guadagno CNHI.MI dal 09/30/2013 al 05/05/2022 di 0.37 log
Guadagno DIA.MI dal 07/19/2007 al 05/05/2022 di 2.27 log
Guadagno ENEL.MI dal 01/03/2000 al 05/05/2022 di 0.01 log
Guadagno ENI.MI dal 01/03/2000 al 05/05/2022 di 0.25 log
Guadagno EXO.MI dal 01/03/2000 al 05/05/2022 di 0.59 log
Guadagno RACE.MI dal 01/04/2016 al 05/05/2022 di 1.48 log
Guadagno FBK.MI dal 07/02/2014 al 05/05/2022 di 1.18 log
Guadagno G.MI dal 01/03/2000 al 05/05/2022 di -0.45 log
Guadagno HER.MI dal 03/28/2003 al 05/05/2022 di 0.67 log
Guadagno IP.MI dal 01/03/2000 al 05/05/2022 di 2.14 log
Guadagno ISP.MI dal 01/03/2000 al 05/05/2022 di -0.59 log
Guadagno INW.MI dal 06/22/2015 al 05/05/2022 di 0.92 log
Guadagno IG.MI dal 11/07/2016 al 05/05/2022 di 0.43 log
Guadagno LDO.MI dal 07/18/2005 al 05/05/2022 di -0.35 log
Guadagno MB.MI dal 01/03/2000 al 05/05/2022 di 0.08 log
Guadagno MONC.MI dal 12/16/2013 al 05/05/2022 di 1.09 log
Guadagno NEXI.MI dal 04/18/2019 al 05/05/2022 di 0.12 log
Guadagno PIRC.MI dal 10/04/2017 al 05/05/2022 di -0.37 log
Guadagno PST.MI dal 10/27/2015 al 05/05/2022 di 0.31 log
Guadagno PRY.MI dal 05/03/2007 al 05/05/2022 di 0.68 log
Guadagno REC.MI dal 01/03/2000 al 05/05/2022 di 3.72 log
Guadagno SPM.MI dal 01/03/2000 al 05/05/2022 di -1.39 log
Guadagno SRG.MI dal 12/06/2001 al 05/05/2022 di 0.79 log
Guadagno STLA.MI dal 01/03/2000 al 05/05/2022 di 0.46 log
Guadagno STM.MI dal 01/03/2000 al 05/05/2022 di -0.37 log
Guadagno TIT.MI dal 01/03/2000 al 05/05/2022 di -2.73 log
Guadagno TEN.MI dal 12/17/2002 al 05/05/2022 di 2.09 log
Guadagno TRN.MI dal 06/23/2004 al 05/05/2022 di 1.48 log
Guadagno UCG.MI dal 01/03/2000 al 05/05/2022 di -2.69 log
Guadagno UNI.MI dal 01/03/2000 al 05/05/2022 di -2.41 log

Il grafico dei guadagni percentuali e logaritmici sono i seguenti:

Osservando il grafico sulle % sembra che i picchi siano delle anomalie, mentre rappresentando i medesimi dati in scala logaritmica sembrano coerenti e seguire un moto Browniano. I dati sono troppo esigui per rappresentarli con un’istogramma sensato, ma facendolo lo stesso otteniamo i seguenti diagrammi:

Istogramma dei guadagni percentuali
Istogramma dei guadagni logaritmici

A occhio, ma servirebbe un matematico, la curva dei guadagni sembra seguire una distribuzione di chi-quadro, mentre la distribuzione dei guadagni logaritmici sembra seguire una distribuzione normale. Ipotesi da approfondire con un set di dati più ampio.

Come ultima simulazione tolgo tutti i titoli che hanno un valore logaritmico elevato fino a ottenere una media di valore logaritmico inferiore a zero. In altre parole sommando i logaritmi di guadagni e perdite prevalgono le perdite. Calcolando il guadagno % otteniamo un guadagno (seppure piccolo) positivo e come si vede il grafico del guadagno logaritmico è stato privato della parte alta con un significativo sbilanciamento verso i numeri negativi.

Guadagno medio -0.0327 log
Guadagno medio 80.35%

In conclusione:

  • Se ci aspettiamo che i guadagni logaritmici seguano una distribuzione normale, il mercato premia sempre un investimento a lungo termine diversificato su un paniere ampio di azioni (B&H)
  • L’andamento nel lungo periodo delle azioni è legato all’analisi fondamentale e alle scelte strategiche operate dalle aziende

Effetto TOBIN TAX

In passato ho fatto degli studi sulle variazioni di quotazione che subiscono i titoli tra chiusura-apertura e apertura-chiusuara. Si tratta di fatto di scomporre il movimenti del titolo in due semi-movimenti, il primo misura il delta prezzo tra chiusura e l’apertura e il secondo tra l’apertura e la chiusura. L’aspetto interessante è che i due semi-movimenti sembrano spesso indipendenti e a volte divergenti. La tobin tax gioca un ruolo significativo perché spinge a chiudere le posizioni a fine giornata, con conseguente calo del prezzo, e ad aprire le posizioni a inizio giornata, con conseguente aumento dei prezzi.

L’immagine sottostante riporta i grafici di alcune azioni ottenuti sommando i delta delle variazioni logaritmiche di prezzo. Titoli quali EXO, RACE non presentano la rampa di salita arancione data dai semimovimenti tra chiusura e apertura.

WP to LinkedIn Auto Publish Powered By : XYZScripts.com