def query_hs300_stocks(): rs = bs.query_hs300_stocks() while Stock.retried_num < Stock.RETRY_MAX_NUM and rs.error_code != '0': sleep(Stock.RETRY_DELAY_S) rs = bs.query_hs300_stocks() Stock.retried_num += 1 if '0' == rs.error_code: Stock.retried_num = 0 return Stock.rs_to_list(rs)
def query_hs300_stocks(): rs = bs.query_hs300_stocks() while BaoStock.retried_num < BaoStock.RETRY_MAX_NUM and rs.error_code != '0': sleep(BaoStock.RETRY_DELAY_S) rs = bs.query_hs300_stocks() BaoStock.retried_num += 1 assert('0' == rs.error_code) BaoStock.retried_num = 0 return BaoStock.rs_to_list(rs)
def getStockList(type: str = "default", date: str = ""): result = [] data: DataFrame if type == "sz50": data = BaoStock.query_sz50_stocks(date).get_data() elif type == "hs300": data = BaoStock.query_hs300_stocks(date).get_data() elif type == "zz500": data = BaoStock.query_zz500_stocks(date).get_data() elif type == "default": path = Path(__file__).parent.absolute()/"list.json" file = open(str(path), "r", encoding="utf8") return Json.loads(file.read()) else: data = BaoStock.query_stock_basic().get_data() keys = data.keys() data = [x[1] for x in BaoStock.query_stock_basic().get_data().iterrows()] if type == "index": data = [x for x in data if x["type"] == "2"] elif type == "stock": data = [x for x in data if x["type"] == "1"] for row in data: result.append({getStockListMap[key][0]: row[key] for key in keys if key in getStockListMap}) return result for row in data.iterrows(): result.append({getStockListMap[key][0]: row[1][key] for key in data.keys() if key in getStockListMap}) return result
def getList(self): stocks = [] # 获取中证500成分股 rs = bs.query_zz500_stocks() print('query_zz500 error_code:' + rs.error_code) print('query_zz500 error_msg:' + rs.error_msg) while (rs.error_code == '0') & rs.next(): # 获取一条记录,将记录合并在一起 stocks.append(rs.get_row_data()) # 获取中证500成分股 rs = bs.query_hs300_stocks() print('query_hs300 error_code:' + rs.error_code) print('query_hs300 error_msg:' + rs.error_msg) while (rs.error_code == '0') & rs.next(): # 获取一条记录,将记录合并在一起 stocks.append(rs.get_row_data()) result = pd.DataFrame(stocks, columns=rs.fields) # 结果集输出到csv文件 self.makeDIR('./data') result.to_csv('data/' + 'stockList.csv', index=False)
def querHS300Stocks(date=''): rs = bs.query_hs300_stocks(date=date) # 打印结果集 hs300_stocks = [] while (rs.error_code == '0') & rs.next(): # 获取一条记录,将记录合并在一起 hs300_stocks.append(rs.get_row_data()) result = pd.DataFrame(hs300_stocks, columns=rs.fields)
def get_hs300_stocks(): rs = BS.query_hs300_stocks() hs300_stocks = [] while (rs.error_code == '0') & rs.next(): hs300_stocks.append(rs.get_row_data()) result = PD.DataFrame(hs300_stocks, columns=rs.fields) print(result) return result
def get_code(file_path): rs = bs.query_hs300_stocks() print('query_hs300 error_code:' + rs.error_code) print('query_hs300 error_msg:' + rs.error_msg) hs300_stocks = [] while (rs.error_code == '0') & rs.next(): hs300_stocks.append(rs.get_row_data()) result = pd.DataFrame(hs300_stocks, columns=rs.fields) result.to_csv(file_path, encoding="utf-8", index=False) return None
def bao_hs300_stocks() -> pd.DataFrame: """ 获取沪深300成分股信息 :return: """ df = bao.query_hs300_stocks().get_data() df['code'] = df['code'].apply(lambda x: ts_code(x)) df.set_index(keys='code', drop=False, inplace=True) logging.info(colorama.Fore.YELLOW + '获取沪深300成分股信息') return df
def calculate_hs300_spec(): lg = bs.login() print('login respond error_code:'+lg.error_code) print('login respond error_msg:'+lg.error_msg) rs = bs.query_hs300_stocks() print('query_hs300 error_code:'+rs.error_code) print('query_hs300 error_msg:'+rs.error_msg) hs300_stocks = [] while (rs.error_code == '0') & rs.next(): hs300_stocks.append(rs.get_row_data()) bs.logout() db = create_engine(common.db_path_sqlalchemy) hs300code = 'sh.000300' sql_cmd = "SELECT * FROM stock_day_k where code='" + hs300code + "' order by date desc limit 0,251" datash = pd.read_sql(sql=sql_cmd, con=db) price = DataFrame({'date': datash['date'], hs300code:datash['close']}) result = [] currentdate = datash['date'][0] for stockinfo in hs300_stocks: stockcode = stockinfo[1] code_name = stockinfo[2] sql_cmd = "SELECT * FROM stock_day_k where code='" + stockcode+"' order by date desc limit 0,251" daily = pd.read_sql(sql=sql_cmd, con=db) pp = DataFrame({stockcode:daily['close']}) price2 = pd.concat([price, pp], axis=1) price2 = price2.drop(['date'], axis=1) price2 = price2.reset_index(drop = True) tickerresult = [] tickerresult.append(currentdate) tickerresult.append(stockcode) tickerresult.append(code_name) trendgap_y = calculate_trendgap(price2, pp.shape[0]) trendgap_hy = calculate_trendgap(price2, pp.shape[0], 120) trendgap_qy = calculate_trendgap(price2, pp.shape[0], 60) trendgap_m = calculate_trendgap(price2, pp.shape[0], 20) trendgap_10 = calculate_trendgap(price2, pp.shape[0], 10) trendgap_5 = calculate_trendgap(price2, pp.shape[0], 5) tickerresult.append(trendgap_y) tickerresult.append(trendgap_hy) tickerresult.append(trendgap_qy) tickerresult.append(trendgap_m) tickerresult.append(trendgap_10) tickerresult.append(trendgap_5) result.append(tickerresult) print(code_name) if len(result) != 0: db.execute(r''' INSERT OR REPLACE INTO stock_hs300_spec VALUES (?,?,?,?,?,?,?,?,?) ''', result)
def get_300_codes(self, date='2017-01-01'): # 获取沪深300成分股 rs = bs.query_hs300_stocks(date) # 打印结果集 hs300_stocks = [] while (rs.error_code == '0') & rs.next(): # 获取一条记录,将记录合并在一起 hs300_stocks.append(rs.get_row_data()) result = pd.DataFrame(hs300_stocks, columns=rs.fields) return result
def hs300(): filename = "data/hs300.csv" if os.path.exists(filename): result = pd.read_csv(filename) else: rs = bs.query_hs300_stocks() hs300_stocks = [] while (rs.error_code == '0') & rs.next(): hs300_stocks.append(rs.get_row_data()) result = pd.DataFrame(hs300_stocks, columns=rs.fields) result.to_csv(filename, encoding="utf-8", index=False) return result
def get_constituent_stock(i): basepath = os.path.dirname(__file__) basicpath = 'static/morestock/' + i + '-stock' show_time = today_time() param = request.form show_code = "" if param and (param['code'] or param['code'] == ""): code = param['code'] show_code = stock_com(code) if show_code == "": # baostock相关设置 lg = bs.login() if i == "hs300": rs = bs.query_hs300_stocks() elif i == "sz": rs = bs.query_sz50_stocks() elif i == "zz": rs = bs.query_zz500_stocks() result = res_data(rs) # 创建个股文件夹 create_file(basicpath) # 存储csv、excel、josn文件 parsed = save_all(basicpath, i, show_time, result, 'data') # 从json获取数据(all) all_len = len(parsed) type_name = i + "Stock" show_obj = {"data": parsed, "total": all_len, "type": type_name} # baostock登出 bs.logout() return show_obj else: jsonpath = basicpath + '/json/' + i + '_' + show_time + '.json' joson_file = os.path.join(basepath, jsonpath) jsonFlag = "0" search_arr = [] with open(joson_file, 'r+', encoding="utf-8") as load_f: load_file = load_f.read() home_file = json.loads(load_file, strict=False) if show_code == "-1": search_arr = home_file['data'] elif show_code == "-2": search_arr = [] else: for item in home_file['data']: if item['code'] == show_code or item[ 'code_name'] == show_code: jsonFlag = "1" search_arr.append(item) all_len = len(search_arr) type_name = i + "Stock" show_obj = {"data": search_arr, "total": all_len, "type": type_name} return show_obj
def bs_save_hs300_stocks(): ''' 获取沪深300成分股信息 :return: ''' bs.login() rs = bs.query_hs300_stocks() data_list = [] while (rs.error_code == '0') & rs.next(): data_list.append(rs.get_row_data()) result = pd.DataFrame(data_list, columns=rs.fields) engine = create_engine('mysql+pymysql://root:root@localhost:3306/stock_quant?charset=utf8') result.to_sql('bs_hs300_stocks', engine, index=True) bs.logout()
def query_hs300_stocks(self, date = None): ''' date:查询日期,格式XXXX-XX-XX,为空时默认最新日期。 ''' rs = bs.query_hs300_stocks(date = date) self.log('query_hs300 error_msg:', rs) # 打印结果集 hs300_stocks = [] while (rs.error_code == '0') & rs.next(): # 获取一条记录,将记录合并在一起 hs300_stocks.append(rs.get_row_data()) result = pd.DataFrame(hs300_stocks, columns=rs.fields) return result
def main(): # 沪深300 rs = bs.query_hs300_stocks() # 获取上证50成分股 rs1 = bs.query_sz50_stocks() # 获取中证500成分股 rs2 = bs.query_zz500_stocks() while (rs.error_code == '0') & rs.next(): # 获取一条记录,将记录合并在一起 re = Combine(rs.get_row_data()[1]) if re: datalist.append(re) result = pd.DataFrame(datalist) result.to_csv("/tmp/a.csv", index=False)
def get_hs300_stocks(date=today): # 获取沪深300成分股 rs = bs.query_hs300_stocks(date=date) if rs.error_code != '0': print('query_hs300 respond error_code::' + rs.error_msg) login() return get_hs300_stocks(date) # 打印结果集 hs300_stocks = [] while (rs.error_code == '0') & rs.next(): # 获取一条记录,将记录合并在一起 hs300_stocks.append(rs.get_row_data()) result = pd.DataFrame(hs300_stocks, columns=rs.fields) return result
def getNormalDataForBaoStock(start_date, end_date): #### 登陆系统 #### lg = bs.login() # 显示登陆返回信息 print('login respond error_code:' + lg.error_code) print('login respond error_msg:' + lg.error_msg) #### 获取沪深A股历史K线数据 #### # 详细指标参数,参见“历史行情指标参数”章节;“分钟线”参数与“日线”参数不同。“分钟线”不包含指数。 # 分钟线指标:date,time,code,open,high,low,close,volume,amount,adjustflag # 周月线指标:date,code,open,high,low,close,volume,amount,adjustflag,turn,pctChg hs300_stocks = [] rs = bs.query_hs300_stocks() while (rs.error_code == '0') & rs.next(): # 获取一条记录,将记录合并在一起 hs300_stocks.append(rs.get_row_data()) for stock_info in hs300_stocks: code = stock_info[1] rs = bs.query_history_k_data_plus( code, "date,code,open,high,low,close,preclose,volume,amount,adjustflag,turn,tradestatus,pctChg,isST", start_date=start_date, end_date=end_date, frequency="d", adjustflag="1") print('query_history_k_data_plus respond error_code:' + rs.error_code) print('query_history_k_data_plus respond error_msg:' + rs.error_msg) #### 打印结果集 #### data_list = [] while (rs.error_code == '0') & rs.next(): # 获取一条记录,将记录合并在一起 data_list.append(rs.get_row_data()) result = pd.DataFrame(data_list, columns=rs.fields) #### 结果集输出到csv文件 #### file_directory = os.path.join(save_path, code) if not os.path.exists(file_directory): os.makedirs(file_directory) result.to_csv(os.path.join(save_path, code, "history_A_stock_k_data.csv"), index=False) print(result) #### 登出系统 #### bs.logout()
def dispatch_request(self): post_data = request.get_json() date = post_data.get('date', '') attr_fields = post_data.get('attr_fields', None) rs = bs.query_hs300_stocks(date=date) hs50_stocks = [] while (rs.error_code == '0') & rs.next(): hs50_stocks.append(rs.get_row_data()) fields = ['updateDate', 'code', 'code_name'] data = jsonWrapper(hs50_stocks, fields) result = { 'code': 200 if rs.error_code == '0' else rs.error_code, 'data': list(map(lambda x: { attr: x.get(attr, '') for attr in attr_fields }, data)) if attr_fields else data, 'msg': rs.error_msg } self.logout() return jsonify(result)
def get_hs300_stocks(): lg = bs.login() # 显示登陆返回信息 print('login respond error_code:' + lg.error_code) print('login respond error_msg:' + lg.error_msg) #### 获取交易日信息 #### rs = bs.query_hs300_stocks() print('query_trade_dates respond error_code:' + rs.error_code) print('query_trade_dates respond error_msg:' + rs.error_msg) #### 打印结果集 #### data_list = [] while (rs.error_code == '0') & rs.next(): # 获取一条记录,将记录合并在一起 data_list.append(rs.get_row_data()) result = pd.DataFrame(data_list, columns=rs.fields) bs.logout() return result
def compute_avg_earning(): lg = bs.login() rs = bs.query_hs300_stocks() result = pd.DataFrame() while(rs.error_code == '0') & rs.next(): row = rs.get_row_data() code = row[1] df = get_closeprice(code) df['code_name'] = row[2] if result.empty: result = df else: result = result.append(df) # zz = bs.query_zz500_stocks() # while(zz.error_code == '0') & zz.next(): # row = zz.get_row_data() # code = row[1] # df = get_closeprice(code) # df['code_name'] = row[2] # result = result.append(df) result = result[result['netProfit_x'] != ''] result['netProfit_x'] = result['netProfit_x'].astype(float) result = result[result['netProfit_x'] > 0] result['netProfit_y'] = result['netProfit_y'].astype(float) result = result[result['netProfit_y'] > 0] result['avgEarningRate'] = (result['netProfit_y']/result['netProfit_x']).apply(lambda x: math.pow(x,1/5)-1) result = result[result['avgEarningRate'] > 0] result['roeAvg_y'] = result['roeAvg_y'].astype(float) result = result[result['roeAvg_y'] > 0.1] result['npMargin_y'] = result['npMargin_y'].astype(float) result = result[result['npMargin_y'] > 0.1] result['pe'] = result['pe'].astype(float) result = result[result['pe'] > 0] result = result[result['pe'] < 50] result['peg'] = result['pe'] / result['avgEarningRate'] result = result.sort_values(by=['peg'], ascending=True) result.to_csv("avg_earning_rate.csv", encoding="utf-8", index=False) result[:10].plot.bar(title='peg', x='code_name', y='peg') plt.show() bs.logout()
def get_hs300_stocks(): """ 获取沪深300成分股 """ # 登陆系统 lg = bs.login() # 显示登陆返回信息 print('login respond error_code:' + lg.error_code) print('login respond error_msg:' + lg.error_msg) # 获取沪深300成分股 rs = bs.query_hs300_stocks() print('query_hs300 error_code:' + rs.error_code) print('query_hs300 error_msg:' + rs.error_msg) # 打印结果集 hs300_stocks = [] while (rs.error_code == '0') & rs.next(): # 获取一条记录,将记录合并在一起 hs300_stocks.append(rs.get_row_data()) result = pd.DataFrame(hs300_stocks, columns=rs.fields) # # 结果集输出到csv文件 # result.to_csv("hs300_stocks.csv", encoding="utf-8", index=False) dtype = { 'updateDate': String(10), 'code': String(9), 'code_name': String(10) } result.to_sql('odl_bs_hs300_stocks', engine, schema=CQ_Config.DB_SCHEMA, if_exists='replace', index=False, dtype=dtype) # 登出系统 bs.logout()
def hs300_stocks(): # 登陆系统 lg = bs.login() # 显示登陆返回信息 print('login respond error_code:' + lg.error_code) print('login respond error_msg:' + lg.error_msg) # 获取证券基本资料 rs = bs.query_hs300_stocks() print('query_hs300 error_code:' + rs.error_code) print('query_hs300 error_msg:' + rs.error_msg) # 打印结果集 hs300_stocks = [] while (rs.error_code == '0') & rs.next(): # 获取一条记录,将记录合并在一起 hs300_stocks.append(rs.get_row_data()) result = pd.DataFrame(hs300_stocks, columns=rs.fields) # 结果集输出到csv文件 # result.to_csv("D:/hs300_stocks.csv", encoding="gbk", index=False) result.to_csv(ConfigUtils.get_stock("HS_300_STOCK_NAME"), index=False) print(result.tail()) print("init all hs300 stock names")
def hs300_index_component(self): file_path = './raw_data/hs300_stocks.csv' if os.path.exists(file_path): is_outdate = None else: is_outdate = True # 获取沪深300成分股 rs = bs.query_hs300_stocks() print(f'hs300_index_component, error_code:{rs.error_code}') # 打印结果集 hs300_stocks = [] while (rs.error_code == '0') & rs.next(): row = rs.get_row_data() if is_outdate is None: is_outdate = self.check_index_component_outdate( row[0], file_path) # is_outdate = True hs300_stocks.append(row) elif is_outdate == True: # 获取一条记录,将记录合并在一起 hs300_stocks.append(row) else: return result = pd.DataFrame(hs300_stocks, columns=rs.fields) result = result.set_index("code") # result = self.get_stock_industry_from_dongcai(result) for code in result.index.values.tolist(): stock_info = self.get_stock_detail(code) result.loc[code, 'url'] = stock_info['url'] result.loc[code, 'industry'] = stock_info['industry'] result.loc[code, 'pe_max'] = stock_info['pe_max'] result.loc[code, 'pe_mean'] = stock_info['pe_mean'] result.loc[code, 'pe_min'] = stock_info['pe_min'] # 结果集输出到csv文件 result.to_csv(file_path, encoding="gbk")
def get_hs300_zz500_data(): # 获取沪深300和中证500成分股 rs_hs300 = bs.query_hs300_stocks("2020-07-30") rs_zz500 = bs.query_zz500_stocks("2020-07-30") print('query_hs300 error_code:' + rs_hs300.error_code) print('query_hs300 error_msg:' + rs_hs300.error_msg) print('query_zz500 error_code:' + rs_zz500.error_code) print('query_zz500 error_msg:' + rs_zz500.error_msg) # 打印结果集 hs300_stocks = [] zz500_stocks = [] while (rs_hs300.error_code == '0') & rs_hs300.next(): # 获取一条记录,将记录合并在一起 hs300_stocks.append(rs_hs300.get_row_data()) while (rs_zz500.error_code == '0') & rs_zz500.next(): # 获取一条记录,将记录合并在一起 zz500_stocks.append(rs_zz500.get_row_data()) stocks_result = pd.DataFrame(hs300_stocks + zz500_stocks, columns=rs_hs300.fields) # stocks_result.to_csv("./stocks-pool/hs300_zz500_stocks.csv", encoding="gbk", index=False) return stocks_result
def query_hs300_stocks(date=None): """" 沪深300成分股 方法说明:通过API接口获取沪深300成分股信息,更新频率:每周一更新。 返回类型:pandas的DataFrame类型。 参数含义: date:查询日期,格式XXXX-XX-XX,为空时默认最新日期。 """ lg = bs.login() if lg.error_code != '0': logger.error('login respond error_msg:' + lg.error_msg) rs = bs.query_hs300_stocks(date) if rs.error_code != '0': logger.error('query_hs300_stocks respond error_msg:' + rs.error_msg) hs300_stocks = [] while (rs.error_code == '0') & rs.next(): hs300_stocks.append(rs.get_row_data()) result = pd.DataFrame(hs300_stocks, columns=rs.fields) bs.logout() return result
def his_hs300(date, ifcache = True): dict = get_cache() if ifcache and ("hs300", date) in dict.keys(): #print("hit") return dict["hs300", date] # 登陆系统 lg = bs.login() # 显示登陆返回信息 #print('login respond error_code:'+lg.error_code) #print('login respond error_msg:'+lg.error_msg) # 获取沪深300成分股 rs = bs.query_hs300_stocks(str(date)) #print('query_hs300 error_code:'+rs.error_code) #print('query_hs300 error_msg:'+rs.error_msg) # 打印结果集 hs300_stocks = [] while (rs.error_code == '0') & rs.next(): # 获取一条记录,将记录合并在一起 hs300_stocks.append(rs.get_row_data()) result = pd.DataFrame(hs300_stocks, columns=rs.fields) # 结果集输出到csv文件 #print(result) datas = [] for data in hs300_stocks: datas.append(data[1]) if ifcache: dict["hs300", date] = datas save_cache(dict) # 登出系统 bs.logout() return datas
def download_sample_stocks(sample_name='sz50'): if sample_name == 'sz50': filename = FILE_PATH + "sz50_stocks.csv" rs = bs.query_sz50_stocks() elif sample_name == 'hs300': filename = FILE_PATH + "hs300_stocks.csv" rs = bs.query_hs300_stocks() elif sample_name == 'zz500': filename = FILE_PATH + "zz500_stocks.csv" rs = bs.query_zz500_stocks() elif sample_name == 'all': filename = FILE_PATH + "all_stocks.csv" # 取前七天的成分股信息,如果取当前天的,可能当天没有更新 trade_cal = get_trade_cal() trade_day = trade_cal[( trade_cal['is_trading_day'] == 1)]['calendar_date'].values rs = bs.query_all_stock() stocks = [] while (rs.error_code == '0') & rs.next(): stocks.append(rs.get_row_data()) result = pd.DataFrame(stocks, columns=rs.fields) result.to_csv(filename, encoding="gbk", index=False) logger.debug("将成分股%s保存至%s" % (sample_name, filename))
def hs300(self): '''沪深300''' return get_data(bs.query_hs300_stocks())
def get_hs300_stocks(self): result = baostock.query_hs300_stocks().get_data() result.to_excel(r'''E:\桌面\PycharmProjects\getstock\test.xlsx''', index=False)
lg = bs.login() # 显示登陆返回信息 print('login respond error_code:' + lg.error_code) print('login respond error_msg:' + lg.error_msg) # 获取中证500成分股 rs = bs.query_zz500_stocks() print('query_zz500 error_code:' + rs.error_code) print('query_zz500 error_msg:' + rs.error_msg) all_stocks = [] while (rs.error_code == '0') & rs.next(): all_stocks.append(rs.get_row_data()) # 获取沪深300 rs = bs.query_hs300_stocks() print('query_hs300 error_code:' + rs.error_code) print('query_hs300 error_msg:' + rs.error_msg) while (rs.error_code == '0') & rs.next(): all_stocks.append(rs.get_row_data()) result = pd.DataFrame(all_stocks, columns=rs.fields) # 去除创业板 result = result[result['code'].str.contains("300") == False] # 结果集输出到csv文件 result.to_csv("./base_stocks.csv", encoding="utf_8_sig", index=False) print(result)