La formula Black & Scholes compie 50 anni !

Ho scritto un saggio in merito: "L'equazione più bella della Finanza. Da Louis Bachelier a Black e Scholes" - Albatros Editore 2022
E' un argomento molto interessante, anche da punto di vista storico!
 
E' il compleanno anche di Markoviz, credo che la sua formula abbia superato la settantina.
Chi non la conoscesse potrebbe divertirsi con la formula del dottor Markoviz con il file allegato, che richiede il motore open souce xlquant.
Ci ho aggiunto un paio di anni di dati di close.
 

Allegati

  • Open source demoEfficientFrontier.xlsx
    734,5 KB · Visite: 51
Una delle formule piu' sopravvalutate nel mondo finanziario e' l'indice di Sharp

Una delle formule piu' sottovalutate nel mondo finanziario e' l'indice di Claire.

Il Clare Ratio, coniato da Jon Clare, è un rapporto di performance che misura il rendimento di un portafoglio rispetto a un benchmark, tenendo conto del rischio assunto. Questo rapporto è progettato per fornire una valutazione della performance che tiene conto sia del rendimento che del rischio, con un'enfasi particolare sulla protezione del capitale.

La formula del Clare Ratio è la seguente:

Clare Ratio = Rendimento del Portafoglio−Rendimento del Benchmark/ Deviazione Standard dei Rendimenti Negativi del Portafoglio

Dove:

  • "Rendimento del Portafoglio" rappresenta il rendimento complessivo del portafoglio.
  • "Rendimento del Benchmark" è il rendimento del benchmark o indice di riferimento.
  • "Deviazione Standard dei Rendimenti Negativi del Portafoglio" è la deviazione standard dei rendimenti negativi del portafoglio.
Il Clare Ratio è progettato per dare maggiore peso alla protezione contro le perdite rispetto alla semplice valutazione del rendimento.

Un Clare Ratio più elevato indica una migliore gestione del rischio, poiché significa che il portafoglio ha generato rendimenti superiori rispetto al benchmark, tenendo conto del rischio associato.

Tra 50 anni probabilmente elogeremo Claire e dimenticheremo William Sharp
 
