203 lines
6.2 KiB
Markdown
203 lines
6.2 KiB
Markdown
#交易 #量化交易 #策略研究 #freqtrade #DeepSeek
|
||
|
||
在 Freqtrade 框架内实现基于K线形态识别的策略是完全可行的,以下是几种高效的方法和工具:
|
||
|
||
### 一、Freqtrade 内置解决方案
|
||
|
||
#### 1. 技术指标形态识别
|
||
|
||
```python
|
||
import talib.abstract as ta
|
||
|
||
def populate_indicators(self, dataframe, metadata):
|
||
# 识别经典K线形态
|
||
dataframe['CDLDOJI'] = ta.CDLDOJI(dataframe) # 十字星
|
||
dataframe['CDLHAMMER'] = ta.CDLHAMMER(dataframe) # 锤头线
|
||
dataframe['CDLENGULFING'] = ta.CDLENGULFING(dataframe) # 吞没形态
|
||
|
||
# 识别趋势形态
|
||
dataframe['CDLMARUBOZU'] = ta.CDLMARUBOZU(dataframe) # 光头光脚
|
||
dataframe['CDL3WHITESOLDIERS'] = ta.CDL3WHITESOLDIERS(dataframe) # 三白兵
|
||
|
||
return dataframe
|
||
```
|
||
|
||
#### 2. 自定义形态检测
|
||
|
||
```python
|
||
def detect_pinbar(df):
|
||
"""检测Pinbar形态"""
|
||
body_size = abs(df['close'] - df['open'])
|
||
total_range = df['high'] - df['low']
|
||
upper_shadow = df['high'] - df[['open','close']].max(axis=1)
|
||
lower_shadow = df[['open','close']].min(axis=1) - df['low']
|
||
|
||
# Pinbar条件:实体小,影线长(至少2倍实体)
|
||
return (body_size/total_range < 0.3) & (
|
||
(upper_shadow > 2*body_size) | (lower_shadow > 2*body_size)
|
||
)
|
||
```
|
||
|
||
### 二、高级图形识别方案
|
||
|
||
#### 1. 模式识别库
|
||
|
||
```python
|
||
# 安装:pip install mplfinance
|
||
import mplfinance as mpf
|
||
|
||
def identify_chart_patterns(dataframe):
|
||
# 转换为mplfinance格式
|
||
df = dataframe.set_index('date')
|
||
mpf.plot(df, type='candle', style='charles', volume=True)
|
||
|
||
# 使用模式识别(需自定义扩展)
|
||
patterns = {
|
||
'head_shoulders': detect_head_shoulders(df),
|
||
'double_top': detect_double_top(df),
|
||
'triangle': detect_triangle(df)
|
||
}
|
||
return patterns
|
||
```
|
||
|
||
#### 2. 机器学习方法(CNN图像识别)
|
||
|
||
```python
|
||
import tensorflow as tf
|
||
from PIL import Image
|
||
|
||
class PatternCNNModel:
|
||
def __init__(self):
|
||
self.model = tf.keras.models.load_model('pattern_cnn.h5')
|
||
|
||
def convert_to_image(self, ohlc_data):
|
||
"""将K线数据转换为灰度图像"""
|
||
fig = plt.figure(figsize=(3,3))
|
||
ax = fig.add_subplot(1,1,1)
|
||
mpf.plot(ohlc_data, type='candle', ax=ax, style='charles')
|
||
fig.canvas.draw()
|
||
img = np.frombuffer(fig.canvas.tostring_rgb(), dtype=np.uint8)
|
||
img = img.reshape(fig.canvas.get_width_height()[::-1] + (3,))
|
||
return img[...,0] # 转为灰度图
|
||
|
||
def predict_pattern(self, image_data):
|
||
"""预测K线形态"""
|
||
img = self.convert_to_image(image_data)
|
||
return self.model.predict(np.expand_dims(img, axis=[0,-1]))
|
||
```
|
||
|
||
### 三、趋势/区间自动识别算法
|
||
|
||
#### 1. 基于波动率的市场状态检测
|
||
|
||
```python
|
||
def detect_market_regime(dataframe, period=50, threshold=0.5):
|
||
"""
|
||
根据波动率划分趋势/震荡市场
|
||
threshold: <0.5震荡市,>0.5趋势市
|
||
"""
|
||
atr = ta.ATR(dataframe, timeperiod=period)
|
||
stdev = dataframe['close'].rolling(period).std()
|
||
|
||
# 波动率比率指标
|
||
volatility_ratio = atr / stdev
|
||
return np.where(volatility_ratio > threshold, 'trend', 'range')
|
||
```
|
||
|
||
#### 2. 自动支撑阻力识别
|
||
|
||
```python
|
||
from scipy.signal import argrelextrema
|
||
|
||
def find_support_resistance(dataframe, order=5):
|
||
"""
|
||
自动寻找支撑阻力位
|
||
order: 两侧需要比较的K线数量
|
||
"""
|
||
highs = dataframe['high'].values
|
||
lows = dataframe['low'].values
|
||
|
||
# 寻找局部极值点
|
||
max_idx = argrelextrema(highs, np.greater, order=order)[0]
|
||
min_idx = argrelextrema(lows, np.less, order=order)[0]
|
||
|
||
return {
|
||
'supports': lows[min_idx],
|
||
'resistances': highs[max_idx]
|
||
}
|
||
```
|
||
|
||
### 四、Freqtrade集成最佳实践
|
||
|
||
```python
|
||
class AdvancedPatternStrategy(IStrategy):
|
||
def __init__(self, *args, **kwargs):
|
||
super().__init__(*args, **kwargs)
|
||
self.pattern_model = PatternCNNModel()
|
||
self.regime_history = []
|
||
|
||
def populate_indicators(self, df, metadata):
|
||
# 基本形态识别
|
||
df['market_regime'] = detect_market_regime(df)
|
||
|
||
# 每100根K线更新图形识别
|
||
if len(df) % 100 == 0:
|
||
recent_data = df.tail(50)
|
||
img_data = self.pattern_model.convert_to_image(recent_data)
|
||
df['pattern'] = self.pattern_model.predict_pattern(img_data)
|
||
|
||
# 记录市场状态变化
|
||
current_regime = df['market_regime'].iloc[-1]
|
||
if not self.regime_history or current_regime != self.regime_history[-1]:
|
||
self.regime_history.append((df['date'].iloc[-1], current_regime))
|
||
|
||
return df
|
||
|
||
def populate_entry_trend(self, df, metadata):
|
||
# 只在趋势市场做多
|
||
df.loc[
|
||
(df['market_regime'] == 'trend') &
|
||
(df['CDL3WHITESOLDIERS'] > 0),
|
||
'enter_long'] = 1
|
||
```
|
||
|
||
### 五、推荐工具栈
|
||
|
||
|工具类型|推荐工具|适用场景|
|
||
|---|---|---|
|
||
|**技术指标**|TA-Lib|经典K线形态识别|
|
||
|**模式识别**|SciPy, Scikit-learn|数学形态分析|
|
||
|**图像识别**|TensorFlow/Keras|AI图形模式识别|
|
||
|**可视化**|mplfinance, Plotly|K线图形生成|
|
||
|**波动分析**|PyWavelets|多尺度市场结构分析|
|
||
|
||
### 实施建议:
|
||
|
||
1. **分层识别系统**:
|
||
|
||
```
|
||
graph TD
|
||
A[原始K线] --> B(基础形态识别)
|
||
A --> C(波动率分析)
|
||
B --> D[经典形态标记]
|
||
C --> E[市场状态判断]
|
||
D --> F[交易信号]
|
||
E --> F
|
||
F --> G[风险管理]
|
||
```
|
||
|
||
2. **回测优化要点**:
|
||
|
||
- 不同市场状态下采用不同策略参数
|
||
- 形态识别需要足够长的历史数据(建议至少200根K线)
|
||
- 使用`--timeframe=4h`以上级别减少噪音
|
||
3. **实盘注意事项**:
|
||
|
||
```python
|
||
# 在策略中增加形态有效性确认
|
||
def confirm_pattern_strength(self, df, pattern):
|
||
return (df['volume'].iloc[-1] > df['volume'].rolling(20).mean().iloc[-1] * 1.5)
|
||
```
|
||
|
||
|
||
这种图形化分析在趋势起始点识别和区间突破交易中特别有效,但需要平衡计算复杂度与实时性要求。建议从简单形态识别开始,逐步增加AI模型复杂度。 |