使用stock_basic从tushare获取股票数据,从中提取股票代码,用此股票代码下载股票交易数据,打印总股票数量,下载花费时间,使用两个线程来下载,用threading.Thread模块,发送两个信号股票的总共的下载进度,
时间: 2023-10-10 16:06:28 浏览: 66
以下是代码实现:
```python
import tushare as ts
import time
import threading
# 获取股票代码列表
stock_list = ts.get_stock_basics().index.tolist()
# 定义下载函数,用于下载单个股票的交易数据
def download_stock_data(stock_code):
print(f"Downloading {stock_code} data...")
ts.get_hist_data(stock_code)
print(f"{stock_code} data downloaded.")
# 定义多线程下载函数
def multi_thread_download():
# 记录开始时间
start_time = time.time()
# 初始化信号量
semaphore = threading.Semaphore(2)
# 初始化线程列表
threads = []
# 遍历股票代码列表,每个股票启动一个线程进行下载
for stock_code in stock_list:
# 获取信号量
semaphore.acquire()
# 创建新线程
t = threading.Thread(target=download_stock_data, args=(stock_code,))
# 启动线程
t.start()
# 将线程添加至线程列表
threads.append(t)
# 等待所有线程执行完毕
for t in threads:
t.join()
# 记录结束时间
end_time = time.time()
# 计算下载所花费的时间
elapsed_time = end_time - start_time
# 打印总股票数量
print(f"Total number of stocks: {len(stock_list)}")
# 打印下载花费的时间
print(f"Time elapsed: {elapsed_time:.2f} seconds")
# 启动多线程下载函数
multi_thread_download()
```
在上述代码中,我们首先使用 `ts.get_stock_basics()` 获取股票代码列表,然后定义了 `download_stock_data()` 函数用于下载单个股票的交易数据。接着,我们定义了 `multi_thread_download()` 函数,使用 `threading.Thread` 模块创建两个线程进行下载。在该函数中,我们使用 `threading.Semaphore` 对线程进行限制,确保每次只有两个线程同时运行。最后,我们启动 `multi_thread_download()` 函数,打印总股票数量和下载所花费的时间。
值得注意的是,由于 tushare 在请求过于频繁时会返回空数据,因此在实际运行中可能会有一些股票没有下载到数据,需要重新运行程序以获取这些股票的数据。