Questa e' la formula che ho costruito del Clare Ratio. Uso oramai quasi esclusivamente questa formula per valutare i miei trading system.
Codice:
'Clare ratio developed by Jon Clare
Function Clare(data() As Double) As Variant
    Dim N As Integer
    Dim i As Integer
    Dim EquityCurve() As Double
    Dim Winner() As Double
    Dim Loser() As Double
    Dim RunningTotalWinners() As Double
    Dim RunningTotalLosers() As Double
    Dim RunningTotalAllTrades() As Double
    Dim RatioRaw() As Double
    Dim HH() As Double
    Dim DD() As Double
    Dim MaxDD() As Double
    Dim ClareRatio() As Double
  
    Const InitialCapital As Double = 100000
    N = UBound(data)
  
    If N >= 1 Then
        ReDim EquityCurve(N)
        ReDim Winner(N)
        ReDim Loser(N)
        ReDim RunningTotalWinners(N)
        ReDim RunningTotalLosers(N)
        ReDim RunningTotalAllTrades(N)
        ReDim RatioRaw(N)
        ReDim HH(N)
        ReDim DD(N)
        ReDim MaxDD(N)
        ReDim ClareRatio(N)
      
        ' Calcolo di currentEquity e RandomWinLoss fuori dal ciclo
        Dim currentEquity As Double
        Dim RandomWinLoss As Double
        If InitialCapital > 0 Then
            currentEquity = InitialCapital
        Else
            ' In caso di InitialCapital negativo, impostiamo un valore predefinito
            currentEquity = 0
        End If
      
        ' Calcoliamo RandomWinLoss iniziale
        RandomWinLoss = 0
      
        ' Variabili per il precalcolo di valori
        Dim prevRunningTotalLosers As Double
        Dim prevHH As Double
      
        ' Inizializziamo prevRunningTotalLosers e prevHH prima del ciclo
        prevRunningTotalLosers = 0
        prevHH = InitialCapital
      
        For i = 0 To N - 1
            ' Equity Curve
            If i > 0 Then
                EquityCurve(i) = (EquityCurve(i - 1) * data(i)) / 100 + EquityCurve(i - 1)
            Else
                EquityCurve(i) = (InitialCapital * data(i)) / 100 + InitialCapital
            End If
          
            ' Calcolo del rendimento percentuale
            RandomWinLoss = ((EquityCurve(i) - currentEquity) / currentEquity) * 100
            currentEquity = EquityCurve(i)
          
            ' Winner e Loser
            If RandomWinLoss > 0 Then
                Winner(i) = RandomWinLoss
                Loser(i) = 0
            Else
                Winner(i) = 0
                Loser(i) = -RandomWinLoss
            End If
          
            ' Running total Winners
            If i = 0 Then
                RunningTotalWinners(i) = Winner(i)
            Else
                RunningTotalWinners(i) = Winner(i) + RunningTotalWinners(i - 1)
            End If
          
            ' Running total Losers
            If i = 0 Then
                RunningTotalLosers(i) = Loser(i)
            Else
                RunningTotalLosers(i) = Loser(i) + prevRunningTotalLosers
            End If
          
            ' Running total All trades
            RunningTotalAllTrades(i) = RunningTotalWinners(i) + RunningTotalLosers(i)
          
            ' Ratio Raw
            If RunningTotalAllTrades(i) <> 0 Then
                RatioRaw(i) = (RunningTotalWinners(i) / RunningTotalAllTrades(i)) * 100
            Else
                RatioRaw(i) = 0 ' Impostare a zero in caso di divisione per zero
            End If
          
            ' HH - Considera periodi precedenti
            HH(i) = Application.WorksheetFunction.Max(EquityCurve(i), prevHH)
            prevHH = HH(i)
          
            ' DD - Considera periodi precedenti (con controllo per divisione per zero)
            If HH(i) > 0 Then
                DD(i) = ((HH(i) - currentEquity) / HH(i)) * 100
            Else
                DD(i) = 0 ' Impostare a zero in caso di divisione per zero
            End If
          
            ' Max DD - Considera iniziale negativo
            If i = 0 Then
                ' Set MaxDD(0) to 0 if DD(0) is negative
                If DD(i) < 0 Then
                    MaxDD(i) = 0
                Else
                    MaxDD(i) = DD(i)
                End If
            Else
                ' Aggiorna MaxDD solo se il valore corrente di DD supera il massimo
                If DD(i) > MaxDD(i - 1) Then
                    MaxDD(i) = DD(i)
                Else
                    MaxDD(i) = MaxDD(i - 1)
                End If
            End If
          
            ' Clare ratio
            ClareRatio(i) = RatioRaw(i) - (RatioRaw(i) * MaxDD(i) / 100)
          
            ' Salva il valore corrente di RunningTotalLosers per il prossimo ciclo
            prevRunningTotalLosers = RunningTotalLosers(i)
        Next i
      
        Clare = ClareRatio(N - 1)
    Else
        Clare = "undefined"
    End If
End Function
 
Ultima modifica:
Un'altra delle formule mitiche degli anni 60, quindi ancora piu' vecchia della B&S, e' attribuita a William Sharpe.

L'Information Ratio è stato introdotto da William F. Sharpe, noto per il modello di valutazione dei prezzi degli asset (Capital Asset Pricing Model - CAPM), nel suo lavoro intitolato "The Sharpe Ratio" pubblicato nel 1966. Tuttavia, la formulazione specifica dell'Information Ratio è attribuita a Peter Dietz, che lo ha sviluppato negli anni '60.

La formula dell'Information Ratio è data da:

Information Ratio=Excess ReturnTracking ErrorInformation Ratio=Tracking ErrorExcess Return

Dove:

  • Excess Return: Rappresenta il rendimento del portafoglio meno il rendimento di un benchmark o di un indice di riferimento.
  • Tracking Error: Misura la volatilità dei rendimenti del portafoglio rispetto ai rendimenti del benchmark. Viene calcolato come la deviazione standard dei rendimenti del portafoglio meno i rendimenti del benchmark.
In sintesi, l'Information Ratio confronta il rendimento aggiustato per il rischio di un portafoglio rispetto a un benchmark, fornendo un'indicazione della capacità del gestore del portafoglio di generare rendimenti superiori rispetto al benchmark in rapporto alla volatilità del portafoglio.

