2026-04-03 14:10:44 +02:00
|
|
|
"""
|
|
|
|
|
Qlib Factor Coder - Generates trading factors using LLM.
|
|
|
|
|
|
|
|
|
|
Integrates with technical indicators module to provide
|
|
|
|
|
available indicator functions for factor implementation.
|
|
|
|
|
"""
|
|
|
|
|
|
2024-11-25 16:27:34 +08:00
|
|
|
from rdagent.components.coder.factor_coder import FactorCoSTEER
|
2026-04-03 14:10:44 +02:00
|
|
|
from rdagent.core.scenario import Scenario
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Technical indicators documentation string for LLM prompts
|
|
|
|
|
TECHNICAL_INDICATORS_DOCSTRING = """
|
|
|
|
|
## Available Technical Indicator Functions
|
|
|
|
|
|
|
|
|
|
You can use these pre-implemented technical indicators in your factor implementations:
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
|
from rdagent.components.coder.rl.indicators import (
|
|
|
|
|
calculate_rsi, # Relative Strength Index (0-100, overbought/oversold)
|
|
|
|
|
calculate_macd, # MACD (Moving Average Convergence Divergence)
|
|
|
|
|
calculate_bollinger_bands, # Bollinger Bands (upper, middle, lower)
|
|
|
|
|
calculate_cci, # Commodity Channel Index
|
|
|
|
|
calculate_atr, # Average True Range (volatility)
|
|
|
|
|
prepare_features # Combine all indicators
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
# Example usage:
|
|
|
|
|
rsi = calculate_rsi(df['close'], period=14)
|
|
|
|
|
macd_df = calculate_macd(df['close'])
|
|
|
|
|
bb_df = calculate_bollinger_bands(df['close'], period=20, std_dev=2.0)
|
|
|
|
|
cci = calculate_cci(df['close'], df['high'], df['low'], period=20)
|
|
|
|
|
atr = calculate_atr(df['high'], df['low'], df['close'], period=14)
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
All functions return pandas Series or DataFrames ready to be used as factor values.
|
|
|
|
|
|
|
|
|
|
### Indicator Descriptions
|
|
|
|
|
|
|
|
|
|
- **RSI (Relative Strength Index)**: Momentum oscillator, range 0-100.
|
|
|
|
|
- Above 70 = overbought (potential reversal down)
|
|
|
|
|
- Below 30 = oversold (potential reversal up)
|
|
|
|
|
|
|
|
|
|
- **MACD (Moving Average Convergence Divergence)**: Trend-following momentum.
|
|
|
|
|
- Returns DataFrame with 'macd', 'signal', 'histogram' columns
|
|
|
|
|
- Crossovers indicate potential trend changes
|
|
|
|
|
|
|
|
|
|
- **Bollinger Bands**: Volatility bands around moving average.
|
|
|
|
|
- Returns DataFrame with 'upper', 'middle', 'lower' columns
|
|
|
|
|
- Price near upper band = potentially overbought
|
|
|
|
|
- Price near lower band = potentially oversold
|
|
|
|
|
|
|
|
|
|
- **CCI (Commodity Channel Index)**: Momentum oscillator.
|
|
|
|
|
- Above +100 = overbought
|
|
|
|
|
- Below -100 = oversold
|
|
|
|
|
|
|
|
|
|
- **ATR (Average True Range)**: Volatility measure.
|
|
|
|
|
- Higher values = more volatile market
|
|
|
|
|
- Useful for dynamic stop-loss placement
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class QlibFactorCoSTEER(FactorCoSTEER):
|
|
|
|
|
"""
|
|
|
|
|
Qlib-specific Factor Coder that includes technical indicators documentation.
|
|
|
|
|
|
|
|
|
|
Enhances the scenario with available technical indicator functions
|
|
|
|
|
so the LLM knows what tools it can use for factor generation.
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
def __init__(self, scen: Scenario, *args, **kwargs) -> None:
|
|
|
|
|
# Add technical indicators documentation to scenario
|
|
|
|
|
if hasattr(scen, "factor_knowledge"):
|
|
|
|
|
scen.factor_knowledge += TECHNICAL_INDICATORS_DOCSTRING
|
|
|
|
|
elif hasattr(scen, "__dict__"):
|
|
|
|
|
scen.technical_indicators_doc = TECHNICAL_INDICATORS_DOCSTRING
|
|
|
|
|
|
|
|
|
|
super().__init__(scen, *args, **kwargs)
|
|
|
|
|
|
2024-06-28 11:45:23 +08:00
|
|
|
|
2026-04-03 14:10:44 +02:00
|
|
|
# Keep the alias for backward compatibility
|
|
|
|
|
QlibFactorCoSTEER = QlibFactorCoSTEER
|