большая информативность при обработке овер-дофига отчетов, рекурсивный просмотр каталога с отчетами.
Автор
vlad halilov

Коммитер
vlad halilov
месяц назад 
Файлов изменено: 2
+28
–5
09db52d
backtest_report.py
+27
–4
@@ -10,12 +10,14 @@ | ||
import operator | ||
import argparse | ||
parser = argparse.ArgumentParser() | ||
from pathlib import Path | ||
def parseArgs(): | ||
parser.add_argument("--path", help="Путь до каталога с отчетами", type=str, default="/tmp/reports") | ||
parser.add_argument("--report", help="Путь куда будет сохранен суммарный отчет", type=str) | ||
parser.add_argument("--sort", help="сортировка по колонкам", type=str) | ||
parser.add_argument("--min-summary", help="минимальный итог для включения в отчет", type=int) | ||
parser.add_argument("--min-net", help="минимальный итог для включения в отчет", type=int) | ||
parser.add_argument("--min-total", help="минимальный profit для включения в отчет", type=int) | ||
args = parser.parse_args() | ||
argsd = vars(args) | ||
@@ -29,19 +31,37 @@ | ||
tbl = PrettyTable() | ||
files_l = os.listdir(path) | ||
#files_l = os.listdir(path) | ||
files_l = [] | ||
for path in Path(path).rglob('*.json'): | ||
files_l.append(path) | ||
print(f"Total [{len(files_l)}] to process ...") | ||
records_ll = [] | ||
header_l = [] | ||
stat_d = {'skipped':0, 'empty':0} | ||
counter = 0 | ||
for file in files_l: | ||
with open(f"{path}/{file}", encoding="UTF-8") as file_in: | ||
print(f"Processing ... [{counter}] skipped [{stat_d['skipped']}] empty [{stat_d['empty']}]",end = '\r') | ||
counter += 1 | ||
with open(file, encoding="UTF-8") as file_in: | ||
try: | ||
records = json.load(file_in) | ||
except Exception as e: | ||
print(f"Error processing [{file_in}] by [{e}]") | ||
continue | ||
record_l = [] | ||
if argsd['min_summary'] and records['summary_d'] < argsd['min_summary']: | ||
#print(records['summary_d']) | ||
## skip emptry summary | ||
if len(records['summary_d']) == 0: | ||
stat_d['empty'] += 1 | ||
continue | ||
if argsd['min_total'] and records['summary_d']['t_profit'] < argsd['min_total']: | ||
stat_d['skipped'] += 1 | ||
continue | ||
if argsd['min_net'] and records['summary_d']['net'] < argsd['min_net']: | ||
stat_d['skipped'] += 1 | ||
continue | ||
for i in ['params_d','summary_d']: | ||
@@ -71,3 +91,6 @@ | ||
writer = csv.writer(fd,delimiter =';') | ||
records_ll.insert(0,header_l) | ||
writer.writerows(records_ll) | ||
print() | ||
print(stat_d) |
examples/backtest.script
+1
–1
@@ -48,7 +48,7 @@ | ||
params_d['resample'] = s0_resample | ||
params_d['rsi_range'] = rsi_range | ||
## в 'path' должен быть указан путь до сгенерированного бэктестером файла отчета | ||
params_d['path'] = f"{argsd['backtest_reports']}/{counter}.json" | ||
params_d['path'] = f"{argsd['backtest_reports']}/{agent_config_d['sources']['s0']['code']}-{counter}.json" | ||
print(f"Starting worker: {counter}") | ||
## запуск воркера | ||
proc = multiprocessing.Process(target=backtest,args=(agent_config_d,agent_state_d,False,params_d)) |
Cherry-pick
Команда cherry-pick позволяет выбрать отдельные коммиты из одной ветки и применить их к другой.