93 lines
2.9 KiB
Markdown
93 lines
2.9 KiB
Markdown
# Analyzing bot data
|
|
|
|
You can analyze the results of backtests and trading history easily using Jupyter notebooks. A sample notebook is located at `user_data/notebooks/analysis_example.ipynb`. For usage instructions, see [jupyter.org](https://jupyter.org/documentation).
|
|
|
|
## Strategy debugging example
|
|
|
|
Debugging a strategy can be time-consuming. FreqTrade offers helper functions to visualize raw data.
|
|
|
|
### Import requirements and define variables used in the script
|
|
|
|
```python
|
|
# Imports
|
|
from pathlib import Path
|
|
import os
|
|
from freqtrade.data.history import load_pair_history
|
|
from freqtrade.resolvers import StrategyResolver
|
|
from freqtrade.data.btanalysis import load_backtest_data
|
|
from freqtrade.data.btanalysis import load_trades_from_db
|
|
|
|
# Define some constants
|
|
ticker_interval = "1m"
|
|
# Name of the strategy class
|
|
strategy_name = 'NewStrategy'
|
|
# Path to user data
|
|
user_data_dir = 'user_data'
|
|
# Location of the strategy
|
|
strategy_location = os.path.join(user_data_dir, 'strategies')
|
|
# Location of the data
|
|
data_location = os.path.join(user_data_dir, 'data', 'binance')
|
|
# Pair to analyze
|
|
# Only use one pair here
|
|
pair = "BTC_USDT"
|
|
```
|
|
|
|
### Load exchange data
|
|
|
|
```python
|
|
# Load data using values set above
|
|
bt_data = load_pair_history(datadir=Path(data_location),
|
|
ticker_interval=ticker_interval,
|
|
pair=pair)
|
|
|
|
# Confirm success
|
|
print("Loaded " + str(len(bt_data)) + f" rows of data for {pair} from {data_location}")
|
|
```
|
|
|
|
### Load and run strategy
|
|
|
|
* Rerun each time the strategy file is changed
|
|
* Display the trade details. Note that using `data.head()` would also work, however most indicators have some "startup" data at the top of the dataframe.
|
|
|
|
Some possible problems:
|
|
|
|
* Columns with NaN values at the end of the dataframe
|
|
* Columns used in `crossed*()` functions with completely different units
|
|
|
|
```python
|
|
# Load strategy using values set above
|
|
strategy = StrategyResolver({'strategy': strategy_name,
|
|
'user_data_dir': user_data_dir,
|
|
'strategy_path': strategy_location}).strategy
|
|
|
|
# Run strategy (just like in backtesting)
|
|
df = strategy.analyze_ticker(bt_data, {'pair': pair})
|
|
|
|
# Report results
|
|
print(f"Generated {df['buy'].sum()} buy signals")
|
|
data = df.set_index('date', drop=True)
|
|
data.tail()
|
|
```
|
|
|
|
### Load backtest results into a pandas dataframe
|
|
|
|
```python
|
|
# Load backtest results
|
|
df = load_backtest_data("user_data/backtest_data/backtest-result.json")
|
|
|
|
# Show value-counts per pair
|
|
df.groupby("pair")["sell_reason"].value_counts()
|
|
```
|
|
|
|
### Load live trading results into a pandas dataframe
|
|
|
|
``` python
|
|
# Fetch trades from database
|
|
df = load_trades_from_db("sqlite:///tradesv3.sqlite")
|
|
|
|
# Display results
|
|
df.groupby("pair")["sell_reason"].value_counts()
|
|
```
|
|
|
|
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.
|