Py学习  »  Python

【Python技术】利用TA-Lib库进行K线形态识别筛选股票

灵度智能 • 1 月前 • 197 次点击  

背景: 最近A股这个市场,短线有点难做,稍微不注意就容易大面。 自己的一些策略没之前那么好用。 怎么个说法呢?  好的要么抢不到, 好买到的不注意看就容易大面。 盘中自己就在想,我能不能把主观看到的一些形态差的过滤掉,一些形态好的做推荐提示。虽然人肉看K线没问题,既然是做技术了,那肯定要用一些技术办法了。 
这里提供一种思路,那继续用TA-Lib库来识别K线形态识别呗。
先介绍下TA-Lib.
TA-Lib(Technical Analysis Library)是一个广泛应用于金融市场分析的开源工具库,支持多种技术指标计算和K线形态识别。TA-Lib 提供超过 150 种技术指标(如MACD、RSI)和 60+种K线形态识别函数。 
关于技术指标(如MACD、RSI) 我之前的文章讲过一些,这里就不细讲了,感兴趣看之前文章。 这篇文章主要讲K线形态识别。

常用K线形态函数


  • CDLHAMMER
    : 锤子线(看涨反转)
  • CDLSHOOTINGSTAR
    : 流星线(看跌反转)
  • CDLENGULFING
    : 吞没形态
  • CDLMORNINGSTAR
    : 早晨之星(看涨)
  • CDLDOJI
    : 十字星

函数返回值为 整数数组,如 100 表示看涨信号,-100 表示看跌信号,0 表示无信号。

那是不是意味着熟悉了这些常用的函数, 对股票用K线图形态就能做一些初步的筛选了。  


相关文章推荐:

利用akshare、pandas、ta库实现常用技术分析方法识别市场趋势
【python技术】用TA-Lib、plotly构建股票技术指标分析系统
【开源项目】发现一开源项目,小白也能轻松玩转股票量化交易

最后提供一个简单例子, 仅供参考思路。 希望对大家有所启发

import akshare as ak
import streamlit as st
import plotly.graph_objects as go
import talib
import pandas as pd
from datetime import datetime


st.set_page_config(page_title="A股K线形态识别", layout="wide")
st.title("A股K线形态识别")

# 侧边栏参数设置
with st.sidebar:
    st.header("⚙️ 参数设置")
    symbol = st.text_input("股票代码""600519")
    start_date = st.date_input("开始日期", datetime(2024, 10, 8))
    end_date = st.date_input("结束日期", datetime.now())


# 获取A股历史数据(使用stock_zh_a_history接口)
def get_stock_data(symbol, start, end):
    """获取A股前复权数据"""
    try:
        code = f"{symbol}"
        df = ak.stock_zh_a_hist(
            symbol=code, period="daily",
            start_date=start.strftime("%Y%m%d"),
            end_date=end.strftime("%Y%m%d"),
            adjust="qfq"
        )
        df = df.rename(columns={
            '日期''date''开盘''open''收盘''close',
            '最高''high''最低''low''成交量''volume'
        })
        df['date'] = pd.to_datetime(df['date'])
        return df.set_index('date').sort_index()
    except Exception as e:
        st.error(f"数据获取失败:{str(e)}")
        return None


data = get_stock_data(symbol,start_date, end_date)

if data is not None:
    # 识别锤子线形态
    hammer_signals = talib.CDLHAMMER(data['open'], data['high'], data['low'], data['close'])
    signals = data[hammer_signals == 100]

    # 创建Plotly图表
    fig = go.Figure()

    # 绘制K线
    fig.add_trace(go.Candlestick(
        x=data.index,
        open=data['open'],
        high=data['high'],
        low=data['low'],
        close=data['close'],
        name='K线',
        increasing_line_color='red',
        decreasing_line_color='green'
    ))

    # 标记锤子线信号
    if not signals.empty:
        fig.add_trace(go.Scatter(
            x=signals.index,
            y=signals['low'] * 0.98,
            mode='markers',
            marker=dict(
                color='rgba(0, 150, 0, 0.8)',
                size=12,
                symbol='triangle-up',
                line=dict(width=1, color='DarkSlateGrey')
            ),
            name='锤子线信号'
        ))

    # 图表布局优化
    fig.update_layout(
        title=f"{symbol}周期K线图 - 锤子线信号",
        xaxis=dict(
            type='date',
            rangeslider=dict(visible=False),
            title_text="日期"
        ),
        yaxis=dict(title_text="价格(前复权)"),
        hovermode="x unified",
        template="plotly_dark",
        height=600,
        margin=dict(l=50, r=50, b=50, t=100)
    )


    # 显示图表
    st.plotly_chart(fig, use_container_width=True)

    # 显示信号明细
    st.subheader("📋 信号明细")
    if not signals.empty:
        st.dataframe(
            signals.style.applymap(
                lambda x: "background-color: #2c5f2d",
                subset=['close']
            ),
            column_order=['open''high''low''close'],
            use_container_width=True
        )
    else:
        st.warning("当前参数范围内未检测到锤子线信号")



量化横行的时代,短线生态有点恶劣。对散户来说,也许,中长线趋势价值投机才是正确的姿势。 也许

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/180247
 
197 次点击