Il codice che io ho scritto per questa formula e' il seguente:
Codice:
'Information ratio Sharpe (1966) e Dietz (1990)
Function Information(data() As Double, Market() As Double) As Variant
    Dim N As Integer
    Dim i As Integer
    Dim ExcessReturnOverMarketSum As Double
    Dim IRDenominator As Double
    Dim result As Variant
    
    N = UBound(data)

    ' Controllo degli input
    If N >= 1 And UBound(Market) = N Then
        ' Calcola la somma degli eccessi di ritorno rispetto al mercato
        For i = 0 To N - 1
            ExcessReturnOverMarketSum = ExcessReturnOverMarketSum + (data(i) - Market(i))
        Next i

        ' Calcola la media e la deviazione standard degli eccessi di rendimento
        Dim IR As Double
        IR = ExcessReturnOverMarketSum / N
        IRDenominator = Application.WorksheetFunction.StDev(ExcessReturnOverMarket)

        ' Calcola l'Information Ratio
        If IsNumeric(IR) And IsNumeric(IRDenominator) And IRDenominator <> 0 Then
            result = IR / IRDenominator
        Else
            result = "Valori non validi per il calcolo dell'Information Ratio"
        End If
    Else
        result = "Input non validi per il calcolo dell'Information Ratio"
    End If
    
    ' Restituisce il risultato
    Information = result
End Function
 
  • Like
Reazioni: Mei
A proposito di formule della geriatria, anche l'ulcer index merita a buon diritto di entrare nell'Ospizio delle formule.
 
L'Ulcer Index è un indicatore finanziario inventato da Martin 40 anni fa

È progettato per misurare la volatilità negativa dei rendimenti di un investimento e fornire una misura del "dolore allo stomaco" associato alle riduzioni di prezzo nel corso del tempo.

La formula dell'Ulcer Index coinvolge tre passaggi principali:

  1. Calcolo delle riduzioni percentuali: Per ogni periodo, la riduzione percentuale è calcolata come la differenza tra il valore massimo del periodo precedente e il valore corrente, diviso per il valore massimo del periodo precedente. Questo valore rappresenta la percentuale di "drawdown" dal picco precedente.
  2. Calcolo del quadrato delle riduzioni percentuali: Ogni riduzione percentuale viene elevata al quadrato. Questo passaggio attribuisce maggior peso ai drawdown più grandi, mettendo in evidenza le riduzioni di prezzo più significative.
  3. Calcolo dell'Ulcer Index: La radice quadrata della media dei quadrati delle riduzioni percentuali viene quindi calcolata per fornire una misura della volatilità negativa nel tempo. Questa media ponderata dei drawdown fornisce una stima del "dolore" associato alle perdite nel portafoglio.
L'Ulcer Index è utile per gli investitori interessati a valutare il rischio di un investimento e la sua capacità di sopportare le perdite nel tempo. Misura la severità e la durata delle riduzioni di prezzo, consentendo agli investitori di valutare meglio il potenziale di perdita e la volatilità di un investimento nel corso del tempo.
Codice:
Function UlcerIndex(data() As Double) As Variant
    ' Dichiarazione delle variabili
    Dim n As Integer
    Dim sumSquaredPercentageDrawdowns As Double
    Dim i As Integer
    Dim prevMax As Double
    Dim squaredDrawdown As Double ' Variabile per memorizzare il quadrato delle riduzioni percentuali
   
    ' Determina il numero di elementi nell'array data
    n = UBound(data)

    ' Controllo se ci sono elementi nell'array data
    If n >= 1 Then
        ' Inizializzazione delle variabili
        sumSquaredPercentageDrawdowns = 0
        prevMax = data(1)  ' Inizializza prevMax con il primo elemento di data
        ' Loop attraverso gli elementi dell'array data
        For i = 2 To n
            ' Verifica se l'elemento corrente è maggiore del massimo valore precedente
            If data(i) > prevMax Then
                ' Se sì, aggiorna il massimo valore precedente e passa all'iterazione successiva
                prevMax = data(i)
            Else
                ' Se no e prevMax non è zero, calcola la riduzione percentuale e il suo quadrato
                If prevMax <> 0 And data(i) <> prevMax Then
                    squaredDrawdown = (100 * (data(i) - prevMax) / prevMax) ^ 2
                    ' Aggiungi il quadrato delle riduzioni percentuali alla somma
                    sumSquaredPercentageDrawdowns = sumSquaredPercentageDrawdowns + squaredDrawdown
                End If
            End If
        Next i
        ' Calcola la radice quadrata della media ponderata delle riduzioni percentuali al quadrato
        If sumSquaredPercentageDrawdowns <> 0 And n <> 0 Then
            UlcerIndex = (sumSquaredPercentageDrawdowns / n) ^ 0.5
        Else
            UlcerIndex = 0  ' Restituisce 0 se la somma dei quadrati delle riduzioni percentuali è zero
        End If
    Else
        ' Se l'array data è vuoto, restituisce "undefined"
        UlcerIndex = "undefined"
    End If
