在上一博客https://blog.csdn.net/reset2021/article/details/119570278中讲述了股票行情的爬取,这篇文章主要讲述对行情数据的更新以及对读取mongodb数据库中的数据并计算周期(这个周期可以依据具体需求自己定义)行情
首先,存储股票代码
由于需要经常用到股票代码的信息,所以将上一博文中的提取股票代码的处理做了一下封装。
code_id_list = []
for page in range(230):
Url = 'http://62.push2.eastmoney.com/api/qt/clist/get?cb=jQuery112407939967130801426_1628420280168&pn=' + str(page + 1) +'&pz=20&po=1&np=1&ut=bd1d9ddb04089700cf9c27f6f7426281&fltt=2&invt=2&fid=f3&fs=m:0+t:6,m:0+t:80,m:1+t:2,m:1+t:23&fields=f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f12,f13,f14,f15,f16,f17,f18,f20,f21,f23,f24,f25,f22,f11,f62,f128,f136,f115,f152&_=1628420280169'
html = requests.get(Url)
html = html.text
stock = re.findall(re.compile('\((.*)\)'),html)
stock = stock[0]
stock = eval(stock)
data_stock = stock['data']
total_stock = data_stock['total']
diff_stock = data_stock['diff']
for signal_stock in diff_stock:
code_id = signal_stock['f12']
dict = {'股票代码': code_id}
#print(dict)
code_id_list.append(dict)
return code_id_list
在上述代码实现中,将获取到的股票代码与”股票代码“字符一起构成dict,然后将所有的股票代码一起组成一个list,下面使用mongodb的多条目插入法实现一起插入。
由于这个数据表是独立的,所以需要新建”code_list“数据表。
client = pymongo.MongoClient('localhost',27017) #创建连接
db_stock = client['stock_info'] #创建名为 "stock_info" 的数据库
sheet_stock = db_stock['code_list'] #在"stock_info"数据库中建表"code_list"
插入函数,一句搞定。
sheet_stock.insert_many(code_id_list)
完成后的数据表展示如下:
2、行情数据更新
行情是每个交易日更新,所以要及时更新行情数据。
2.1、首先要查询数据库中的最新行情数据的日期
行情数据表是这样存储的,于是只要获取第一条数据,并提取其中的”日期“数据即可
具体实现如下所示
last_stock_info = sheet_stock.find_one()
lastday = last_stock_info['日期']
2.2、将行情数据表的最新日期与今天的日期分别传入下面的”start_time “ 与 ”end_time “
if (code_id[0] == '6' or code_id[0] == '9'):
url = 'http://quotes.money.163.com/service/chddata.html?code=0' + code_id + \
'&start=' + start_time + '&end=' + end_time + '&fields=TCLOSE;HIGH;LOW;TOPEN;LCLOSE;CHG;PCHG;TURNOVER;VOTURNOVER;VATURNOVER;TCAP;MCAP'
print(url)
else:
url ='http://quotes.money.163.com/service/chddata.html?code=1' + code_id + \
'&start=' + start_time + '&end=' + end_time + '&fields=TCLOSE;HIGH;LOW;TOPEN;LCLOSE;CHG;PCHG;TURNOVER;VOTURNOVER;VATURNOVER;TCAP;MCAP'
print(url)
任何将获取的数据依据上述方法存入数据表中即可。
3、获取某股票的所有行情数据
查询数据库中股票代码为tag_label 的所有数据,并且按日期排序,最终存入list中。便于后续处理
myquery = { tag_name: tag_label }
mydoc = sheet_stock.find(myquery).sort("日期", 1)
stock_info_list = []
for query_info in mydoc:
stock_info_list.append(query_info)
4、计算周期行情数据
首先对行情数据进行分组,以周期为一个单位,不满一个周期的存入最后一个周期中,得到周期的行情list
然后对每个周期数据进行处理计算,针对每一项值的特征进行特别处理
stock_cycle_info = group_info[-1]
stock_cycle_info['日期'] = group_info[-1]['日期']
stock_cycle_info['股票代码'] = group_info[-1]['股票代码']
stock_cycle_info['名称'] = group_info[-1]['名称']
stock_cycle_info['收盘价'] = group_info[-1]['收盘价']
stock_cycle_info['总市值'] = group_info[-1]['总市值']
stock_cycle_info['流通市值'] = group_info[-1]['流通市值']
stock_cycle_info['开盘价'] = group_info[0]['收盘价']
stock_cycle_info['前收盘'] = group_info[0]['前收盘']
high_price = group_info[0]['最高价']
low_price = group_info[0]['最低价']
change_amount = 0.0
change_percent = 0.0
turnover_rate = 0.0
turnover = 0.0
trading_volume = 0.0
for stock_info in group_info:
if stock_info['最高价'] > high_price:
high_price = stock_info['最高价']
if stock_info['最低价'] < low_price:
low_price = stock_info['最低价']
if stock_info['涨跌额'] == 'None':
change_amount += 0.0
else:
change_amount += float(stock_info['涨跌额'])
if stock_info['涨跌幅'] == 'None':
change_percent += 0.0
else:
change_percent += float(stock_info['涨跌幅'])
if stock_info['换手率'] == 'None':
turnover_rate += 0.0
else:
turnover_rate += float(stock_info['换手率'])
turnover += float(stock_info['成交量'])
trading_volume += float(stock_info['成交金额'])
stock_cycle_info['最高价'] = high_price
stock_cycle_info['最低价'] = low_price
stock_cycle_info['涨跌额'] = change_amount
stock_cycle_info['涨跌幅'] = change_percent
stock_cycle_info['换手率'] = turnover_rate
stock_cycle_info['成交量'] = turnover
stock_cycle_info['成交金额'] = trading_volume
del stock_cycle_info['_id']
return stock_cycle_info
5、周期数据存入数据库
最后将计算得到的周期数据存入相应的数据表中
cycle_table_name = 'stock_cycle' +"_" + str(cycle_number)
sheet_stock = mongodb_init('stock_info',cycle_table_name)
code_id_list = get_stock_list()
for code_id in code_id_list:
cycle_info = get_cycle_info(cycle_number,code_id)
for group_info in cycle_info:
stock_cycle_info = calculate_cycle_info(group_info)
print(stock_cycle_info)
sheet_stock.insert_one(stock_cycle_info)
最后的显示结果如下(5周期行情数据)
本文主要是实现周期行情数据的计算,还存在优化的空间,比如,批量插入,以及更新时日期中时间问题(行情结束前后更新的数据是存在差异的),后续将随着功能的调整 也会对前期代码进行调整,但是流程基本上是不变的。