Automatically generate documentation from jupyter notebook
This commit is contained in:
parent
74a0f44230
commit
9a3bad291a
@ -135,78 +135,9 @@ print(f"Loaded len(candles) rows of data for {pair} from {data_location}")
|
|||||||
candles.head()
|
candles.head()
|
||||||
```
|
```
|
||||||
|
|
||||||
## Strategy debugging example
|
Further Data analysis documents:
|
||||||
|
|
||||||
Debugging a strategy can be time-consuming. FreqTrade offers helper functions to visualize raw data.
|
* [Strategy debugging](strategy_analysis_example.md)
|
||||||
|
* [Plotting](plotting.md)
|
||||||
### Define variables used in analyses
|
|
||||||
|
|
||||||
You can override strategy settings as demonstrated below.
|
|
||||||
|
|
||||||
```python
|
|
||||||
# Customize these according to your needs.
|
|
||||||
|
|
||||||
# Define some constants
|
|
||||||
ticker_interval = "5m"
|
|
||||||
# Name of the strategy class
|
|
||||||
strategy_name = 'SampleStrategy'
|
|
||||||
# Path to user data
|
|
||||||
user_data_dir = 'user_data'
|
|
||||||
# Location of the strategy
|
|
||||||
strategy_location = Path(user_data_dir, 'strategies')
|
|
||||||
# Location of the data
|
|
||||||
data_location = Path(user_data_dir, 'data', 'binance')
|
|
||||||
# Pair to analyze - Only use one pair here
|
|
||||||
pair = "BTC_USDT"
|
|
||||||
```
|
|
||||||
|
|
||||||
### Load exchange data
|
|
||||||
|
|
||||||
```python
|
|
||||||
from pathlib import Path
|
|
||||||
from freqtrade.data.history import load_pair_history
|
|
||||||
|
|
||||||
# Load data using values set above
|
|
||||||
candles = load_pair_history(datadir=data_location,
|
|
||||||
ticker_interval=ticker_interval,
|
|
||||||
pair=pair)
|
|
||||||
|
|
||||||
# Confirm success
|
|
||||||
print(f"Loaded {len(candles)} rows of data for {pair} from {data_location}")
|
|
||||||
candles.head()
|
|
||||||
```
|
|
||||||
|
|
||||||
### Load and run strategy
|
|
||||||
|
|
||||||
* Rerun each time the strategy file is changed
|
|
||||||
|
|
||||||
```python
|
|
||||||
from freqtrade.resolvers import StrategyResolver
|
|
||||||
|
|
||||||
# Load strategy using values set above
|
|
||||||
strategy = StrategyResolver({'strategy': strategy_name,
|
|
||||||
'user_data_dir': user_data_dir,
|
|
||||||
'strategy_path': strategy_location}).strategy
|
|
||||||
|
|
||||||
# Generate buy/sell signals using strategy
|
|
||||||
df = strategy.analyze_ticker(candles, {'pair': pair})
|
|
||||||
```
|
|
||||||
|
|
||||||
### Display the trade details
|
|
||||||
|
|
||||||
* Note that using `data.tail()` is preferable to `data.head()` as 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
|
|
||||||
* Comparison with full backtest
|
|
||||||
* having 200 buy signals as output for one pair from `analyze_ticker()` does not necessarily mean that 200 trades will be made during backtesting.
|
|
||||||
* Assuming you use only one condition such as, `df['rsi'] < 30` as buy condition, this will generate multiple "buy" signals for each pair in sequence (until rsi returns > 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.
|
|
||||||
|
|
||||||
```python
|
|
||||||
# Report results
|
|
||||||
print(f"Generated {df['buy'].sum()} buy signals")
|
|
||||||
data = df.set_index('date', drop=True)
|
|
||||||
data.tail()
|
|
||||||
```
|
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
@ -149,6 +149,14 @@ print(datetime.utcnow())
|
|||||||
The output will show the last entry from the Exchange as well as the current UTC date.
|
The output will show the last entry from the Exchange as well as the current UTC date.
|
||||||
If the day shows the same day, then the last candle can be assumed as incomplete and should be dropped (leave the setting `"ohlcv_partial_candle"` from the exchange-class untouched / True). Otherwise, set `"ohlcv_partial_candle"` to `False` to not drop Candles (shown in the example above).
|
If the day shows the same day, then the last candle can be assumed as incomplete and should be dropped (leave the setting `"ohlcv_partial_candle"` from the exchange-class untouched / True). Otherwise, set `"ohlcv_partial_candle"` to `False` to not drop Candles (shown in the example above).
|
||||||
|
|
||||||
|
## Updating example notebooks
|
||||||
|
|
||||||
|
To keep the jupyter notebooks aligned with the documentation, the following should be ran after updating a example notebook.
|
||||||
|
|
||||||
|
``` bash
|
||||||
|
jupyter nbconvert --to markdown user_data/notebooks/strategy_analysis_example.ipynb --stdout > docs/strategy_analysis_example.md
|
||||||
|
```
|
||||||
|
|
||||||
## Creating a release
|
## Creating a release
|
||||||
|
|
||||||
This part of the documentation is aimed at maintainers, and shows how to create a release.
|
This part of the documentation is aimed at maintainers, and shows how to create a release.
|
||||||
|
95
docs/strategy_analysis_example.md
Normal file
95
docs/strategy_analysis_example.md
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
## Strategy debugging example
|
||||||
|
|
||||||
|
Debugging a strategy can be time-consuming. FreqTrade offers helper functions to visualize raw data.
|
||||||
|
|
||||||
|
## Setup
|
||||||
|
|
||||||
|
```python
|
||||||
|
# Change directory
|
||||||
|
# Modify this cell to insure that the output shows the correct path.
|
||||||
|
import os
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
# Define all paths relative to the project root shown in the cell output
|
||||||
|
project_root = "somedir/freqtrade"
|
||||||
|
i=0
|
||||||
|
try:
|
||||||
|
os.chdirdir(project_root)
|
||||||
|
assert Path('LICENSE').is_file()
|
||||||
|
except:
|
||||||
|
while i<4 and (not Path('LICENSE').is_file()):
|
||||||
|
os.chdir(Path(Path.cwd(), '../'))
|
||||||
|
i+=1
|
||||||
|
project_root = Path.cwd()
|
||||||
|
print(Path.cwd())
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
```python
|
||||||
|
# Customize these according to your needs.
|
||||||
|
|
||||||
|
# Define some constants
|
||||||
|
ticker_interval = "5m"
|
||||||
|
# Name of the strategy class
|
||||||
|
strategy_name = 'SampleStrategy'
|
||||||
|
# Path to user data
|
||||||
|
user_data_dir = 'user_data'
|
||||||
|
# Location of the strategy
|
||||||
|
strategy_location = Path(user_data_dir, 'strategies')
|
||||||
|
# Location of the data
|
||||||
|
data_location = Path(user_data_dir, 'data', 'binance')
|
||||||
|
# Pair to analyze - Only use one pair here
|
||||||
|
pair = "BTC_USDT"
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
```python
|
||||||
|
# Load data using values set above
|
||||||
|
from pathlib import Path
|
||||||
|
from freqtrade.data.history import load_pair_history
|
||||||
|
|
||||||
|
candles = load_pair_history(datadir=data_location,
|
||||||
|
ticker_interval=ticker_interval,
|
||||||
|
pair=pair)
|
||||||
|
|
||||||
|
# Confirm success
|
||||||
|
print("Loaded " + str(len(candles)) + f" rows of data for {pair} from {data_location}")
|
||||||
|
candles.head()
|
||||||
|
```
|
||||||
|
|
||||||
|
## Load and run strategy
|
||||||
|
* Rerun each time the strategy file is changed
|
||||||
|
|
||||||
|
|
||||||
|
```python
|
||||||
|
# Load strategy using values set above
|
||||||
|
from freqtrade.resolvers import StrategyResolver
|
||||||
|
strategy = StrategyResolver({'strategy': strategy_name,
|
||||||
|
'user_data_dir': user_data_dir,
|
||||||
|
'strategy_path': strategy_location}).strategy
|
||||||
|
|
||||||
|
# Generate buy/sell signals using strategy
|
||||||
|
df = strategy.analyze_ticker(candles, {'pair': pair})
|
||||||
|
df.tail()
|
||||||
|
```
|
||||||
|
|
||||||
|
### 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
|
||||||
|
* Comparison with full backtest
|
||||||
|
* having 200 buy signals as output for one pair from `analyze_ticker()` does not necessarily mean that 200 trades will be made during backtesting.
|
||||||
|
* Assuming you use only one condition such as, `df['rsi'] < 30` as buy condition, this will generate multiple "buy" signals for each pair in sequence (until rsi returns > 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.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
```python
|
||||||
|
# Report results
|
||||||
|
print(f"Generated {df['buy'].sum()} buy signals")
|
||||||
|
data = df.set_index('date', drop=True)
|
||||||
|
data.tail()
|
||||||
|
```
|
||||||
|
|
||||||
|
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.
|
@ -15,8 +15,10 @@ nav:
|
|||||||
- Hyperopt: hyperopt.md
|
- Hyperopt: hyperopt.md
|
||||||
- Edge positioning: edge.md
|
- Edge positioning: edge.md
|
||||||
- FAQ: faq.md
|
- FAQ: faq.md
|
||||||
- Data Analysis: data-analysis.md
|
- Data Analysis:
|
||||||
- Plotting: plotting.md
|
- Jupyter Notebooks: data-analysis.md
|
||||||
|
- Strategy analysis: strategy_analysis_example.md
|
||||||
|
- Plotting: plotting.md
|
||||||
- SQL Cheatsheet: sql_cheatsheet.md
|
- SQL Cheatsheet: sql_cheatsheet.md
|
||||||
- Sandbox testing: sandbox-testing.md
|
- Sandbox testing: sandbox-testing.md
|
||||||
- Deprecated features: deprecated.md
|
- Deprecated features: deprecated.md
|
||||||
|
@ -12,3 +12,6 @@ pytest-asyncio==0.10.0
|
|||||||
pytest-cov==2.7.1
|
pytest-cov==2.7.1
|
||||||
pytest-mock==1.10.4
|
pytest-mock==1.10.4
|
||||||
pytest-random-order==1.0.4
|
pytest-random-order==1.0.4
|
||||||
|
|
||||||
|
# Convert jupyter notebooks to markdown documents
|
||||||
|
nbconvert==5.6.0
|
||||||
|
Loading…
Reference in New Issue
Block a user