End Function
 
L'Ulcer Index è un indicatore finanziario inventato da Martin 40 anni fa

È progettato per misurare la volatilità negativa dei rendimenti di un investimento e fornire una misura del "dolore allo stomaco" associato alle riduzioni di prezzo nel corso del tempo.

La formula dell'Ulcer Index coinvolge tre passaggi principali:

  1. Calcolo delle riduzioni percentuali: Per ogni periodo, la riduzione percentuale è calcolata come la differenza tra il valore massimo del periodo precedente e il valore corrente, diviso per il valore massimo del periodo precedente. Questo valore rappresenta la percentuale di "drawdown" dal picco precedente.
  2. Calcolo del quadrato delle riduzioni percentuali: Ogni riduzione percentuale viene elevata al quadrato. Questo passaggio attribuisce maggior peso ai drawdown più grandi, mettendo in evidenza le riduzioni di prezzo più significative.
  3. Calcolo dell'Ulcer Index: La radice quadrata della media dei quadrati delle riduzioni percentuali viene quindi calcolata per fornire una misura della volatilità negativa nel tempo. Questa media ponderata dei drawdown fornisce una stima del "dolore" associato alle perdite nel portafoglio.
L'Ulcer Index è utile per gli investitori interessati a valutare il rischio di un investimento e la sua capacità di sopportare le perdite nel tempo. Misura la severità e la durata delle riduzioni di prezzo, consentendo agli investitori di valutare meglio il potenziale di perdita e la volatilità di un investimento nel corso del tempo.
Codice:
Function UlcerIndex(data() As Double) As Variant
    ' Dichiarazione delle variabili
    Dim n As Integer
    Dim sumSquaredPercentageDrawdowns As Double
    Dim i As Integer
    Dim prevMax As Double
    Dim squaredDrawdown As Double ' Variabile per memorizzare il quadrato delle riduzioni percentuali
  
    ' Determina il numero di elementi nell'array data
    n = UBound(data)

    ' Controllo se ci sono elementi nell'array data
    If n >= 1 Then
        ' Inizializzazione delle variabili
        sumSquaredPercentageDrawdowns = 0
        prevMax = data(1)  ' Inizializza prevMax con il primo elemento di data
        ' Loop attraverso gli elementi dell'array data
        For i = 2 To n
            ' Verifica se l'elemento corrente è maggiore del massimo valore precedente
            If data(i) > prevMax Then
                ' Se sì, aggiorna il massimo valore precedente e passa all'iterazione successiva
                prevMax = data(i)
            Else
                ' Se no e prevMax non è zero, calcola la riduzione percentuale e il suo quadrato
                If prevMax <> 0 And data(i) <> prevMax Then
                    squaredDrawdown = (100 * (data(i) - prevMax) / prevMax) ^ 2
                    ' Aggiungi il quadrato delle riduzioni percentuali alla somma
                    sumSquaredPercentageDrawdowns = sumSquaredPercentageDrawdowns + squaredDrawdown
                End If
            End If
        Next i
        ' Calcola la radice quadrata della media ponderata delle riduzioni percentuali al quadrato
        If sumSquaredPercentageDrawdowns <> 0 And n <> 0 Then
            UlcerIndex = (sumSquaredPercentageDrawdowns / n) ^ 0.5
        Else
            UlcerIndex = 0  ' Restituisce 0 se la somma dei quadrati delle riduzioni percentuali è zero
        End If
    Else
        ' Se l'array data è vuoto, restituisce "undefined"
        UlcerIndex = "undefined"
    End If
