def update_codes(self): """获取股票代码到本地""" #文件中 _path = Util.path_add_file(self.dir_config, "stocks.txt") try: time_start = time.time() #上证 sh_df = ak.stock_info_sh_name_code(indicator="主板A股") raw_codes = sh_df["SECURITY_CODE_A"].values raw_formater = map(lambda x: "sh" + x, raw_codes) self.symbols.extend(raw_formater) #深证 sz_df = ak.stock_info_sz_name_code(indicator="A股列表") raw_codes = sz_df["公司代码"].values raw_formater = map(lambda x: "sz" + x, raw_codes) self.symbols.extend(raw_formater) #写 with open(_path, "w", encoding="utf8") as fw: for symbol in self.symbols: fw.write(symbol) fw.write("\n") time_end = time.time() log.info("A股代码列表跟新完毕\n 路径:{}\n 时间(s):{} ".format( _path, time_end - time_start)) except Exception as e: log.error("A股代码列表跟新错误:{}".format(e))
def get_stock_info_sz_name_code(self, indicator): ''' :param indicator: indicator="A股列表"; choice of {"A股列表", "B股列表", "CDR列表", "AB股列表"} :return: 公司代码 str Y - 公司简称 str Y - 公司全称 str Y - 英文名称 str Y - 注册地址 str Y - A股代码 str Y - A股简称 str Y - A股上市日期 str Y - A股总股本 str Y - A股流通股本 str Y - B股代码 str Y - B股简称 str Y - B股上市日期 str Y - B股总股本 str Y - B股流通股本 str Y - 地区 str Y - 省份 str Y - 城市 str Y - 所属行业 str Y - 公司网址 str Y - ''' stock_info_sz_df = ak.stock_info_sz_name_code(indicator="A股列表") return stock_info_sz_df
def a_stock_attr() -> pd.DataFrame: """ code and attributes table for China's stock A market Returns ------- stock_a : pd.DataFrame ["code", "name", 'listing_date', 'market'] """ stock_sh = ak.stock_info_sh_name_code(indicator="主板A股") stock_sh = stock_sh[["SECURITY_CODE_A", "SECURITY_ABBR_A", "LISTING_DATE"]] stock_sh.columns = ["stock_code", "name", 'listing_date'] stock_sh['market'] = '上证' stock_sz = ak.stock_info_sz_name_code(indicator="A股列表") stock_sz["A股代码"] = stock_sz["A股代码"].astype(str).str.zfill(6) stock_sz = stock_sz[["A股代码", "A股简称", "A股上市日期", "板块"]] stock_sz.columns = ["stock_code", "name", 'listing_date', 'market'] stock_kcb = ak.stock_info_sh_name_code( '科创板')[['SECURITY_CODE_A', 'SECURITY_ABBR_A', "LISTING_DATE"]] stock_kcb.columns = ["stock_code", "name", 'listing_date'] stock_kcb['market'] = '科创版' stock_a = pd.concat([stock_sh, stock_sz, stock_kcb], axis=0) return stock_a
def stock_info_all(): stock_info_sh_df = ak.stock_info_sh_name_code(indicator="主板A股") df = stock_info_sh_df[['company_abbr', 'stockCode', 'list_date']] stock_info_sz_df = ak.stock_info_sz_name_code(indicator="A股列表")[[ 'A股简称', 'A股代码', 'A股上市日期' ]] stock_info_sz_df.columns = ['companyAbbr', 'stockCode', 'listDate'] df = df.append(stock_info_sz_df) return jsonify_dataframe(df)
def stock_info_sz_name_code(cls, indicator="A股列表"): """获取深证证券交易所股票代码和简称数据;不包含退市代码 :param indicator: indicator="A股列表"; choice of {"A股列表", "B股列表", "CDR列表", "AB股列表"} """ df = ak.stock_info_sz_name_code(indicator) df = df[["A股代码", "A股上市日期"]] df["终止上市日期"] = '-' df.columns = ["code", "LISTING_DATE", "CHANGE_DATE"] print(df.columns) print(df.head(10)) return df
def _listing_date(): """上市日期""" sh_df = ak.stock_info_sh_name_code(indicator="主板A股") sh = { code: pd.to_datetime(dt, errors='coerce') for code, dt in zip(sh_df['SECURITY_CODE_A'], sh_df['LISTING_DATE']) } sz_df = ak.stock_info_sz_name_code(indicator="A股列表") sz = { code: pd.to_datetime(dt, errors='coerce') for code, dt in zip(sz_df['A股代码'], sz_df['A股上市日期']) } return merge(sh, sz)
import re import akshare as ak import pandas as pd sz_df = ak.stock_info_sz_name_code("上市公司列表") # sh_df = ak.stock_info_sh_name_code("主板A股") stock_comment = ak.stock_em_comment() industry_tmp = list(set(sz_df["所属行业"])) industry_list = [re.sub(r"[A-z]| ", "", s) for s in industry_tmp] def completion_stock_coke(stock_code): stock_code = str(stock_code) while len(stock_code) < 6: stock_code = "0" + stock_code return stock_code def get_detail_info(): sz_df["公司代码"] = sz_df["公司代码"].apply(completion_stock_coke) detail_df = pd.merge(sz_df, stock_comment, left_on="公司代码", right_on="Code", how="left") detail_df = detail_df[[ "公司代码", "公司简称", "城 市", "所属行业", "PERation", "TurnoverRate" ]]
def update(config=None): import akshare as ak import pandas as pd import traceback import time today = dt.date.today() today_weekday = today.isoweekday() if today_weekday in [6, 7]: print(f'{today} has no update!') return config = config or load_json_settings('mongodb_settings.json') if not config: raise Exception('请先配置mongodb') print(f'connect to {config["host"]}:{config["port"]}') client = connect(alias='CNStock', db='CNStock', host=config['host'], port=config['port'], username=config['user'], password=config['password'], authentication_source='admin') client.get_database('admin').authenticate(name=config['user'], password=config['password']) db = client.get_database('CNStock') col_ohlcv = db.get_collection('stock_ohlcv') col_hfq = db.get_collection('stock_hfq_factor') col_qfq = db.get_collection('stock_qfq_factor') col_ohlcv.create_index([("code", 1)]) col_hfq.create_index([("code", 1)]) col_qfq.create_index([("code", 1)]) col_ohlcv.create_index([("code", 1), ("datetime", 1)], unique=True) col_hfq.create_index([("code", 1), ("datetime", 1)], unique=True) col_qfq.create_index([("code", 1), ("datetime", 1)], unique=True) print(f'update code info!') big_df = pd.DataFrame() stock_sh = ak.stock_info_sh_name_code(indicator="主板A股") stock_sh = stock_sh[["SECURITY_CODE_A", "SECURITY_ABBR_A"]] stock_sh.columns = ["code", "name"] stock_sh["code"] = 'sh' + stock_sh["code"] stock_sh["market"] = 'sh' stock_sz = ak.stock_info_sz_name_code(indicator="A股列表") stock_sz["A股代码"] = stock_sz["A股代码"].astype(str).str.zfill(6) stock_sz = stock_sz[["A股代码", "A股简称"]] stock_sz.columns = ["code", "name"] stock_sz["code"] = 'sz' + stock_sz["code"] stock_sz["market"] = 'sz' stock_kcb = ak.stock_info_sh_name_code(indicator="科创板") stock_kcb = stock_kcb[["SECURITY_CODE_A", "SECURITY_ABBR_A"]] stock_kcb.columns = ["code", "name"] stock_kcb["code"] = 'sh' + stock_kcb["code"] stock_kcb["market"] = 'kcb' big_df = big_df.append(stock_sh, ignore_index=True) big_df = big_df.append(stock_sz, ignore_index = True) big_df = big_df.append(stock_kcb, ignore_index=True) CNStock_Info_Code_Name.drop_collection() for _, data in big_df.iterrows(): qs = CNStock_Info_Code_Name(code=data['code'], name=data['name'], market=data['market']) qs.save() all_info = CNStock_Info_Code_Name.objects() print('start update stock data') for info in all_info: try: ohlcv_list = [] hfq_list = [] qfq_list = [] last_day = (col_ohlcv.find_one({'code': info.code}, sort=[('datetime', -1)]) or {}).get('datetime', dt.datetime(1970, 1, 1)) + dt.timedelta(days=1) if last_day.date() >= today: continue daily_func_name = {'sh': 'stock_zh_a_daily', 'sz': 'stock_zh_a_daily', 'kcb':'stock_zh_kcb_daily'}.get(info.market) if not daily_func_name: raise Exception("unknown market flag") get_daily = getattr(ak, daily_func_name) data = get_daily(info.code) for d, v in data[last_day:].iterrows(): ohlcv_list.append({'datetime': d.to_pydatetime(), 'code': info.code, **v.to_dict()}) if ohlcv_list: col_ohlcv.insert_many(ohlcv_list, ordered=False) hfq_factor = get_daily(info.code, adjust='hfq-factor') for d, r in hfq_factor.iterrows(): hfq_list.append({'datetime': d.to_pydatetime(), 'code': info.code, 'factor': float(r.hfq_factor)}) col_hfq.delete_many({'code': info.code}) col_hfq.insert_many(hfq_list) qfq_factor = get_daily(info.code, adjust='qfq-factor') for d, r in qfq_factor.iterrows(): qfq_list.append({'datetime': d.to_pydatetime(), 'code': info.code, 'factor': float(r.qfq_factor)}) col_qfq.delete_many({'code': info.code}) col_qfq.insert_many(qfq_list) time.sleep(1) # except KeyError: # continue except Exception: print(f'update {info.code} failed with error:\n {traceback.format_exc()})')