diff --git a/spread_backtest.py b/spread_backtest.py index 1b44473..55ee743 100644 --- a/spread_backtest.py +++ b/spread_backtest.py @@ -1,21 +1,22 @@ # -*- coding: UTF-8 -*- -import os +import sys,os import pandas as pd import numpy as np +import time from trader import Trader -from rich.progress import track from rich import print as rprint -from rich import pretty, text -from rich.table import Column, Table -from rich.style import Style +from rich.table import Table class Spread_Backtest(): - def __init__(self, - trader: Trader): + def __init__( + self, + trader: Trader + ): self.trader = trader - def run(self, + def run( + self, start: str, end: str ): @@ -35,14 +36,33 @@ class Spread_Backtest(): else: bkt_end = rec_end print(f'回测区间: {bkt_start} - {bkt_end}') - for d in track(self.trader.signal[list(self.trader.signal.keys())[0]].loc[bkt_start:bkt_end].index, - description='Backtesting...', - update_period=0.5): + # for d in track(self.trader.signal[list(self.trader.signal.keys())[0]].loc[bkt_start:bkt_end].index, + # description='Backtesting...', + # update_period=0.5): + # # avaliable_date最后一天的数据只能用于记录持仓 + # if (d <= rec_end) and (d < self.trader.avaliable_date.index.max()): + # self.trader.update_signal(d) + # else: + # self.trader.update_signal(d, update_type='position') + start_time = time.time() + target_list = self.trader.signal[list(self.trader.signal.keys())[0]].loc[bkt_start:bkt_end].index + for idx,date in enumerate(sorted(target_list), start=1): + sys.stdout.flush() + if idx > 1: + used_time = time.time()-start_time + need_time = int((used_time / idx) * (len(target_list) - idx)) + used_time = int(used_time) + print("\r", end="") + print("回测进度: {:>3d}% [{} -> {}] 用时: {:0>2d}: {:0>2d} / 需要: {:0>2d}: {:0>2d}".format( + idx*100//len(target_list), date, bkt_end, + used_time//60, used_time%60, + need_time//60, need_time%60 + ), end="") # avaliable_date最后一天的数据只能用于记录持仓 - if (d <= rec_end) and (d < self.trader.avaliable_date.index.max()): - self.trader.update_signal(d) + if (date <= rec_end) and (date < self.trader.avaliable_date.index.max()): + self.trader.update_signal(date) else: - self.trader.update_signal(d, update_type='position') + self.trader.update_signal(date, update_type='position') @property def account_history(self):