Алексей Боровков – Алгоритмический трейдинг: Создание, тестирование и запуск роботов на рынке Форекс (страница 7)
total_return = (final_value / initial_cash – 1) * 100
print(f'Конечный капитал: {final_value:.2f}')
print(f'Общая доходность: {total_return:.2f}%')
# Анализ результатов
if hasattr(strat, 'analyzers'):
returns = strat.analyzers.returns.get_analysis()
sharpe = strat.analyzers.sharpe.get_analysis()
drawdown = strat.analyzers.drawdown.get_analysis()
trades = strat.analyzers.trades.get_analysis()
sqn = strat.analyzers.sqn.get_analysis()
print(f'\nАНАЛИТИКА:')
print(f'Sharpe Ratio: {sharpe.get("sharperatio", 0):.3f}')
print(f'Максимальная просадка: {drawdown.max.drawdown:.2f}%')
print(f'Продолжительность просадки: {drawdown.max.len} дней')
if trades.total.total:
print(f'\nСТАТИСТИКА СДЕЛОК:')
print(f'Всего сделок: {trades.total.total}')
print(f'Прибыльных: {trades.won.total} ({trades.won.total/trades.total.total*100:.1f}%)')
print(f'Убыточных: {trades.lost.total} ({trades.lost.total/trades.total.total*100:.1f}%)')
print(f'Profit Factor: {trades.won.pnl.total/abs(trades.lost.pnl.total):.2f}')
print(f'Средняя прибыль: {trades.won.pnl.average:.2f}')
print(f'Средний убыток: {trades.lost.pnl.average:.2f}')
print(f'SQN: {sqn.sqn:.2f}')
# Возвращаем детали сделок для дальнейшего анализа
trades_details = getattr(strat, 'trades', [])
return cerebro, strat, trades_details
def optimize_parameters(data, parameter_ranges):
"""Оптимизация параметров стратегии"""
cerebro = bt.Cerebro(optreturn=False)
# Добавляем данные
data_feed = bt.feeds.PandasData(dataname=data)
cerebro.adddata(data_feed)
# Добавляем стратегию с параметрами для оптимизации
cerebro.optstrategy(
TrendFollowerOptimizer,
fast_ma=parameter_ranges.get('fast_ma', range(10, 101, 10)),
slow_ma=parameter_ranges.get('slow_ma', range(50, 301, 50)),
adx_threshold=parameter_ranges.get('adx_threshold', range(20, 41, 5)),
risk_per_trade=parameter_ranges.get('risk_per_trade', [0.005, 0.01, 0.02])
)
# Настройки
cerebro.broker.setcash(10000)
cerebro.broker.setcommission(commission=0.001)
# Оптимизация
print("Запуск оптимизации параметров…")
opt_results = cerebro.run(maxcpus=1)
# Анализ результатов оптимизации
results = []
for run in opt_results:
for strat in run:
# Собираем статистику для каждого набора параметров
value = cerebro.broker.getvalue()
returns = (value / 10000 – 1) * 100
results.append({
'fast_ma': strat.params.fast_ma,
'slow_ma': strat.params.slow_ma,
'adx_threshold': strat.params.adx_threshold,
'risk_per_trade': strat.params.risk_per_trade,
'final_value': value,
'returns': returns
})
# Создаем DataFrame с результатами
results_df = pd.DataFrame(results)
results_df = results_df.sort_values('final_value', ascending=False)
return results_df