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

8 years ago
'''
'''
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