From 34ea6a04eb17a10ff8673c19cdd1874f2b8bfff2 Mon Sep 17 00:00:00 2001 From: "zhangkun9038@dingtalk.com" Date: Wed, 18 Feb 2026 12:39:44 +0800 Subject: [PATCH] =?UTF-8?q?=E6=95=A3=E6=88=B7=E7=94=9F=E5=AD=98=E4=B9=8B?= =?UTF-8?q?=E9=81=93=EF=BC=9B=E9=BC=93=E5=8A=B1=E5=85=A5=E5=9C=BA=EF=BC=8C?= =?UTF-8?q?=E6=83=A9=E7=BD=9A=E9=95=BF=E6=97=B6=E9=97=B4=E6=8C=81=E6=9C=89?= =?UTF-8?q?+2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- freqtrade/templates/freqaiprimer.py | 34 +++++++++++++++++++---------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/freqtrade/templates/freqaiprimer.py b/freqtrade/templates/freqaiprimer.py index d671a9f5..44ea9e72 100644 --- a/freqtrade/templates/freqaiprimer.py +++ b/freqtrade/templates/freqaiprimer.py @@ -71,8 +71,8 @@ class FreqaiPrimer(IStrategy): # 添加用于检测大户操纵的特征 # 1. 价格波动率特征 - dataframe["%-volatility_5"] = dataframe["close"].rolling(5).std() - dataframe["%-volatility_10"] = dataframe["close"].rolling(10).std() + dataframe["%-volatility_5"] = dataframe["close"].rolling(5).std().fillna(0) + dataframe["%-volatility_10"] = dataframe["close"].rolling(10).std().fillna(0) # 2. 量价关系特征 dataframe["%-volume_change"] = dataframe["volume"].pct_change().fillna(0) @@ -80,24 +80,36 @@ class FreqaiPrimer(IStrategy): # 3. 价格偏离特征 - 直接计算布林带而不依赖外部列 bbands = ta.bbands(dataframe['close'], length=20, std=2) - dataframe["%-bb_upper"] = bbands['BBU_20_2.0'] - dataframe["%-bb_lower"] = bbands['BBL_20_2.0'] - dataframe["%-bb_position"] = (dataframe["close"] - dataframe["%-bb_lower"]) / (dataframe["%-bb_upper"] - dataframe["%-bb_lower"]) - dataframe["%-hl_ratio"] = (dataframe["high"] - dataframe["low"]) / dataframe["close"] + dataframe["%-bb_upper"] = bbands['BBU_20_2.0'].fillna(dataframe['close']) + dataframe["%-bb_lower"] = bbands['BBL_20_2.0'].fillna(dataframe['close']) + bb_width = dataframe["%-bb_upper"] - dataframe["%-bb_lower"] + bb_width = bb_width.replace(0, 1e-10) + dataframe["%-bb_position"] = (dataframe["close"] - dataframe["%-bb_lower"]) / bb_width + dataframe["%-bb_position"] = dataframe["%-bb_position"].fillna(0.5) + dataframe["%-hl_ratio"] = (dataframe["high"] - dataframe["low"]) / dataframe["close"].replace(0, 1e-10) + dataframe["%-hl_ratio"] = dataframe["%-hl_ratio"].fillna(0) # 4. VWAP 特征 (简化版) - dataframe["%-vwap"] = (dataframe['volume'] * (dataframe['high'] + dataframe['low'] + dataframe['close']) / 3).rolling(window=20).sum() / dataframe['volume'].rolling(window=20).sum() - dataframe["%-price_vwap_diff"] = (dataframe["close"] - dataframe["%-vwap"]) / dataframe["%-vwap"] + volume_sum = dataframe['volume'].rolling(window=20).sum().replace(0, 1e-10) + typical_price = (dataframe['high'] + dataframe['low'] + dataframe['close']) / 3 + vwap_numerator = (dataframe['volume'] * typical_price).rolling(window=20).sum() + dataframe["%-vwap"] = vwap_numerator / volume_sum + dataframe["%-vwap"] = dataframe["%-vwap"].fillna(dataframe['close']) + vwap_safe = dataframe["%-vwap"].replace(0, 1e-10) + dataframe["%-price_vwap_diff"] = (dataframe["close"] - dataframe["%-vwap"]) / vwap_safe + dataframe["%-price_vwap_diff"] = dataframe["%-price_vwap_diff"].fillna(0) # 5. MFI (资金流量指标) - 简化版 - typical_price = (dataframe['high'] + dataframe['low'] + dataframe['close']) / 3 money_flow = typical_price * dataframe['volume'] dataframe["%-mfi"] = ta.rsi(money_flow.fillna(0), length=14) + dataframe["%-mfi"] = dataframe["%-mfi"].fillna(50) # 6. Z-Score (标准分) - 检测异常波动 - rolling_mean = dataframe['close'].rolling(window=20).mean() - rolling_std = dataframe['close'].rolling(window=20).std() + rolling_mean = dataframe['close'].rolling(window=20).mean().fillna(dataframe['close']) + rolling_std = dataframe['close'].rolling(window=20).std().fillna(0) + rolling_std = rolling_std.replace(0, 1e-10) dataframe["%-z_score"] = (dataframe['close'] - rolling_mean) / rolling_std + dataframe["%-z_score"] = dataframe["%-z_score"].fillna(0) return dataframe