This commit is contained in:
aaron 2026-02-20 23:56:02 +08:00
parent 21ccd2aca3
commit 01a0d1fdfc
4 changed files with 151 additions and 46 deletions

View File

@ -56,10 +56,16 @@ class LLMSignalAnalyzer:
- **旗形整理**趋势中的健康回调 - **旗形整理**趋势中的健康回调
## 三、技术指标分析 ## 三、技术指标分析
### RSI相对强弱指标 ### RSI相对强弱指标- 使用 Wilder's Smoothing 标准算法
- RSI < 30超卖区关注反弹机会 **RSI 是最重要的超买超卖指标请注意细节**
- RSI > 70超买区关注回落风险 - **RSI < 30**超卖区关注反弹机会
- RSI 背离价格与 RSI 走势相反 = 重要反转信号 - RSI 30 以下回升交叉上穿 30买入信号
- RSI 底背离价格新低但 RSI 未创新低强买入信号
- **RSI > 70**超买区关注回落风险
- RSI 70 以上回落交叉下穿 70卖出信号
- RSI 顶背离价格新高但 RSI 未创新高强卖出信号
- **RSI 40-60**震荡区观望为主
- **RSI 趋势**RSI 自身的趋势变化比单一数值更重要
### MACD ### MACD
- 金叉DIF 上穿 DEA做多信号 - 金叉DIF 上穿 DEA做多信号
@ -74,11 +80,20 @@ class LLMSignalAnalyzer:
- 布林带收口即将变盘 - 布林带收口即将变盘
- 布林带开口趋势启动 - 布林带开口趋势启动
### 均线系统 ### 均线系统(重要)
- 多头排列MA5>MA10>MA20上涨趋势 **均线系统是趋势判断的核心请仔细分析**
- 空头排列MA5<MA10<MA20下跌趋势 - **多头排列**MA5 > MA10 > MA20 > MA50强势上涨趋势回调做多
- 价格回踩均线支撑低吸机会 - **空头排列**MA5 < MA10 < MA20 < MA50强势下跌趋势反弹做空
- 价格反弹均线压力做空机会 - **价格与 MA 的关系**
- 价格站稳 MA5/MA10 上方短线上涨
- 价格突破 MA20中线转多
- 价格跌破 MA20中线转空
- MA50 是中期趋势的分水岭
- **均线金叉死叉**
- MA5 上穿 MA10短线买入信号
- MA5 下穿 MA10短线卖出信号
- MA10 上穿 MA20中线买入信号
- MA10 下穿 MA20中线卖出信号
## 四、新闻舆情分析 ## 四、新闻舆情分析
结合最新市场新闻判断 结合最新市场新闻判断
@ -87,10 +102,33 @@ class LLMSignalAnalyzer:
- **市场情绪**恐慌指数社交媒体热度 - **市场情绪**恐慌指数社交媒体热度
- **大户动向**鲸鱼转账交易所流入流出 - **大户动向**鲸鱼转账交易所流入流出
## 五、多周期共振 ## 五、多周期共振(关键分析框架)
- 4H + 1H 同向 = 中线信号更可靠 **多周期共振是提高信号质量的核心方法**
- 1H + 15M 同向 = 短线信号更可靠
- 多周期 RSI 同时超买/超卖 = 强反转信号 ### 周期层级关系
- **4h趋势层**决定中期大方向
- **1h主周期**主要交易周期
- **15m入场层**寻找入场时机
- **5m精确入场**确认最佳入场点
### 共振判断标准
**强共振A级信号**
- 所有周期趋势同向 4h多 + 1h多 + 15m多
- 多周期 RSI 同时超买/超卖后出现背离
- 多周期 MA 同时金叉/死叉
**中等共振B级信号**
- 大周期4h+1h同向
- 主周期1h技术指标明确
**弱共振C级信号**
- 只有单一周期信号
- 多周期方向不一致
### 实战策略
- **顺势交易**4h 1h 同向时 15m/5m 寻找入场点
- **逆势谨慎**只有 1h 信号但 4h 反向时降低置信度
- **突破交易**多周期同时突破关键位信号最强
## 六、入场方式 ## 六、入场方式
- **market**现价立即入场 - 信号已经触发建议立即开仓 - **market**现价立即入场 - 信号已经触发建议立即开仓
@ -247,10 +285,16 @@ class LLMSignalAnalyzer:
- **箱体震荡**震荡区间突破后选择方向 - **箱体震荡**震荡区间突破后选择方向
## 三、技术指标分析 ## 三、技术指标分析
### RSI相对强弱指标 ### RSI相对强弱指标- 使用 Wilder's Smoothing 标准算法
- RSI < 30超卖区关注反弹机会 **RSI 是最重要的超买超卖指标请注意细节**
- RSI > 70超买区关注回落风险 - **RSI < 30**超卖区关注反弹机会
- RSI 背离价格与 RSI 走势相反 = 重要反转信号 - RSI 30 以下回升交叉上穿 30买入信号
- RSI 底背离价格新低但 RSI 未创新低强买入信号
- **RSI > 70**超买区关注回落风险
- RSI 70 以上回落交叉下穿 70卖出信号
- RSI 顶背离价格新高但 RSI 未创新高强卖出信号
- **RSI 40-60**震荡区观望为主
- **RSI 趋势**RSI 自身的趋势变化比单一数值更重要
- 股票市场中 RSI 极端值比加密货币更可靠 - 股票市场中 RSI 极端值比加密货币更可靠
### MACD ### MACD
@ -267,21 +311,51 @@ class LLMSignalAnalyzer:
- 布林带开口趋势启动 - 布林带开口趋势启动
### 均线系统(重要) ### 均线系统(重要)
- 多头排列MA5>MA10>MA20>MA50上涨趋势 **均线系统是趋势判断的核心请仔细分析**
- 空头排列MA5<MA10<MA20<MA50下跌趋势 - **多头排列**MA5 > MA10 > MA20 > MA50强势上涨趋势回调做多
- 价格回踩 MA20/MA50重要支撑位 - **空头排列**MA5 < MA10 < MA20 < MA50强势下跌趋势反弹做空
- 价格反弹 MA20/MA50重要阻力位 - **价格与 MA 的关系**
- 均线金叉/死叉重要趋势信号 - 价格站稳 MA5/MA10 上方短线上涨
- 价格突破 MA20中线转多
- 价格跌破 MA20中线转空
- MA20/MA50 是中期趋势的分水岭
- **均线金叉死叉**
- MA5 上穿 MA10短线买入信号
- MA5 下穿 MA10短线卖出信号
- MA10 上穿 MA20中线买入信号
- MA10 下穿 MA20中线卖出信号
### 成交量分析 ### 成交量分析
- **量价配合**价格上涨+放量或下跌+缩量是健康的 - **量价配合**价格上涨+放量或下跌+缩量是健康的
- **量价背离**价格上涨+缩量或下跌+放量要警惕 - **量价背离**价格上涨+缩量或下跌+放量要警惕
- **换手率**换手率过低说明关注度不够换手率过高可能是投机 - **换手率**换手率过低说明关注度不够换手率过高可能是投机
## 四、多周期共振 ## 四、多周期共振(关键分析框架)
- 日线 + 周线同向 = 中长线信号更可靠 **多周期共振是提高信号质量的核心方法**
- 日线 + 4小时同向 = 短线信号更可靠
- 多周期 RSI 同时超买/超卖 = 强反转信号 ### 周期层级关系
- **日线趋势层**决定中长期大方向
- **4h/1h主周期**主要交易周期
- **15m/5m入场层**寻找最佳入场时机
### 共振判断标准
**强共振A级信号**
- 所有周期趋势同向如日线多 + 4h多 + 1h多
- 多周期 RSI 同时超买/超卖后出现背离
- 多周期 MA 同时金叉/死叉
**中等共振B级信号**
- 大周期日线+4h同向
- 主周期技术指标明确
**弱共振C级信号**
- 只有单一周期信号
- 多周期方向不一致
### 实战策略
- **顺势交易**大周期和小周期同向时信号最强
- **逆势谨慎**只有小周期信号但大周期反向时降低置信度
- **突破交易**多周期同时突破关键位信号最可靠
- 大周期决定方向小周期决定入场时机 - 大周期决定方向小周期决定入场时机
## 五、股票市场特殊性 ## 五、股票市场特殊性

