calculate_loss adaptado a calcular o SHARPE RATIO

This commit is contained in:
Rafael Rodrigues 2019-06-02 23:50:34 -03:00
parent 92113ce1c9
commit 4982dda24c

View File

@ -24,6 +24,9 @@ from freqtrade.exchange import timeframe_to_minutes
from freqtrade.optimize.backtesting import Backtesting from freqtrade.optimize.backtesting import Backtesting
from freqtrade.resolvers.hyperopt_resolver import HyperOptResolver from freqtrade.resolvers.hyperopt_resolver import HyperOptResolver
import numpy as np
import datetime
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -136,14 +139,38 @@ class Hyperopt(Backtesting):
print('.', end='') print('.', end='')
sys.stdout.flush() sys.stdout.flush()
def calculate_loss(self, total_profit: float, trade_count: int, trade_duration: float) -> float: # def calculate_loss(self, total_profit: float, trade_count: int, trade_duration: float) -> float:
# """
# Objective function, returns smaller number for more optimal results
# """
# trade_loss = 1 - 0.25 * exp(-(trade_count - self.target_trades) ** 2 / 10 ** 5.8)
# profit_loss = max(0, 1 - total_profit / self.expected_max_profit)
# duration_loss = 0.4 * min(trade_duration / self.max_accepted_trade_duration, 1)
# result = trade_loss + profit_loss + duration_loss
# return result
def calculate_loss(self, total_profit: list, trade_count: int) -> float:
""" """
Objective function, returns smaller number for more optimal results Objective function, returns smaller number for more optimal results
""" """
trade_loss = 1 - 0.25 * exp(-(trade_count - self.target_trades) ** 2 / 10 ** 5.8) period = self.max_date - self.min_date
profit_loss = max(0, 1 - total_profit / self.expected_max_profit) days_period = period.days
duration_loss = 0.4 * min(trade_duration / self.max_accepted_trade_duration, 1)
result = trade_loss + profit_loss + duration_loss #adding slippage of 0.1% per trade
total_profit = total_profit - 0.0005
expected_yearly_return = total_profit.sum()/days_period
if (np.std(total_profit) != 0.):
sharp_ratio = expected_yearly_return/np.std(total_profit)*np.sqrt(365)
else:
sharp_ratio = 1.
sharp_ratio = -sharp_ratio
# print(expected_yearly_return, np.std(total_profit), sharp_ratio)
result = sharp_ratio
self.resultloss = result
return result return result
def has_space(self, space: str) -> bool: def has_space(self, space: str) -> bool:
@ -193,6 +220,8 @@ class Hyperopt(Backtesting):
processed = load(TICKERDATA_PICKLE) processed = load(TICKERDATA_PICKLE)
min_date, max_date = get_timeframe(processed) min_date, max_date = get_timeframe(processed)
self.min_date = min_date
self.max_date = max_date
results = self.backtest( results = self.backtest(
{ {
'stake_amount': self.config['stake_amount'], 'stake_amount': self.config['stake_amount'],
@ -204,7 +233,8 @@ class Hyperopt(Backtesting):
) )
result_explanation = self.format_results(results) result_explanation = self.format_results(results)
total_profit = results.profit_percent.sum() # total_profit = results.profit_percent.sum()
total_profit = results.profit_percent
trade_count = len(results.index) trade_count = len(results.index)
trade_duration = results.trade_duration.mean() trade_duration = results.trade_duration.mean()
@ -219,7 +249,7 @@ class Hyperopt(Backtesting):
'result': result_explanation, 'result': result_explanation,
} }
loss = self.calculate_loss(total_profit, trade_count, trade_duration) loss = self.calculate_loss(total_profit, trade_count)
return { return {
'loss': loss, 'loss': loss,