Эта стратегия делает детальное и визуальное сравнение между данной стратегией и доходами от покупки и хранения торгуемой ценной бумаги.
Основная логика этой стратегии состоит в том, чтобы составить четыре ключевых элемента для сравнения между данной стратегией и стратегией покупки и хранения:
Сравнивая вышеперечисленные четыре элемента, мы можем получить интуитивное представление о том, превосходит ли наша стратегия простую стратегию покупки и хранения или уступает ей.
По сравнению с простым сравнением доходов от покупки и хранения, эта стратегия имеет следующие преимущества:
Более всеобъемлющие и подробные показатели сравнения, включая сравнения по барам и общие статистические сравнения, чтобы мы ясно знали, когда и где наша стратегия побеждает или проигрывает, чтобы купить и удержать.
Интуитивные визуальные графики, которые изображают стратегию P / L, buy & hold P / L и разницу между ними. Это позволяет нам визуально рассказать о производительности нашей стратегии быстрее.
Настраиваемый диапазон дат сравнения, где мы можем сосредоточиться на сравнении нашей стратегии против покупки и удержания на конкретных периодах.
Простая и простая в использовании. Логика сравнения встроена так, что нам нужно только заменить раздел сценария стратегии на свой собственный. Нет необходимости кодировать логику сравнения сами.
Эта стратегия основана в основном на встроенных показателях доходности покупки и хранения торговой платформы для сравнения. Любая предвзятость с этим эталоном повлияет на конечный результат. Кроме того, могут существовать недостатки в статистических расчетах этой стратегии, которые не могут точно отразить сравнение.
Если торговая платформа вносит значительные изменения в показатель buy & hold, логику сравнения здесь также необходимо скорректировать.
Эта стратегия может быть дополнительно оптимизирована из следующих аспектов:
Ввести больше эталонов для трехстороннего или многостороннего сравнения, например, сравнения с индексом или отраслевыми аналогами.
Включите больше статистических показателей, таких как годовой показатель выигрыша, максимальная разница в продолжительности заимствования и т. Д., Для оценки стратегии с более широких аспектов.
Сделайте больше компонентов, таких как эталонные показатели, метрики и т. Д., Настраиваемые пользователями вместо простого диапазона дат.
Улучшить визуализацию графиков, поскольку простые линейные графики здесь затрудняют обнаружение подробных сравнений на конкретных панелях.
С помощью подробных сравнительных показателей и интуитивных визуальных диаграмм эта стратегия позволяет нам иметь очень четкое представление о том, где и как наша индивидуальная стратегия отличается от простого подхода buy & hold.
Дальнейшее обогащение эталонов, показателей и визуализации может превратить его в чрезвычайно мощный инструмент для анализа стратегии.
/*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)