View File

@ -93,7 +93,7 @@ class BinanceService:
for interval in ['5m', '15m', '1h', '4h']: for interval in ['5m', '15m', '1h', '4h']:
df = self.get_klines(symbol, interval, limit=limits.get(interval, 100)) df = self.get_klines(symbol, interval, limit=limits.get(interval, 100))
if not df.empty: if not df.empty:
df = self.calculate_indicators(df) df = self.calculate_indicators(df, interval) # 传递 interval 参数
data[interval] = df data[interval] = df
logger.info(f"获取 {symbol} 多周期数据完成") logger.info(f"获取 {symbol} 多周期数据完成")
@ -124,12 +124,13 @@ class BinanceService:
return df return df
def calculate_indicators(self, df: pd.DataFrame) -> pd.DataFrame: def calculate_indicators(self, df: pd.DataFrame, interval: str = '1h') -> pd.DataFrame:
""" """
计算技术指标 计算技术指标
Args: Args:
df: K线数据 DataFrame df: K线数据 DataFrame
interval: K线周期用于调整 MA 参数
Returns: Returns:
添加了技术指标的 DataFrame 添加了技术指标的 DataFrame
@ -137,17 +138,28 @@ class BinanceService:
if df.empty: if df.empty:
return df return df
# 移动平均线 # 根据周期调整 MA 参数
df['ma5'] = self._calculate_ma(df['close'], 5) # 短周期5m, 15m使用较短的 MA长周期使用较长的 MA
df['ma10'] = self._calculate_ma(df['close'], 10) ma_config = {
df['ma20'] = self._calculate_ma(df['close'], 20) '5m': {'ma_short': 5, 'ma_mid': 10, 'ma_long': 20, 'ma_extra': 50},
df['ma50'] = self._calculate_ma(df['close'], 50) '15m': {'ma_short': 5, 'ma_mid': 10, 'ma_long': 20, 'ma_extra': 50},
'1h': {'ma_short': 5, 'ma_mid': 10, 'ma_long': 20, 'ma_extra': 50},
'4h': {'ma_short': 5, 'ma_mid': 10, 'ma_long': 20, 'ma_extra': 50},
}
config = ma_config.get(interval, ma_config['1h'])
# 移动平均线(统一命名,便于 LLM 分析)
df['ma5'] = self._calculate_ma(df['close'], config['ma_short'])
df['ma10'] = self._calculate_ma(df['close'], config['ma_mid'])
df['ma20'] = self._calculate_ma(df['close'], config['ma_long'])
df['ma50'] = self._calculate_ma(df['close'], config['ma_extra'])
# EMA # EMA
df['ema12'] = self._calculate_ema(df['close'], 12) df['ema12'] = self._calculate_ema(df['close'], 12)
df['ema26'] = self._calculate_ema(df['close'], 26) df['ema26'] = self._calculate_ema(df['close'], 26)
# RSI # RSI(使用 Wilder's Smoothing
df['rsi'] = self._calculate_rsi(df['close'], 14) df['rsi'] = self._calculate_rsi(df['close'], 14)
# MACD # MACD
@ -181,12 +193,25 @@ class BinanceService:
@staticmethod @staticmethod
def _calculate_rsi(data: pd.Series, period: int = 14) -> pd.Series: def _calculate_rsi(data: pd.Series, period: int = 14) -> pd.Series:
"""RSI 指标""" """
RSI 指标 - 使用 Wilder's Smoothing 方法
这是标准 RSI 计算方法比简单平均更准确
"""
delta = data.diff() delta = data.diff()
gain = (delta.where(delta > 0, 0)).rolling(window=period).mean()
loss = (-delta.where(delta < 0, 0)).rolling(window=period).mean() # 分离涨跌
rs = gain / loss gain = delta.where(delta > 0, 0)
loss = -delta.where(delta < 0, 0)
# 使用 Wilder's Smoothing (EMA) 而不是简单平均
# alpha = 1/period
avg_gain = gain.ewm(alpha=1/period, adjust=False).mean()
avg_loss = loss.ewm(alpha=1/period, adjust=False).mean()
# 计算 RS 和 RSI
rs = avg_gain / avg_loss
rsi = 100 - (100 / (1 + rs)) rsi = 100 - (100 / (1 + rs))
return rsi return rsi
@staticmethod @staticmethod

