一键获取每日股票数据,自动更新,尽在掌握
用Python和Tushare库获取股票日线数据
在金融市场分析中,获取股票的历史数据是进行技术分析和量化投资的基础。Tusharetushare官网是一个提供中国股市数据的API接口,它支持获取股票的日线数据、基本面数据等。本文将介绍如何使用Python语言和Tushare库来获取股票的日线数据,并结合多线程技术提高数据获取的效率。
1. 环境准备
首先,确保你的Python环境中安装了以下库:
tushare
:用于获取股票数据的API接口。pandas
:用于数据处理和分析。datetime
:用于处理日期和时间。os
:用于操作系统功能,如文件路径操作。multiprocessing
:用于实现多线程。time
:用于处理时间相关的操作。
可以通过以下命令安装所需的库:
pip install tushare pandas
2. Tushare API的初始化
在使用Tushare之前,需要注册并获取API tokentushare官网。然后,使用以下代码初始化Tushare:
import tushare as ts
pro = ts.pro_api('your_token')
3. 获取股票列表
股票数据的获取通常是基于股票代码进行的。以下代码展示了如何获取当前上市的所有股票代码:
stock_list = list(
pro.stock_basic(exchange='', list_status='L', fields='ts_code,symbol,name,area,industry,list_date')['ts_code']) + \
list(pro.stock_basic(exchange='', list_status='D', fields='ts_code,symbol,name,area,industry,list_date')['ts_code']) + \
list(pro.stock_basic(exchange='', list_status='P', fields='ts_code,symbol,name,area,industry,list_date')['ts_code'])
stock_list = list(filter(lambda x: x.startswith(('0', '6', '3')) and x.endswith(('SH', 'SZ')), stock_list))
4. 定义获取单只股票日线数据的函数
定义一个函数get_stock_daily_data_all
,用于获取单只股票的日线数据。这个函数包括获取基础行情、复权因子、基本面因子、涨跌停价格和资金流向:
def get_stock_daily_data_all(stock_id, save_file_mode='feather'):
df_daily = pd.DataFrame([])
# 根据股票代码获取股票的交易所代码
if len(stock_id) == 6:
if stock_id.startswith(('6')):
fund_code = f'{stock_id}.SH'
elif stock_id.startswith('8'):
fund_code = f'{stock_id}.BJ'
else:
fund_code = f'{stock_id}.SZ'
else:
fund_code = stock_id
# 检查是否已经存在数据文件,如果不存在则获取数据
if not os.path.exists(f'D:/stock_daily_data_tushare/{fund_code[:-3]}.feather'):
try:
for i in range(len(date_list) - 1):
df_daily_temp = pro.daily(ts_code=f'{stock_id}', start_date=date_list[i], end_date=date_list[i + 1]).iloc[::-1]
df_adj = pro.adj_factor(ts_code=f'{stock_id}', start_date=date_list[i], end_date=date_list[i + 1]).iloc[::-1]
df_basic = pro.daily_basic(ts_code=f'{stock_id}', start_date=date_list[i], end_date=date_list[i + 1], fields='ts_code,trade_date,turnover_rate,turnover_rate_f,volume_ratio,pe,pe_ttm,pb,ps,ps_ttm,dv_ratio,dv_ttm,total_share,float_share,free_share,total_mv,circ_mv').iloc[::-1]
df_limit = pro.stk_limit(ts_code=f'{stock_id}', start_date=date_list[i], end_date=date_list[i + 1]).iloc[::-1]
df_moneyflow = pro.moneyflow(ts_code=f'{stock_id}', start_date=date_list[i], end_date=date_list[i + 1]).iloc[::-1]
df_daily_temp['adj_factor'] = df_adj['adj_factor']
df_daily_temp = pd.merge(df_daily_temp, df_limit, on=['ts_code', 'trade_date'], how='inner')
df_daily_temp = pd.merge(df_daily_temp, df_basic, on=['ts_code', 'trade_date'], how='inner')
df_daily_temp = pd.merge(df_daily_temp, df_moneyflow, on=['ts_code', 'trade_date'], how='inner')
df_daily = pd.concat([df_daily, df_daily_temp])
for item in ['open', 'high', 'low', 'close']:
df_daily[f'{item}_after'] = df_daily[item] * df_daily['adj_factor']
df_daily['ts_code'] = df_daily['ts_code'].apply(lambda x: x[:-3])
df_daily = df_daily.rename(columns={'ts_code': 'code', 'trade_date': 'date', 'vol': 'volume'})
df_daily.reset_index(drop=True, inplace=True)
if save_file_mode == 'feather':
df_daily.to_feather(f'D:/stock_daily_data_tushare/{fund_code[:-3]}.feather')
elif save_file_mode == 'csv':
df_daily.to_csv(f'./data/temp_data/{fund_code[:-3]}.csv')
except Exception as e:
time.sleep(60)
print(e)
print(f'{fund_code} error!')
5. 多线程获取数据
为了提高数据获取的效率,可以使用Python的multiprocessing
库来实现多线程。以下代码展示了如何使用多线程获取所有股票的日线数据:
if __name__ == '__main__':
pool = mp.Pool(processes=4) # 创建一个进程池
pool.map(get_stock_daily_data_all, stock_list) # 映射函数到股票列表
pool.close()
pool.join()
6. 总结
本文介绍了如何使用Python和Tushare库获取股票的日线数据,包括基础行情、复权因子、基本面因子、涨跌停价格和资金流向。通过多线程技术,可以显著提高数据获取的效率。这些数据可以用于后续的数据分析和量化投资策略开发。
注意事项
- 确保Tushare的API token是有效的。
- 根据需要调整数据保存的格式和路径。
- 考虑到API的调用频率限制,适当增加错误处理和重试逻辑。