End Function
scusa l'ignoranza , ma questo che linguaggio di programmazione è ?
 
Anche questa formula il prossimo anno compie 60 anni !!

Indice di Treynor - Wikipedia

Treynor non e' sopravissuto, in quanto e' morto qualche anno fa. Ma quando nacque il FOL, era vivo e vegeto !!
 
Per quel che vale, ecco la formula che prima di morire egli partori'
Codice:
'Treynor Ratio (talvolta chiamato Reward-to-Variability-Ratio)
Function Treynor(data() As Double, Market() As Double, ByVal riskfree As Double) As Double
    Dim n As Long
    Dim M As Long
    Dim betaValue As Double
    
    ' Trova la dimensione del dataset data
    n = UBound(data)
    
    ' Trova la dimensione del dataset market
    M = UBound(Market)
    
    ' Verifica se ci sono dati nei dataset e se riskfree è numerico
    If n > 0 And M > 0 And n = M And IsNumeric(riskfree) Then
        ' Calcola il valore beta usando la funzione beta
        betaValue = beta(data(), Market(), riskfree)
        
        ' Verifica che il calcolo di beta sia numerico e diverso da zero
        If IsNumeric(betaValue) And betaValue <> 0 Then
            ' Calcola e restituisce il rapporto di Treynor
            Treynor = (Mean(data()) - riskfree) / betaValue
        Else
            ' Se beta non è valido, restituisce "undefined"
            Treynor = "undefined"
        End If
    Else
        ' Se i dataset non contengono dati o riskfree non è numerico, restituisce "undefined"
        Treynor = "undefined"
    End If
End Function
 
Ma nessuno batte Harry Markovitz: la sua formula che usa la media e la varianza ha 71 anni. Eppure ci sono dei giornalini che escono il sabato mattino come allegato, dei dipendenti bancari delle casse rurali, dei dipendenti bancari delle banche popolari, dei consulenti finanziari arruolati per il viso pulito che mostrano, e per il sapiente uso dell'abbigliamento scuro
vecchio .png
, che continuano a suggerire una formula matematica di 71 anni come un approccio innovativo.

Comunque direi che la formula di Markoviz ha 71 anni portati ancora molto bene,

Sicuramente raggiungera' il secolo di vita !
 
La formula di Markoviz e' riportata gia' in alto al post numero 3.
Tengo a precisare che e' del 1952 e non del 1953 come avevo precedentemente scritto.

Ma la sua intuizione e' dovuta ad altri precursori, tra i quali - mi piace ricordarlo - un italiano, il grande matematico e politico radicale De Finetti, impiegato delle assicurazioni. De Finetti aveva anche ideato la formula di Black and Scholes, come tardivamente venne riconosciuto dai Nobel stessi, uno tra i sopravissuti, in un'intervista negli anni 2000.
 
  • Like
Reazioni: Mei
Non ho parlato ancora della formula di Burke, inventata da Salomon Burke. Uno che ha fatto davvero grandi cose nella vita, in molti campi diversi come la musica e puo' essere considerato un campione dell'ecletticita'.

Esempio:


Supponiamo di avere un dataset di rendimenti mensili per un periodo di 10 anni. Il rendimento medio annuale è del 10% e la sommatoria dei quadrati dei drawdown è 0.2. In questo caso, il rapporto di Burke sarebbe:


Rapporto di Burke = 10% / √(0.2) = 10% / 0.447 = 22.38


Limiti del rapporto di Burke:


  • Il rapporto di Burke è solo una misura della performance di un investimento. È importante considerare anche altri fattori, come la volatilità e il rischio di ribassi del tipo 1987 oppure 11 settembre 2001, cioe' dei drawdown colossali che il rapporto di Burke tende a sottovalutare.
  • Il rapporto di Burke è sensibile al periodo di tempo considerato. Il rapporto di Burke può essere diverso se si calcola su un periodo di tempo diverso. Per cui la prossima formula che illustrero' cerchera' di tenere conto di questo fattore. Va sotto il nome di rapporto di Burke modificato, in cui il rapporto di Burke viene moltipolicato per la radice quadrata del numero di dati.

