improve performance and documentation of spice-rack.

This commit is contained in:
robcaulk 2022-10-08 12:45:49 +02:00
parent d362332527
commit 06f4f2db0a
5 changed files with 75 additions and 7 deletions

68
docs/freqai-spice-rack.md Normal file
View File

@ -0,0 +1,68 @@
# Using the `spice_rack`
The `spice_rack` is aimed at users who do not wish to deal with setting up `FreqAI` confgs, but instead prefer to interact with `FreqAI` similar to a `talib` indicator. In this case, the user can instead simply add two keys to their config:
```json
"freqai_spice_rack": true,
"freqai_identifier": "spicey-id",
```
Which tells `FreqAI` to set up a pre-set `FreqAI` instance automatically under the hood with preset parameters. Now the user can access a suite of custom `FreqAI` supercharged indicators inside their strategy:
```python
dataframe['dissimilarity_index'] = self.freqai.spice_rack(
'DI_values', dataframe, metadata, self)
dataframe['extrema'] = self.freqai.spice_rack(
'&s-extrema', dataframe, metadata, self)
self.freqai.close_spice_rack() # user must close the spicerack
```
Users can then use these columns, concert with all their own additional indicators added to `populate_indicators` in their entry/exit criteria and strategy callback methods the same way as any typical indicator (note: `spice_rack` indicators should not be used exclusively for entries and exits, the following example is just a demonstration of syntax. `spice_rack` indicators should **always** be used to support existing strategies). For example:
```python
def populate_entry_trend(self, df: DataFrame, metadata: dict) -> DataFrame:
df.loc[
(
(df['dissimilarity_index'] < 1) &
(df['extrema'] > 0.1)
),
'enter_long'] = 1
df.loc[
(
(df['dissimilarity_index'] < 1) &
(df['extrema'] <> -0.1)
),
'enter_short'] = 1
return df
def populate_exit_trend(self, df: DataFrame, metadata: dict) -> DataFrame:
df.loc[
(
(df['dissimilarity_index'] < 1) &
(df['extrema'] > 0.1)
),
'exit_long'] = 1
df.loc[
(
(df['dissimilarity_index'] < 1) &
(df['extrema'] < -0.1)
),
'exit_short'] = 1
return df
```
## Available indicators
| Parameter | Description |
|------------|-------------|
| `DI_values` | **Required.** <br> The dissimilarity index of the current candle to the recent candles. More information available [here](freqai-feature-engineering.md#identifying-outliers-with-the-dissimilarity-index-di) <br> **Datatype:** Floats.
| `extrema` | **Required.** <br> A continuous prediction from FreqAI which aims to help predict if the current candle is a maxima or a minma. FreqAI aims for 1 to be a maxima and -1 to be a minima - but the values should typically hover between -0.2 and 0.2. <br> **Datatype:** Floats.

View File

@ -1262,7 +1262,7 @@ class FreqaiDataKitchen:
return file_exists return file_exists
def spice_extractor(self, indicator: str, dataframe: DataFrame) -> npt.NDArray: def spice_extractor(self, indicator: str, dataframe: DataFrame) -> npt.NDArray:
if indicator in dataframe: if indicator in dataframe.columns:
return np.array(dataframe[indicator]) return np.array(dataframe[indicator])
else: else:
logger.warning(f'User asked spice_rack for {indicator}, ' logger.warning(f'User asked spice_rack for {indicator}, '

View File

@ -4,7 +4,7 @@
"enabled": true, "enabled": true,
"purge_old_models": true, "purge_old_models": true,
"train_period_days": 4, "train_period_days": 4,
"backtest_period_days": 2, "backtest_period_days": 1,
"identifier": "spicy-id", "identifier": "spicy-id",
"feature_parameters": { "feature_parameters": {
"include_timeframes": [ "include_timeframes": [

View File

@ -160,14 +160,13 @@ def auto_populate_any_indicators(
if set_generalized_indicators: if set_generalized_indicators:
df["%-day_of_week"] = (df["date"].dt.dayofweek + 1) / 7 df["%-day_of_week"] = (df["date"].dt.dayofweek + 1) / 7
df["%-hour_of_day"] = (df["date"].dt.hour + 1) / 25 df["%-hour_of_day"] = (df["date"].dt.hour + 1) / 25
df["&s-minima"] = 0 df["&s-extrema"] = 0
df["&s-maxima"] = 0
min_peaks = argrelextrema(df["close"].values, np.less, order=80) min_peaks = argrelextrema(df["close"].values, np.less, order=80)
max_peaks = argrelextrema(df["close"].values, np.greater, order=80) max_peaks = argrelextrema(df["close"].values, np.greater, order=80)
for mp in min_peaks[0]: for mp in min_peaks[0]:
df.at[mp, "&s-minima"] = 1 df.at[mp, "&s-extrema"] = -1
for mp in max_peaks[0]: for mp in max_peaks[0]:
df.at[mp, "&s-maxima"] = 1 df.at[mp, "&s-extrema"] = 1
return df return df
@ -222,7 +221,7 @@ def setup_freqai_spice_rack(config: dict, exchange: Optional[Exchange]) -> Dict[
config['freqai']['feature_parameters'].update({'include_timeframes': new_tfs}) config['freqai']['feature_parameters'].update({'include_timeframes': new_tfs})
config['freqai']['feature_parameters'].update({'include_corr_pairlist': new_corr_pairs}) config['freqai']['feature_parameters'].update({'include_corr_pairlist': new_corr_pairs})
config.update({"freqaimodel": 'LightGBMRegressorMultiTarget'}) config.update({"freqaimodel": 'LightGBMRegressor'})
return config return config
# Keep below for when we wish to download heterogeneously lengthed data for FreqAI. # Keep below for when we wish to download heterogeneously lengthed data for FreqAI.

View File

@ -29,6 +29,7 @@ nav:
- Parameter table: freqai-parameter-table.md - Parameter table: freqai-parameter-table.md
- Feature engineering: freqai-feature-engineering.md - Feature engineering: freqai-feature-engineering.md
- Running FreqAI: freqai-running.md - Running FreqAI: freqai-running.md
- Spice Rack: freqai-spice-rack.md
- Developer guide: freqai-developers.md - Developer guide: freqai-developers.md
- Short / Leverage: leverage.md - Short / Leverage: leverage.md
- Utility Sub-commands: utils.md - Utility Sub-commands: utils.md