Visueller Vergleich zwischen Strategie und Buy & Hold Renditen

Schriftsteller:ChaoZhang, Datum: 2024-01-05 15:27:26
Tags:

img

Übersicht

Diese Strategie stellt einen detaillierten und visuellen Vergleich zwischen einer bestimmten Strategie und der Buy & Hold Rendite des gehandelten Wertpapiers her.

Strategie Logik

Die Kernlogik dieser Strategie besteht darin, vier Schlüsselelemente für den Vergleich zwischen der gegebenen Strategie und der Buy & Hold-Strategie zu erstellen:

  1. Strategie P/L: Strategie Nettogewinn + Strategie offener Gewinn
  2. Buy & Hold P/L: nicht realisierte Rendite
  3. Unterschied: Strategie P/L - Kauf und Halte P/L
  4. Strategie gegen Kauf Halte Statistiken
    • Prozentsatz der Bar-Strategie P/L liegt über Buy & Hold
    • Prozentsatz der Bars-Strategie P/L liegt unter Buy & Hold
    • Allzeitdurchschnittliche Differenz

Durch den Vergleich der oben genannten vier Elemente können wir intuitiv verstehen, ob unsere Strategie eine einfache Buy & Hold-Strategie übertrifft oder untertrifft.

Analyse der Vorteile

Im Vergleich zu einem einfachen Vergleich der Buy & Hold-Renditen hat diese Strategie folgende Vorteile:

  1. Umfassendere und detailliertere Vergleichsmetriken, einschließlich Vergleiche pro Stange und Gesamtstatistikvergleiche, damit wir klar wissen, wann und wo unsere Strategie beim Buy & Hold schlägt oder verliert.

  2. Intuitive visuelle Diagramme, die die Strategie P/L, Buy & Hold P/L und den Unterschied zwischen ihnen darstellen.

  3. Anpassbarer Vergleichsdatumsbereich, in dem wir uns darauf konzentrieren können, unsere Strategie gegen Buy & Hold auf bestimmte Zeiträume zu vergleichen.

  4. Einfach und einfach zu bedienen. Die Vergleichslogik ist eingebaut, sodass wir nur den Strategie-Skript-Abschnitt durch unseren eigenen ersetzen müssen.

Risikoanalyse

Diese Strategie stützt sich hauptsächlich auf die integrierten Buy & Hold-Return-Metriken der Handelsplattform zum Vergleich. Jede Verzerrung mit diesem Benchmark wirkt sich auf das Endergebnis aus. Außerdem können in den statistischen Berechnungen dieser Strategie Mängel auftreten, die den Vergleich nicht genau widerspiegeln.

Wenn die Handelsplattform erhebliche Änderungen an der Buy & Hold-Metrik vornimmt, muss auch die Vergleichslogik angepasst werden.

Optimierungsrichtlinien

Diese Strategie kann aus folgenden Gesichtspunkten weiter optimiert werden:

  1. Mehr Benchmarks für einen dreiseitigen oder mehrseitigen Vergleich einführen, z. B. im Vergleich zu einem Index oder Branchenkollegen.

  2. Einbeziehen Sie mehr statistische Kennzahlen wie jährliche Gewinnrate, maximale Differenz in der Auslastungsdauer usw., um die Strategie aus mehr Dimensionen zu bewerten.

  3. Erstellen Sie mehr Komponenten wie Benchmarks, Metriken usw., die von Benutzern anstelle des Datumsbereichs angepasst werden können.

  4. Verbessern Sie die Grafikvisualisierung, da einfache Liniendiagramme es hier schwierig machen, detaillierte Vergleiche auf bestimmten Balken zu erkennen.

Schlussfolgerung

Mit detaillierten Vergleichsmetriken und intuitiven visuellen Diagrammen ermöglicht uns diese Strategie einen sehr klaren Überblick darüber, wo und wie sich unsere benutzerdefinierte Strategie von einem einfachen Buy & Hold-Ansatz unterscheidet.

Durch die weitere Anreicherung der Benchmarks, Metriken und Visualisierungen kann dies zu einem äußerst leistungsfähigen Toolkit für die Strategieanalyse werden.


