生生不息

生生不息

AI使用TA-Lib识别“锤头”形态

2025-06-24
AI使用TA-Lib识别“锤头”形态

提示词

有一个日期为index的DataFrame,包含期货的开盘价、最高价、最低价和收盘价,需要使用TA-Lib识别其是否包含锤头形态,并且将识别出的K线用Ploty进行可视化。请给出示例代码。

答案

import pandas as pd
import talib
import plotly.graph_objects as go
import numpy as np
from datetime import datetime, timedelta

# 1. 数据准备(假设df是包含日期索引和OHLC数据的DataFrame)
# 如果已有数据,请替换以下示例数据
# def generate_sample_data(days=100):
#     dates = pd.date_range(end=datetime.today(), periods=days)
#     open_prices = np.random.uniform(3500, 4000, days)
#     high_prices = open_prices + np.random.uniform(10, 50, days)
#     low_prices = open_prices - np.random.uniform(10, 80, days)  # 模拟长下影线
#     close_prices = np.random.uniform(np.minimum(open_prices, low_prices), 
#                                     np.maximum(open_prices, high_prices))
  
#     return pd.DataFrame({
#         'Open': open_prices,
#         'High': high_prices,
#         'Low': low_prices,
#         'Close': close_prices
#     }, index=dates)

# # 生成示例数据(实际使用时替换为你的DataFrame)
# df = generate_sample_data()

# 2. 使用TA-Lib识别锤头形态[1,2,4](@ref)
signals1 = talib.CDLHAMMER(df['开盘价'], df['最高价'], df['最低价'], df['收盘价'])

# 2. 创建包含信号的DataFrame
df = pd.DataFrame({
    'Open': df['开盘价'],
    'High': df['最高价'],
    'Low': df['最低价'],
    'Close': df['收盘价'],
    'hammer_signals': signals1
})

# 3. 创建信号标记数据
signals = df['hammer_signals'] > 0  # >0表示识别到锤头形态
print(f"识别到{len(signals)}个锤头形态")

# 4. 创建Plotly K线图
fig = go.Figure()

# 添加K线主图
fig.add_trace(go.Candlestick(
    x=df.index,
    open=df['Open'],
    high=df['High'],
    low=df['Low'],
    close=df['Close'],
    increasing_line_color='red',  # 根据中国习惯设置涨跌颜色
    decreasing_line_color='green',
    name='K线'
))

# 5. 标注锤头形态
if not signals.empty:
    fig.add_trace(go.Scatter(
        x=df.index[signals],
        y=df['Low'][signals] * 0.995,  # 在最低价下方显示标记
        mode='markers',
        marker=dict(
            symbol='triangle-up',
            size=15,
            color='gold',
            line=dict(width=2, color='black')
        ),
        name='锤头形态',
        hoverinfo='text',
        hovertext=[f"日期:{date.strftime('%Y-%m-%d')}<br>最低价:{low:.2f}" 
                  for date, low in zip(df.index[signals], df['Low'][signals])]
    ))

# 6. 添加技术指标增强分析(可选)
df['MA20'] = talib.MA(df['Close'], timeperiod=20)  # 20日均线
fig.add_trace(go.Scatter(
    x=df.index,
    y=df['MA20'],
    line=dict(color='blue', width=1.5),
    name='20日均线'
))

# 7. 专业级图表布局配置[7](@ref)
fig.update_layout(
    title='期货K线图 - 锤头形态识别',
    xaxis_title='日期',
    yaxis_title='价格',
    xaxis_rangeslider_visible=False,  # 隐藏底部滑动条
    template='plotly_dark',
    height=700,
    hovermode='x unified',
    legend=dict(orientation='h', yanchor='bottom', y=1.02, xanchor='right', x=1),
    annotations=[dict(
        x=0.5, y=-0.12, 
        xref='paper', yref='paper',
        showarrow=False,
        text='数据来源:期货行情数据 | 技术指标:TA-Lib CDLHAMMER'
    )]
)

# 添加专业网格和样式
fig.update_xaxes(
    gridcolor='rgba(100, 100, 100, 0.2)',
    rangeslider_thickness=0.03
)
fig.update_yaxes(
    gridcolor='rgba(100, 100, 100, 0.2)'
)

# 8. 显示图表
fig.show()

# 9. 输出信号明细(可选)
if not signals.empty:
    print("\n锤头形态出现日期:")
    print(df.index[signals].strftime("%Y-%m-%d").values)

我增加了自己的数据和修改了表格列名的代码,其余都是ai写的。

图像:

后记

锤头线“上影线短、下影线长”是明确的底部买入信号,适用于捕捉超跌反弹;

倒锤头线需分情况:高位为卖出信号,低位为试探性买入信号。

投资者需结合市场环境、成交量及趋势综合决策,避免单一形态依赖。