Py学习  »  Python

【python技术】用TA-Lib、plotly构建股票技术指标分析系统

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

背景: 一些同学看我之前写的开源项目介绍,卡在了TA-Lib安装这一步,问我这个怎么安装。也有同学问我怎么分析某只股票是否值得买,参考哪些技术指标。
这里提供下思路,方便需要的同学。虽然之前技术指标分别都写过对应的文章,但比较零散,感兴趣的同学可以翻一翻之前的文章。  这里计划把常用的指标用TA-Lib直接一个界面全部搞定,仅供参考
先介绍下TA-Lib。

TA-Lib是一个开源的金融技术分析库,涵盖超过150种技术指标的计算,包括趋势指标(如移动平均线)、动量指标(如RSI)、波动率指标(如布林带)等。其底层采用C语言优化,并通过Python、Java等接口暴露功能,计算速度极快,特别适合处理高频金融数据。


核心优势

  • 高效计算
    :C语言内核确保毫秒级指标计算。
  • 全面覆盖
    :支持均线、MACD、KDJ、布林带等主流指标。
  • 多语言支持
    :Python、C/C++、Java、Ruby等均可调用。
  • 开源免费
    :社区活跃,文档丰富,适合个人与商业项目。

以我用的mac为例:
1、通过homebrew 安装ta-lib
brew install ta-lib
通过
ls /opt/homebrew/opt/ta-lib/lib/
确认下libta_lib.0.dylib是否存在
2、安装python包
pip install ta-lib
3、如果brew info ta-lib 出不来效果尝试 做下软连接
sudo ln -s /opt/homebrew/Cellar/ta-lib/0.4.0/lib/libta_lib.0.dylib /usr/local/lib/
修改成对应的ta-lib版本

windows网上搜索下对应的方式。

下面系统讲一下常用的技术指标

1. 移动平均线(MA):捕捉趋势方向

移动平均线是识别趋势的基础工具。TA-Lib提供SMA(简单移动平均)、EMA(指数移动平均)等函数。


import talib
import numpy as np

# 示例数据:收盘价(假设为连续10天的数据)
close_prices = np.array([45.3,46.1,47.8,48.5,49.2,50.1,49.8,51.0, 50.5,52.3])

# 计算5日简单移动平均线
sma5 = talib.SMA(close_prices, timeperiod=5)
print("5日SMA:", sma5)
# 输出:[       nan        nan        nan        nan 47.38, 48.34, 49.12, 49.88, 50.32, 50.94]

2. 相对强弱指数(RSI):识别超买超卖

RSI用于衡量价格变动速度,通常在70以上视为超买,30以下为超卖。


rsi14 = talib.RSI(close_prices, timeperiod=14)


    

print("14日RSI:", rsi14[-1])  # 输出最新RSI值

# 策略示例:RSI低于30时触发买入信号
if rsi14[-1] < 30:
    print("买入信号:RSI超卖区域!")

3. MACD:捕捉趋势转折

MACD由快线(DIF)、慢线(DEA)和柱状图(MACD Histogram)组成,常用于判断多空转换。


macd, signal, hist = talib.MACD


    
(close_prices, 
                               fastperiod=12, 
                               slowperiod=26, 
                               signalperiod=9)
# 金叉:MACD线上穿信号线(买入信号)
if macd[-2] < signal[-2] and macd[-1] > signal[-1]:
    print("MACD金叉出现,建议买入!")

4. 布林带(Bollinger Bands):衡量波动率


布林带由中轨(均线)、上轨和下轨组成,价格突破轨道常被视为趋势信号。


upper, middle, lower = talib.BBANDS(close_prices, 
                                    timeperiod=20, 
                                    nbdevup=2, 
                                    nbdevdn=2)
# 价格突破上轨可能预示回调
if close_prices[-1] > upper[-1]:
    print("价格突破布林带上轨,警惕超买风险!")

这里提供下核心代码

# 数据获取
def get_stock_data(_symbol, start, end, period_type):
    try:
        df = ak.stock_zh_a_hist(
            symbol=_symbol,
            period=period_type,
            start_date=start.strftime("%Y%m%d"),
            end_date=end.strftime("%Y%m%d"),
            adjust="qfq"
        )
        if df.empty:
            return pd.DataFrame()
        df['日期'] = pd.to_datetime(df['日期'])
        return df.sort_values('日期').set_index('日期')
    except Exception as e:
        st.error(f"数据获取失败: {str(e)}")
        return pd.DataFrame()


# 技术指标计算
def calculate_indicators(df):
    # 均线系统
    df['MA5'] = talib.SMA(df['收盘'], timeperiod=5)
    df['MA10'] = talib.SMA(df['收盘'], timeperiod=10)
    df['MA20'] = talib.SMA(df['收盘'], timeperiod=20)

    # MACD
    df['MACD'], df['MACDsignal'], df['MACDhist'] = talib.MACD(
        df['收盘'], fastperiod=12, slowperiod=26, signalperiod=9)

    # RSI
    df['RSI14'] = talib.RSI(df['收盘'], timeperiod=14)

    # KDJ
    df['slowk'], df['slowd'] = talib.STOCH(
        df['最高'], df['最低'], df['收盘'],
        fastk_period=9, slowk_period=3, slowk_matype=0,
        slowd_period=3, slowd_matype=0
    )
    df['slowj'] = 3 * df['slowk'] - 2 * df['slowd']

    # 布林带
    df['upper'], df['middle'], df['lower'] = talib.BBANDS(df['收盘'], timeperiod=20)

    # 成交量
    df['VOL_MA5'] = talib.SMA(df['成交量'], timeperiod=5)
    return df.dropna()