/*backtest
start: 2023-12-28 00:00:00
end: 2024-01-04 00:00:00
period: 3m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("VS Buy Hold", precision=2)

bnh_info_panel = input(true, title='Enable Info Panel')
bnh_indicator_panel = input(true, title='Enable Indicator Panel')

//COMPARISON DATE RANGE//
bnh_FromYear = input(1970, title="From Year", minval=1970)
bnh_FromMonth = input(1, title="From Month", minval=1, maxval=12)
bnh_FromDay = input(1, title="From Day", minval=1, maxval=31)

bnh_ToYear = input(2050, title="To Year", minval=2010)
bnh_ToMonth = input(12, title="To Month", minval=1, maxval=12)
bnh_ToDay = input(31, title="To Day", minval=1, maxval=31)

bnh_start = timestamp(bnh_FromYear, bnh_FromMonth, bnh_FromDay, 00, 00)
bnh_finish = timestamp(bnh_ToYear, bnh_ToMonth, bnh_ToDay, 23, 59)
bnh_timeCond = time >= bnh_start and time <= bnh_finish ? true: false
    
//Note: If you are going to use the COMPARISON DATE RANGE above, apply bnh_timeCond
//      to your strategy parameters.


/////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////STRATEGY SCRIPT START//////////////////////////////////

//=========================PLACEHOLDER MA CROSS STRATEGY=========================//
fastLength = 50
slowLength = 200
price = close

mafast = sma(price, fastLength)
maslow = sma(price, slowLength)
strategy.initial_capital = 50000
positionSize = strategy.initial_capital / close

if (crossover(mafast, maslow) and bnh_timeCond) // <= bnh_timeCond added as a condition
    strategy.entry("MA2CrossLE", strategy.long, positionSize, comment="MA2CrossLE")

if (crossunder(mafast, maslow) and bnh_timeCond) // <= bnh_timeCond added as a condition
    strategy.entry("MA2CrossSE", strategy.short, positionSize, comment="MA2CrossSE")

//////////////////////////////STRATEGY SCRIPT END////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////



//STRATEGY EQUITY
strategy_pnl = strategy.netprofit + strategy.openprofit
bnh_strategy_pnl_pcnt = (strategy_pnl / strategy.initial_capital) * 100


//BUY AND HOLD EQUITY
float bnh_start_bar = na
bnh_start_bar := na(bnh_start_bar[1]) and bnh_timeCond? close : bnh_start_bar[1]
bnl_buy_hold_equity = ((close - bnh_start_bar)/bnh_start_bar) * 100


//STRATEGY VS BUY AND HOLD STATS
bnh_vs_diff = bnh_strategy_pnl_pcnt - bnl_buy_hold_equity

bnh_bar_counter = 0
bnh_bar_counter := bnh_vs_diff > 0 ? nz(bnh_bar_counter[1]) + 1 : bnh_bar_counter[1]

bnh_bar_counter2 = 0
bnh_bar_counter2 := bnh_vs_diff <= 0 ? nz(bnh_bar_counter2[1]) + 1 : bnh_bar_counter2[1]

bnh_pcnt_above = (bnh_bar_counter/(bnh_bar_counter + bnh_bar_counter2))*100
bnh_pcnt_below = (bnh_bar_counter2/(bnh_bar_counter + bnh_bar_counter2))*100

bnh_average_diff = cum(bnh_vs_diff) / (bnh_bar_counter + bnh_bar_counter2)


//PLOTS AND LABELS
bnh_diff_color = bnh_vs_diff > 0 ? color.green : color.red
plot(bnh_vs_diff, style=plot.style_columns, color=bnh_diff_color, transp=60, title='SvB')
plot(bnh_strategy_pnl_pcnt, color=color.yellow, linewidth=2, title="SR")
plot(bnl_buy_hold_equity, color=color.blue, title="BHR")

// draw_IndicatorLabel(_text, _x, _y, label_color, font_color)=>
//     string_text = _text
//     var label la_indicator = na
//     label.delete(la_indicator)
//     la_indicator := label.new(
//          x=_x, y=_y, 
//          text=string_text, xloc=xloc.bar_index, yloc=yloc.price, 
//          color=label_color, style=label.style_labeldown, textcolor=font_color, size=size.small)

// draw_InfoPanel(_text, _x, _y, font_size)=>
//     var label la_panel = na
//     label.delete(la_panel)
//     la_panel := label.new(
//          x=_x, y=_y, 
//          text=_text, xloc=xloc.bar_time, yloc=yloc.price, 
//          color=color.new(#383838, 5), style=label.style_labelup, textcolor=color.white, size=font_size)

// if bnh_indicator_panel         
//     draw_IndicatorLabel("Difference", bar_index, bnh_vs_diff, color.new(color.gray, 40), color.white)
//     draw_IndicatorLabel("Strategy P/L", bar_index, bnh_strategy_pnl_pcnt, color.new(color.yellow, 50), color.white)
//     draw_IndicatorLabel("Buy & Hold P/L", bar_index, bnl_buy_hold_equity, color.new(color.blue, 50), color.white)

// info_panel_x = time_close + round(change(time) * 200)
// info_panel_y = max(max(bnl_buy_hold_equity, bnh_strategy_pnl_pcnt), bnh_vs_diff) + abs(bnh_vs_diff * 0.25)


// title = "STRATEGY vs BUY & HOLD STATS"
// row0 = "-----------------------------------------------------"
// row1 = 'Bars Above Buy & Hold: ' + tostring(bnh_pcnt_above, '#.##') + '%'
// row2 = 'Bars Below Buy & Hold: ' + tostring(bnh_pcnt_below, '#.##') + '%'
// row3 = 'All Time Ave. Difference: ' + tostring(bnh_average_diff, '#.##') + '%'

// panel_text = '\n' + title + '\n' + row0 + '\n' + row1 + '\n\n' + row2 + '\n\n' + row3 + '\n'

// if bnh_info_panel
//     draw_InfoPanel(panel_text, info_panel_x, info_panel_y, size.normal)



Mehr