You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

TA-Lib在有限DataFrame上的异常表现:同一K线HAMMER形态识别结果不一致问题

Why does TA-Lib's CDLHAMMER return inconsistent results when adjusting pandas' skiprows parameter?

Let's break down exactly what's happening here—this is a common gotcha with TA-Lib's candlestick pattern functions.

The Core Issue: TA-Lib needs historical context for pattern recognition

TA-Lib's CDLHAMMER doesn't just look at a single candlestick in isolation. Hammer patterns are reversal signals, which means TA-Lib's implementation requires context from the previous candlestick to confirm the pattern. Specifically, it checks things like:

  • Whether the current candle is forming after a downward move (comparing to the prior candle's close)
  • The relative size of the candle's body vs. its lower wick

When you set skiprows=5 and only read 15 rows, your target candle (2020-10-23 13:15:00) ends up being one of the first few rows in your DataFrame. TA-Lib doesn't have access to the prior candles that came before your skipped rows, so it can't verify the downward trend prerequisite for a hammer. Without that context, it returns 0 because the pattern's full conditions aren't met.

In contrast, when skiprows=1-4, your target candle is positioned far enough into the 15-row dataset that TA-Lib can access the immediately preceding candle in your loaded data, allowing it to correctly evaluate all the hammer's criteria.

How to Fix This

To avoid this inconsistency, you need to ensure TA-Lib has the necessary historical context:

  • Include extra leading rows when slicing data: If you're targeting a specific candle, load at least one extra row before it so TA-Lib can reference the prior period. For example, if your target is in row 10 of your sliced data, make sure rows 9 (and maybe earlier) are included.
  • Load the full dataset first, then filter: Instead of using skiprows and nrows to slice during loading, read the entire CSV into a DataFrame first, then subset to your target date range. This way, TA-Lib can access all the prior candles it needs for pattern checks.

Example Fix

Instead of slicing during read:

# Problematic approach
df = pd.read_csv('RTS-MINUTES15.csv', header=None, names=['index', 'OPEN', 'HIGH', 'LOW', 'CLOSE', 'VOL'], index_col=0, skiprows = 5, nrows = 15)

Try loading full data first, then filtering:

# Better approach
full_df = pd.read_csv('RTS-MINUTES15.csv', header=None, names=['index', 'OPEN', 'HIGH', 'LOW', 'CLOSE', 'VOL'], index_col=0)
# Subset to your target 15 rows, plus at least 1 extra leading row
target_df = full_df.loc['2020-10-23 12:00:00':'2020-10-23 15:45:00']
target_df['HAMMER'] = talib.CDLHAMMER(target_df['OPEN'], target_df['HIGH'], target_df['LOW'], target_df['CLOSE'])

内容的提问来源于stack exchange,提问作者Sultan Dadakhanov

火山引擎 最新活动