Quando l’equal weight supera l’ottimizzazione
L’equal weight supera l’optimized position sizing con campioni brevi. Una simulazione Python con seed mostra il crossover e la sua chiusura al crescere del campione.
L’equal weight supera l’optimized position sizing quando il campione è troppo breve per stimare con precisione i rendimenti attesi, e i campioni brevi sono la norma, non l’eccezione. Un optimizer applica un’aritmetica corretta a un input che nessuno riesce a misurare bene. Il portafoglio 1/N, con pesi uguali, non stima nulla: per questo resiste quando le stime sono inaffidabili.
L’equal weight batte davvero l’ottimizzazione?
In una condizione specifica, sì. Esaminiamo i termini uno alla volta. L’equal weight, indicato come 1/N, distribuisce il capitale in modo uniforme su N posizioni e non richiede alcuna previsione. La mean variance optimization calcola i pesi con il miglior rendimento atteso per unità di varianza stimata. Il criterio di Kelly calcola i pesi che massimizzano la crescita composta di lungo periodo; con asset non correlati, il risultato si riduce a un peso proporzionale al rendimento extra atteso di ciascun asset diviso per la sua varianza. La nostra guida dimensionamento delle posizioni con il criterio di Kelly illustra in dettaglio questa formula.
Entrambi gli ottimizzatori richiedono lo stesso input: un rendimento atteso per asset. È la grandezza che una stima campionaria misura peggio. La volatilità si ricava da una finestra breve con una precisione utilizzabile. La media no, e la differenza tra le due grandezze è abbastanza ampia da emergere in qualsiasi serie storica dei prezzi. Il pannello seguente prende sei titoli ampiamente detenuti, misura separatamente ogni anno dal 2015 al 2024 e mostra la distanza tra la stima annuale più alta e quella più bassa. Lo fa due volte per ciascun titolo: una volta per il rendimento medio giornaliero annualizzato e una volta per la volatilità annualizzata.
L'esatto SQL dietro ogni numero
WITH prices AS
(
SELECT
ticker,
date,
toFloat64(max(close)) AS c
FROM global_markets.stocks_daily_aggs
WHERE ticker IN ('AAPL', 'MSFT', 'NVDA', 'SPY', 'KO', 'JNJ')
AND date >= '2015-01-01'
AND date < '2025-01-01'
GROUP BY ticker, date
),
rets AS
(
SELECT
ticker,
date,
c / lagInFrame(c, 1) OVER (PARTITION BY ticker ORDER BY date ASC ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) - 1 AS ret
FROM prices
),
yearly AS
(
SELECT
ticker,
toYear(date) AS yr,
avg(ret) * 252 * 100 AS mean_pct,
stddevPop(ret) * sqrt(252) * 100 AS vol_pct
FROM rets
WHERE isFinite(ret)
GROUP BY ticker, yr
HAVING count() >= 200
)
SELECT
ticker,
round(max(mean_pct) - min(mean_pct), 1) AS mean_estimate_range_pct,
round(max(vol_pct) - min(vol_pct), 1) AS vol_estimate_range_pct
FROM yearly
GROUP BY ticker
ORDER BY mean_estimate_range_pct DESCPer NVDA, la stima della media annua varia di 184.7 punti percentuali nell’arco dei dieci anni considerati, contro un intervallo di 28.6 punti nella stima della volatilità dello stesso titolo negli stessi anni. Anche il titolo più stabile del pannello, KO, ha visto la propria stima della media annua variare di 23.9 punti. Qualsiasi schema che fornisca a un ottimizzatore il rendimento medio dell’anno scorso come rendimento atteso dell’anno in corso gli sta assegnando un numero soggetto a oscillazioni di questa entità.
Quanto deve essere lunga una serie storica per stimare un rendimento atteso?
L’errore standard della media dei rendimenti stimata è pari alla volatilità dell’asset divisa per la radice quadrata della lunghezza del campione in anni. In anni, non in osservazioni: campionare gli stessi dodici mesi su base oraria invece che giornaliera non porta alcun beneficio. Applicando la formula a un asset con volatilità del 20%, un anno di dati storici produce un errore standard di 20 punti percentuali annui. Quattro anni lo dimezzano a 10. Per ridurlo a un punto, la precisione che servirebbe per classificare due asset i cui rendimenti medi effettivi differiscono di due punti, occorrono quattro secoli di dati.
La volatilità segue una dinamica diversa. La sua precisione migliora in funzione del numero di osservazioni, non dell’intervallo di calendario. Bastano quindi pochi mesi di dati giornalieri per stimarla con un errore di pochi punti. Il pannello seguente suddivide i rendimenti giornalieri di un index fund raccolti nell’arco di vent’anni in blocchi non sovrapposti di lunghezza fissa. Per ogni blocco calcola entrambe le stime e mostra quanto queste si discostano da un blocco all’altro.
L'esatto SQL dietro ogni numero
WITH prices AS
(
SELECT
date,
toFloat64(max(close)) AS c
FROM global_markets.stocks_daily_aggs
WHERE ticker = 'SPY'
AND date >= '2005-01-01'
AND date < '2025-01-01'
GROUP BY date
),
rets AS
(
SELECT
date,
c / lagInFrame(c, 1) OVER (ORDER BY date ASC ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) - 1 AS ret
FROM prices
),
numbered AS
(
SELECT
ret,
row_number() OVER (ORDER BY date ASC) AS i
FROM rets
WHERE isFinite(ret)
),
sweep AS
(
SELECT
arrayJoin([21, 63, 126, 252, 504]) AS n,
i,
ret
FROM numbered
),
blocks AS
(
SELECT
n,
intDiv(i - 1, n) AS blk,
avg(ret) * 252 * 100 AS mean_pct,
stddevPop(ret) * sqrt(252) * 100 AS vol_pct
FROM sweep
GROUP BY n, blk
HAVING count() = n
)
SELECT
concat(toString(n), ' sessions') AS sample_length,
round(stddevPop(mean_pct), 1) AS mean_estimate_spread_pct,
round(stddevPop(vol_pct), 1) AS vol_estimate_spread_pct,
count() AS window_count
FROM blocks
GROUP BY n
ORDER BY n ASCCon blocchi di 21 sessions, la stima della media varia nell’intervallo di 53.7 punti percentuali, contro 10.9 punti per la stima della volatilità calcolata sugli stessi blocchi. Estendendo il blocco a 504 sessions, la dispersione della media si riduce a 10.6 punti. La riduzione segue una radice quadrata: ogni dimezzamento dell’errore richiede una quantità di dati quattro volte maggiore.
Una simulazione con seed che puoi eseguire autonomamente
Nulla di tutto questo dimostra che l’errore di stima sia abbastanza grande da far prevalere 1/N. Questa simulazione lo dimostra. La procedura richiede solo un’installazione di Python: non servono file di dati, download o pacchetti di terze parti. La simulazione genera autonomamente i rendimenti a partire dai parametri scelti, quindi la risposta corretta è nota e si possono confrontare entrambe le allocazioni con essa.
- Importa due moduli,
import randomeimport statistics, oltre afrom math import log. Imposta il seed nella riga successiva conrandom.seed(20260816). - Definisci cinque asset con rendimenti annui attesi effettivi pari al 5, 6, 7, 8 e 9 percento, ciascuno con una volatilità annua effettiva del 20 percento e privi di correlazione. Converti il passo in frequenza giornaliera con
mu_d = mu_a / 252esd_d = sd_a / (252 ** 0.5). - Scegli una lunghezza del campione T dall’intervallo
[60, 125, 250, 500, 1000, 2500, 5000]. - Genera T rendimenti giornalieri per ciascun asset con
random.gauss(mu_d, sd_d). Questo campione rappresenta tutta la storia a disposizione del gestore. - Stima la media di ciascun asset con
statistics.meane la volatilità constatistics.stdev. Queste due stime sono tutto ciò che l’ottimizzatore conosce. - Costruisci il portafoglio equal weight assegnando 0,2 a ciascuno dei cinque asset. Non utilizza nessuna delle stime.
- Costruisci il portafoglio ottimizzato impostando ciascun peso grezzo su
mu_hat / (sd_hat ** 2), quindi dividendo ogni peso per la somma dei valori assoluti dei pesi grezzi. In questo modo entrambi i portafogli hanno la stessa esposizione lorda. - Genera un nuovo percorso out of sample di 2520 rendimenti giornalieri per ciascun asset a partire dai parametri effettivi. Nessuna delle due allocazioni lo ha osservato.
- Valuta entrambe le allocazioni su questo percorso calcolando la media di
log(1 + r), dove r è la somma ponderata dei rendimenti dei cinque asset nella giornata. - Ripeti i passaggi da 4 a 9 per 2000 prove indipendenti a ogni valore di T e registra la quota di prove in cui l’equal weight ottiene un risultato migliore dei pesi ottimizzati.
Leggi l’intervallo da T più breve a T più lungo. All’estremo breve, l’equal weight prevale nella netta maggioranza delle prove. La quota diminuisce progressivamente all’aumentare di T e, all’estremo lungo, i pesi ottimizzati prevalgono nella maggior parte delle prove. A un certo punto le due serie si incrociano. Il punto di crossover varia in funzione del seed e dello spread tra le medie effettive. La direzione, invece, non cambia: più dati favoriscono l’ottimizzatore, meno dati favoriscono 1/N. Per replicare la simulazione, modifica l’intero contenuto in random.seed(20260816) ed esegui nuovamente l’intervallo.
Perché l’ottimizzatore amplifica una stima errata della media
Osservate dove entrano le stime nel calcolo del peso. La media stimata è al numeratore, la varianza stimata al denominatore. Se raddoppiate la stima della media, il peso raddoppia. Se riducete di un quarto la stima della varianza, il peso aumenta di un terzo. In un campione favorevole, i due errori vanno spesso nella stessa direzione: una sequenza di rendimenti positivi fa salire la media misurata e spesso riduce anche la varianza misurata nello stesso intervallo. L’ottimizzatore interpreta quell’asset come il migliore del gruppo e gli assegna un peso di conseguenza. Fuori campione, l’asset torna a essere un componente ordinario del gruppo. L’allocazione equiponderata non aveva mai visto quel campione favorevole.
La simulazione rappresenta la versione più semplice del problema. Cinque asset non correlati producono una matrice di covarianza diagonale, che non presenta difficoltà di inversione. I portafogli reali sono correlati e una matrice di covarianza campionaria costruita con un numero di osservazioni appena superiore a quello degli asset è prossima alla singolarità. Invertirla amplifica piccoli errori negli input trasformandoli in pesi molto elevati. È così che un ottimizzatore può arrivare ad assumere su un singolo nome una posizione pari a diverse volte il capitale, compensata da una posizione short su un sostituto molto simile. La nostra nota sul rischio di concentrazione in un portafoglio analizza l’impatto di un peso di questo tipo sul drawdown.
Anche l’input è variabile. Il grafico seguente segue la media mobile a un anno dei rendimenti giornalieri, annualizzata e rilevata su base mensile, per un fondo indicizzato ampio e per un importante titolo del comparto consumer staples.
L'esatto SQL dietro ogni numero
WITH prices AS
(
SELECT
ticker,
date,
toFloat64(max(close)) AS c
FROM global_markets.stocks_daily_aggs
WHERE ticker IN ('SPY', 'KO')
AND date >= '2015-10-01'
AND date < '2025-01-01'
GROUP BY ticker, date
),
rets AS
(
SELECT
ticker,
date,
c / lagInFrame(c, 1) OVER (PARTITION BY ticker ORDER BY date ASC ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) - 1 AS ret
FROM prices
),
trailing AS
(
SELECT
ticker,
date,
avg(ret) OVER (PARTITION BY ticker ORDER BY date ASC ROWS BETWEEN 251 PRECEDING AND CURRENT ROW) * 252 * 100 AS trailing_mean_pct,
row_number() OVER (PARTITION BY ticker ORDER BY date ASC) AS i
FROM rets
WHERE isFinite(ret)
)
SELECT
toString(toStartOfMonth(date)) AS month,
round(avgIf(trailing_mean_pct, ticker = 'SPY'), 1) AS spy_trailing_mean_pct,
round(avgIf(trailing_mean_pct, ticker = 'KO'), 1) AS ko_trailing_mean_pct
FROM trailing
WHERE i >= 252
AND date >= '2017-01-01'
GROUP BY month
ORDER BY month ASCOgni punto di queste due linee è un valore che un certo ottimizzatore avrebbe potuto accettare come rendimento atteso in quella data. La prima rilevazione mensile per SPY è 17.7% e l’ultima è 25.8%, con 96 rilevazioni intermedie. KO apre la stessa finestra a -0.4%. Un metodo di ponderazione che utilizza questa serie mese dopo mese incorpora ogni sua oscillazione.
La correzione con half Kelly e shrinkage funziona?
La rendono meno fragile. Nella pratica emergono quattro correttivi, e ciascuno rinuncia a una parte dell’ottimo teorico per ridurre la sensibilità alla stima.
- Half Kelly dimezza ogni peso. La curva di crescita di Kelly è piatta vicino al picco e ripida al di sotto. Una posizione dimezzata rinuncia a una quota ridotta del tasso di crescita teorico, ma limita molto di più il danno causato da un vantaggio stimato in eccesso. Targeting della volatilità applica la stessa logica al denominatore e determina la dimensione della posizione a partire dall’unico input che un campione breve può fornire.
- Lo shrinkage avvicina ogni rendimento medio stimato alla media cross-sectional delle stime, con un’intensità che aumenta quando il campione si riduce. Portato all’estremo, assegna a ogni asset lo stesso rendimento atteso; con volatilità uguali, l’ottimizzatore restituisce autonomamente pesi uguali. Un portafoglio equal weight è il portafoglio completamente sottoposto a shrinkage.
- I vincoli, cioè il divieto di assumere posizioni short e un limite massimo per posizione, restringono l’impatto che una singola stima fortunata può avere su un peso. Sono una misura di contenimento del danno, non un miglioramento della stima.
- Eliminare del tutto i rendimenti attesi lascia la varianza minima e la risk parity, che utilizzano solo la covarianza. È questo l’input che il campione può fornire davvero.
Nessuno dei quattro correttivi crea informazioni che non siano contenute nel campione. Cambiano soltanto la quota del portafoglio che dipende da informazioni di cui potresti non disporre.
Quando l’ottimizzazione ripaga
Il punto di crossover si verifica in entrambe le direzioni. Quando T diventa grande rispetto allo spread tra le vere medie, l’allocazione ottimizzata prende il sopravvento e mantiene il vantaggio. Più ampio è lo spread, prima avviene il sorpasso. L’ottimizzazione è inoltre lo strumento corretto quando l’input è fornito dai dati: la covarianza e gli hedge ratio possono essere stimati con molta più accuratezza rispetto ai rendimenti attesi.
L’equal weight ha un costo proprio. Ignora informazioni che si possiedono realmente e, in un universo ristretto, concentra il portafoglio quanto farebbe qualsiasi optimizer. Va trattata come il benchmark che ogni nuovo criterio di ponderazione deve superare utilizzando dati che non sono mai stati impiegati per determinare i pesi. Stimare i pesi e valutarli sullo stesso campione equivale a look-ahead bias nel backtesting sotto un’altra forma e finisce sempre per favorire l’optimizer. Per ottenere un intervallo realistico attorno a un vantaggio misurato, anziché una singola stima puntuale, lo strumento standard sono gli intervalli di confidenza bootstrap.
FAQ
L’ equal weight supera davvero l’ottimizzazione mean variance?
Su campioni brevi, spesso sì. Un optimizer ha bisogno di una stima del rendimento atteso di ogni asset, e questa stima presenta un errore standard pari, approssimativamente, alla volatilità dell’asset divisa per la radice quadrata della lunghezza del campione in anni. Finché questo errore resta superiore alle differenze effettive tra gli asset, l’optimizer finisce per ordinare il rumore. L’equal weight non richiede alcuna stima che possa essere sbagliata.
Quante osservazioni servono per stimare un rendimento atteso?
Più di quante ne abbia quasi chiunque. Per un asset con una volatilità del 20 percento, un anno di dati giornalieri lascia un errore standard vicino a 20 punti percentuali annui; per dimezzare questo errore serve un arco temporale quattro volte più lungo. Aggiungere osservazioni intraday nello stesso anno non aiuta. La volatilità, invece, può essere stimata in modo utile già con pochi mesi di dati.
Half Kelly è semplicemente una posizione più piccola?
È una posizione più piccola a condizioni favorevoli. La curva di crescita di Kelly è piatta vicino al suo picco. Dimezzare la posizione comporta quindi una rinuncia limitata al tasso di crescita teorico, riducendo all’incirca della metà la volatilità del percorso e contenendo il costo di un vantaggio sovrastimato.
Che cos’è il portafoglio 1/N?
È il portafoglio che investe una quota uguale del capitale in ciascuna delle N posizioni e ribilancia secondo una pianificazione prestabilita. Non richiede né una previsione dei rendimenti né una stima della covarianza. Per questo è il benchmark standard per ogni schema di ponderazione che invece ne abbia bisogno.
Come vengono costruiti i pannelli
Tutti e tre i pannelli utilizzano i prezzi di chiusura giornalieri e calcolano i rendimenti semplici close to close, accorpando le righe duplicate in un’unica chiusura per ticker e data. Le medie sono annualizzate moltiplicando il rendimento medio giornaliero per 252 sedute; le volatilità sono annualizzate moltiplicando la deviazione standard giornaliera per la radice quadrata di 252. Il pannello annuale conserva un anno solare solo quando sono presenti almeno 200 sedute. Il pannello per blocchi utilizza blocchi non sovrapposti ed esclude il blocco parziale finale a ciascuna lunghezza; la colonna del numero di finestre mostra quanti blocchi sono stati prodotti per ogni lunghezza. Non sono inclusi dividendi, quindi si tratta di rendimenti di prezzo e il livello di qualsiasi media è sottostimato per i titoli che pagano dividendi. Lo spread delle stime è il punto centrale dei pannelli, non il loro livello.
Ogni pannello qui riportato contiene l’SQL esatto sotto il grafico e la simulazione include il proprio seed. Per eseguire lo stesso controllo sulla stabilità delle stime sulla vostra lista di nomi, richiedetelo in inglese semplice sul terminale Strasmore.