View File

@ -171,11 +171,14 @@ class USStockService:
ma20 = close.rolling(window=20).mean().iloc[-1] if len(close) >= 20 else None ma20 = close.rolling(window=20).mean().iloc[-1] if len(close) >= 20 else None
ma60 = close.rolling(window=60).mean().iloc[-1] if len(close) >= 60 else None ma60 = close.rolling(window=60).mean().iloc[-1] if len(close) >= 60 else None
# 计算RSI # 计算RSI(使用 Wilder's Smoothing 方法)
delta = close.diff() delta = close.diff()
gain = (delta.where(delta > 0, 0)).rolling(window=14).mean() gain = delta.where(delta > 0, 0)
loss = (-delta.where(delta < 0, 0)).rolling(window=14).mean() loss = -delta.where(delta < 0, 0)
rs = gain / loss # 使用 EMA (Wilder's Smoothing) 而不是简单平均
avg_gain = gain.ewm(alpha=1/14, adjust=False).mean()
avg_loss = loss.ewm(alpha=1/14, adjust=False).mean()
rs = avg_gain / avg_loss
rsi = 100 - (100 / (1 + rs)) rsi = 100 - (100 / (1 + rs))
rsi_value = rsi.iloc[-1] if len(rsi) >= 14 else None rsi_value = rsi.iloc[-1] if len(rsi) >= 14 else None

View File

@ -196,11 +196,14 @@ class YFinanceService:
df['ma20'] = df['close'].rolling(window=20).mean() df['ma20'] = df['close'].rolling(window=20).mean()
df['ma50'] = df['close'].rolling(window=50).mean() df['ma50'] = df['close'].rolling(window=50).mean()
# RSI # RSI(使用 Wilder's Smoothing 方法)
delta = df['close'].diff() delta = df['close'].diff()
gain = (delta.where(delta > 0, 0)).rolling(window=14).mean() gain = delta.where(delta > 0, 0)
loss = (-delta.where(delta < 0, 0)).rolling(window=14).mean() loss = -delta.where(delta < 0, 0)
rs = gain / loss # 使用 EMA (Wilder's Smoothing) 而不是简单平均
avg_gain = gain.ewm(alpha=1/14, adjust=False).mean()
avg_loss = loss.ewm(alpha=1/14, adjust=False).mean()
rs = avg_gain / avg_loss
df['rsi'] = 100 - (100 / (1 + rs)) df['rsi'] = 100 - (100 / (1 + rs))
# MACD (使用与 binance_service 相同的计算方法) # MACD (使用与 binance_service 相同的计算方法)