Add hyperopt ROI documentation, add note on methology for hyperopt
This commit is contained in:
		| @@ -1,4 +1,5 @@ | |||||||
| # Hyperopt | # Hyperopt | ||||||
|  |  | ||||||
| This page explains how to tune your strategy by finding the optimal  | This page explains how to tune your strategy by finding the optimal  | ||||||
| parameters, a process called hyperparameter optimization. The bot uses several  | parameters, a process called hyperparameter optimization. The bot uses several  | ||||||
| algorithms included in the `scikit-optimize` package to accomplish this. The | algorithms included in the `scikit-optimize` package to accomplish this. The | ||||||
| @@ -8,17 +9,20 @@ and still take a long time. | |||||||
| *Note:* Hyperopt will crash when used with only 1 CPU Core as found out in [Issue #1133](https://github.com/freqtrade/freqtrade/issues/1133) | *Note:* Hyperopt will crash when used with only 1 CPU Core as found out in [Issue #1133](https://github.com/freqtrade/freqtrade/issues/1133) | ||||||
|  |  | ||||||
| ## Table of Contents | ## Table of Contents | ||||||
|  |  | ||||||
| - [Prepare your Hyperopt](#prepare-hyperopt) | - [Prepare your Hyperopt](#prepare-hyperopt) | ||||||
| - [Configure your Guards and Triggers](#configure-your-guards-and-triggers) | - [Configure your Guards and Triggers](#configure-your-guards-and-triggers) | ||||||
| - [Solving a Mystery](#solving-a-mystery) | - [Solving a Mystery](#solving-a-mystery) | ||||||
| - [Adding New Indicators](#adding-new-indicators) | - [Adding New Indicators](#adding-new-indicators) | ||||||
| - [Execute Hyperopt](#execute-hyperopt) | - [Execute Hyperopt](#execute-hyperopt) | ||||||
| - [Understand the hyperopts result](#understand-the-backtesting-result) | - [Understand the hyperopt result](#understand-the-hyperopt-result) | ||||||
|  |  | ||||||
| ## Prepare Hyperopting | ## Prepare Hyperopting | ||||||
|  |  | ||||||
| We recommend you start by taking a look at `hyperopt.py` file located in [freqtrade/optimize](https://github.com/freqtrade/freqtrade/blob/develop/freqtrade/optimize/hyperopt.py) | We recommend you start by taking a look at `hyperopt.py` file located in [freqtrade/optimize](https://github.com/freqtrade/freqtrade/blob/develop/freqtrade/optimize/hyperopt.py) | ||||||
|   |   | ||||||
| ### Configure your Guards and Triggers | ### Configure your Guards and Triggers | ||||||
|  |  | ||||||
| There are two places you need to change to add a new buy strategy for testing: | There are two places you need to change to add a new buy strategy for testing: | ||||||
| - Inside [populate_buy_trend()](https://github.com/freqtrade/freqtrade/blob/develop/freqtrade/optimize/hyperopt.py#L231-L264). | - Inside [populate_buy_trend()](https://github.com/freqtrade/freqtrade/blob/develop/freqtrade/optimize/hyperopt.py#L231-L264). | ||||||
| - Inside [hyperopt_space()](https://github.com/freqtrade/freqtrade/blob/develop/freqtrade/optimize/hyperopt.py#L213-L224)  | - Inside [hyperopt_space()](https://github.com/freqtrade/freqtrade/blob/develop/freqtrade/optimize/hyperopt.py#L213-L224)  | ||||||
| @@ -113,11 +117,12 @@ When you want to test an indicator that isn't used by the bot currently, remembe | |||||||
| add it to the `populate_indicators()` method in `hyperopt.py`. | add it to the `populate_indicators()` method in `hyperopt.py`. | ||||||
|  |  | ||||||
| ## Execute Hyperopt | ## Execute Hyperopt | ||||||
| Once you have updated your hyperopt configuration you can run it.  |  | ||||||
| Because hyperopt tries a lot of combination to find the best parameters |  | ||||||
| it will take time you will have the result (more than 30 mins). |  | ||||||
|  |  | ||||||
| We strongly recommend to use `screen` to prevent any connection loss. | Once you have updated your hyperopt configuration you can run it. | ||||||
|  | Because hyperopt tries a lot of combinations to find the best parameters it will take time you will have the result (more than 30 mins). | ||||||
|  |  | ||||||
|  | We strongly recommend to use `screen` or `tmux` to prevent any connection loss. | ||||||
|  |  | ||||||
| ```bash | ```bash | ||||||
| python3 ./freqtrade/main.py -c config.json hyperopt -e 5000 | python3 ./freqtrade/main.py -c config.json hyperopt -e 5000 | ||||||
| ``` | ``` | ||||||
| @@ -126,11 +131,13 @@ The `-e` flag will set how many evaluations hyperopt will do. We recommend | |||||||
| running at least several thousand evaluations. | running at least several thousand evaluations. | ||||||
|  |  | ||||||
| ### Execute Hyperopt with Different Ticker-Data Source | ### Execute Hyperopt with Different Ticker-Data Source | ||||||
|  |  | ||||||
| If you would like to hyperopt parameters using an alternate ticker data that | If you would like to hyperopt parameters using an alternate ticker data that | ||||||
| you have on-disk, use the `--datadir PATH` option. Default hyperopt will | you have on-disk, use the `--datadir PATH` option. Default hyperopt will | ||||||
| use data from directory `user_data/data`. | use data from directory `user_data/data`. | ||||||
|  |  | ||||||
| ### Running Hyperopt with Smaller Testset | ### Running Hyperopt with Smaller Testset | ||||||
|  |  | ||||||
| Use the `--timerange` argument to change how much of the testset | Use the `--timerange` argument to change how much of the testset | ||||||
| you want to use. The last N ticks/timeframes will be used. | you want to use. The last N ticks/timeframes will be used. | ||||||
| Example: | Example: | ||||||
| @@ -140,6 +147,7 @@ python3 ./freqtrade/main.py hyperopt --timerange -200 | |||||||
| ``` | ``` | ||||||
|  |  | ||||||
| ### Running Hyperopt with Smaller Search Space | ### Running Hyperopt with Smaller Search Space | ||||||
|  |  | ||||||
| Use the `--spaces` argument to limit the search space used by hyperopt. | Use the `--spaces` argument to limit the search space used by hyperopt. | ||||||
| Letting Hyperopt optimize everything is a huuuuge search space. Often it  | Letting Hyperopt optimize everything is a huuuuge search space. Often it  | ||||||
| might make more sense to start by just searching for initial buy algorithm.  | might make more sense to start by just searching for initial buy algorithm.  | ||||||
| @@ -154,7 +162,8 @@ Legal values are: | |||||||
| - `stoploss`: search for the best stoploss value | - `stoploss`: search for the best stoploss value | ||||||
| - space-separated list of any of the above values for example `--spaces roi stoploss` | - space-separated list of any of the above values for example `--spaces roi stoploss` | ||||||
|  |  | ||||||
| ## Understand the Hyperopts Result  | ## Understand the Hyperopt Result | ||||||
|  |  | ||||||
| Once Hyperopt is completed you can use the result to create a new strategy. | Once Hyperopt is completed you can use the result to create a new strategy. | ||||||
| Given the following result from hyperopt: | Given the following result from hyperopt: | ||||||
|  |  | ||||||
| @@ -166,22 +175,24 @@ with values: | |||||||
| ``` | ``` | ||||||
|  |  | ||||||
| You should understand this result like: | You should understand this result like: | ||||||
|  |  | ||||||
| - The buy trigger that worked best was `bb_lower`. | - The buy trigger that worked best was `bb_lower`. | ||||||
| - You should not use ADX because `adx-enabled: False`)  | - You should not use ADX because `adx-enabled: False`)  | ||||||
| - You should **consider** using the RSI indicator (`rsi-enabled: True` and the best value is `29.0` (`rsi-value: 29.0`) | - You should **consider** using the RSI indicator (`rsi-enabled: True` and the best value is `29.0` (`rsi-value: 29.0`) | ||||||
|  |  | ||||||
| You have to look inside your strategy file into `buy_strategy_generator()`  | You have to look inside your strategy file into `buy_strategy_generator()`  | ||||||
| method, what those values match to.    | method, what those values match to. | ||||||
|    |    | ||||||
| So for example you had `rsi-value: 29.0` so we would look  | So for example you had `rsi-value: 29.0` so we would look at `rsi`-block, that translates to the following code block: | ||||||
| at `rsi`-block, that translates to the following code block: |  | ||||||
| ``` | ``` | ||||||
| (dataframe['rsi'] < 29.0) | (dataframe['rsi'] < 29.0) | ||||||
| ``` | ``` | ||||||
|    |    | ||||||
| Translating your whole hyperopt result as the new buy-signal  | Translating your whole hyperopt result as the new buy-signal  | ||||||
| would then look like: | would then look like: | ||||||
| ``` |  | ||||||
|  | ```python | ||||||
| def populate_buy_trend(self, dataframe: DataFrame) -> DataFrame: | def populate_buy_trend(self, dataframe: DataFrame) -> DataFrame: | ||||||
|     dataframe.loc[ |     dataframe.loc[ | ||||||
|         ( |         ( | ||||||
| @@ -192,6 +203,37 @@ def populate_buy_trend(self, dataframe: DataFrame) -> DataFrame: | |||||||
|     return dataframe |     return dataframe | ||||||
| ``` | ``` | ||||||
|  |  | ||||||
|  | ### Understand Hyperopt ROI results | ||||||
|  |  | ||||||
|  | If you are optimizing ROI, you're result will look as follows and include a ROI table. | ||||||
|  |  | ||||||
|  | ``` | ||||||
|  | Best result: | ||||||
|  |    135 trades. Avg profit  0.57%. Total profit  0.03871918 BTC (0.7722Σ%). Avg duration 180.4 mins. | ||||||
|  | with values: | ||||||
|  | {'adx-value': 44, 'rsi-value': 29, 'adx-enabled': False, 'rsi-enabled': True, 'trigger': 'bb_lower', 'roi_t1': 40, 'roi_t2': 57, 'roi_t3': 21, 'roi_p1': 0.03634636907306948, 'roi_p2': 0.055237357937802885, 'roi_p3': 0.015163796015548354, 'stoploss': -0.37996664668703606} | ||||||
|  | ROI table: | ||||||
|  | {0: 0.10674752302642071, 21: 0.09158372701087236, 78: 0.03634636907306948, 118: 0} | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | This would translate to the following ROI table: | ||||||
|  |  | ||||||
|  | ``` python | ||||||
|  |  minimal_roi = { | ||||||
|  |         "118": 0, | ||||||
|  |         "78": 0.0363463, | ||||||
|  |         "21": 0.0915, | ||||||
|  |         "0": 0.106 | ||||||
|  |     } | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | ### Validate backtest result | ||||||
|  |  | ||||||
|  | Once the optimized strategy has been implemented into your strategy, you should backtest this strategy to make sure everything is working as expected. | ||||||
|  | To archive the same results (number of trades, ...) than during hyperopt, please use the command line flag `--disable-max-market-positions`. | ||||||
|  | This setting is the default for hyperopt for speed reasons. you can overwrite this in the configuration by setting `"position_stacking"=false` or by changing the relevant line in your hyperopt file [here](https://github.com/freqtrade/freqtrade/blob/develop/freqtrade/optimize/hyperopt.py#L283)  | ||||||
|  |  | ||||||
| ## Next Step | ## Next Step | ||||||
|  |  | ||||||
| Now you have a perfect bot and want to control it from Telegram. Your | Now you have a perfect bot and want to control it from Telegram. Your | ||||||
| next step is to learn the [Telegram usage](https://github.com/freqtrade/freqtrade/blob/develop/docs/telegram-usage.md). | next step is to learn the [Telegram usage](https://github.com/freqtrade/freqtrade/blob/develop/docs/telegram-usage.md). | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user