P.A.T.
Nuovo Utente
- Registrato
- 8/5/01
- Messaggi
- 31.058
- Punti reazioni
- 1.413
Follow along with the video below to see how to install our site as a web app on your home screen.
Nota: This feature may not be available in some browsers.
'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
'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
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 è ?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:
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.
- 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.
- 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.
- 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.
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
'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
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:
Il Clare Ratio è progettato per dare maggiore peso alla protezione contro le perdite rispetto alla semplice valutazione del rendimento.
- "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.
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
'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