如何在单个数据帧中在多个ticker上运行TA-Lib



我有一个名为idf的panda数据帧,数据范围为2021年4月19日至2021年5月19日,适用于4675个股票行情机,包括以下列:符号、日期、开盘、高、低、收盘、vol

|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循环。

非常感谢您的帮助。

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

最新更新