# 创建交互图表
def create_plotly_chart(df, period):
    fig = make_subplots(
        rows=5, cols=1,
        shared_xaxes=True,
        vertical_spacing=0.03,
        row_heights=[0.5, 0.15, 0.15, 0.15, 0.2],
        specs=[[{"secondary_y": True}], [{}], [{}], [{}], [{}]]
    )

    # K线图(红涨绿跌)
    fig.add_trace(go.Candlestick(
        x=df.index,
        open=df['开盘'],
        high=df['最高' ],
        low=df['最低'],
        close=df['收盘'],
        name='K线',
        increasing={'line': {'color''red'}, 'fillcolor''rgba(255,0,0,0.3)'},
        decreasing={'line': {'color''green'}, 'fillcolor''rgba(0,128,0,0.3)'}
    ), row=1, col=1)

    # 均线系统
    for ma, color in zip(['MA5''MA10''MA20'], ['orange''blue''purple']):
        fig.add_trace(go.Scatter(
            x=df.index, y=df[ma],
            name=ma,
            line=dict(color=color, width=1.5),
            opacity=0.8
        ), row=1, col=1)

    # MACD
    colors = np.where(df['MACDhist'] > 0, 'red''green')
    fig.add_trace(go.Bar(
        x=df.index, y=df['MACDhist'],
        name='MACD Hist',
        marker_color=colors
    ), row=2, col=1)
    fig.add_trace(go.Scatter(
        x=df.index, y=df['MACD'],
        line=dict(color='blue'),
        name='MACD'
    ), row=2, col=1)
    fig.add_trace(go.Scatter(
        x=df.index, y=df['MACDsignal'],
        line=dict(color='orange'),
        name='Signal'
    ), row=2, col=1)

    # RSI
    fig.add_trace(go.Scatter(
        x=df.index, y=df['RSI14'],
        line=dict(color='purple'),
        name='RSI 14'
    ), row=3, col=1)
    fig.add_hline(y=30, line=dict(color='gray', dash='dash'), row=3, col=1)
    fig.add_hline(y=70, line=dict(color='gray', dash='dash'), row=3, col=1)

    # KDJ
    fig.add_trace(go.Scatter(
        x=df.index, y=df['slowk'],
        line=dict(color='blue'),
        name='K值'
    ), row=4, col=1)
    fig.add_trace(go.Scatter(
        x=df.index, y=df['slowd'],
        line=dict(color='orange'),
        name='D值'
    ), row=4, col=1)
    fig.add_trace(go.Scatter(
        x=df.index, y=df['slowj'],
        line=dict(color='green', dash='dot'),
        name='J值'
    ), row=4, col=1)
    fig.add_hline(y=20, line=dict(color='gray', dash='dash'), row=4, col=1)
    fig.add_hline(y=80, line=dict(color='gray', dash='dash'), row=4, col=1)

    # 成交量
    colors = np.where(df['收盘'] > df['开盘'], 'red''green')
    fig.add_trace(go.Bar(
        x=df.index, y=df['成交量'],
        name='成交量',
        marker_color=colors,
        opacity=0.7
    ), row=5, col=1)
    fig.add_trace(go.Scatter(
        x=df.index, y=df['VOL_MA5'],
        line=dict(color='orange'),
        name='成交量MA5'
    ), row=5, col=1)

    # 布局设置
    fig.update_layout(
        height=1200,
        title=f'{symbol} {period}级别技术分析',
        font=CHINESE_FONT,
        showlegend=True,
        xaxis_rangeslider_visible=False,
        hovermode="x unified"
    )

    # Y轴标签
    yaxis_labels = ["价格""MACD""RSI""KDJ""成交量"]
    for i, label in enumerate(yaxis_labels, 1):
        fig.update_yaxes(title_text=label, row=i, col=1)

    return fig



完整代码这里我不就贴了。   说下原因, 这次代码用到了ta-lib,如果ta-lib自己解决不了安装问题,就不要折腾了。
 就像我之前文章提供的代码用到node、pywencai, 我真的没有时间精力 一步步手把手教怎么安装,况且我还提供了文章答疑。  说实话, 我分享的知识是无偿的, 没必要最后像 东郭先生和狼那样, 我不帮人一步步免费安装并且运行起来,最后惹一身骚。今天遇到很坑的事情, 微信账号不知道什么情况还被人投诉了,申诉后才解锁。 难道免费分享是原罪?
最后,想要完整代码比较简单, 对这篇文章进行点赞分享且在看就可以(最近文章阅读量不佳, 掺杂点私心,增加点阅读量) , 如果不想让人看到 随意打赏也行(美股今天晚上大跌, A股明天貌似有抄底机会,正好加仓为国护盘)。 到时候 微信截图联系我就行。免费、付费的形式二选一就可以, 突然觉得自己就是个天才



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