Deployed 7e7e475 to develop in en with MkDocs 1.6.1 and mike 2.1.4

This commit is contained in:
github-actions[bot]
2026-03-31 05:20:03 +00:00
parent df495f4472
commit 970aa93176
44 changed files with 13314 additions and 6959 deletions
+442 -161
View File
@@ -1340,11 +1340,139 @@
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#configure-freqtrade-environment" class="md-nav__link">
<span class="md-ellipsis">
Configure Freqtrade environment
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#load-and-run-strategy" class="md-nav__link">
<span class="md-ellipsis">
Load and run strategy
</span>
</a>
<nav class="md-nav" aria-label="Load and run strategy">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#display-the-trade-details" class="md-nav__link">
<span class="md-ellipsis">
Display the trade details
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#load-existing-objects-into-a-jupyter-notebook" class="md-nav__link">
<span class="md-ellipsis">
Load existing objects into a Jupyter notebook
</span>
</a>
<nav class="md-nav" aria-label="Load existing objects into a Jupyter notebook">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#load-backtest-results-to-pandas-dataframe" class="md-nav__link">
<span class="md-ellipsis">
Load backtest results to pandas dataframe
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#plotting-daily-profit-equity-line" class="md-nav__link">
<span class="md-ellipsis">
Plotting daily profit / equity line
</span>
</a>
<nav class="md-nav" aria-label="Plotting daily profit / equity line">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#load-live-trading-results-into-a-pandas-dataframe" class="md-nav__link">
<span class="md-ellipsis">
Load live trading results into a pandas dataframe
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#analyze-the-loaded-trades-for-trade-parallelism" class="md-nav__link">
<span class="md-ellipsis">
Analyze the loaded trades for trade parallelism
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#plot-results" class="md-nav__link">
<span class="md-ellipsis">
Plot results
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#plot-average-profit-per-trade-as-distribution-graph" class="md-nav__link">
<span class="md-ellipsis">
Plot average profit per trade as distribution graph
</span>
</a>
</li>
</ul>
@@ -1881,11 +2009,139 @@
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#configure-freqtrade-environment" class="md-nav__link">
<span class="md-ellipsis">
Configure Freqtrade environment
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#load-and-run-strategy" class="md-nav__link">
<span class="md-ellipsis">
Load and run strategy
</span>
</a>
<nav class="md-nav" aria-label="Load and run strategy">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#display-the-trade-details" class="md-nav__link">
<span class="md-ellipsis">
Display the trade details
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#load-existing-objects-into-a-jupyter-notebook" class="md-nav__link">
<span class="md-ellipsis">
Load existing objects into a Jupyter notebook
</span>
</a>
<nav class="md-nav" aria-label="Load existing objects into a Jupyter notebook">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#load-backtest-results-to-pandas-dataframe" class="md-nav__link">
<span class="md-ellipsis">
Load backtest results to pandas dataframe
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#plotting-daily-profit-equity-line" class="md-nav__link">
<span class="md-ellipsis">
Plotting daily profit / equity line
</span>
</a>
<nav class="md-nav" aria-label="Plotting daily profit / equity line">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#load-live-trading-results-into-a-pandas-dataframe" class="md-nav__link">
<span class="md-ellipsis">
Load live trading results into a pandas dataframe
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#analyze-the-loaded-trades-for-trade-parallelism" class="md-nav__link">
<span class="md-ellipsis">
Analyze the loaded trades for trade parallelism
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#plot-results" class="md-nav__link">
<span class="md-ellipsis">
Plot results
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#plot-average-profit-per-trade-as-distribution-graph" class="md-nav__link">
<span class="md-ellipsis">
Plot average profit per trade as distribution graph
</span>
</a>
</li>
</ul>
@@ -1919,73 +2175,81 @@ The following assumes you work with SampleStrategy, data for 5m timeframe from B
Please follow the <a href="https://www.freqtrade.io/en/stable/data-download/">documentation</a> for more details.</p>
<h2 id="setup">Setup<a class="headerlink" href="#setup" title="Permanent link">&para;</a></h2>
<h3 id="change-working-directory-to-repository-root">Change Working directory to repository root<a class="headerlink" href="#change-working-directory-to-repository-root" title="Permanent link">&para;</a></h3>
<p>```python
import os
from pathlib import Path</p>
<h1 id="change-directory">Change directory<a class="headerlink" href="#change-directory" title="Permanent link">&para;</a></h1>
<h1 id="modify-this-cell-to-insure-that-the-output-shows-the-correct-path">Modify this cell to insure that the output shows the correct path.<a class="headerlink" href="#modify-this-cell-to-insure-that-the-output-shows-the-correct-path" title="Permanent link">&para;</a></h1>
<h1 id="define-all-paths-relative-to-the-project-root-shown-in-the-cell-output">Define all paths relative to the project root shown in the cell output<a class="headerlink" href="#define-all-paths-relative-to-the-project-root-shown-in-the-cell-output" title="Permanent link">&para;</a></h1>
<p>project_root = "somedir/freqtrade"
i = 0
try:
os.chdir(project_root)
if not Path("LICENSE").is_file():
i = 0
while i &lt; 4 and (not Path("LICENSE").is_file()):
os.chdir(Path(Path.cwd(), "../"))
i += 1
project_root = Path.cwd()
except FileNotFoundError:
print("Please define the project root relative to the current directory")
print(Path.cwd())
```</p>
<div class="highlight"><pre><span></span><code><span class="kn">import</span><span class="w"> </span><span class="nn">os</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">pathlib</span><span class="w"> </span><span class="kn">import</span> <span class="n">Path</span>
<span class="c1"># Change directory</span>
<span class="c1"># Modify this cell to insure that the output shows the correct path.</span>
<span class="c1"># Define all paths relative to the project root shown in the cell output</span>
<span class="n">project_root</span> <span class="o">=</span> <span class="s2">&quot;somedir/freqtrade&quot;</span>
<span class="n">i</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">os</span><span class="o">.</span><span class="n">chdir</span><span class="p">(</span><span class="n">project_root</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">Path</span><span class="p">(</span><span class="s2">&quot;LICENSE&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">is_file</span><span class="p">():</span>
<span class="n">i</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">while</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mi">4</span> <span class="ow">and</span> <span class="p">(</span><span class="ow">not</span> <span class="n">Path</span><span class="p">(</span><span class="s2">&quot;LICENSE&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">is_file</span><span class="p">()):</span>
<span class="n">os</span><span class="o">.</span><span class="n">chdir</span><span class="p">(</span><span class="n">Path</span><span class="p">(</span><span class="n">Path</span><span class="o">.</span><span class="n">cwd</span><span class="p">(),</span> <span class="s2">&quot;../&quot;</span><span class="p">))</span>
<span class="n">i</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="n">project_root</span> <span class="o">=</span> <span class="n">Path</span><span class="o">.</span><span class="n">cwd</span><span class="p">()</span>
<span class="k">except</span> <span class="ne">FileNotFoundError</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Please define the project root relative to the current directory&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="n">Path</span><span class="o">.</span><span class="n">cwd</span><span class="p">())</span>
</code></pre></div>
<h3 id="configure-freqtrade-environment">Configure Freqtrade environment<a class="headerlink" href="#configure-freqtrade-environment" title="Permanent link">&para;</a></h3>
<p>```python
from freqtrade.configuration import Configuration</p>
<h1 id="customize-these-according-to-your-needs">Customize these according to your needs.<a class="headerlink" href="#customize-these-according-to-your-needs" title="Permanent link">&para;</a></h1>
<h1 id="initialize-empty-configuration-object">Initialize empty configuration object<a class="headerlink" href="#initialize-empty-configuration-object" title="Permanent link">&para;</a></h1>
<p>config = Configuration.from_files([])</p>
<h1 id="optionally-recommended-use-existing-configuration-file">Optionally (recommended), use existing configuration file<a class="headerlink" href="#optionally-recommended-use-existing-configuration-file" title="Permanent link">&para;</a></h1>
<h1 id="config-configurationfrom_filesuser_dataconfigjson">config = Configuration.from_files(["user_data/config.json"])<a class="headerlink" href="#config-configurationfrom_filesuser_dataconfigjson" title="Permanent link">&para;</a></h1>
<h1 id="define-some-constants">Define some constants<a class="headerlink" href="#define-some-constants" title="Permanent link">&para;</a></h1>
<p>config["timeframe"] = "5m"</p>
<h1 id="name-of-the-strategy-class">Name of the strategy class<a class="headerlink" href="#name-of-the-strategy-class" title="Permanent link">&para;</a></h1>
<p>config["strategy"] = "SampleStrategy"</p>
<h1 id="location-of-the-data">Location of the data<a class="headerlink" href="#location-of-the-data" title="Permanent link">&para;</a></h1>
<p>data_location = config["datadir"]</p>
<h1 id="pair-to-analyze-only-use-one-pair-here">Pair to analyze - Only use one pair here<a class="headerlink" href="#pair-to-analyze-only-use-one-pair-here" title="Permanent link">&para;</a></h1>
<p>pair = "BTC/USDT"
```</p>
<p>```python</p>
<h1 id="load-data-using-values-set-above">Load data using values set above<a class="headerlink" href="#load-data-using-values-set-above" title="Permanent link">&para;</a></h1>
<p>from freqtrade.data.history import load_pair_history
from freqtrade.enums import CandleType</p>
<p>candles = load_pair_history(
datadir=data_location,
timeframe=config["timeframe"],
pair=pair,
data_format="json", # Make sure to update this to your data
candle_type=CandleType.SPOT,
)</p>
<h1 id="confirm-success">Confirm success<a class="headerlink" href="#confirm-success" title="Permanent link">&para;</a></h1>
<p>print(f"Loaded {len(candles)} rows of data for {pair} from {data_location}")
candles.head()
```</p>
<div class="highlight"><pre><span></span><code><span class="kn">from</span><span class="w"> </span><span class="nn">freqtrade.configuration</span><span class="w"> </span><span class="kn">import</span> <span class="n">Configuration</span>
<span class="c1"># Customize these according to your needs.</span>
<span class="c1"># Initialize empty configuration object</span>
<span class="n">config</span> <span class="o">=</span> <span class="n">Configuration</span><span class="o">.</span><span class="n">from_files</span><span class="p">([])</span>
<span class="c1"># Optionally (recommended), use existing configuration file</span>
<span class="c1"># config = Configuration.from_files([&quot;user_data/config.json&quot;])</span>
<span class="c1"># Define some constants</span>
<span class="n">config</span><span class="p">[</span><span class="s2">&quot;timeframe&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;5m&quot;</span>
<span class="c1"># Name of the strategy class</span>
<span class="n">config</span><span class="p">[</span><span class="s2">&quot;strategy&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;SampleStrategy&quot;</span>
<span class="c1"># Location of the data</span>
<span class="n">data_location</span> <span class="o">=</span> <span class="n">config</span><span class="p">[</span><span class="s2">&quot;datadir&quot;</span><span class="p">]</span>
<span class="c1"># Pair to analyze - Only use one pair here</span>
<span class="n">pair</span> <span class="o">=</span> <span class="s2">&quot;BTC/USDT&quot;</span>
</code></pre></div>
<div class="highlight"><pre><span></span><code><span class="c1"># Load data using values set above</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">freqtrade.data.history</span><span class="w"> </span><span class="kn">import</span> <span class="n">load_pair_history</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">freqtrade.enums</span><span class="w"> </span><span class="kn">import</span> <span class="n">CandleType</span>
<span class="n">candles</span> <span class="o">=</span> <span class="n">load_pair_history</span><span class="p">(</span>
<span class="n">datadir</span><span class="o">=</span><span class="n">data_location</span><span class="p">,</span>
<span class="n">timeframe</span><span class="o">=</span><span class="n">config</span><span class="p">[</span><span class="s2">&quot;timeframe&quot;</span><span class="p">],</span>
<span class="n">pair</span><span class="o">=</span><span class="n">pair</span><span class="p">,</span>
<span class="n">data_format</span><span class="o">=</span><span class="s2">&quot;json&quot;</span><span class="p">,</span> <span class="c1"># Make sure to update this to your data</span>
<span class="n">candle_type</span><span class="o">=</span><span class="n">CandleType</span><span class="o">.</span><span class="n">SPOT</span><span class="p">,</span>
<span class="p">)</span>
<span class="c1"># Confirm success</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Loaded </span><span class="si">{</span><span class="nb">len</span><span class="p">(</span><span class="n">candles</span><span class="p">)</span><span class="si">}</span><span class="s2"> rows of data for </span><span class="si">{</span><span class="n">pair</span><span class="si">}</span><span class="s2"> from </span><span class="si">{</span><span class="n">data_location</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="n">candles</span><span class="o">.</span><span class="n">head</span><span class="p">()</span>
</code></pre></div>
<h2 id="load-and-run-strategy">Load and run strategy<a class="headerlink" href="#load-and-run-strategy" title="Permanent link">&para;</a></h2>
<ul>
<li>Rerun each time the strategy file is changed</li>
</ul>
<p>```python</p>
<h1 id="load-strategy-using-values-set-above">Load strategy using values set above<a class="headerlink" href="#load-strategy-using-values-set-above" title="Permanent link">&para;</a></h1>
<p>from freqtrade.data.dataprovider import DataProvider
from freqtrade.resolvers import StrategyResolver</p>
<p>strategy = StrategyResolver.load_strategy(config)
strategy.dp = DataProvider(config, None, None)
strategy.ft_bot_start()</p>
<h1 id="generate-buysell-signals-using-strategy">Generate buy/sell signals using strategy<a class="headerlink" href="#generate-buysell-signals-using-strategy" title="Permanent link">&para;</a></h1>
<p>df = strategy.analyze_ticker(candles, {"pair": pair})
df.tail()
```</p>
<div class="highlight"><pre><span></span><code><span class="c1"># Load strategy using values set above</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">freqtrade.data.dataprovider</span><span class="w"> </span><span class="kn">import</span> <span class="n">DataProvider</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">freqtrade.resolvers</span><span class="w"> </span><span class="kn">import</span> <span class="n">StrategyResolver</span>
<span class="n">strategy</span> <span class="o">=</span> <span class="n">StrategyResolver</span><span class="o">.</span><span class="n">load_strategy</span><span class="p">(</span><span class="n">config</span><span class="p">)</span>
<span class="n">strategy</span><span class="o">.</span><span class="n">dp</span> <span class="o">=</span> <span class="n">DataProvider</span><span class="p">(</span><span class="n">config</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="n">strategy</span><span class="o">.</span><span class="n">ft_bot_start</span><span class="p">()</span>
<span class="c1"># Generate buy/sell signals using strategy</span>
<span class="n">df</span> <span class="o">=</span> <span class="n">strategy</span><span class="o">.</span><span class="n">analyze_ticker</span><span class="p">(</span><span class="n">candles</span><span class="p">,</span> <span class="p">{</span><span class="s2">&quot;pair&quot;</span><span class="p">:</span> <span class="n">pair</span><span class="p">})</span>
<span class="n">df</span><span class="o">.</span><span class="n">tail</span><span class="p">()</span>
</code></pre></div>
<h3 id="display-the-trade-details">Display the trade details<a class="headerlink" href="#display-the-trade-details" title="Permanent link">&para;</a></h3>
<ul>
<li>Note that using <code>data.head()</code> would also work, however most indicators have some "startup" data at the top of the dataframe.</li>
@@ -1996,119 +2260,136 @@ df.tail()
* having 200 buy signals as output for one pair from <code>analyze_ticker()</code> does not necessarily mean that 200 trades will be made during backtesting.
* Assuming you use only one condition such as, <code>df['rsi'] &lt; 30</code> as buy condition, this will generate multiple "buy" signals for each pair in sequence (until rsi returns &gt; 29). The bot will only buy on the first of these signals (and also only if a trade-slot ("max_open_trades") is still available), or on one of the middle signals, as soon as a "slot" becomes available. </li>
</ul>
<p>```python</p>
<h1 id="report-results">Report results<a class="headerlink" href="#report-results" title="Permanent link">&para;</a></h1>
<p>print(f"Generated {df['enter_long'].sum()} entry signals")
data = df.set_index("date", drop=False)
data.tail()
```</p>
<div class="highlight"><pre><span></span><code><span class="c1"># Report results</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Generated </span><span class="si">{</span><span class="n">df</span><span class="p">[</span><span class="s1">&#39;enter_long&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">sum</span><span class="p">()</span><span class="si">}</span><span class="s2"> entry signals&quot;</span><span class="p">)</span>
<span class="n">data</span> <span class="o">=</span> <span class="n">df</span><span class="o">.</span><span class="n">set_index</span><span class="p">(</span><span class="s2">&quot;date&quot;</span><span class="p">,</span> <span class="n">drop</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
<span class="n">data</span><span class="o">.</span><span class="n">tail</span><span class="p">()</span>
</code></pre></div>
<h2 id="load-existing-objects-into-a-jupyter-notebook">Load existing objects into a Jupyter notebook<a class="headerlink" href="#load-existing-objects-into-a-jupyter-notebook" title="Permanent link">&para;</a></h2>
<p>The following cells assume that you have already generated data using the cli.<br />
They will allow you to drill deeper into your results, and perform analysis which otherwise would make the output very difficult to digest due to information overload.</p>
<h3 id="load-backtest-results-to-pandas-dataframe">Load backtest results to pandas dataframe<a class="headerlink" href="#load-backtest-results-to-pandas-dataframe" title="Permanent link">&para;</a></h3>
<p>Analyze a trades dataframe (also used below for plotting)</p>
<p>```python
from freqtrade.data.btanalysis import load_backtest_data, load_backtest_stats</p>
<h1 id="if-backtest_dir-points-to-a-directory-itll-automatically-load-the-last-backtest-file">if backtest_dir points to a directory, it'll automatically load the last backtest file.<a class="headerlink" href="#if-backtest_dir-points-to-a-directory-itll-automatically-load-the-last-backtest-file" title="Permanent link">&para;</a></h1>
<p>backtest_dir = config["user_data_dir"] / "backtest_results"</p>
<h1 id="backtest_dir-can-also-point-to-a-specific-file">backtest_dir can also point to a specific file<a class="headerlink" href="#backtest_dir-can-also-point-to-a-specific-file" title="Permanent link">&para;</a></h1>
<h1 id="backtest_dir">backtest_dir = (<a class="headerlink" href="#backtest_dir" title="Permanent link">&para;</a></h1>
<h1 id="configuser_data_dir-backtest_resultsbacktest-result-2020-07-01_20-04-22json">config["user_data_dir"] / "backtest_results/backtest-result-2020-07-01_20-04-22.json"<a class="headerlink" href="#configuser_data_dir-backtest_resultsbacktest-result-2020-07-01_20-04-22json" title="Permanent link">&para;</a></h1>
<h1 id="_1">)<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h1>
<p>```</p>
<p>```python</p>
<h1 id="you-can-get-the-full-backtest-statistics-by-using-the-following-command">You can get the full backtest statistics by using the following command.<a class="headerlink" href="#you-can-get-the-full-backtest-statistics-by-using-the-following-command" title="Permanent link">&para;</a></h1>
<h1 id="this-contains-all-information-used-to-generate-the-backtest-result">This contains all information used to generate the backtest result.<a class="headerlink" href="#this-contains-all-information-used-to-generate-the-backtest-result" title="Permanent link">&para;</a></h1>
<p>stats = load_backtest_stats(backtest_dir)</p>
<p>strategy = "SampleStrategy"</p>
<h1 id="all-statistics-are-available-per-strategy-so-if-strategy-list-was-used-during-backtest">All statistics are available per strategy, so if <code>--strategy-list</code> was used during backtest,<a class="headerlink" href="#all-statistics-are-available-per-strategy-so-if-strategy-list-was-used-during-backtest" title="Permanent link">&para;</a></h1>
<h1 id="this-will-be-reflected-here-as-well">this will be reflected here as well.<a class="headerlink" href="#this-will-be-reflected-here-as-well" title="Permanent link">&para;</a></h1>
<h1 id="example-usages">Example usages:<a class="headerlink" href="#example-usages" title="Permanent link">&para;</a></h1>
<p>print(stats["strategy"][strategy]["results_per_pair"])</p>
<h1 id="get-pairlist-used-for-this-backtest">Get pairlist used for this backtest<a class="headerlink" href="#get-pairlist-used-for-this-backtest" title="Permanent link">&para;</a></h1>
<p>print(stats["strategy"][strategy]["pairlist"])</p>
<h1 id="get-market-change-average-change-of-all-pairs-from-start-to-end-of-the-backtest-period">Get market change (average change of all pairs from start to end of the backtest period)<a class="headerlink" href="#get-market-change-average-change-of-all-pairs-from-start-to-end-of-the-backtest-period" title="Permanent link">&para;</a></h1>
<p>print(stats["strategy"][strategy]["market_change"])</p>
<h1 id="maximum-drawdown">Maximum drawdown ()<a class="headerlink" href="#maximum-drawdown" title="Permanent link">&para;</a></h1>
<p>print(stats["strategy"][strategy]["max_drawdown_abs"])</p>
<h1 id="maximum-drawdown-start-and-end">Maximum drawdown start and end<a class="headerlink" href="#maximum-drawdown-start-and-end" title="Permanent link">&para;</a></h1>
<p>print(stats["strategy"][strategy]["drawdown_start"])
print(stats["strategy"][strategy]["drawdown_end"])</p>
<h1 id="get-strategy-comparison-only-relevant-if-multiple-strategies-were-compared">Get strategy comparison (only relevant if multiple strategies were compared)<a class="headerlink" href="#get-strategy-comparison-only-relevant-if-multiple-strategies-were-compared" title="Permanent link">&para;</a></h1>
<p>print(stats["strategy_comparison"])
```</p>
<p>```python</p>
<h1 id="load-backtested-trades-as-dataframe">Load backtested trades as dataframe<a class="headerlink" href="#load-backtested-trades-as-dataframe" title="Permanent link">&para;</a></h1>
<p>trades = load_backtest_data(backtest_dir)</p>
<h1 id="show-value-counts-per-pair">Show value-counts per pair<a class="headerlink" href="#show-value-counts-per-pair" title="Permanent link">&para;</a></h1>
<p>trades.groupby("pair")["exit_reason"].value_counts()
```</p>
<div class="highlight"><pre><span></span><code><span class="kn">from</span><span class="w"> </span><span class="nn">freqtrade.data.btanalysis</span><span class="w"> </span><span class="kn">import</span> <span class="n">load_backtest_data</span><span class="p">,</span> <span class="n">load_backtest_stats</span>
<span class="c1"># if backtest_dir points to a directory, it&#39;ll automatically load the last backtest file.</span>
<span class="n">backtest_dir</span> <span class="o">=</span> <span class="n">config</span><span class="p">[</span><span class="s2">&quot;user_data_dir&quot;</span><span class="p">]</span> <span class="o">/</span> <span class="s2">&quot;backtest_results&quot;</span>
<span class="c1"># backtest_dir can also point to a specific file</span>
<span class="c1"># backtest_dir = (</span>
<span class="c1"># config[&quot;user_data_dir&quot;] / &quot;backtest_results/backtest-result-2020-07-01_20-04-22.json&quot;</span>
<span class="c1"># )</span>
</code></pre></div>
<div class="highlight"><pre><span></span><code><span class="c1"># You can get the full backtest statistics by using the following command.</span>
<span class="c1"># This contains all information used to generate the backtest result.</span>
<span class="n">stats</span> <span class="o">=</span> <span class="n">load_backtest_stats</span><span class="p">(</span><span class="n">backtest_dir</span><span class="p">)</span>
<span class="n">strategy</span> <span class="o">=</span> <span class="s2">&quot;SampleStrategy&quot;</span>
<span class="c1"># All statistics are available per strategy, so if `--strategy-list` was used during backtest,</span>
<span class="c1"># this will be reflected here as well.</span>
<span class="c1"># Example usages:</span>
<span class="nb">print</span><span class="p">(</span><span class="n">stats</span><span class="p">[</span><span class="s2">&quot;strategy&quot;</span><span class="p">][</span><span class="n">strategy</span><span class="p">][</span><span class="s2">&quot;results_per_pair&quot;</span><span class="p">])</span>
<span class="c1"># Get pairlist used for this backtest</span>
<span class="nb">print</span><span class="p">(</span><span class="n">stats</span><span class="p">[</span><span class="s2">&quot;strategy&quot;</span><span class="p">][</span><span class="n">strategy</span><span class="p">][</span><span class="s2">&quot;pairlist&quot;</span><span class="p">])</span>
<span class="c1"># Get market change (average change of all pairs from start to end of the backtest period)</span>
<span class="nb">print</span><span class="p">(</span><span class="n">stats</span><span class="p">[</span><span class="s2">&quot;strategy&quot;</span><span class="p">][</span><span class="n">strategy</span><span class="p">][</span><span class="s2">&quot;market_change&quot;</span><span class="p">])</span>
<span class="c1"># Maximum drawdown ()</span>
<span class="nb">print</span><span class="p">(</span><span class="n">stats</span><span class="p">[</span><span class="s2">&quot;strategy&quot;</span><span class="p">][</span><span class="n">strategy</span><span class="p">][</span><span class="s2">&quot;max_drawdown_abs&quot;</span><span class="p">])</span>
<span class="c1"># Maximum drawdown start and end</span>
<span class="nb">print</span><span class="p">(</span><span class="n">stats</span><span class="p">[</span><span class="s2">&quot;strategy&quot;</span><span class="p">][</span><span class="n">strategy</span><span class="p">][</span><span class="s2">&quot;drawdown_start&quot;</span><span class="p">])</span>
<span class="nb">print</span><span class="p">(</span><span class="n">stats</span><span class="p">[</span><span class="s2">&quot;strategy&quot;</span><span class="p">][</span><span class="n">strategy</span><span class="p">][</span><span class="s2">&quot;drawdown_end&quot;</span><span class="p">])</span>
<span class="c1"># Get strategy comparison (only relevant if multiple strategies were compared)</span>
<span class="nb">print</span><span class="p">(</span><span class="n">stats</span><span class="p">[</span><span class="s2">&quot;strategy_comparison&quot;</span><span class="p">])</span>
</code></pre></div>
<div class="highlight"><pre><span></span><code><span class="c1"># Load backtested trades as dataframe</span>
<span class="n">trades</span> <span class="o">=</span> <span class="n">load_backtest_data</span><span class="p">(</span><span class="n">backtest_dir</span><span class="p">)</span>
<span class="c1"># Show value-counts per pair</span>
<span class="n">trades</span><span class="o">.</span><span class="n">groupby</span><span class="p">(</span><span class="s2">&quot;pair&quot;</span><span class="p">)[</span><span class="s2">&quot;exit_reason&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">value_counts</span><span class="p">()</span>
</code></pre></div>
<h2 id="plotting-daily-profit-equity-line">Plotting daily profit / equity line<a class="headerlink" href="#plotting-daily-profit-equity-line" title="Permanent link">&para;</a></h2>
<p>```python</p>
<h1 id="plotting-equity-line-starting-with-0-on-day-1-and-adding-daily-profit-for-each-backtested-day">Plotting equity line (starting with 0 on day 1 and adding daily profit for each backtested day)<a class="headerlink" href="#plotting-equity-line-starting-with-0-on-day-1-and-adding-daily-profit-for-each-backtested-day" title="Permanent link">&para;</a></h1>
<p>import pandas as pd
import plotly.express as px</p>
<p>from freqtrade.configuration import Configuration
from freqtrade.data.btanalysis import load_backtest_stats</p>
<h1 id="strategy-samplestrategy">strategy = 'SampleStrategy'<a class="headerlink" href="#strategy-samplestrategy" title="Permanent link">&para;</a></h1>
<h1 id="config-configurationfrom_filesuser_dataconfigjson_1">config = Configuration.from_files(["user_data/config.json"])<a class="headerlink" href="#config-configurationfrom_filesuser_dataconfigjson_1" title="Permanent link">&para;</a></h1>
<h1 id="backtest_dir-configuser_data_dir-backtest_results">backtest_dir = config["user_data_dir"] / "backtest_results"<a class="headerlink" href="#backtest_dir-configuser_data_dir-backtest_results" title="Permanent link">&para;</a></h1>
<p>stats = load_backtest_stats(backtest_dir)
strategy_stats = stats["strategy"][strategy]</p>
<p>df = pd.DataFrame(columns=["dates", "equity"], data=strategy_stats["daily_profit"])
df["equity_daily"] = df["equity"].cumsum()</p>
<p>fig = px.line(df, x="dates", y="equity_daily")
fig.show()
```</p>
<div class="highlight"><pre><span></span><code><span class="c1"># Plotting equity line (starting with 0 on day 1 and adding daily profit for each backtested day)</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">pandas</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">pd</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">plotly.express</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">px</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">freqtrade.configuration</span><span class="w"> </span><span class="kn">import</span> <span class="n">Configuration</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">freqtrade.data.btanalysis</span><span class="w"> </span><span class="kn">import</span> <span class="n">load_backtest_stats</span>
<span class="c1"># strategy = &#39;SampleStrategy&#39;</span>
<span class="c1"># config = Configuration.from_files([&quot;user_data/config.json&quot;])</span>
<span class="c1"># backtest_dir = config[&quot;user_data_dir&quot;] / &quot;backtest_results&quot;</span>
<span class="n">stats</span> <span class="o">=</span> <span class="n">load_backtest_stats</span><span class="p">(</span><span class="n">backtest_dir</span><span class="p">)</span>
<span class="n">strategy_stats</span> <span class="o">=</span> <span class="n">stats</span><span class="p">[</span><span class="s2">&quot;strategy&quot;</span><span class="p">][</span><span class="n">strategy</span><span class="p">]</span>
<span class="n">df</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="p">(</span><span class="n">columns</span><span class="o">=</span><span class="p">[</span><span class="s2">&quot;dates&quot;</span><span class="p">,</span> <span class="s2">&quot;equity&quot;</span><span class="p">],</span> <span class="n">data</span><span class="o">=</span><span class="n">strategy_stats</span><span class="p">[</span><span class="s2">&quot;daily_profit&quot;</span><span class="p">])</span>
<span class="n">df</span><span class="p">[</span><span class="s2">&quot;equity_daily&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">df</span><span class="p">[</span><span class="s2">&quot;equity&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">cumsum</span><span class="p">()</span>
<span class="n">fig</span> <span class="o">=</span> <span class="n">px</span><span class="o">.</span><span class="n">line</span><span class="p">(</span><span class="n">df</span><span class="p">,</span> <span class="n">x</span><span class="o">=</span><span class="s2">&quot;dates&quot;</span><span class="p">,</span> <span class="n">y</span><span class="o">=</span><span class="s2">&quot;equity_daily&quot;</span><span class="p">)</span>
<span class="n">fig</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
</code></pre></div>
<h3 id="load-live-trading-results-into-a-pandas-dataframe">Load live trading results into a pandas dataframe<a class="headerlink" href="#load-live-trading-results-into-a-pandas-dataframe" title="Permanent link">&para;</a></h3>
<p>In case you did already some trading and want to analyze your performance</p>
<p>```python
from freqtrade.data.btanalysis import load_trades_from_db</p>
<h1 id="fetch-trades-from-database">Fetch trades from database<a class="headerlink" href="#fetch-trades-from-database" title="Permanent link">&para;</a></h1>
<p>trades = load_trades_from_db("sqlite:///tradesv3.sqlite")</p>
<h1 id="display-results">Display results<a class="headerlink" href="#display-results" title="Permanent link">&para;</a></h1>
<p>trades.groupby("pair")["exit_reason"].value_counts()
```</p>
<div class="highlight"><pre><span></span><code><span class="kn">from</span><span class="w"> </span><span class="nn">freqtrade.data.btanalysis</span><span class="w"> </span><span class="kn">import</span> <span class="n">load_trades_from_db</span>
<span class="c1"># Fetch trades from database</span>
<span class="n">trades</span> <span class="o">=</span> <span class="n">load_trades_from_db</span><span class="p">(</span><span class="s2">&quot;sqlite:///tradesv3.sqlite&quot;</span><span class="p">)</span>
<span class="c1"># Display results</span>
<span class="n">trades</span><span class="o">.</span><span class="n">groupby</span><span class="p">(</span><span class="s2">&quot;pair&quot;</span><span class="p">)[</span><span class="s2">&quot;exit_reason&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">value_counts</span><span class="p">()</span>
</code></pre></div>
<h2 id="analyze-the-loaded-trades-for-trade-parallelism">Analyze the loaded trades for trade parallelism<a class="headerlink" href="#analyze-the-loaded-trades-for-trade-parallelism" title="Permanent link">&para;</a></h2>
<p>This can be useful to find the best <code>max_open_trades</code> parameter, when used with backtesting in conjunction with a very high <code>max_open_trades</code> setting.</p>
<p><code>analyze_trade_parallelism()</code> returns a timeseries dataframe with an "open_trades" column, specifying the number of open trades for each candle.</p>
<p>```python
from freqtrade.data.btanalysis import analyze_trade_parallelism</p>
<h1 id="analyze-the-above">Analyze the above<a class="headerlink" href="#analyze-the-above" title="Permanent link">&para;</a></h1>
<p>parallel_trades = analyze_trade_parallelism(trades, "5m")</p>
<p>parallel_trades.plot()
```</p>
<div class="highlight"><pre><span></span><code><span class="kn">from</span><span class="w"> </span><span class="nn">freqtrade.data.btanalysis</span><span class="w"> </span><span class="kn">import</span> <span class="n">analyze_trade_parallelism</span>
<span class="c1"># Analyze the above</span>
<span class="n">parallel_trades</span> <span class="o">=</span> <span class="n">analyze_trade_parallelism</span><span class="p">(</span><span class="n">trades</span><span class="p">,</span> <span class="s2">&quot;5m&quot;</span><span class="p">)</span>
<span class="n">parallel_trades</span><span class="o">.</span><span class="n">plot</span><span class="p">()</span>
</code></pre></div>
<h2 id="plot-results">Plot results<a class="headerlink" href="#plot-results" title="Permanent link">&para;</a></h2>
<p>Freqtrade offers interactive plotting capabilities based on plotly.</p>
<p>```python
from freqtrade.plot.plotting import generate_candlestick_graph</p>
<h1 id="limit-graph-period-to-keep-plotly-quick-and-reactive">Limit graph period to keep plotly quick and reactive<a class="headerlink" href="#limit-graph-period-to-keep-plotly-quick-and-reactive" title="Permanent link">&para;</a></h1>
<h1 id="filter-trades-to-one-pair">Filter trades to one pair<a class="headerlink" href="#filter-trades-to-one-pair" title="Permanent link">&para;</a></h1>
<p>trades_red = trades.loc[trades["pair"] == pair]</p>
<p>data_red = data["2019-06-01":"2019-06-10"]</p>
<h1 id="generate-candlestick-graph">Generate candlestick graph<a class="headerlink" href="#generate-candlestick-graph" title="Permanent link">&para;</a></h1>
<p>graph = generate_candlestick_graph(
pair=pair,
data=data_red,
trades=trades_red,
indicators1=["sma20", "ema50", "ema55"],
indicators2=["rsi", "macd", "macdsignal", "macdhist"],
)
```</p>
<p>```python</p>
<h1 id="show-graph-inline">Show graph inline<a class="headerlink" href="#show-graph-inline" title="Permanent link">&para;</a></h1>
<h1 id="graphshow">graph.show()<a class="headerlink" href="#graphshow" title="Permanent link">&para;</a></h1>
<h1 id="render-graph-in-a-separate-window">Render graph in a separate window<a class="headerlink" href="#render-graph-in-a-separate-window" title="Permanent link">&para;</a></h1>
<p>graph.show(renderer="browser")
```</p>
<div class="highlight"><pre><span></span><code><span class="kn">from</span><span class="w"> </span><span class="nn">freqtrade.plot.plotting</span><span class="w"> </span><span class="kn">import</span> <span class="n">generate_candlestick_graph</span>
<span class="c1"># Limit graph period to keep plotly quick and reactive</span>
<span class="c1"># Filter trades to one pair</span>
<span class="n">trades_red</span> <span class="o">=</span> <span class="n">trades</span><span class="o">.</span><span class="n">loc</span><span class="p">[</span><span class="n">trades</span><span class="p">[</span><span class="s2">&quot;pair&quot;</span><span class="p">]</span> <span class="o">==</span> <span class="n">pair</span><span class="p">]</span>
<span class="n">data_red</span> <span class="o">=</span> <span class="n">data</span><span class="p">[</span><span class="s2">&quot;2019-06-01&quot;</span><span class="p">:</span><span class="s2">&quot;2019-06-10&quot;</span><span class="p">]</span>
<span class="c1"># Generate candlestick graph</span>
<span class="n">graph</span> <span class="o">=</span> <span class="n">generate_candlestick_graph</span><span class="p">(</span>
<span class="n">pair</span><span class="o">=</span><span class="n">pair</span><span class="p">,</span>
<span class="n">data</span><span class="o">=</span><span class="n">data_red</span><span class="p">,</span>
<span class="n">trades</span><span class="o">=</span><span class="n">trades_red</span><span class="p">,</span>
<span class="n">indicators1</span><span class="o">=</span><span class="p">[</span><span class="s2">&quot;sma20&quot;</span><span class="p">,</span> <span class="s2">&quot;ema50&quot;</span><span class="p">,</span> <span class="s2">&quot;ema55&quot;</span><span class="p">],</span>
<span class="n">indicators2</span><span class="o">=</span><span class="p">[</span><span class="s2">&quot;rsi&quot;</span><span class="p">,</span> <span class="s2">&quot;macd&quot;</span><span class="p">,</span> <span class="s2">&quot;macdsignal&quot;</span><span class="p">,</span> <span class="s2">&quot;macdhist&quot;</span><span class="p">],</span>
<span class="p">)</span>
</code></pre></div>
<div class="highlight"><pre><span></span><code><span class="c1"># Show graph inline</span>
<span class="c1"># graph.show()</span>
<span class="c1"># Render graph in a separate window</span>
<span class="n">graph</span><span class="o">.</span><span class="n">show</span><span class="p">(</span><span class="n">renderer</span><span class="o">=</span><span class="s2">&quot;browser&quot;</span><span class="p">)</span>
</code></pre></div>
<h2 id="plot-average-profit-per-trade-as-distribution-graph">Plot average profit per trade as distribution graph<a class="headerlink" href="#plot-average-profit-per-trade-as-distribution-graph" title="Permanent link">&para;</a></h2>
<p>```python
import plotly.figure_factory as ff</p>
<p>hist_data = [trades.profit_ratio]
group_labels = ["profit_ratio"] # name of the dataset</p>
<p>fig = ff.create_distplot(hist_data, group_labels, bin_size=0.01)
fig.show()
```</p>
<div class="highlight"><pre><span></span><code><span class="kn">import</span><span class="w"> </span><span class="nn">plotly.figure_factory</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">ff</span>
<span class="n">hist_data</span> <span class="o">=</span> <span class="p">[</span><span class="n">trades</span><span class="o">.</span><span class="n">profit_ratio</span><span class="p">]</span>
<span class="n">group_labels</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;profit_ratio&quot;</span><span class="p">]</span> <span class="c1"># name of the dataset</span>
<span class="n">fig</span> <span class="o">=</span> <span class="n">ff</span><span class="o">.</span><span class="n">create_distplot</span><span class="p">(</span><span class="n">hist_data</span><span class="p">,</span> <span class="n">group_labels</span><span class="p">,</span> <span class="n">bin_size</span><span class="o">=</span><span class="mf">0.01</span><span class="p">)</span>
<span class="n">fig</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
</code></pre></div>
<p>Feel free to submit an issue or Pull Request enhancing this document if you would like to share ideas on how to best analyze the data.</p>