【发布时间】:2022-01-24 15:35:50
【问题描述】:
我开发了一个代码来分析大量股票价格。基本上,它使用两个技术指标(MACD 和 EMA)并创建一个技术分析标志。
代码正在运行,这很好,但执行起来需要太多时间,很可能是因为使用 iloc 进行迭代。您对提高速度有什么建议吗?我在下面提供一个例子:
import pandas as pd
import numpy as np
import time
df = pd.DataFrame(np.random.uniform(low=2, high=5.5, size=(10000,)), columns=['Close'])
close = df['Close'].astype(float)
def MACD(first,second,signal):
df['EMA'+str(first)] = close.ewm(span=first).mean()
df['EMA'+str(second)] = close.ewm(span=second).mean()
df['MACD']=df['EMA'+str(first)]-df['EMA'+str(second)]
df['signal']=df.MACD.ewm(span=signal).mean()
df['MACD_ind'] = 0
for i in range (second+signal, len(df)):
if df.MACD.iloc[i]>df.signal.iloc[i] and df.MACD.iloc[i-1]<df.signal.iloc[i-1]:
df.loc[i,'MACD_ind']=1
if df.MACD.iloc[i]<df.signal.iloc[i] and df.MACD.iloc[i-1]>df.signal.iloc[i-1]:
df.loc[i,'MACD_ind']=-1
def EMA(first,second):
df['EMA'+str(first)] = close.rolling(window=first).mean()
df['EMA'+str(second)] = close.rolling(window=second).mean()
df['EMAdif'] = df['EMA'+str(first)]-df['EMA'+str(second)]
df['EMA_ind'] = 0
for i in range (second, len(df)):
if df.EMAdif.iloc[i]>0 and df.EMAdif.iloc[i-1]<0:
df.loc[i,'EMA_ind']=1
if df.EMAdif.iloc[i]<0 and df.EMAdif.iloc[i-1]>0:
df.loc[i,'EMA_ind']=-1
split_time = time.time()
TA_ind=list()
MACD(12, 26, 9)
TA_ind.append('MACD_ind')
print("MACD--- %s seconds ---" % (time.time() - split_time))
split_time = time.time()
EMA(20,50)
TA_ind.append('EMA_ind')
print("EMA--- %s seconds ---" % (time.time() - split_time))
split_time = time.time()
【问题讨论】:
标签: python pandas performance iteration technical-indicator