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
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 |
|
|
|
|