Deployed 00d1f14 to develop in en with MkDocs 1.6.1 and mike 2.1.3

This commit is contained in:
github-actions[bot]
2025-01-05 18:36:19 +00:00
parent 2e05c6af0a
commit ec4f22a758
24 changed files with 351 additions and 351 deletions

View File

@@ -1663,25 +1663,25 @@ class.</p>
<p>To use a custom loss function class, make sure that the function <code>hyperopt_loss_function</code> is defined in your custom hyperopt loss class.
For the sample below, you then need to add the command line parameter <code>--hyperopt-loss SuperDuperHyperOptLoss</code> to your hyperopt call so this function is being used.</p>
<p>A sample of this can be found below, which is identical to the Default Hyperopt loss implementation. A full sample can be found in <a href="https://github.com/freqtrade/freqtrade/blob/develop/freqtrade/templates/sample_hyperopt_loss.py">userdata/hyperopts</a>.</p>
<div class="highlight"><pre><span></span><code><span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">datetime</span>
<span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">Any</span><span class="p">,</span> <span class="n">Dict</span>
<div class="highlight"><pre><span></span><code><span class="kn">from</span><span class="w"> </span><span class="nn">datetime</span><span class="w"> </span><span class="kn">import</span> <span class="n">datetime</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">typing</span><span class="w"> </span><span class="kn">import</span> <span class="n">Any</span><span class="p">,</span> <span class="n">Dict</span>
<span class="kn">from</span> <span class="nn">pandas</span> <span class="kn">import</span> <span class="n">DataFrame</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">pandas</span><span class="w"> </span><span class="kn">import</span> <span class="n">DataFrame</span>
<span class="kn">from</span> <span class="nn">freqtrade.constants</span> <span class="kn">import</span> <span class="n">Config</span>
<span class="kn">from</span> <span class="nn">freqtrade.optimize.hyperopt</span> <span class="kn">import</span> <span class="n">IHyperOptLoss</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">freqtrade.constants</span><span class="w"> </span><span class="kn">import</span> <span class="n">Config</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">freqtrade.optimize.hyperopt</span><span class="w"> </span><span class="kn">import</span> <span class="n">IHyperOptLoss</span>
<span class="n">TARGET_TRADES</span> <span class="o">=</span> <span class="mi">600</span>
<span class="n">EXPECTED_MAX_PROFIT</span> <span class="o">=</span> <span class="mf">3.0</span>
<span class="n">MAX_ACCEPTED_TRADE_DURATION</span> <span class="o">=</span> <span class="mi">300</span>
<span class="k">class</span> <span class="nc">SuperDuperHyperOptLoss</span><span class="p">(</span><span class="n">IHyperOptLoss</span><span class="p">):</span>
<span class="k">class</span><span class="w"> </span><span class="nc">SuperDuperHyperOptLoss</span><span class="p">(</span><span class="n">IHyperOptLoss</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Defines the default loss function for hyperopt</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="nd">@staticmethod</span>
<span class="k">def</span> <span class="nf">hyperopt_loss_function</span><span class="p">(</span>
<span class="k">def</span><span class="w"> </span><span class="nf">hyperopt_loss_function</span><span class="p">(</span>
<span class="o">*</span><span class="p">,</span>
<span class="n">results</span><span class="p">:</span> <span class="n">DataFrame</span><span class="p">,</span>
<span class="n">trade_count</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span>
@@ -1734,16 +1734,16 @@ For the sample below, you then need to add the command line parameter <code>--hy
</div>
<h2 id="overriding-pre-defined-spaces">Overriding pre-defined spaces<a class="headerlink" href="#overriding-pre-defined-spaces" title="Permanent link">&para;</a></h2>
<p>To override a pre-defined space (<code>roi_space</code>, <code>generate_roi_table</code>, <code>stoploss_space</code>, <code>trailing_space</code>, <code>max_open_trades_space</code>), define a nested class called Hyperopt and define the required spaces as follows:</p>
<div class="highlight"><pre><span></span><code><span class="kn">from</span> <span class="nn">freqtrade.optimize.space</span> <span class="kn">import</span> <span class="n">Categorical</span><span class="p">,</span> <span class="n">Dimension</span><span class="p">,</span> <span class="n">Integer</span><span class="p">,</span> <span class="n">SKDecimal</span>
<div class="highlight"><pre><span></span><code><span class="kn">from</span><span class="w"> </span><span class="nn">freqtrade.optimize.space</span><span class="w"> </span><span class="kn">import</span> <span class="n">Categorical</span><span class="p">,</span> <span class="n">Dimension</span><span class="p">,</span> <span class="n">Integer</span><span class="p">,</span> <span class="n">SKDecimal</span>
<span class="k">class</span> <span class="nc">MyAwesomeStrategy</span><span class="p">(</span><span class="n">IStrategy</span><span class="p">):</span>
<span class="k">class</span> <span class="nc">HyperOpt</span><span class="p">:</span>
<span class="k">class</span><span class="w"> </span><span class="nc">MyAwesomeStrategy</span><span class="p">(</span><span class="n">IStrategy</span><span class="p">):</span>
<span class="k">class</span><span class="w"> </span><span class="nc">HyperOpt</span><span class="p">:</span>
<span class="c1"># Define a custom stoploss space.</span>
<span class="k">def</span> <span class="nf">stoploss_space</span><span class="p">():</span>
<span class="k">def</span><span class="w"> </span><span class="nf">stoploss_space</span><span class="p">():</span>
<span class="k">return</span> <span class="p">[</span><span class="n">SKDecimal</span><span class="p">(</span><span class="o">-</span><span class="mf">0.05</span><span class="p">,</span> <span class="o">-</span><span class="mf">0.01</span><span class="p">,</span> <span class="n">decimals</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="s1">&#39;stoploss&#39;</span><span class="p">)]</span>
<span class="c1"># Define custom ROI space</span>
<span class="k">def</span> <span class="nf">roi_space</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="n">List</span><span class="p">[</span><span class="n">Dimension</span><span class="p">]:</span>
<span class="k">def</span><span class="w"> </span><span class="nf">roi_space</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="n">List</span><span class="p">[</span><span class="n">Dimension</span><span class="p">]:</span>
<span class="k">return</span> <span class="p">[</span>
<span class="n">Integer</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="mi">120</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="s1">&#39;roi_t1&#39;</span><span class="p">),</span>
<span class="n">Integer</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="mi">60</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="s1">&#39;roi_t2&#39;</span><span class="p">),</span>
@@ -1753,7 +1753,7 @@ For the sample below, you then need to add the command line parameter <code>--hy
<span class="n">SKDecimal</span><span class="p">(</span><span class="mf">0.01</span><span class="p">,</span> <span class="mf">0.20</span><span class="p">,</span> <span class="n">decimals</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="s1">&#39;roi_p3&#39;</span><span class="p">),</span>
<span class="p">]</span>
<span class="k">def</span> <span class="nf">generate_roi_table</span><span class="p">(</span><span class="n">params</span><span class="p">:</span> <span class="n">Dict</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">int</span><span class="p">,</span> <span class="nb">float</span><span class="p">]:</span>
<span class="k">def</span><span class="w"> </span><span class="nf">generate_roi_table</span><span class="p">(</span><span class="n">params</span><span class="p">:</span> <span class="n">Dict</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">int</span><span class="p">,</span> <span class="nb">float</span><span class="p">]:</span>
<span class="n">roi_table</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">roi_table</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;roi_p1&#39;</span><span class="p">]</span> <span class="o">+</span> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;roi_p2&#39;</span><span class="p">]</span> <span class="o">+</span> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;roi_p3&#39;</span><span class="p">]</span>
@@ -1763,7 +1763,7 @@ For the sample below, you then need to add the command line parameter <code>--hy
<span class="k">return</span> <span class="n">roi_table</span>
<span class="k">def</span> <span class="nf">trailing_space</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="n">List</span><span class="p">[</span><span class="n">Dimension</span><span class="p">]:</span>
<span class="k">def</span><span class="w"> </span><span class="nf">trailing_space</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="n">List</span><span class="p">[</span><span class="n">Dimension</span><span class="p">]:</span>
<span class="c1"># All parameters here are mandatory, you can only modify their type or the range.</span>
<span class="k">return</span> <span class="p">[</span>
<span class="c1"># Fixed to true, if optimizing trailing_stop we assume to use trailing stop at all times.</span>
@@ -1781,7 +1781,7 @@ For the sample below, you then need to add the command line parameter <code>--hy
<span class="p">]</span>
<span class="c1"># Define a custom max_open_trades space</span>
<span class="k">def</span> <span class="nf">max_open_trades_space</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">List</span><span class="p">[</span><span class="n">Dimension</span><span class="p">]:</span>
<span class="k">def</span><span class="w"> </span><span class="nf">max_open_trades_space</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">List</span><span class="p">[</span><span class="n">Dimension</span><span class="p">]:</span>
<span class="k">return</span> <span class="p">[</span>
<span class="n">Integer</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="s1">&#39;max_open_trades&#39;</span><span class="p">),</span>
<span class="p">]</span>
@@ -1792,9 +1792,9 @@ For the sample below, you then need to add the command line parameter <code>--hy
</div>
<h3 id="dynamic-parameters">Dynamic parameters<a class="headerlink" href="#dynamic-parameters" title="Permanent link">&para;</a></h3>
<p>Parameters can also be defined dynamically, but must be available to the instance once the <a href="../strategy-callbacks/#bot-start"><code>bot_start()</code> callback</a> has been called.</p>
<div class="highlight"><pre><span></span><code><span class="k">class</span> <span class="nc">MyAwesomeStrategy</span><span class="p">(</span><span class="n">IStrategy</span><span class="p">):</span>
<div class="highlight"><pre><span></span><code><span class="k">class</span><span class="w"> </span><span class="nc">MyAwesomeStrategy</span><span class="p">(</span><span class="n">IStrategy</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">bot_start</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">def</span><span class="w"> </span><span class="nf">bot_start</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">buy_adx</span> <span class="o">=</span> <span class="n">IntParameter</span><span class="p">(</span><span class="mi">20</span><span class="p">,</span> <span class="mi">30</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="mi">30</span><span class="p">,</span> <span class="n">optimize</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="c1"># ...</span>
@@ -1805,27 +1805,27 @@ For the sample below, you then need to add the command line parameter <code>--hy
</div>
<h3 id="overriding-base-estimator">Overriding Base estimator<a class="headerlink" href="#overriding-base-estimator" title="Permanent link">&para;</a></h3>
<p>You can define your own estimator for Hyperopt by implementing <code>generate_estimator()</code> in the Hyperopt subclass.</p>
<div class="highlight"><pre><span></span><code><span class="k">class</span> <span class="nc">MyAwesomeStrategy</span><span class="p">(</span><span class="n">IStrategy</span><span class="p">):</span>
<span class="k">class</span> <span class="nc">HyperOpt</span><span class="p">:</span>
<span class="k">def</span> <span class="nf">generate_estimator</span><span class="p">(</span><span class="n">dimensions</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="s1">&#39;Dimension&#39;</span><span class="p">],</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<div class="highlight"><pre><span></span><code><span class="k">class</span><span class="w"> </span><span class="nc">MyAwesomeStrategy</span><span class="p">(</span><span class="n">IStrategy</span><span class="p">):</span>
<span class="k">class</span><span class="w"> </span><span class="nc">HyperOpt</span><span class="p">:</span>
<span class="k">def</span><span class="w"> </span><span class="nf">generate_estimator</span><span class="p">(</span><span class="n">dimensions</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="s1">&#39;Dimension&#39;</span><span class="p">],</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="k">return</span> <span class="s2">&quot;RF&quot;</span>
</code></pre></div>
<p>Possible values are either one of "GP", "RF", "ET", "GBRT" (Details can be found in the <a href="https://scikit-optimize.github.io/">scikit-optimize documentation</a>), or "an instance of a class that inherits from <code>RegressorMixin</code> (from sklearn) and where the <code>predict</code> method has an optional <code>return_std</code> argument, which returns <code>std(Y | x)</code> along with <code>E[Y | x]</code>".</p>
<p>Some research will be necessary to find additional Regressors.</p>
<p>Example for <code>ExtraTreesRegressor</code> ("ET") with additional parameters:</p>
<div class="highlight"><pre><span></span><code><span class="k">class</span> <span class="nc">MyAwesomeStrategy</span><span class="p">(</span><span class="n">IStrategy</span><span class="p">):</span>
<span class="k">class</span> <span class="nc">HyperOpt</span><span class="p">:</span>
<span class="k">def</span> <span class="nf">generate_estimator</span><span class="p">(</span><span class="n">dimensions</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="s1">&#39;Dimension&#39;</span><span class="p">],</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="kn">from</span> <span class="nn">skopt.learning</span> <span class="kn">import</span> <span class="n">ExtraTreesRegressor</span>
<div class="highlight"><pre><span></span><code><span class="k">class</span><span class="w"> </span><span class="nc">MyAwesomeStrategy</span><span class="p">(</span><span class="n">IStrategy</span><span class="p">):</span>
<span class="k">class</span><span class="w"> </span><span class="nc">HyperOpt</span><span class="p">:</span>
<span class="k">def</span><span class="w"> </span><span class="nf">generate_estimator</span><span class="p">(</span><span class="n">dimensions</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="s1">&#39;Dimension&#39;</span><span class="p">],</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">skopt.learning</span><span class="w"> </span><span class="kn">import</span> <span class="n">ExtraTreesRegressor</span>
<span class="c1"># Corresponds to &quot;ET&quot; - but allows additional parameters.</span>
<span class="k">return</span> <span class="n">ExtraTreesRegressor</span><span class="p">(</span><span class="n">n_estimators</span><span class="o">=</span><span class="mi">100</span><span class="p">)</span>
</code></pre></div>
<p>The <code>dimensions</code> parameter is the list of <code>skopt.space.Dimension</code> objects corresponding to the parameters to be optimized. It can be used to create isotropic kernels for the <code>skopt.learning.GaussianProcessRegressor</code> estimator. Here's an example:</p>
<div class="highlight"><pre><span></span><code><span class="k">class</span> <span class="nc">MyAwesomeStrategy</span><span class="p">(</span><span class="n">IStrategy</span><span class="p">):</span>
<span class="k">class</span> <span class="nc">HyperOpt</span><span class="p">:</span>
<span class="k">def</span> <span class="nf">generate_estimator</span><span class="p">(</span><span class="n">dimensions</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="s1">&#39;Dimension&#39;</span><span class="p">],</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="kn">from</span> <span class="nn">skopt.utils</span> <span class="kn">import</span> <span class="n">cook_estimator</span>
<span class="kn">from</span> <span class="nn">skopt.learning.gaussian_process.kernels</span> <span class="kn">import</span> <span class="p">(</span><span class="n">Matern</span><span class="p">,</span> <span class="n">ConstantKernel</span><span class="p">)</span>
<div class="highlight"><pre><span></span><code><span class="k">class</span><span class="w"> </span><span class="nc">MyAwesomeStrategy</span><span class="p">(</span><span class="n">IStrategy</span><span class="p">):</span>
<span class="k">class</span><span class="w"> </span><span class="nc">HyperOpt</span><span class="p">:</span>
<span class="k">def</span><span class="w"> </span><span class="nf">generate_estimator</span><span class="p">(</span><span class="n">dimensions</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="s1">&#39;Dimension&#39;</span><span class="p">],</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">skopt.utils</span><span class="w"> </span><span class="kn">import</span> <span class="n">cook_estimator</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">skopt.learning.gaussian_process.kernels</span><span class="w"> </span><span class="kn">import</span> <span class="p">(</span><span class="n">Matern</span><span class="p">,</span> <span class="n">ConstantKernel</span><span class="p">)</span>
<span class="n">kernel_bounds</span> <span class="o">=</span> <span class="p">(</span><span class="mf">0.0001</span><span class="p">,</span> <span class="mi">10000</span><span class="p">)</span>
<span class="n">kernel</span> <span class="o">=</span> <span class="p">(</span>
<span class="n">ConstantKernel</span><span class="p">(</span><span class="mf">1.0</span><span class="p">,</span> <span class="n">kernel_bounds</span><span class="p">)</span> <span class="o">*</span>
@@ -1852,7 +1852,7 @@ If you're unsure about this, best use one of the Defaults (<code>"ET"</code> has
<li><code>Real</code> - Pick from a range of decimal numbers with full precision (e.g. <code>Real(0.1, 0.5, name='adx')</code></li>
</ul>
<p>You can import all of these from <code>freqtrade.optimize.space</code>, although <code>Categorical</code>, <code>Integer</code> and <code>Real</code> are only aliases for their corresponding scikit-optimize Spaces. <code>SKDecimal</code> is provided by freqtrade for faster optimizations.</p>
<div class="highlight"><pre><span></span><code><span class="kn">from</span> <span class="nn">freqtrade.optimize.space</span> <span class="kn">import</span> <span class="n">Categorical</span><span class="p">,</span> <span class="n">Dimension</span><span class="p">,</span> <span class="n">Integer</span><span class="p">,</span> <span class="n">SKDecimal</span><span class="p">,</span> <span class="n">Real</span> <span class="c1"># noqa</span>
<div class="highlight"><pre><span></span><code><span class="kn">from</span><span class="w"> </span><span class="nn">freqtrade.optimize.space</span><span class="w"> </span><span class="kn">import</span> <span class="n">Categorical</span><span class="p">,</span> <span class="n">Dimension</span><span class="p">,</span> <span class="n">Integer</span><span class="p">,</span> <span class="n">SKDecimal</span><span class="p">,</span> <span class="n">Real</span> <span class="c1"># noqa</span>
</code></pre></div>
<div class="admonition hint">
<p class="admonition-title">SKDecimal vs. Real</p>