from datetime import datetime
from vnpy.app.cta_strategy.backtesting import BacktestingEngine
from vnpy.trader.constant import Interval
from vnpy.app.cta_strategy.base import BacktestingMode
import sys
sys.path.append(r"C:\Users\zzy\strategies")
from vnpy.app.cta_strategy.strategies.double_ma_strategy import DoubleMaStrategy as stg
import matplotlib.pyplot as plt
import copy
class BacktestingEngine(BacktestingEngine):
def show_chart(self, df = None):
""""""
# Check DataFrame input exterior
if df is None:
df = self.daily_df
# Check for init DataFrame
if df is None:
return
plt.figure(figsize=(10, 16))
balance_plot = plt.subplot(4, 1, 1)
balance_plot.set_title("Balance")
df["balance"].plot(legend=True)
drawdown_plot = plt.subplot(4, 1, 2)
drawdown_plot.set_title("Drawdown")
drawdown_plot.fill_between(range(len(df)), df["drawdown"].values)
pnl_plot = plt.subplot(4, 1, 3)
pnl_plot.set_title("Daily Pnl")
y=copy.deepcopy(df["net_pnl"])
x=copy.deepcopy(df["net_pnl"])
x[x<=0]=0
y[y>0]=0
x.plot(kind="bar", legend=False, grid=True, xticks=[],color='r')
y.plot(kind="bar", legend=False, grid=True, xticks=[], color='g')
distribution_plot = plt.subplot(4, 1, 4)
distribution_plot.set_title("Daily Pnl Distribution")
df["net_pnl"].hist(bins=50)
plt.show()
engine = BacktestingEngine()
engine.clear_data()
engine.set_parameters(
vt_symbol="M9999.DCE",
interval=Interval.MINUTE,
start=datetime(2017,2,28),
rate=0.0001,
slippage=1.0,
size=10,
pricetick=1.0,
capital=100000,
end=datetime(2020,2,28),
mode=BacktestingMode.BAR,
inverse=False
)
setting={'rsi_signal': 20, 'rsi_window': 14, 'fast_window': 5, 'slow_window': 20, 'fixed_size': 1}
#setting为策略的参数
engine.add_strategy(stg,setting)
engine.load_data()
engine.run_backtesting()
engine.calculate_result()
engine.calculate_statistics(output=True)
engine.show_chart()
大家有兴趣可以把参数优化给加上去,不过感觉要优化参数的话打开GUI界面比较方便。