back-trader-python 1.4.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- back_trader_python-1.4.0.dist-info/METADATA +1491 -0
- back_trader_python-1.4.0.dist-info/RECORD +465 -0
- back_trader_python-1.4.0.dist-info/WHEEL +5 -0
- back_trader_python-1.4.0.dist-info/licenses/LICENSE +674 -0
- back_trader_python-1.4.0.dist-info/top_level.txt +1 -0
- backtrader/__init__.py +148 -0
- backtrader/_cerebro/__init__.py +5 -0
- backtrader/_cerebro/channel.py +382 -0
- backtrader/_cerebro/execution.py +377 -0
- backtrader/_cerebro/lifecycle.py +143 -0
- backtrader/_cerebro/notifications.py +150 -0
- backtrader/_cerebro/presentation.py +230 -0
- backtrader/_cerebro/registry.py +593 -0
- backtrader/_cerebro/runnext.py +551 -0
- backtrader/_cerebro/runonce.py +142 -0
- backtrader/analyzer.py +594 -0
- backtrader/analyzers/__init__.py +50 -0
- backtrader/analyzers/annualreturn.py +226 -0
- backtrader/analyzers/calmar.py +165 -0
- backtrader/analyzers/drawdown.py +287 -0
- backtrader/analyzers/leverage.py +112 -0
- backtrader/analyzers/logreturnsrolling.py +190 -0
- backtrader/analyzers/periodstats.py +153 -0
- backtrader/analyzers/positions.py +119 -0
- backtrader/analyzers/pyfolio.py +470 -0
- backtrader/analyzers/returns.py +192 -0
- backtrader/analyzers/sharpe.py +307 -0
- backtrader/analyzers/sharpe_ratio_stats.py +534 -0
- backtrader/analyzers/sqn.py +112 -0
- backtrader/analyzers/timereturn.py +192 -0
- backtrader/analyzers/total_value.py +75 -0
- backtrader/analyzers/tradeanalyzer.py +278 -0
- backtrader/analyzers/transactions.py +141 -0
- backtrader/analyzers/vwr.py +245 -0
- backtrader/bokeh/__init__.py +155 -0
- backtrader/bokeh/analyzers/__init__.py +13 -0
- backtrader/bokeh/analyzers/plot.py +192 -0
- backtrader/bokeh/analyzers/recorder.py +181 -0
- backtrader/bokeh/app.py +1094 -0
- backtrader/bokeh/live/__init__.py +11 -0
- backtrader/bokeh/live/client.py +352 -0
- backtrader/bokeh/live/datahandler.py +346 -0
- backtrader/bokeh/plot_adapter.py +200 -0
- backtrader/bokeh/schemes/__init__.py +14 -0
- backtrader/bokeh/schemes/blackly.py +76 -0
- backtrader/bokeh/schemes/scheme.py +150 -0
- backtrader/bokeh/schemes/tradimo.py +82 -0
- backtrader/bokeh/tab.py +125 -0
- backtrader/bokeh/tabs/__init__.py +30 -0
- backtrader/bokeh/tabs/analyzer.py +120 -0
- backtrader/bokeh/tabs/config.py +154 -0
- backtrader/bokeh/tabs/live.py +109 -0
- backtrader/bokeh/tabs/log.py +185 -0
- backtrader/bokeh/tabs/metadata.py +182 -0
- backtrader/bokeh/tabs/performance.py +359 -0
- backtrader/bokeh/tabs/source.py +70 -0
- backtrader/bokeh/utils/__init__.py +8 -0
- backtrader/bokeh/utils/helpers.py +167 -0
- backtrader/bokeh/webapp.py +164 -0
- backtrader/broker.py +478 -0
- backtrader/brokers/__init__.py +36 -0
- backtrader/brokers/bbroker.py +2576 -0
- backtrader/brokers/btapibroker.py +8227 -0
- backtrader/brokers/hft/__init__.py +89 -0
- backtrader/brokers/hft/binance_bbo.py +625 -0
- backtrader/brokers/hft/binance_bbo_compare.py +1398 -0
- backtrader/brokers/hft/examples.py +1228 -0
- backtrader/brokers/hft/exchange.py +380 -0
- backtrader/brokers/hft/latency.py +309 -0
- backtrader/brokers/hft/matching_core.py +572 -0
- backtrader/brokers/hft/queue.py +238 -0
- backtrader/brokers/hft/recorder.py +88 -0
- backtrader/brokers/hft/state.py +138 -0
- backtrader/brokers/impact_models.py +118 -0
- backtrader/brokers/mixbroker.py +895 -0
- backtrader/brokers/tickbroker.py +1991 -0
- backtrader/btrun/__init__.py +12 -0
- backtrader/btrun/btrun.py +1218 -0
- backtrader/cerebro.py +828 -0
- backtrader/channel.py +682 -0
- backtrader/channels/__init__.py +23 -0
- backtrader/channels/bridge.py +186 -0
- backtrader/channels/funding.py +248 -0
- backtrader/channels/live_queue.py +216 -0
- backtrader/channels/live_validator.py +294 -0
- backtrader/channels/orderbook.py +257 -0
- backtrader/channels/tick.py +202 -0
- backtrader/comminfo.py +665 -0
- backtrader/commissions/__init__.py +106 -0
- backtrader/commissions/ctpoption.py +993 -0
- backtrader/configs/account_config_example.yaml +8 -0
- backtrader/dataseries.py +379 -0
- backtrader/errors.py +106 -0
- backtrader/events.py +980 -0
- backtrader/feed.py +1523 -0
- backtrader/feeds/__init__.py +75 -0
- backtrader/feeds/barrier.py +2006 -0
- backtrader/feeds/blaze.py +118 -0
- backtrader/feeds/btapifeed.py +1538 -0
- backtrader/feeds/btcsv.py +203 -0
- backtrader/feeds/chainer.py +114 -0
- backtrader/feeds/cryptohftdata.py +164 -0
- backtrader/feeds/csvgeneric.py +1205 -0
- backtrader/feeds/ctpcohort.py +1051 -0
- backtrader/feeds/influxfeed.py +158 -0
- backtrader/feeds/livefeed.py +71 -0
- backtrader/feeds/mixed_channel.py +108 -0
- backtrader/feeds/mt4csv.py +42 -0
- backtrader/feeds/pandafeed.py +381 -0
- backtrader/feeds/quandl.py +256 -0
- backtrader/feeds/rollover.py +229 -0
- backtrader/feeds/sierrachart.py +30 -0
- backtrader/feeds/vchart.py +162 -0
- backtrader/feeds/vchartcsv.py +84 -0
- backtrader/feeds/vchartfile.py +153 -0
- backtrader/feeds/yahoo.py +399 -0
- backtrader/fillers.py +148 -0
- backtrader/filters/__init__.py +34 -0
- backtrader/filters/bsplitter.py +127 -0
- backtrader/filters/calendardays.py +121 -0
- backtrader/filters/datafiller.py +192 -0
- backtrader/filters/datafilter.py +74 -0
- backtrader/filters/daysteps.py +96 -0
- backtrader/filters/heikinashi.py +63 -0
- backtrader/filters/renko.py +164 -0
- backtrader/filters/session.py +289 -0
- backtrader/flt.py +80 -0
- backtrader/functions.py +960 -0
- backtrader/indicator.py +449 -0
- backtrader/indicators/__init__.py +148 -0
- backtrader/indicators/accdecoscillator.py +110 -0
- backtrader/indicators/aroon.py +300 -0
- backtrader/indicators/atr.py +315 -0
- backtrader/indicators/awesomeoscillator.py +122 -0
- backtrader/indicators/basicops.py +834 -0
- backtrader/indicators/bollinger.py +223 -0
- backtrader/indicators/cci.py +89 -0
- backtrader/indicators/channels_ext.py +83 -0
- backtrader/indicators/contrib/__init__.py +228 -0
- backtrader/indicators/contrib/absolutely_no_lag_lwma.py +28 -0
- backtrader/indicators/contrib/absolutely_no_lag_lwma_color.py +44 -0
- backtrader/indicators/contrib/accumulation_distribution_line.py +92 -0
- backtrader/indicators/contrib/adx_cross_hull_style_indicator.py +249 -0
- backtrader/indicators/contrib/adxdmi.py +34 -0
- backtrader/indicators/contrib/ai_acceleration_deceleration_oscillator.py +34 -0
- backtrader/indicators/contrib/altr_trend_signal_v22.py +85 -0
- backtrader/indicators/contrib/anchored_momentum_line.py +115 -0
- backtrader/indicators/contrib/any_range_cld_tail_indicator.py +82 -0
- backtrader/indicators/contrib/aroon_horn_sign_indicator.py +96 -0
- backtrader/indicators/contrib/aroon_oscillator_sign_alert.py +50 -0
- backtrader/indicators/contrib/arrows_curves_indicator.py +112 -0
- backtrader/indicators/contrib/as_ctrend_indicator.py +143 -0
- backtrader/indicators/contrib/asimmetric_stoch_nr_indicator.py +187 -0
- backtrader/indicators/contrib/atr_normalize_histogram.py +118 -0
- backtrader/indicators/contrib/average_change_candle.py +165 -0
- backtrader/indicators/contrib/bb_squeeze_indicator.py +60 -0
- backtrader/indicators/contrib/bezier_st_dev_indicator.py +135 -0
- backtrader/indicators/contrib/binary_wave_indicator.py +233 -0
- backtrader/indicators/contrib/blau_c_momentum_indicator.py +123 -0
- backtrader/indicators/contrib/blau_cmi_indicator.py +141 -0
- backtrader/indicators/contrib/blau_csi.py +76 -0
- backtrader/indicators/contrib/blau_ergodic.py +53 -0
- backtrader/indicators/contrib/blau_t_stoch_i.py +72 -0
- backtrader/indicators/contrib/blau_ts_stochastic.py +85 -0
- backtrader/indicators/contrib/blau_tvi.py +55 -0
- backtrader/indicators/contrib/brain_trend2_indicator.py +128 -0
- backtrader/indicators/contrib/brain_trend_signal_proxy.py +47 -0
- backtrader/indicators/contrib/brake_parb_indicator.py +85 -0
- backtrader/indicators/contrib/breakout_bars_trend_v2.py +121 -0
- backtrader/indicators/contrib/bsi_indicator.py +87 -0
- backtrader/indicators/contrib/bulls_bears_eyes.py +67 -0
- backtrader/indicators/contrib/bulls_power.py +56 -0
- backtrader/indicators/contrib/bw_wise_man1_signal.py +102 -0
- backtrader/indicators/contrib/bykov_trend_indicator.py +85 -0
- backtrader/indicators/contrib/candle_stop_color.py +46 -0
- backtrader/indicators/contrib/candles_x_smoothed_indicator.py +69 -0
- backtrader/indicators/contrib/candlesticks_bw.py +45 -0
- backtrader/indicators/contrib/caudate_x_period_candle_color.py +56 -0
- backtrader/indicators/contrib/cci_histogram_indicator.py +53 -0
- backtrader/indicators/contrib/cci_woodies_indicator.py +80 -0
- backtrader/indicators/contrib/center_of_gravity_candle_indicator.py +83 -0
- backtrader/indicators/contrib/center_of_gravity_indicator.py +70 -0
- backtrader/indicators/contrib/cg_oscillator.py +40 -0
- backtrader/indicators/contrib/close_line_cci.py +38 -0
- backtrader/indicators/contrib/close_price_fractals.py +47 -0
- backtrader/indicators/contrib/color3rd_gen_xma_indicator.py +122 -0
- backtrader/indicators/contrib/color_bb_candles_indicator.py +108 -0
- backtrader/indicators/contrib/color_coppock_indicator.py +157 -0
- backtrader/indicators/contrib/color_hma.py +71 -0
- backtrader/indicators/contrib/color_j_variation_indicator.py +53 -0
- backtrader/indicators/contrib/color_metro_de_marker_indicator.py +78 -0
- backtrader/indicators/contrib/color_metro_stochastic_indicator.py +93 -0
- backtrader/indicators/contrib/color_metro_wpr_indicator.py +85 -0
- backtrader/indicators/contrib/color_schaff_de_marker_trend_cycle.py +92 -0
- backtrader/indicators/contrib/color_schaff_trend_cycle_indicator.py +203 -0
- backtrader/indicators/contrib/color_step_xccx_indicator.py +193 -0
- backtrader/indicators/contrib/color_x2_ma.py +49 -0
- backtrader/indicators/contrib/color_x_derivative.py +63 -0
- backtrader/indicators/contrib/color_zerolag_de_marker.py +84 -0
- backtrader/indicators/contrib/corrected_average_indicator.py +127 -0
- backtrader/indicators/contrib/darvas_boxes_system.py +73 -0
- backtrader/indicators/contrib/dema_range_channel_color.py +42 -0
- backtrader/indicators/contrib/derivative_indicator.py +95 -0
- backtrader/indicators/contrib/digital_ft01_indicator.py +112 -0
- backtrader/indicators/contrib/digital_macd.py +200 -0
- backtrader/indicators/contrib/donchian_channels_system.py +45 -0
- backtrader/indicators/contrib/dots_indicator.py +93 -0
- backtrader/indicators/contrib/ef_distance_indicator.py +82 -0
- backtrader/indicators/contrib/ema_rsi_va.py +80 -0
- backtrader/indicators/contrib/envelopes_jp_alonso.py +32 -0
- backtrader/indicators/contrib/f2a_ao_indicator.py +120 -0
- backtrader/indicators/contrib/fatl_filter.py +179 -0
- backtrader/indicators/contrib/fibo_candles_indicator.py +78 -0
- backtrader/indicators/contrib/fine_tuning_ma.py +100 -0
- backtrader/indicators/contrib/fisher_org_v1.py +102 -0
- backtrader/indicators/contrib/fisher_org_v1_sign.py +118 -0
- backtrader/indicators/contrib/force_index_ema.py +96 -0
- backtrader/indicators/contrib/force_index_ema_2.py +27 -0
- backtrader/indicators/contrib/forecast_oscilator.py +145 -0
- backtrader/indicators/contrib/fractal_amambk.py +81 -0
- backtrader/indicators/contrib/frama_series.py +84 -0
- backtrader/indicators/contrib/frasm_av2_indicator.py +104 -0
- backtrader/indicators/contrib/go_indicator.py +93 -0
- backtrader/indicators/contrib/hlr_indicator.py +95 -0
- backtrader/indicators/contrib/hma.py +50 -0
- backtrader/indicators/contrib/i4_drfv2.py +34 -0
- backtrader/indicators/contrib/i4_drfv3.py +38 -0
- backtrader/indicators/contrib/i_anch_mom_indicator.py +72 -0
- backtrader/indicators/contrib/i_de_marker_sign_indicator.py +64 -0
- backtrader/indicators/contrib/i_gap_indicator.py +45 -0
- backtrader/indicators/contrib/i_stoch_komposter_indicator.py +77 -0
- backtrader/indicators/contrib/i_trend_indicator.py +125 -0
- backtrader/indicators/contrib/iamma_indicator.py +39 -0
- backtrader/indicators/contrib/indexed_moving_average.py +33 -0
- backtrader/indicators/contrib/instantaneous_trend_filter_indicator.py +51 -0
- backtrader/indicators/contrib/inverse_reaction_indicator.py +41 -0
- backtrader/indicators/contrib/irsi_sign_indicator.py +95 -0
- backtrader/indicators/contrib/iwpr_sign_indicator.py +59 -0
- backtrader/indicators/contrib/j_brain_trend1_sig_indicator.py +233 -0
- backtrader/indicators/contrib/j_tpo_proxy.py +32 -0
- backtrader/indicators/contrib/jma_slope_indicator.py +73 -0
- backtrader/indicators/contrib/kalman_filter_indicator.py +119 -0
- backtrader/indicators/contrib/kalman_filter_line.py +127 -0
- backtrader/indicators/contrib/kama_indicator.py +150 -0
- backtrader/indicators/contrib/karacatica_indicator.py +99 -0
- backtrader/indicators/contrib/kdj_indicator.py +59 -0
- backtrader/indicators/contrib/kwan_ccc_indicator.py +195 -0
- backtrader/indicators/contrib/kwan_nrp_indicator.py +113 -0
- backtrader/indicators/contrib/kwan_rdp_indicator.py +192 -0
- backtrader/indicators/contrib/laguerre_adx_indicator.py +85 -0
- backtrader/indicators/contrib/laguerre_filter_indicator.py +66 -0
- backtrader/indicators/contrib/laguerre_plus_di_proxy.py +57 -0
- backtrader/indicators/contrib/laguerre_roc_indicator.py +81 -0
- backtrader/indicators/contrib/le_man_signal_indicator.py +63 -0
- backtrader/indicators/contrib/linear_reg_slope_v2_indicator.py +136 -0
- backtrader/indicators/contrib/loco_indicator.py +88 -0
- backtrader/indicators/contrib/lrma_indicator.py +185 -0
- backtrader/indicators/contrib/lsma_angle_indicator.py +106 -0
- backtrader/indicators/contrib/ma_rounding_channel_indicator.py +149 -0
- backtrader/indicators/contrib/macd2_indicator.py +61 -0
- backtrader/indicators/contrib/macd_candle_indicator.py +80 -0
- backtrader/indicators/contrib/malr_indicator.py +77 -0
- backtrader/indicators/contrib/momentum_candle_sign_indicator.py +51 -0
- backtrader/indicators/contrib/moving_average_fn_indicator.py +139 -0
- backtrader/indicators/contrib/mt5_stochastic_close_close.py +57 -0
- backtrader/indicators/contrib/muv_nor_diff_cloud_indicator.py +107 -0
- backtrader/indicators/contrib/non_lag_dot_indicator.py +124 -0
- backtrader/indicators/contrib/nrtr_extr_indicator.py +95 -0
- backtrader/indicators/contrib/nrtr_indicator.py +95 -0
- backtrader/indicators/contrib/p_channel_system.py +40 -0
- backtrader/indicators/contrib/percent_envelope.py +37 -0
- backtrader/indicators/contrib/percentage_crossover_channel.py +47 -0
- backtrader/indicators/contrib/pivot_zig_zag_proxy.py +47 -0
- backtrader/indicators/contrib/price_channel_stop_indicator.py +104 -0
- backtrader/indicators/contrib/price_extreme_channel.py +35 -0
- backtrader/indicators/contrib/qqe_cloud_indicator.py +129 -0
- backtrader/indicators/contrib/ravi_indicator.py +40 -0
- backtrader/indicators/contrib/raw_close_close_stochastic.py +74 -0
- backtrader/indicators/contrib/rd_trend_trigger_indicator.py +51 -0
- backtrader/indicators/contrib/renko_level.py +85 -0
- backtrader/indicators/contrib/renko_line_break.py +91 -0
- backtrader/indicators/contrib/rftl_indicator.py +41 -0
- backtrader/indicators/contrib/rkd_indicator.py +53 -0
- backtrader/indicators/contrib/roc2_vg_indicator.py +68 -0
- backtrader/indicators/contrib/rsi_histogram_indicator.py +43 -0
- backtrader/indicators/contrib/rsi_slowdown.py +57 -0
- backtrader/indicators/contrib/rsioma_v2.py +41 -0
- backtrader/indicators/contrib/rvi_histogram_indicator.py +107 -0
- backtrader/indicators/contrib/safe_adx.py +89 -0
- backtrader/indicators/contrib/shared_strategy_indicators.py +1651 -0
- backtrader/indicators/contrib/sidus_indicator.py +105 -0
- backtrader/indicators/contrib/silver_trend_indicator.py +79 -0
- backtrader/indicators/contrib/sliding_range_color.py +56 -0
- backtrader/indicators/contrib/slow_stoch.py +42 -0
- backtrader/indicators/contrib/smoothed_adx_indicator.py +86 -0
- backtrader/indicators/contrib/smoothed_rsi.py +31 -0
- backtrader/indicators/contrib/spearman_rank_correlation_histogram.py +60 -0
- backtrader/indicators/contrib/stalin_indicator.py +152 -0
- backtrader/indicators/contrib/starter_laguerre_filter.py +62 -0
- backtrader/indicators/contrib/step_manrtr_indicator.py +137 -0
- backtrader/indicators/contrib/stochastic_histogram_indicator.py +143 -0
- backtrader/indicators/contrib/t3_alarm_indicator.py +125 -0
- backtrader/indicators/contrib/t3_average.py +76 -0
- backtrader/indicators/contrib/t3_indicator.py +40 -0
- backtrader/indicators/contrib/the20s_v020_signal.py +93 -0
- backtrader/indicators/contrib/three_candles_indicator.py +70 -0
- backtrader/indicators/contrib/three_line_break_indicator.py +64 -0
- backtrader/indicators/contrib/time_line.py +57 -0
- backtrader/indicators/contrib/trading_channel_index_proxy.py +48 -0
- backtrader/indicators/contrib/trend_arrows_indicator.py +109 -0
- backtrader/indicators/contrib/trend_continuation_indicator.py +127 -0
- backtrader/indicators/contrib/trend_intensity_index_proxy.py +51 -0
- backtrader/indicators/contrib/trend_manager_indicator.py +39 -0
- backtrader/indicators/contrib/tri_x_candle_indicator.py +51 -0
- backtrader/indicators/contrib/trigger_line.py +66 -0
- backtrader/indicators/contrib/triple_ema_rate.py +34 -0
- backtrader/indicators/contrib/trvi_indicator.py +194 -0
- backtrader/indicators/contrib/two_pb_ideal_xosma_indicator.py +127 -0
- backtrader/indicators/contrib/ultra_absolutely_no_lag_lwma_color.py +92 -0
- backtrader/indicators/contrib/ultra_wpr_indicator.py +173 -0
- backtrader/indicators/contrib/up_down_candle_strength.py +68 -0
- backtrader/indicators/contrib/vinin_i_trend_indicator.py +139 -0
- backtrader/indicators/contrib/volume_weighted_ma_indicator.py +78 -0
- backtrader/indicators/contrib/volume_weighted_ma_st_dev_indicator.py +111 -0
- backtrader/indicators/contrib/vwap_close_indicator.py +65 -0
- backtrader/indicators/contrib/vwma_candle.py +57 -0
- backtrader/indicators/contrib/vwma_digit_system.py +70 -0
- backtrader/indicators/contrib/wami.py +43 -0
- backtrader/indicators/contrib/wprsi_signal_indicator.py +105 -0
- backtrader/indicators/contrib/x_de_marker_histogram_vol_direct_indicator.py +145 -0
- backtrader/indicators/contrib/x_fisher_indicator.py +64 -0
- backtrader/indicators/contrib/xcci_histogram_vol_direct_indicator.py +56 -0
- backtrader/indicators/contrib/xcci_histogram_vol_indicator.py +85 -0
- backtrader/indicators/contrib/xma_ichimoku.py +163 -0
- backtrader/indicators/contrib/xma_ishimoku_channel_indicator.py +65 -0
- backtrader/indicators/contrib/xma_ishimoku_line.py +68 -0
- backtrader/indicators/contrib/xma_range_bands_indicator.py +107 -0
- backtrader/indicators/contrib/xmacd_indicator.py +70 -0
- backtrader/indicators/contrib/xrsi_de_marker_histogram.py +67 -0
- backtrader/indicators/contrib/xrsi_histogram_vol_direct_indicator.py +52 -0
- backtrader/indicators/contrib/xrsi_histogram_vol_indicator.py +81 -0
- backtrader/indicators/contrib/xrvi_indicator.py +130 -0
- backtrader/indicators/contrib/zero_lag_macd.py +36 -0
- backtrader/indicators/contrib/zig_zag_recent_pivot_signal.py +90 -0
- backtrader/indicators/contrib/zpf_indicator.py +115 -0
- backtrader/indicators/crossover.py +337 -0
- backtrader/indicators/dema.py +175 -0
- backtrader/indicators/demarker.py +270 -0
- backtrader/indicators/deviation.py +284 -0
- backtrader/indicators/directionalmove.py +1071 -0
- backtrader/indicators/dma.py +112 -0
- backtrader/indicators/dpo.py +96 -0
- backtrader/indicators/dv2.py +56 -0
- backtrader/indicators/ema.py +145 -0
- backtrader/indicators/envelope.py +475 -0
- backtrader/indicators/hadelta.py +198 -0
- backtrader/indicators/heikinashi.py +153 -0
- backtrader/indicators/hma.py +153 -0
- backtrader/indicators/hurst.py +151 -0
- backtrader/indicators/ichimoku.py +267 -0
- backtrader/indicators/kama.py +181 -0
- backtrader/indicators/kst.py +159 -0
- backtrader/indicators/lrsi.py +125 -0
- backtrader/indicators/mabase.py +147 -0
- backtrader/indicators/macd.py +322 -0
- backtrader/indicators/momentum.py +267 -0
- backtrader/indicators/moneyflow.py +237 -0
- backtrader/indicators/mt5atr.py +124 -0
- backtrader/indicators/myind.py +179 -0
- backtrader/indicators/obv.py +94 -0
- backtrader/indicators/ols.py +265 -0
- backtrader/indicators/oscillator.py +161 -0
- backtrader/indicators/percentchange.py +83 -0
- backtrader/indicators/percentrank.py +46 -0
- backtrader/indicators/pivotpoint.py +469 -0
- backtrader/indicators/prettygoodoscillator.py +113 -0
- backtrader/indicators/priceops_ext.py +123 -0
- backtrader/indicators/priceoscillator.py +262 -0
- backtrader/indicators/psar.py +212 -0
- backtrader/indicators/rmi.py +69 -0
- backtrader/indicators/rsi.py +440 -0
- backtrader/indicators/sma.py +141 -0
- backtrader/indicators/smma.py +116 -0
- backtrader/indicators/spread.py +54 -0
- backtrader/indicators/stochastic.py +263 -0
- backtrader/indicators/supertrend.py +436 -0
- backtrader/indicators/trend_ext.py +105 -0
- backtrader/indicators/trix.py +202 -0
- backtrader/indicators/tsi.py +155 -0
- backtrader/indicators/ultimateoscillator.py +158 -0
- backtrader/indicators/vortex.py +62 -0
- backtrader/indicators/williams.py +194 -0
- backtrader/indicators/wma.py +103 -0
- backtrader/indicators/zlema.py +135 -0
- backtrader/indicators/zlind.py +104 -0
- backtrader/linebuffer.py +3155 -0
- backtrader/lineiterator.py +2911 -0
- backtrader/lineroot.py +1106 -0
- backtrader/lineseries.py +2559 -0
- backtrader/live_trading/__init__.py +31 -0
- backtrader/live_trading/interface.py +404 -0
- backtrader/mathsupport.py +94 -0
- backtrader/metabase.py +1804 -0
- backtrader/mixins/__init__.py +21 -0
- backtrader/mixins/singleton.py +118 -0
- backtrader/observer.py +106 -0
- backtrader/observers/__init__.py +45 -0
- backtrader/observers/benchmark.py +126 -0
- backtrader/observers/broker.py +184 -0
- backtrader/observers/buysell.py +144 -0
- backtrader/observers/drawdown.py +161 -0
- backtrader/observers/logreturns.py +113 -0
- backtrader/observers/timereturn.py +86 -0
- backtrader/observers/trade_logger.py +2972 -0
- backtrader/observers/tradelogger.py +6 -0
- backtrader/observers/trades.py +258 -0
- backtrader/order.py +1114 -0
- backtrader/parameters.py +2345 -0
- backtrader/plot/__init__.py +54 -0
- backtrader/plot/finance.py +1022 -0
- backtrader/plot/formatters.py +200 -0
- backtrader/plot/locator.py +353 -0
- backtrader/plot/multicursor.py +495 -0
- backtrader/plot/plot.py +2500 -0
- backtrader/plot/plot_plotly.py +1351 -0
- backtrader/plot/scheme.py +253 -0
- backtrader/plot/utils.py +104 -0
- backtrader/position.py +290 -0
- backtrader/position_modes.py +132 -0
- backtrader/profiles.py +254 -0
- backtrader/reports/__init__.py +39 -0
- backtrader/reports/charts.py +371 -0
- backtrader/reports/performance.py +620 -0
- backtrader/reports/reporter.py +660 -0
- backtrader/resamplerfilter.py +1001 -0
- backtrader/signal.py +118 -0
- backtrader/signals/__init__.py +17 -0
- backtrader/sizer.py +114 -0
- backtrader/sizers/__init__.py +26 -0
- backtrader/sizers/fixedsize.py +161 -0
- backtrader/sizers/percents_sizer.py +119 -0
- backtrader/store.py +221 -0
- backtrader/stores/__init__.py +33 -0
- backtrader/stores/btapistore.py +15506 -0
- backtrader/stores/livestore.py +137 -0
- backtrader/stores/vchartfile.py +96 -0
- backtrader/strategy.py +3655 -0
- backtrader/talib.py +280 -0
- backtrader/test_helpers.py +96 -0
- backtrader/timer.py +358 -0
- backtrader/trade.py +442 -0
- backtrader/tradingcal.py +361 -0
- backtrader/utils/__init__.py +68 -0
- backtrader/utils/autodict.py +251 -0
- backtrader/utils/date.py +71 -0
- backtrader/utils/dateintern.py +509 -0
- backtrader/utils/flushfile.py +94 -0
- backtrader/utils/fractal.py +101 -0
- backtrader/utils/get_metrics.py +101 -0
- backtrader/utils/load_data.py +209 -0
- backtrader/utils/log_message.py +998 -0
- backtrader/utils/ordereddefaultdict.py +75 -0
- backtrader/utils/py3.py +296 -0
- backtrader/version.py +21 -0
- backtrader/writer.py +372 -0
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Sharpe Ratio Analyzer Module - Sharpe ratio calculation.
|
|
3
|
+
|
|
4
|
+
This module provides the SharpeRatio analyzer for calculating the Sharpe
|
|
5
|
+
ratio of a strategy using a risk-free asset.
|
|
6
|
+
|
|
7
|
+
Classes:
|
|
8
|
+
SharpeRatio: Analyzer that calculates Sharpe ratio.
|
|
9
|
+
SharpeRatio_Annual: Annualized Sharpe ratio analyzer.
|
|
10
|
+
|
|
11
|
+
Example:
|
|
12
|
+
>>> cerebro = bt.Cerebro()
|
|
13
|
+
>>> cerebro.addanalyzer(bt.analyzers.SharpeRatio, _name='sharpe')
|
|
14
|
+
>>> results = cerebro.run()
|
|
15
|
+
>>> print(results[0].analyzers.sharpe.get_analysis())
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
import math
|
|
19
|
+
|
|
20
|
+
from ..analyzer import Analyzer
|
|
21
|
+
from ..dataseries import TimeFrame
|
|
22
|
+
from ..mathsupport import average, is_finite_real, standarddev
|
|
23
|
+
from ..metabase import OwnerContext
|
|
24
|
+
from ..utils.py3 import itervalues
|
|
25
|
+
from .annualreturn import AnnualReturn
|
|
26
|
+
from .timereturn import TimeReturn
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class SharpeRatio(Analyzer):
|
|
30
|
+
# Relatively speaking, backtrader's Sharpe ratio calculation method is quite complex, considering many parameters
|
|
31
|
+
"""This analyzer calculates the SharpeRatio of a strategy using a risk-free
|
|
32
|
+
asset, which is simply an interest rate
|
|
33
|
+
|
|
34
|
+
See also:
|
|
35
|
+
|
|
36
|
+
- https://en.wikipedia.org/wiki/Sharpe_ratio
|
|
37
|
+
|
|
38
|
+
Params:
|
|
39
|
+
|
|
40
|
+
- ``timeframe``: (default: ``TimeFrame.Years``) # Trading period
|
|
41
|
+
|
|
42
|
+
- ``compression`` (default: ``1``) # Specific trading period
|
|
43
|
+
|
|
44
|
+
Only used for sub-day timeframes to, for example, work on an hourly
|
|
45
|
+
timeframe by specifying "TimeFrame.Minutes" and 60 as compression
|
|
46
|
+
|
|
47
|
+
- ``riskfreerate`` (default: 0.01 -> 1%) # Risk-free rate used for Sharpe ratio calculation
|
|
48
|
+
|
|
49
|
+
Expressed in annual terms (see ``convertrate`` below)
|
|
50
|
+
|
|
51
|
+
- ``convertrate`` (default: ``True``) # Whether to convert risk-free rate from annual to monthly, weekly, daily, no intraday support
|
|
52
|
+
|
|
53
|
+
Convert the ``riskfreerate`` from annual to monthly, weekly or daily
|
|
54
|
+
rate. Sub-day conversions are not supported
|
|
55
|
+
|
|
56
|
+
- ``factor`` (default: ``None``) # If not specified, will convert according to specified date, 1 year = 12 months = 52 weeks = 252 trading days
|
|
57
|
+
|
|
58
|
+
If ``None``, the conversion factor for the risk-free rate from *annual*
|
|
59
|
+
to the chosen timeframe will be chosen from a predefined table
|
|
60
|
+
|
|
61
|
+
Days: 252, Weeks: 52, Months: 12, Years: 1
|
|
62
|
+
|
|
63
|
+
Else the specified value will be used
|
|
64
|
+
|
|
65
|
+
- ``annualize`` (default: ``False``) # If set to True, will convert to annualized return
|
|
66
|
+
|
|
67
|
+
If ``convertrate`` is `True`, the *SharpeRatio* will be delivered in
|
|
68
|
+
the ``timeframe`` of choice.
|
|
69
|
+
|
|
70
|
+
On most occasions, the SharpeRatio is delivered in annualized form.
|
|
71
|
+
Convert the ``riskfreerate`` from annual to monthly, weekly or daily
|
|
72
|
+
rate. Sub-day conversions are not supported
|
|
73
|
+
|
|
74
|
+
- ``stddev_sample`` (default: ``False``) # Whether to subtract 1 when calculating standard deviation
|
|
75
|
+
|
|
76
|
+
If this is set to ``True`` the *standard deviation* will be calculated
|
|
77
|
+
decreasing the denominator in the mean by ``1``. This is used when
|
|
78
|
+
calculating the *standard deviation* if it's considered that not all
|
|
79
|
+
samples are used for the calculation. This is known as the *Bessels'
|
|
80
|
+
correction*
|
|
81
|
+
|
|
82
|
+
- ``daysfactor`` (default: ``None``) # Legacy code
|
|
83
|
+
|
|
84
|
+
Old naming for ``factor``. If set to anything else than ``None`` and
|
|
85
|
+
the ``timeframe`` is ``TimeFrame.Days`` it will be assumed this is old
|
|
86
|
+
code and the value will be used
|
|
87
|
+
|
|
88
|
+
- ``legacyannual`` (default: ``False``) # Only applies to years, use annualized return analyzer
|
|
89
|
+
|
|
90
|
+
Use the ``AnnualReturn`` return analyzer, which as the name implies
|
|
91
|
+
only works for years
|
|
92
|
+
|
|
93
|
+
- ``fund`` (default: ``None``) # Net asset mode or fund mode, by default will auto-detect
|
|
94
|
+
|
|
95
|
+
If `None`, the actual mode of the broker (fundmode - True/False) will
|
|
96
|
+
be autodetected to decide if the returns are based on the total net
|
|
97
|
+
asset value or on the fund value. See ``set_fundmode`` in the broker
|
|
98
|
+
documentation
|
|
99
|
+
|
|
100
|
+
Set it to ``True`` or ``False`` for a specific behavior
|
|
101
|
+
|
|
102
|
+
Methods:
|
|
103
|
+
|
|
104
|
+
- Get_analysis
|
|
105
|
+
|
|
106
|
+
Returns a dictionary with key "sharperatio" holding the ratio
|
|
107
|
+
|
|
108
|
+
"""
|
|
109
|
+
|
|
110
|
+
# Default parameters
|
|
111
|
+
params = (
|
|
112
|
+
("timeframe", TimeFrame.Years),
|
|
113
|
+
("compression", 1),
|
|
114
|
+
("riskfreerate", 0.01),
|
|
115
|
+
("factor", None),
|
|
116
|
+
("convertrate", True),
|
|
117
|
+
("annualize", False),
|
|
118
|
+
("stddev_sample", False),
|
|
119
|
+
# old behavior
|
|
120
|
+
("daysfactor", None),
|
|
121
|
+
("legacyannual", False),
|
|
122
|
+
("fund", None),
|
|
123
|
+
)
|
|
124
|
+
# Default date conversion
|
|
125
|
+
RATEFACTORS = {
|
|
126
|
+
TimeFrame.Days: 252,
|
|
127
|
+
TimeFrame.Weeks: 52,
|
|
128
|
+
TimeFrame.Months: 12,
|
|
129
|
+
TimeFrame.Years: 1,
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
def __init__(self, *args, **kwargs):
|
|
133
|
+
"""Initialize the SharpeRatio analyzer.
|
|
134
|
+
|
|
135
|
+
Sets up the return analyzer based on the legacyannual parameter.
|
|
136
|
+
|
|
137
|
+
Args:
|
|
138
|
+
*args: Positional arguments.
|
|
139
|
+
**kwargs: Keyword arguments for analyzer parameters.
|
|
140
|
+
"""
|
|
141
|
+
# CRITICAL FIX: Call super().__init__() first to initialize self.p
|
|
142
|
+
super().__init__(*args, **kwargs)
|
|
143
|
+
# If using years, get annualized return, otherwise get daily return
|
|
144
|
+
# Use OwnerContext so child analyzers can find this as their parent
|
|
145
|
+
if self.p.legacyannual:
|
|
146
|
+
with OwnerContext.set_owner(self):
|
|
147
|
+
self.anret = AnnualReturn()
|
|
148
|
+
else:
|
|
149
|
+
with OwnerContext.set_owner(self):
|
|
150
|
+
self.timereturn = TimeReturn(
|
|
151
|
+
timeframe=self.p.timeframe, compression=self.p.compression, fund=self.p.fund
|
|
152
|
+
)
|
|
153
|
+
|
|
154
|
+
def stop(self):
|
|
155
|
+
"""Calculate and store the Sharpe ratio when analysis ends.
|
|
156
|
+
|
|
157
|
+
Performs the following calculations:
|
|
158
|
+
1. Retrieves returns from the sub-analyzer
|
|
159
|
+
2. Converts risk-free rate if needed
|
|
160
|
+
3. Calculates excess returns
|
|
161
|
+
4. Computes the Sharpe ratio
|
|
162
|
+
5. Optionally annualizes the result
|
|
163
|
+
"""
|
|
164
|
+
super().stop()
|
|
165
|
+
# Calculate returns and Sharpe ratio in annual units
|
|
166
|
+
if self.p.legacyannual:
|
|
167
|
+
ratio = self._legacy_annual_ratio()
|
|
168
|
+
else:
|
|
169
|
+
ratio = self._timeframe_ratio()
|
|
170
|
+
# Save Sharpe ratio
|
|
171
|
+
self.rets["sharperatio"] = ratio
|
|
172
|
+
|
|
173
|
+
def _legacy_annual_ratio(self):
|
|
174
|
+
"""Sharpe ratio using the legacy AnnualReturn sub-analyzer path."""
|
|
175
|
+
rate = self.p.riskfreerate
|
|
176
|
+
try:
|
|
177
|
+
retavg = average([r - rate for r in self.anret.rets])
|
|
178
|
+
retdev = standarddev(self.anret.rets)
|
|
179
|
+
except (TypeError, ValueError, ZeroDivisionError):
|
|
180
|
+
return None
|
|
181
|
+
if not is_finite_real(retavg) or not is_finite_real(retdev):
|
|
182
|
+
return None
|
|
183
|
+
try:
|
|
184
|
+
ratio = retavg / retdev
|
|
185
|
+
return ratio if is_finite_real(ratio) else None
|
|
186
|
+
except (ValueError, TypeError, ZeroDivisionError):
|
|
187
|
+
return None
|
|
188
|
+
|
|
189
|
+
def _resolve_factor(self):
|
|
190
|
+
"""Resolve the annualization factor for the configured timeframe/params."""
|
|
191
|
+
if self.p.timeframe == TimeFrame.Days and self.p.daysfactor is not None:
|
|
192
|
+
return self.p.daysfactor
|
|
193
|
+
if self.p.factor is not None:
|
|
194
|
+
return self.p.factor # user specified factor
|
|
195
|
+
if self.p.timeframe in self.RATEFACTORS:
|
|
196
|
+
# Get the conversion factor from the default table
|
|
197
|
+
return self.RATEFACTORS[self.p.timeframe]
|
|
198
|
+
return None
|
|
199
|
+
|
|
200
|
+
def _timeframe_ratio(self):
|
|
201
|
+
"""Sharpe ratio using the TimeReturn sub-analyzer with optional annualization."""
|
|
202
|
+
# Get the returns from the subanalyzer (daily returns)
|
|
203
|
+
returns = list(itervalues(self.timereturn.get_analysis()))
|
|
204
|
+
# Risk-free rate
|
|
205
|
+
rate = self.p.riskfreerate
|
|
206
|
+
factor = self._resolve_factor()
|
|
207
|
+
|
|
208
|
+
# Convert either the rate (down to the timeframe) or the returns (up to
|
|
209
|
+
# yearly) depending on convertrate, when a factor is available.
|
|
210
|
+
if factor is not None:
|
|
211
|
+
converted = self._convert_rate_returns(rate, returns, factor)
|
|
212
|
+
if converted is None:
|
|
213
|
+
return None
|
|
214
|
+
rate, returns = converted
|
|
215
|
+
|
|
216
|
+
if not is_finite_real(rate) or any(not is_finite_real(ret) for ret in returns):
|
|
217
|
+
return None
|
|
218
|
+
|
|
219
|
+
# Number of trading days
|
|
220
|
+
lrets = len(returns) - self.p.stddev_sample
|
|
221
|
+
# Check if the ratio can be calculated
|
|
222
|
+
if not lrets:
|
|
223
|
+
# no returns or stddev_sample was active and 1 return
|
|
224
|
+
return None
|
|
225
|
+
|
|
226
|
+
# Get the excess returns - arithmetic mean - original sharpe
|
|
227
|
+
ret_free = [r - rate for r in returns]
|
|
228
|
+
ret_free_avg = average(ret_free)
|
|
229
|
+
retdev = standarddev(ret_free, avgx=ret_free_avg, bessel=self.p.stddev_sample)
|
|
230
|
+
|
|
231
|
+
if not is_finite_real(ret_free_avg) or not is_finite_real(retdev):
|
|
232
|
+
return None
|
|
233
|
+
try:
|
|
234
|
+
# Calculate Sharpe ratio
|
|
235
|
+
ratio = ret_free_avg / retdev
|
|
236
|
+
# Annualize if requested (rate was converted down to the timeframe)
|
|
237
|
+
if factor is not None and self.p.convertrate and self.p.annualize:
|
|
238
|
+
ratio = math.sqrt(factor) * ratio
|
|
239
|
+
return ratio if is_finite_real(ratio) else None
|
|
240
|
+
except (ValueError, TypeError, ZeroDivisionError):
|
|
241
|
+
return None
|
|
242
|
+
|
|
243
|
+
def _convert_rate_returns(self, rate, returns, factor):
|
|
244
|
+
"""Apply the timeframe ``factor`` to either the risk-free rate or the
|
|
245
|
+
returns series (per ``convertrate``).
|
|
246
|
+
|
|
247
|
+
Returns the ``(rate, returns)`` pair on success, or ``None`` when the
|
|
248
|
+
conversion is not representable (mirrors the original inline
|
|
249
|
+
ValueError-guarded behavior). Extracted from ``_timeframe_ratio``;
|
|
250
|
+
behavior unchanged.
|
|
251
|
+
"""
|
|
252
|
+
try:
|
|
253
|
+
if not is_finite_real(factor) or factor <= 0 or not is_finite_real(rate):
|
|
254
|
+
raise ValueError()
|
|
255
|
+
if self.p.convertrate:
|
|
256
|
+
# Standard: downgrade annual returns to a timeframe factor
|
|
257
|
+
if 1.0 + rate < 0:
|
|
258
|
+
raise ValueError()
|
|
259
|
+
rate = pow(1.0 + rate, 1.0 / factor) - 1.0
|
|
260
|
+
if isinstance(rate, complex) or not math.isfinite(rate):
|
|
261
|
+
raise ValueError()
|
|
262
|
+
else:
|
|
263
|
+
# Else upgrade returns to yearly returns
|
|
264
|
+
returns = [pow(1.0 + x, factor) - 1.0 for x in returns]
|
|
265
|
+
if any(isinstance(x, complex) or not math.isfinite(x) for x in returns):
|
|
266
|
+
raise ValueError()
|
|
267
|
+
except (ValueError, TypeError, ZeroDivisionError, OverflowError):
|
|
268
|
+
return None
|
|
269
|
+
return rate, returns
|
|
270
|
+
|
|
271
|
+
# Number of trading days
|
|
272
|
+
lrets = len(returns) - self.p.stddev_sample
|
|
273
|
+
# Check if the ratio can be calculated
|
|
274
|
+
if not lrets:
|
|
275
|
+
# no returns or stddev_sample was active and 1 return
|
|
276
|
+
return None
|
|
277
|
+
|
|
278
|
+
# Get the excess returns - arithmetic mean - original sharpe
|
|
279
|
+
ret_free = [r - rate for r in returns]
|
|
280
|
+
ret_free_avg = average(ret_free)
|
|
281
|
+
retdev = standarddev(ret_free, avgx=ret_free_avg, bessel=self.p.stddev_sample)
|
|
282
|
+
|
|
283
|
+
if not is_finite_real(ret_free_avg) or not is_finite_real(retdev):
|
|
284
|
+
return None
|
|
285
|
+
try:
|
|
286
|
+
# Calculate Sharpe ratio
|
|
287
|
+
ratio = ret_free_avg / retdev
|
|
288
|
+
# Annualize if requested (rate was converted down to the timeframe)
|
|
289
|
+
if factor is not None and self.p.convertrate and self.p.annualize:
|
|
290
|
+
ratio = math.sqrt(factor) * ratio
|
|
291
|
+
return ratio if is_finite_real(ratio) else None
|
|
292
|
+
except (ValueError, TypeError, ZeroDivisionError):
|
|
293
|
+
return None
|
|
294
|
+
|
|
295
|
+
|
|
296
|
+
class SharpeRatioA(SharpeRatio):
|
|
297
|
+
"""Extension of the SharpeRatio which returns the Sharpe Ratio directly in
|
|
298
|
+
annualized form
|
|
299
|
+
|
|
300
|
+
The following param has been changed from `SharpeRatio`
|
|
301
|
+
|
|
302
|
+
- ``annualize`` (default: ``True``)
|
|
303
|
+
|
|
304
|
+
"""
|
|
305
|
+
|
|
306
|
+
# Calculate annualized Sharpe ratio
|
|
307
|
+
params = (("annualize", True),)
|