def refresh_all_stock_adjust(start_date="2020-03-27", current_date="2020-03-30"): bs.login() db_conn = create_engine(common.db_path_sqlalchemy) stock_rs = bs.query_all_stock(day=current_date) stock_df = stock_rs.get_data() rs_list = [] for code in stock_df["code"]: if code.startswith("sh.6") | code.startswith( "sz.00") | code.startswith("sz.300"): print('query_stock_factor code:' + code) rs_factor = bs.query_adjust_factor(code=code, start_date=start_date, end_date=current_date) while (rs_factor.error_code == '0') & rs_factor.next(): rs_list.append(rs_factor.get_row_data()) factor_list = [] for d in rs_list: code = d[0] print("refresh all factor for " + code) rs_factor = bs.query_adjust_factor(code=code, start_date='2006-01-01', end_date=current_date) while (rs_factor.error_code == '0') & rs_factor.next(): factor_list.append(rs_factor.get_row_data()) if len(factor_list) > 0: db_conn.execute( r''' INSERT OR REPLACE INTO stock_adjustfactor VALUES (?, ?, ?, ?, ?) ''', factor_list) bs.logout()
def downLoadAdjustFactorByStockCode(stockCode): '''下载指定股票的复权因子 下载指定股票所有的复权因子 Args: stockCode: 6位的股票代码,字符串格式 Returns: 返回复权因子的列表 [['sz.300634', '2018-03-23', '0.996584', '1.000000', '1.000000'], ['sz.300634', '2019-06-03', '1.000000', '1.003428', '1.003428']] [股票代码,除权除息日期 ,前复权,后复权,最后一个不要] ''' if stockCode[0] == '6': baoStockCode = 'sh.' + stockCode else: baoStockCode = 'sz.' + stockCode rs = bs.query_adjust_factor(code=baoStockCode, start_date="1990-01-01", end_date=getTodayDate()) if rs.error_code != '0': print('下载复权因子失败 :%s %s' % (baoStockCode, rs.error_msg)) return data_list = [] while (rs.error_code == '0') & rs.next(): data_list.append(rs.get_row_data()) return data_list
def load_adjfactor(symbol, data_path): adj_file = os.path.join(data_path, symbol, 'adj.csv') if os.path.exists(adj_file): return load_adjfactor_from_file(adj_file) lg = bs.login('anonymous', '123456') if lg.error_code != '0': raise ValueError('baostock login failed:{}, {}'.format(lg.error_code, lg.error_msg)) rs_list = [] rs_factor = bs.query_adjust_factor(convert_symbol(symbol), start_date="1990-01-01", end_date="2199-12-31") while (rs_factor.error_code == '0') & rs_factor.next(): rs_list.append(rs_factor.get_row_data()) if rs_factor.error_code != '0': bs.logout() raise ValueError('baostock read data failed:{}'.format(rs_factor.error_msg)) bs.logout() result_factor = pd.DataFrame(rs_list, columns=rs_factor.fields) result_factor.to_csv(adj_file, encoding="utf-8", index=False) return load_adjfactor_from_file(adj_file)
def testGetFactor(): bs.login() data_list = [] k_rs = bs.query_adjust_factor(code="sh.600161", start_date="2010-01-01", end_date="") while (k_rs.error_code == '0') & k_rs.next(): data_list.append(k_rs.get_row_data()) print(data_list) bs.logout()
def updateAllAdjustFactor(): stockList = getStockListFromBaoStock() for i in stockList: rs = bs.query_adjust_factor(code=i, start_date="1990-01-01", end_date=getTodayDate()) if rs.error_code != '0': print('下载复权因子失败 :%s %s' % (i, rs.error_msg)) return data_list = [] while (rs.error_code == '0') & rs.next(): data_list.append(rs.get_row_data()) updateAdjustFactorInDB(data_list) print('更新复权因子 %s' %i)
def query_adjust_factor(self, code, start_date = None, end_date = None): ''' code:股票代码,sh或sz.+6位数字代码,或者指数代码,如:sh.601398。sh:上海;sz:深圳。此参数不可为空; start_date:开始日期,为空时默认为2015-01-01,包含此日期; end_date:结束日期,为空时默认当前日期,包含此日期。 ''' rs_list = [] rs = bs.query_adjust_factor(code=code, start_date=start_date, end_date=end_date) self.log('query_adjust_factor respond error_msg:', rs) while (rs.error_code == '0') & rs.next(): rs_list.append(rs.get_row_data()) result = pd.DataFrame(rs_list, columns=rs.fields) return result
def query_adjust_factor(code, start_date=None, end_date=None): """ 查询复权因子信息 BaoStock提供的是涨跌幅复权算法复权因子 :param code:股票代码,sh或sz.+6位数字代码,或者指数代码,如:sh.601398。sh:上海;sz:深圳。此参数不可为空; :param start_date:开始日期,为空时默认为2015-01-01,包含此日期; :param end_date:结束日期,为空时默认当前日期,包含此日期。 """ lg = bs.login() if lg.error_code != '0': logger.error('login respond error_msg:' + lg.error_msg) rs_list = [] rs_factor = bs.query_adjust_factor(code=code, start_date=start_date, end_date=end_date) while (rs_factor.error_code == '0') & rs_factor.next(): rs_list.append(rs_factor.get_row_data()) result_factor = pd.DataFrame(rs_list, columns=rs_factor.fields) bs.logout() return result_factor
def dmpAdjFactorsToFile(self, codes:list, filename:str): codes = transCodes(codes) stocks = { "SSE":{}, "SZSE":{} } count = 0 length = len(codes) for code in codes: exchg = code[:2] if exchg == 'sh': exchg = 'SSE' else: exchg = 'SZSE' count += 1 stocks[exchg][code[3:]] = list() print("Fetching adjust factors of %s(%d/%s)..." % (code, count, length)) rs = bs.query_adjust_factor(code=code, start_date="1990-01-01") if rs.error_code == '0': print("Error occured: %s" % (rs.error_msg)) continue while rs.next(): items = rs.get_row_data() date = int(items[1].replace("-","")) factor = float(items[4]) stocks[exchg][code[3:]].append({ "date": date, "factor": factor }) print("Writing adjust factors into file %s..." % (filename)) f = open(filename, 'w+') f.write(json.dumps(stocks, sort_keys=True, indent=4, ensure_ascii=False)) f.close()
def get_adj_factor(): # baostock登录 lg = bs.login() param = request.form if param and param['code']: # sh.600000(600000.SH) code = param['code'] if param and param['begin']: # 2015-01-01 begin = param['begin'] if param and param['end']: # 2015-01-01 end = param['end'] rs_list = [] show_code = stock_com(code) rs_factor = bs.query_adjust_factor(code=show_code, start_date=begin, end_date=end) while (rs_factor.error_code == '0') & rs_factor.next(): rs_list.append(rs_factor.get_row_data()) result_factor = pd.DataFrame(rs_list, columns=rs_factor.fields) # 保存路径 basepath = os.path.dirname(__file__) basicpath = 'static/perstock/' + code show_time = today_time() fileFlag = get_file_exist(basicpath, 'main') factorFlag = get_file_exist(basicpath, 'factor') csv_name = basicpath + '/factor/' + code + '_' + show_time + '.csv' save_csv(csv_name, result_factor) # 转为json存储 json_name = basicpath + '/factor/' + code + "_" + show_time + ".json" parsed = save_json(json_name, result_factor, 'com') all_len = len(parsed) show_obj = {"data": parsed, "total": all_len, "type": "factorList"} # baostock登出 bs.logout() return show_obj
def dmpAdjFactorsToDB(self, dbHelper:DBHelper, codes:list): codes = transCodes(codes) stocks = { "SSE":{}, "SZSE":{} } count = 0 length = len(codes) for code in codes: exchg = code[:2] if exchg == 'sh': exchg = 'SSE' else: exchg = 'SZSE' count += 1 print("Fetching adjust factors of %s(%d/%s)..." % (code, count, length)) stocks[exchg][code[3:]] = list() rs = bs.query_adjust_factor(code=code, start_date="1990-01-01") if rs.error_code == '0': print("Error occured: %s" % (rs.error_msg)) continue while rs.next(): items = rs.get_row_data() date = int(items[1].replace("-","")) factor = float(items[4]) stocks[exchg][code[3:]].append({ "date": date, "factor": factor }) print("Writing adjust factors into database...") dbHelper.writeFactors(stocks)
import baostock as bs import pandas as pd # 登陆系统 lg = bs.login() # 显示登陆返回信息 print('login respond error_code:' + lg.error_code) print('login respond error_msg:' + lg.error_msg) # 查询2015至2017年复权因子 rs_list = [] rs_factor = bs.query_adjust_factor(code="sh.600000", start_date="2015-01-01", end_date="2017-12-31") while (rs_factor.error_code == '0') & rs_factor.next(): rs_list.append(rs_factor.get_row_data()) result_factor = pd.DataFrame(rs_list, columns=rs_factor.fields) # 打印输出 print(result_factor) # 结果集输出到csv文件 result_factor.to_csv("D:\\adjust_factor_data.csv", encoding="gbk", index=False) # 登出系统 bs.logout()
def adjust_factor(self, code, start_date, end_date): self.getStockInstance() rs = bs.query_adjust_factor(code, start_date, end_date) self._test_rs(rs) return rs
import baostock as bs import pandas as pd # 登陆系统 lg = bs.login() # 显示登陆返回信息 print('login respond error_code:'+lg.error_code) print('login respond error_msg:'+lg.error_msg) # 查询2017至2019年复权因子 rs_list = [] rs_factor = bs.query_adjust_factor(code="sz.000001", start_date="2017-01-01", end_date="2019-12-31") while (rs_factor.error_code == '0') & rs_factor.next(): rs_list.append(rs_factor.get_row_data()) result_factor = pd.DataFrame(rs_list, columns=rs_factor.fields) # 打印输出 print(result_factor) # 结果集输出到csv文件 result_factor.to_csv("D:\\adjust_factor_data.csv", encoding="gbk", index=False) # 登出系统 bs.logout()