1

我正在使用 zerodha 经纪人的 API 进行 Algo 交易项目。我正在尝试进行多线程处理,以节省调用 API 函数以一次获取 50 只股票的历史数据的昂贵操作,然后将我的策略应用于买入/卖出。

这是我的代码:

  1. 历史数据功能:
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)
  1. 策略功能:
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)
  1. 并发调用上述函数:
# 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 个问题我无法解决。

  1. API 服务器存在一个瓶颈,它每秒接受 20 个 API 调用,如果调用更多则拒绝。列表中的股票总数为 50,我想做的是一次获取 20 只股票的数据,然后在下一次获取另外 20 只,然后在第三轮中剩下 10 只。总股票清单很快就会有 200 只股票,这就是为什么连续执行对于我的策略来说太昂贵了。
  2. 同时运行此函数时,一次创建的线程太多,API 请求超过......并且print('time is : ', end-start)在我运行第三个单元格时立即运行。

那么如何在所有线程完成执行之前阻止代码离开内部 for 循环。

我每秒最多获得 20 个线程的方法是否正确?我应该在sleep(1)某个地方放置一个吗?

4

0 回答 0