社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

子晓聊技术 • 6 天前 • 50 次点击  

背景: 一些同学看我之前写的开源项目介绍,卡在了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/179932
 
50 次点击