6.2 KiB
6.2 KiB
#交易 #量化交易 #策略研究 #freqtrade #DeepSeek
在 Freqtrade 框架内实现基于K线形态识别的策略是完全可行的,以下是几种高效的方法和工具:
一、Freqtrade 内置解决方案
1. 技术指标形态识别
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. 自定义形态检测
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. 模式识别库
# 安装: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图像识别)
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. 基于波动率的市场状态检测
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. 自动支撑阻力识别
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集成最佳实践
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 | 多尺度市场结构分析 |
实施建议:
-
分层识别系统:
graph TD A[原始K线] --> B(基础形态识别) A --> C(波动率分析) B --> D[经典形态标记] C --> E[市场状态判断] D --> F[交易信号] E --> F F --> G[风险管理] -
回测优化要点:
- 不同市场状态下采用不同策略参数
- 形态识别需要足够长的历史数据(建议至少200根K线)
- 使用
--timeframe=4h以上级别减少噪音
-
实盘注意事项:
# 在策略中增加形态有效性确认 def confirm_pattern_strength(self, df, pattern): return (df['volume'].iloc[-1] > df['volume'].rolling(20).mean().iloc[-1] * 1.5)
这种图形化分析在趋势起始点识别和区间突破交易中特别有效,但需要平衡计算复杂度与实时性要求。建议从简单形态识别开始,逐步增加AI模型复杂度。