vectorbt-案例学习-2 双均线策略

vectorbt-案例学习-2 双均线策略 一、数据准备# 数据准备 seed 42 symbol BTC-USD metric total_return start_date datetime(2018, 1, 1, tzinfopytz.utc) # 设置起止时间 end_date datetime(2020, 1, 1, tzinfopytz.utc) time_buffer timedelta(days100) # 缓存时间窗口 freq 1D vbt.settings.portfolio[init_cash] 100. # 初始资金 vbt.settings.portfolio[fees] 0.0025 #手续费 vbt.settings.portfolio[slippage] 0.0025 # 滑点 #下载数据 cols [Open, High, Low, Close, Volume] ohlcv_wbuf vbt.YFData.download(symbol, startstart_date-time_buffer, endend_date).get(cols) ohlcv_wbuf ohlcv_wbuf.astype(np.float64) # 通过掩码把数据范围指定到之前设置的起止日期 wobuf_mask (ohlcv_wbuf.index start_date) (ohlcv_wbuf.index end_date) # mask without buffer ohlcv ohlcv_wbuf.loc[wobuf_mask, :]二、策略执行fast_window 30 slow_window 80 # 对不同指标预计算 fast_ma vbt.MA.run(ohlcv_wbuf[Open], fast_window) slow_ma vbt.MA.run(ohlcv_wbuf[Open], slow_window) # 把指标计算结果限定在起止时间内 fast_ma fast_ma[wobuf_mask] slow_ma slow_ma[wobuf_mask] # 确定没有nan assert(~fast_ma.ma.isnull().any()) assert(~slow_ma.ma.isnull().any()) # 生成双均线出场入场信号 dmac_entries fast_ma.ma_crossed_above(slow_ma) dmac_exits fast_ma.ma_crossed_below(slow_ma) #策略可视化双均线与开盘价 fig ohlcv[Open].vbt.plot(trace_kwargsdict(namePrice)) fig fast_ma.ma.vbt.plot(trace_kwargsdict(nameFast MA), figfig) fig slow_ma.ma.vbt.plot(trace_kwargsdict(nameSlow MA), figfig) fig dmac_entries.vbt.signals.plot_as_entry_markers(ohlcv[Open], figfig) fig dmac_exits.vbt.signals.plot_as_exit_markers(ohlcv[Open], figfig) fig.show_svg()#建立投资组合其中内部计算权益曲线 # 默认情况下将成交量设置为np.inf以买入/卖出全部资产 # 在这里你不需要传递freq因为数据已经完全按时间索引排列 dmac_pf vbt.Portfolio.from_signals(ohlcv[Close], dmac_entries, dmac_exits) # 打印统计数据 print(dmac_pf.stats())#交易情况可视化 dmac_pf.trades.plot().show_svg()#现在构建“持有”策略投资组合 # 这里在开始时买入一次然后在结束时卖出 hold_entries pd.Series.vbt.signals.empty_like(dmac_entries) hold_entries.iloc[0] True hold_exits pd.Series.vbt.signals.empty_like(hold_entries) hold_exits.iloc[-1] True hold_pf vbt.Portfolio.from_signals(ohlcv[Close], hold_entries, hold_exits) #结果可视化 fig dmac_pf.value().vbt.plot(trace_kwargsdict(nameValue (DMAC))) hold_pf.value().vbt.plot(trace_kwargsdict(nameValue (Hold)), figfig).show_svg()三、策略优化#设置窗口参数最大和最小值 min_window 2 max_window 100 perf_metrics [total_return, positions.win_rate, positions.expectancy, max_drawdown] perf_metric_names [Total return, Win rate, Expectancy, Max drawdown] # windows_slider widgets.IntRangeSlider( value[fast_window, slow_window], minmin_window, maxmax_window, step1, layoutdict(width500px), continuous_updateTrue ) dmac_fig None dmac_img widgets.Image( formatpng, widthvbt.settings[plotting][layout][width], heightvbt.settings[plotting][layout][height] ) metrics_html widgets.HTML() def on_value_change(value): global dmac_fig # Calculate portfolio fast_window, slow_window value[new] fast_ma vbt.MA.run(ohlcv_wbuf[Open], fast_window) slow_ma vbt.MA.run(ohlcv_wbuf[Open], slow_window) fast_ma fast_ma[wobuf_mask] slow_ma slow_ma[wobuf_mask] dmac_entries fast_ma.ma_crossed_above(slow_ma) dmac_exits fast_ma.ma_crossed_below(slow_ma) dmac_pf vbt.Portfolio.from_signals(ohlcv[Close], dmac_entries, dmac_exits) # Update figure if dmac_fig is None: dmac_fig ohlcv[Open].vbt.plot(trace_kwargsdict(namePrice)) fast_ma.ma.vbt.plot(trace_kwargsdict(nameFast MA), figdmac_fig) slow_ma.ma.vbt.plot(trace_kwargsdict(nameSlow MA), figdmac_fig) dmac_entries.vbt.signals.plot_as_entry_markers(ohlcv[Open], figdmac_fig) dmac_exits.vbt.signals.plot_as_exit_markers(ohlcv[Open], figdmac_fig) else: with dmac_fig.batch_update(): dmac_fig.data[1].y fast_ma.ma dmac_fig.data[2].y slow_ma.ma dmac_fig.data[3].x ohlcv[Open].index[dmac_entries] dmac_fig.data[3].y ohlcv[Open][dmac_entries] dmac_fig.data[4].x ohlcv[Open].index[dmac_exits] dmac_fig.data[4].y ohlcv[Open][dmac_exits] dmac_img.value dmac_fig.to_image(formatpng) # Update metrics table sr pd.Series([dmac_pf.deep_getattr(m) for m in perf_metrics], indexperf_metric_names, namePerformance) metrics_html.value sr.to_frame().style.set_properties(**{text-align: right}).render() windows_slider.observe(on_value_change, namesvalue) on_value_change({new: windows_slider.value}) dashboard widgets.VBox([ widgets.HBox([widgets.Label(Fast and slow window:), windows_slider]), dmac_img, metrics_html ]) dashboard dashboard.close() # after using, release memory and notebook metadata gc.collect()参数热力图#构建window多参数的ma策略 fast_ma, slow_ma vbt.MA.run_combs( ohlcv_wbuf[Open], np.arange(min_window, max_window1), r2, short_names[fast_ma, slow_ma]) fast_ma fast_ma[wobuf_mask] slow_ma slow_ma[wobuf_mask] dmac_entries fast_ma.ma_crossed_above(slow_ma) dmac_exits fast_ma.ma_crossed_below(slow_ma) dmac_pf vbt.Portfolio.from_signals(ohlcv[Close], dmac_entries, dmac_exits) #以收益为评判不同参数组合的标准 dmac_perf dmac_pf.deep_getattr(metric) #选出最优的参数组合 dmac_perf.idxmax() #做99X99的参数矩阵 dmac_perf_matrix dmac_perf.vbt.unstack_to_df(symmetricTrue, index_levelsfast_ma_window, column_levelsslow_ma_window) 打出热力图 dmac_perf_matrix.vbt.heatmap( xaxis_titleSlow window, yaxis_titleFast window).show_svg()