我正在使用 zerodha 经纪人的 API 进行 Algo 交易项目。我正在尝试进行多线程处理,以节省调用 API 函数以一次获取 50 只股票的历史数据的昂贵操作,然后将我的策略应用于买入/卖出。
这是我的代码:
- 历史数据功能:
def historicData(token, start_dt, end_dt):
data = pd.DataFrame( kite.historical_data( token,
start_dt,
end_dt,
interval = 'minute',
continuous = False,
oi = False
)
)
# kite.historical_data() is the API call with limitation of 20 requests/sec
return data.tail(5)
- 策略功能:
def Strategy(token, script_name):
start_dt = (datetime.now() - timedelta(3)).strftime("%Y-%m-%d")
end_dt = datetime.now().strftime("%Y-%m-%d")
ScriptData = historicData(token, start_dt, end_dt)
# perform operations on ScriptData
print(token,script_name)
- 并发调用上述函数:
# concurrent code
from threading import Thread, Lock
start_dt = (datetime.now() - timedelta(3)).strftime("%Y-%m-%d")
end_dt = datetime.now().strftime("%Y-%m-%d")
th_list = [None]*10
start = sleep.time()
for i in range(0,50,20): # trying to send 20 request in a form of 20 threads in one go
token_batch = tokens[i:i+20] # data inside is ['123414','124124',...] total 50
script_batch = scripts[i:i+20] # data inside is ['RELIANCE','INFY',...] total 50
j=0
for stock_script in zip(token_batch,script_batch):
th_list[j] = Thread( target = Strategy,
args = ( stock_script[0],
stock_script[1]
)
)
th_list[j].start()
j+=1
end = sleep.time()
print('time is : ', end-start)
在在线尝试了许多解决方案两天后,现在有 2 个问题我无法解决。
- API 服务器存在一个瓶颈,它每秒接受 20 个 API 调用,如果调用更多则拒绝。列表中的股票总数为 50,我想做的是一次获取 20 只股票的数据,然后在下一次获取另外 20 只,然后在第三轮中剩下 10 只。总股票清单很快就会有 200 只股票,这就是为什么连续执行对于我的策略来说太昂贵了。
- 同时运行此函数时,一次创建的线程太多,API 请求超过......并且
print('time is : ', end-start)
在我运行第三个单元格时立即运行。
那么如何在所有线程完成执行之前阻止代码离开内部 for 循环。
和
我每秒最多获得 20 个线程的方法是否正确?我应该在sleep(1)
某个地方放置一个吗?