首页 > 解决方案 > 如何在单个数据框中的多个代码上运行 TA-Lib

问题描述

我有一个名为idf的 pandas 数据框,其数据从 21 年 4 月 19 日到 21 年 5 月 19 日,用于 4675 个股票代码,包括以下列:符号、日期、开盘价、最高价、最低价、收盘价、成交量

|index  |symbol |date       |open   |high   |low        |close  |vol    |EMA8|EMA21|RSI3|RSI14|
|-------|-------|-----------|-------|-------|-----------|-------|-------|----|-----|----|-----|
|0      |AACG   |2021-04-19 |2.85   |3.03   |2.8000     |2.99   |173000 |    |     |    |     |
|1      |AACG   |2021-04-20 |2.93   |2.99   |2.7700     |2.85   |73700  |    |     |    |     |
|2      |AACG   |2021-04-21 |2.82   |2.95   |2.7500     |2.76   |93200  |    |     |    |     |
|3      |AACG   |2021-04-22 |2.76   |2.95   |2.7200     |2.75   |56500  |    |     |    |     |
|4      |AACG   |2021-04-23 |2.75   |2.88   |2.7000     |2.84   |277700 |    |     |    |     |
|...    |...    |...        |...    |...    |...        |...    |...    |    |     |    |     |
|101873 |ZYXI   |2021-05-13 |13.94  |14.13  |13.2718    |13.48  |413200 |    |     |    |     |
|101874 |ZYXI   |2021-05-14 |13.61  |14.01  |13.2200    |13.87  |225200 |    |     |    |     |
|101875 |ZYXI   |2021-05-17 |13.72  |14.05  |13.5500    |13.82  |183600 |    |     |    |     |
|101876 |ZYXI   |2021-05-18 |13.97  |14.63  |13.8300    |14.41  |232200 |    |     |    |     |
|101877 |ZYXI   |2021-05-19 |14.10  |14.26  |13.7700    |14.25  |165600 |    |     |    |     |

我想使用 ta-lib 计算几个技术指标,例如长度为 8 和 21 的 EMA,以及 3 和 14 的 RSI。

上传文件并创建名为idf的数据框后,我一直在使用以下代码执行此操作:

ind = pd.DataFrame()
tind = pd.DataFrame()
for ticker in idf['symbol'].unique():
    tind['rsi3'] = ta.RSI(idf.loc[idf['symbol'] == ticker, 'close'], 3).round(2)    
    tind['rsi14'] = ta.RSI(idf.loc[idf['symbol'] == ticker, 'close'], 14).round(2)    
    tind['ema8'] = ta.EMA(idf.loc[idf['symbol'] == ticker, 'close'], 8).round(2)    
    tind['ema21'] = ta.EMA(idf.loc[idf['symbol'] == ticker, 'close'], 21).round(2)    
    ind = ind.append(tind)
    tind = tind.iloc[0:0]

idf = pd.merge(idf, ind, left_index=True, right_index=True)

这是最有效的方法吗?

如果不是,那么计算指标值并将这些计算出的指标值放入数据框idf的最简单和最快的方法是什么?

如果可能,最好避免使用 for 循环。

非常感谢任何帮助。

标签: pythonpandasta-lib

解决方案


rsi = lambda x: talib.RSI(idf.loc[x.index, "close"], 14) 
idf['rsi(14)'] = idf.groupby(['symbol']).apply(rsi).reset_index(0,drop=True)

推荐阅读