In generale, il rapporto di Burke è un utile strumento per valutare la performance di un investimento, ma è importante utilizzarlo in combinazione con altre metriche e considerazioni.
 
Ultima modifica:
  • Like
Reazioni: Mei
Una delle formule piu' sopravvalutate nel mondo finanziario e' l'indice di Sharp

Una delle formule piu' sottovalutate nel mondo finanziario e' l'indice di Claire.

Il Clare Ratio, coniato da Jon Clare, è un rapporto di performance che misura il rendimento di un portafoglio rispetto a un benchmark, tenendo conto del rischio assunto. Questo rapporto è progettato per fornire una valutazione della performance che tiene conto sia del rendimento che del rischio, con un'enfasi particolare sulla protezione del capitale.

La formula del Clare Ratio è la seguente:

Clare Ratio = Rendimento del Portafoglio−Rendimento del Benchmark/ Deviazione Standard dei Rendimenti Negativi del Portafoglio

Dove:

  • "Rendimento del Portafoglio" rappresenta il rendimento complessivo del portafoglio.
  • "Rendimento del Benchmark" è il rendimento del benchmark o indice di riferimento.
  • "Deviazione Standard dei Rendimenti Negativi del Portafoglio" è la deviazione standard dei rendimenti negativi del portafoglio.
Il Clare Ratio è progettato per dare maggiore peso alla protezione contro le perdite rispetto alla semplice valutazione del rendimento.

Un Clare Ratio più elevato indica una migliore gestione del rischio, poiché significa che il portafoglio ha generato rendimenti superiori rispetto al benchmark, tenendo conto del rischio associato.

Tra 50 anni probabilmente elogeremo Claire e dimenticheremo William Sharp

Ciao, il Claire Ratio può essere assimilato quindi all'indice di Sortino?
 
Sì, l'Indice di Sortino e l'Indice di Clare sono entrambi misure di performance che si concentrano sul rischio al ribasso di un investimento, ma hanno approcci leggermente diversi, , in quanto il calcolo delle penalità differisce leggermente tra l'Indice di Sortino e l'Indice di Clare.
 
Una formula che non ha potuto godere dei benefici della legge Fornero e' la formula Up, che tuttavia oramai ha piu' di 50 anni.
Gode anch'essa di ottima salute, per non aver svolto lavori usuranti ? :D

Onestamente non lo so :mmmm:


Ecco, ad ogni modo, anche per "up !" il suo pseudocodice



Codice:
'Upside Potential Ratio Leibowitz e Homer (1972)
' numeratore/radice (denominatore)
' numeratore e' somma dei rendimenti positivi al di sopra della soglia specificata (thresh)
' denominatore e' la somma dei quadrati dei rendimenti negativi sotto la soglia specificata (thresh).

Function UP(data() As Double, ByVal thresh As Variant) As Variant
    Dim n As Integer
    Dim i As Integer
    Dim nominator As Double
    Dim denominator As Double
  
    ' Inizializzazione delle variabili
    n = UBound(data)
  
    ' Verifica dei requisiti
    If n <= 0 Or Not IsNumeric(thresh) Or IsEmpty(thresh) Then
        UP = "undefined"
        Exit Function
    End If

    ' Calcolo di nominator e denominator
    For i = 0 To n - 1
        If data(i) > thresh Then
            nominator = nominator + (data(i) - thresh) / n
        ElseIf data(i) < thresh Then
            denominator = denominator + (data(i) - thresh) ^ 2 / n
        End If
    Next i

    ' Calcolo di UP
    If denominator <> 0 Then
        UP = nominator / (denominator ^ 0.5)
    Else
        UP = "undefined"
    End If
End Function
 
Da modestissimo anziano appassionato del settore mi sono imbattuto in questo thread e, a proposito di "compleanni anziani", volevo ricordarne un altro, forse il più datato, che è trascorso da pochi giorni: 29 marzo 1900 - Louis Bachelier - "La teoria della speculazione".
(EDIT: @P.A.T. protesto vibratamente per la figura caricaturale posta accanto ad un 71esimo compleanno :rotfl::rotfl:)
 
Indietro