-
-
Notifications
You must be signed in to change notification settings - Fork 5.7k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Browse the repository at this point in the history
* more consistent backtesting tables and labels * added rounding to Tot Profit % on Sell Reasosn table to be consistent with other percentiles on table. * added daily sharpe ratio hyperopt loss method, ty @djacky * removed commented code * removed unused profit_abs * added proper slippage to each trade * replaced use of old value total_profit * Align quotes in same area * added daily sharpe ratio test and modified hyperopt_loss_sharpe_daily * fixed some more line alignments * updated docs to include SharpeHyperOptLossDaily * Update dockerfile to 3.8.1 * Run tests against 3.8 * added daily sharpe ratio hyperopt loss method, ty @djacky * removed commented code * removed unused profit_abs * added proper slippage to each trade * replaced use of old value total_profit * added daily sharpe ratio test and modified hyperopt_loss_sharpe_daily * updated docs to include SharpeHyperOptLossDaily * docs fixes * missed one fix * fixed standard deviation line * fixed to bracket notation * fixed to bracket notation * fixed syntax error * better readability, kept np.sqrt(365) which results in annualized sharpe ratio * fixed method arguments indentation * updated commented out debug print line * renamed after slippage profit_percent so it wont affect _calculate_results_metrics() * Reworked to fill leading and trailing days * No need for np; make flake happy * Fix risk free rate Co-authored-by: Matthias <xmatthias@outlook.com> Co-authored-by: hroff-1902 <47309513+hroff-1902@users.noreply.github.com>
- Loading branch information
1 parent
b5ee4f1
commit 9639ffb
Showing
5 changed files
with
110 additions
and
21 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,61 @@ | ||
""" | ||
SharpeHyperOptLossDaily | ||
This module defines the alternative HyperOptLoss class which can be used for | ||
Hyperoptimization. | ||
""" | ||
import math | ||
from datetime import datetime | ||
|
||
from pandas import DataFrame, date_range | ||
|
||
from freqtrade.optimize.hyperopt import IHyperOptLoss | ||
|
||
|
||
class SharpeHyperOptLossDaily(IHyperOptLoss): | ||
""" | ||
Defines the loss function for hyperopt. | ||
This implementation uses the Sharpe Ratio calculation. | ||
""" | ||
|
||
@staticmethod | ||
def hyperopt_loss_function(results: DataFrame, trade_count: int, | ||
min_date: datetime, max_date: datetime, | ||
*args, **kwargs) -> float: | ||
""" | ||
Objective function, returns smaller number for more optimal results. | ||
Uses Sharpe Ratio calculation. | ||
""" | ||
resample_freq = '1D' | ||
slippage_per_trade_ratio = 0.0005 | ||
days_in_year = 365 | ||
annual_risk_free_rate = 0.0 | ||
risk_free_rate = annual_risk_free_rate / days_in_year | ||
|
||
# apply slippage per trade to profit_percent | ||
results.loc[:, 'profit_percent_after_slippage'] = \ | ||
results['profit_percent'] - slippage_per_trade_ratio | ||
|
||
# create the index within the min_date and end max_date | ||
t_index = date_range(start=min_date, end=max_date, freq=resample_freq) | ||
|
||
sum_daily = ( | ||
results.resample(resample_freq, on='close_time').agg( | ||
{"profit_percent_after_slippage": sum}).reindex(t_index).fillna(0) | ||
) | ||
|
||
total_profit = sum_daily["profit_percent_after_slippage"] - risk_free_rate | ||
expected_returns_mean = total_profit.mean() | ||
up_stdev = total_profit.std() | ||
|
||
if (up_stdev != 0.): | ||
sharp_ratio = expected_returns_mean / up_stdev * math.sqrt(days_in_year) | ||
else: | ||
# Define high (negative) sharpe ratio to be clear that this is NOT optimal. | ||
sharp_ratio = -20. | ||
|
||
# print(t_index, sum_daily, total_profit) | ||
# print(risk_free_rate, expected_returns_mean, up_stdev, sharp_ratio) | ||
return -sharp_ratio |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters