人的精力是有限的,所以将目光聚焦在更小的范围内,也许能够得到性价比最高的效果。
股票很多很多,但是我们关心的也许并不多,将自己关心或者符合自己买入股票的前提条件的股票纳入一个股票池,然后再一定时间内只关注这些股票,也许是一个不错的选择,
入市有风险,投资需谨慎,本文不作为任何投资参考依据。
数据源
这里主要指免费的,收费的本人也没用过。
比较推荐的数据源有两个tushare或者baostock.
tushare需要注册(如果你需要质量更高的数据的话)。对获取频率或者小于日线频率的数据有限制。
其他数据源
- baostock
数据不需要注册,数据有维护者维护 - akshare
数据源来源于各类财经网站 - pytdx
通过通达信的数据接口获取的数据
如果大家想注册tushare的话, 可以使用我的分享链接: https://tushare.pro/register?reg=277890 这样我能多50积分^_^
使用何种方式获取数据都是可以的,看自己喜欢。
安装
安装很简单
pip install tushare pip install baostock pip install akshare pip install pytdx
数据获取
这里使用为了接下来的操作需要将一定历史范围的股票数据下载下来,这里下载起始时间为20160101,截至时间为运行代码的时间范围的历史日线数据。
这里以tushare为例, tushare获取历史数据有两种方式。
第一种是以迭代历史交易日的方式获取所有历史数据,假设获取三年的历史数据,一年一般220个交易日左右,那么3年需要请求660多次左右,如果以这种方式的话,就下载数据的时间只需要1分钟多点的样子。
第二种是以迭代所有股票代码的方式获取所有历史数据,股票数量有大概3800多个,需要请求3800多次,但是在积分有限的情况下一分钟最多请求500次,也就意味着仅下载数据的时间至少需要大概8分钟时间。
理论上,你获取的历史范围超过17.3年,那么使用第一种方式才比第二种方式快。
这两种方式我实现了,大家可以参考以下代码.
首先是一些必要的设置及额外的重试机制。
DATE_FORMAT = "%Y%m%d" TS_TOKEN = "<你的Tushare Token>" ts.set_token(TS_TOKEN) pro = ts.pro_api(TS_TOKEN) def retry(fn, max_retry=3, sleep_init=14): """简单的retry函数""" count = 1 while count < max_retry: count += 1 try: return fn() except Exception as e: # traceback.print_exc("") # 等待时间递增 time_sleep = sleep_init * count + 1 print("遇到异常%s, 在%s秒后再次尝试第%s次" % (e, time_sleep, count)) time.sleep(time_sleep) def save_to_csv(ret, data_path="stock"): if not path.exists(data_path): # 如果父目录不存在不会报错 os.makedirs(data_path) for ts_code, df in ret.items(): fname = "-".join([ts_code, ".csv"]) fp = path.join(data_path, fname) df.to_csv(fp, index=False)
第一种方式
def download_by_trade_date(start_date, end_date, data_path="by_trade_date", worker_size=2, debug=False): """ 通过交易日来遍历时间范围内的数据,当交易日的个数小于股票的数量时,效率较高. 一年一般220个交易日左右,但是股票却有3800多个,那么通过交易日来下载数据就高效的多了 """ now = datetime.now() start_time = now try: start_date_ = datetime.strptime(start_date, DATE_FORMAT) end_date_ = datetime.strptime(end_date, DATE_FORMAT) if end_date_ < start_date_: sys.exit("起始时间应该大于结束时间") if start_date_ > now: sys.exit("起始时间应该大于当前时间") if end_date_ > now: end_date = now.strftime(DATE_FORMAT) except Exception: traceback.print_exc("") sys.exit("传入的start_date[%s]或end_date[%s]时间格式不正确, 格式应该像20200101" % (start_date, end_date)) # 获取交易日历 try: trade_cal = pro.trade_cal(exchange="SSE", is_open="1", start_date=start_date, end_date=end_date, fields=