def get_sz_fs(code): url = "http://www.szse.cn/api/report/ShowReport/data?SHOWTYPE=JSON&\ CATALOGID=1945_LOF&txtQueryKeyAndJC={code}".format( code=code ) r = rget_json(url) return _float(r[0]["data"][0]["dqgm"]) * 1e4
def get_fund_holdings(code, year="", season="", month="", category="jjcc"): """ 获取基金详细的底层持仓信息 :param code: str. 6 位基金代码 :param year: int. eg. 2019 :param season: int, 1,2,3,4 :param month: Optional[int]. 指定 season 即可,一般不需理会 :param category: str. stock 股票持仓, bond 债券持仓,天天基金无法自动处理海外基金持仓,暂未兼容 FOF 的国内基金持仓 :return: pd.DataFrame or None. 没有对应持仓时返回 None。 """ if not month and season: month = 3 * int(season) if category in ["stock", "stocks", "jjcc", "", "gp", "s"]: category = "jjcc" elif category in ["bond", "bonds", "zq", "zqcc", "b"]: category = "zqcc" else: raise ParserFailure("unrecognized category %s" % category) if code.startswith("F"): code = code[1:] r = rget( "http://fundf10.eastmoney.com/FundArchivesDatas.aspx?type={category}&code={code}&topline=10&\ year={year}&month={month}".format(year=str(year), month=str(month), code=code, category=category), headers={ "Host": "fundf10.eastmoney.com", "Referer": "http://fundf10.eastmoney.com/ccmx_{code}.html".format(code=code), }, ) if len(r.text) < 50: return # raise ParserFailure( # "This fund has no holdings on stock or bonds in this period" # ) s = BeautifulSoup( re.match("[\s\S]*apidata={ content:(.*),arryear:", r.text).groups()[0], "lxml") if len(s.text) < 30: return # raise ParserFailure( # "This fund has no holdings on stock or bonds in this period" # ) timeline = [ i.string for i in s.findAll("font", class_="px12") if i.text.startswith("2") ] ind = 0 if month: for i, d in enumerate(timeline): if d.split("-")[1][-1] == str(month)[-1]: # avoid 09 compare to 9 ind = i break else: return # not update to this month t1 = s.findAll("table")[ind] main = [[j.text for j in i.contents] for i in t1.findAll("tr")[1:]] cols = [j.text for j in t1.findAll("tr")[0].contents if j.text.strip()] icode = 1 iname = 2 iratio = 4 ishare = 5 ivalue = 6 for j, col in enumerate(cols): if col.endswith("代码"): icode = j elif col.endswith("名称"): iname = j elif col.endswith("比例"): iratio = j elif col.startswith("持股数"): ishare = j elif col.startswith("持仓市值"): ivalue = j if category == "jjcc": result = { "code": [], "name": [], "ratio": [], "share": [], "value": [] } for l in main: result["code"].append(l[icode]) result["name"].append(l[iname]) result["ratio"].append(float(l[iratio][:-1])) result["share"].append(_float(l[ishare])) result["value"].append(_float(l[ivalue])) elif category == "zqcc": result = {"code": [], "name": [], "ratio": [], "value": []} for l in main: result["code"].append(l[1]) result["name"].append(l[2]) result["ratio"].append(float(l[3][:-1])) result["value"].append(_float(l[4])) return pd.DataFrame(result)