You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

79 lines
2.1 KiB

'''
'''
from data import series
from execution.executor import Executor
import random
from math import inf
import numpy
class Solver():
'''
'''
def __init__(self, series):
'''
Constructor
'''
self.series = series
self.executor = Executor(series)
self.generators = []
def add_generator(self, generator):
self.generators.append(generator)
def solve(self):
max_signals = 3
max_strategies = 1000
self.results = []
for x in range(0, max_strategies):
sig_num = random.randint(1, max_signals)
strategy = []
for i in range(0, sig_num):
strategy.append(random.choice(self.generators).generate())
trades = self.executor.execute(strategy)
result = self.evaluate_trades(trades)
result['display_name'] = ' && '.join([signal.get_text() for signal in strategy])
self.results.append(result)
return self.results
def evaluate_trades(self, trades):
result = {}
profits = [x.pnl() for x in trades]
result['trades_number'] = len(trades)
result['total_pnl'] = sum(profits)
if len(trades) > 0:
result['avg_percentage'] = sum([trade.pnl_percentage() for trade in trades]) / len(trades)
else:
result['avg_percentage'] = 0
gross_profit = sum([max(0, x.pnl()) for x in trades])
gross_loss = sum([min(0, x.pnl()) for x in trades])
if gross_loss != 0:
result['profit_factor'] = gross_profit / (-gross_loss)
else:
result['profit_factor'] = inf
if len(profits) > 0:
mean = numpy.mean(profits)
stddev = numpy.std(profits)
if stddev != 0:
result['sharpe'] = mean / stddev
else:
result['sharpe'] = 0
else:
result['sharpe'] = 0
return result