python:talib 计算 KDJ 用 pro_api

该博客通过TALIB库计算股票KDJ指标,并使用pandas和matplotlib展示K线图及KDJ曲线。首先,从tushare Pro获取历史数据,然后调用STOCH函数计算KDJ的快速确认线(K)、慢速主干线(D)和J值,最后绘制KDJ曲线与收盘价图。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

talib 计算 KDJ值对应的函数是Stochastic Oscillator Slow (Stoch),

其返回值有两个,一个是快速确认线值,另外一个是慢速主干线值。KDJ 需要至少最近9天的数据。

talib_kdj2.py

# -*- coding: utf-8 -*-
import os, sys
import tushare as ts
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import talib

if len(sys.argv) ==2:
    code = sys.argv[1]
else:
    print('usage: python talib_kdj2.py stockcode ')
    sys.exit(1)

if len(code) !=6:
    print('stock code length: 6')
    sys.exit(2)

if code < '600000':
    ts_code = code +'.SZ'
else:
    ts_code = code +'.SH'

# 初始化pro接口
pro = ts.pro_api('your token')

dh = pro.daily(ts_code=ts_code, start_date='20210101')
if dh.empty ==True:
    print(" df is empty ")
    sys.exit(2)

df = dh.sort_values(by='trade_date')
#df = df.reset_index(drop=True)
# 为了与原来的 tushare 保持一致性,修改列名
df.rename(columns={'trade_date':'date','vol':'volume'}, inplace=True)
if len(df) <10:
    print(" len(df) <10 ")
    sys.exit(2)

dw = pd.DataFrame()
# KDJ 值对应的函数是 STOCH
dw['slowk'], dw['slowd'] = talib.STOCH(
			df['high'].values, 
			df['low'].values, 
			df['close'].values,
                        fastk_period=9,
                        slowk_period=3,
                        slowk_matype=0,
                        slowd_period=3,
                        slowd_matype=0)
# 求出J值,J = (3*K) - (2*D)
dw['slowj'] = list(map(lambda x,y: 3*x-2*y, dw['slowk'], dw['slowd']))
dw.index = range(len(dw))
print(dw[-5:])

df['ma10'] = df['close'].rolling(window=10).mean()
df.index = pd.to_datetime(df.date)
# 画股票收盘价图
fig,axes = plt.subplots(2,1)
df[['close', 'ma10']].plot(ax=axes[0], grid=True, title=code)
# 画 KDJ 曲线图
dw[['slowk','slowd','slowj']].plot(ax=axes[1], grid=True)
plt.legend(loc='best', shadow=True)
plt.show()

请尽快使用Pro版接口:https://waditu.com/document/2

<think>嗯,用户遇到了一个编译错误,具体是talib/_ta_lib.c:73886:26处的错误,提示‘_PyErr_StackItem’没有名为‘exc_traceback’的成员。我需要先理解这个错误的背景和原因。 首先,TA-Lib是一个常用的技术分析库,用户可能在安装时从源码编译,遇到了问题。错误信息指出在C源代码中访问了结构体_PyErr_StackItem的exc_traceback成员,但这个成员不存在。这可能是因为Python的C API在新版本中发生了变化,移除了这个成员。 接下来,我应该回忆Python的版本变化对C API的影响。记得在Python 3.10或更高版本中,异常处理机制有所调整,可能涉及_PyErr_StackItem结构的成员变更。比如,之前可能有exc_type、exc_value、exc_traceback三个成员,现在可能合并成exc_value,其中包含类型、值和回溯信息。 然后,需要确认用户使用的Python版本是否与TA-Lib兼容。如果用户用的是Python 3.11+,而TA-Lib的源码还未适配新的API,就会出现这个问题。解决方法是更新TA-Lib到支持新Python版本的版本,或者降级Python到兼容的旧版本。 另外,检查TA-Lib的GitHub仓库是否有相关的issue或提交,确认是否存在针对该错误的补丁。例如,可能有人已经提交了修改代码,用新的API替换旧的成员访问方式,比如从exc_traceback改为使用PyException_GetTraceback函数。 用户可能需要手动修改源码中的这一行,将tmp_tb = exc_info->exc_traceback;替换为获取traceback的新方法,或者应用现有的补丁。或者建议用户使用预编译的二进制包,避免从源码编译。 总结来说,问题的根源是Python版本的升级导致C API变更,而TA-Lib的旧代码未适配。解决方案包括更新库、降级Python、手动修改代码或使用预编译版本。需要将这些步骤清晰地传达给用户,并建议先尝试更新TA-Lib,因为这是最直接的解决办法。</think>该错误属于 **Python C扩展兼容性问题**,常见于使用旧版C扩展模块与新版Python(≥3.10)编译时。以下是逐步分析及解决方案: --- ### **错误原因分析** 1. **Python 3.10+的C API变更** Python 3.10重构了异常处理结构体 `_PyErr_StackItem`,移除了 `exc_traceback` 成员。旧版代码中直接访问此成员会导致编译失败。 2. **TA-Lib源码兼容性问题** TA-Lib的C扩展代码 (`_ta_lib.c`) 仍在使用已废弃的 `exc_traceback`,未适配新版Python的C API。 --- ### **解决方案** #### 方法 1:升级TA-Lib版本 **推荐指数:★★★★★** 官方可能已修复此问题,尝试安装最新版: ```bash pip install --upgrade TA-Lib ``` #### 方法 2:降级Python版本 **推荐指数:★★★☆☆** 若需保持当前TA-Lib版本,可降级到Python 3.9或以下(此方法不推荐长期使用): ```bash conda create -n py39 python=3.9 conda activate py39 pip install TA-Lib ``` #### 方法 3:手动修复源码(适用于开发者) **推荐指数:★★☆☆☆** 修改 `_ta_lib.c` 源码以适配新版Python: 1. 定位错误行(约73886行): ```c tmp_tb = exc_info->exc_traceback; // 旧版写法 ``` 2. 替换为Python 3.10+的API: ```c tmp_tb = PyException_GetTraceback(exc_info->exc_value); // 新版写法 ``` #### 方法 4:使用预编译二进制包 **推荐指数:★★★★☆** 通过非官方渠道安装预编译版本(如Windows): ```bash pip install TA-Lib-bin ``` --- ### **技术背景补充** - **Python异常处理演变** Python 3.10后,`PyErr_*` 系列函数改为通过 `PyException_GetTraceback()`、`PyException_GetContext()` 等API获取异常信息,废弃直接访问结构体成员的方式。 - **相关链接** - [Python 3.10 C API变更文档](https://docs.python.org/3.10/whatsnew/3.10.html#changes-in-the-c-api) - [TA-Lib GitHub Issues](https://github.com/mrjbq7/ta-lib/issues) --- ### **验证是否解决** 重新编译或安装后,运行Python测试: ```python import talib print(talib.__version__) # 无报错则成功 ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值