Python批量获取基金季报
The following article is from 小一的学习笔记 Author xiaoyi
最近研究基金的时候,突然对今年来收益最高的基金有点好奇,于是去翻了翻该基金的业绩报告。
好家伙,今年来收益接近30%了,这还是最近一段时间回调了,如果在9月初那会,净值最高冲到了2.64,也就是累计涨幅达到了164%。
说出来你可能不信,这个基金2020年才成立的。我直呼好家伙
先看一下历史业绩数据:
再来看一下今年来的业绩情况:
大幅跑赢沪深300指数,且相对于沪深300,回撤也降低了很多。
其中最让我亮眼的一个点,竟然是今年来的季度胜率为100%。也就是说在已经过去的三个季度里面,每个季度都跑赢沪深300指数
这个让我有点好奇,于是我把时间维度拉长到近三年
最近的10个季度,除了20Q2和21Q4不及沪深300指数,其余8个季度都跑赢沪深300指数,胜率80%。当然如果要从20年Q3季度算起,胜率更是高达88.88%。
周期性行业的恐怖如斯,这可能只是一个小小的缩影。
对了,这个指数基金是国泰中证煤炭ETF,上面截图的是它的场外基金连接C,代码是008280。简介如下:
这里有必要给大家提个醒:
基金的季度报告里可以查看基金的各种信息,你可以看到,上面那个报告长达60页,满满的都是基金经理对于该行业的投资理念和个人理解,远不是我们这种小散可以比的。
所以,如果想购买一个基金,最好的办法可能是先看看他过去几年的报告,了解一下投资风格。
但是,如何快速获取一个基金的所有报告,理解其投资风格呢?
今天教大家用 Python 批量搞定,先给一个使用说明,源码和逻辑见后文
1、核心代码
首先是需要自定义一些参数,分别是:
# 自定义参数
fund_code = '008279' #基金代码
start_date = '2021-01-01' #起始时间,默认20210101
end_date = datetime.now().strftime('%Y-%m-%d')
其次是获取从起始时间到截止时间之间的所有报告清单,起始时间默认是2021年1月1日,截止时间为当前日期
# 获取内部定义ID
fund_code_Id = get_inner_Id(fund_code)
# 获取报告的清单信息
df_report_info = get_detail_info(fund_code, fund_code_Id, start_date, end_date)
最后是对清单中的PDF文件进行下载
# 下载报告清单
download_file(fund_code, df_report_info)
程序运行图如下:
最终爬取的报告结果如下:
2、爬虫思路
获取源码文件请直接在后台回复 基金季报
后续我将主要围绕基金、指数等展开量化策略研究分析,相关的源代码和数据肯定是不会一直公开的,目前仅针对公众号粉丝免费,先到先得吧,后面大概率会收费。
这里我是从巨潮资讯上爬取的,选择它是因为它的数据比较全,使用起来比较舒服,所以后续的其他文章大概率也会是从这拿数据了
打开切到基金这一栏
在右边的框里,选择开始时间和结束时间,基金代码输入对应的6位数字【或者简称也行,会有提示】,分类可以选择年报、中报、季报等
选择完成后,点击查询按钮,左边部分会出现该基金的查询结果 【向下】
可以看到,对应日期的基金报告都已经列了出来
随便点开一个就是我们需要的pdf了
流程走通之后,接下来按F12打开开发者工具,切换到NetWork栏,并重复上述的步骤
可以看到,点击查询按钮就会出现一个请求,该请求的响应内容就是我们上面看到的报告清单
根据该请求的内容和参数,我们发现Form Data里是需要传入参数的
seDate是起止时间,stock是传入的代码,其中008279是我们刚刚传入的,jjjl0000034是它自动生成的
而后者只要能找到每个基金代码对应的自动生成的代码,就可以得到stock的参数。
而这个对应的关系,在前一个页面里就可以拿到
把这个数据获取下来就可以了。
获取详细报告清单的核心代码如下:
# 获取详细报告清单
url = 'http://www.cninfo.com.cn/new/hisAnnouncement/query'
response = requests.post(url, params=params, headers={'User-Agent': get_ua()})
report_json = json.loads(response.text)
# 将JSON转换为DF
df_report_info = pd.json_normalize(report_json['announcements'])
批量下载PDF文件就很容易了,刚刚获取到的数据里有网址,直接用request.get获取,用open函数保存就可以了
批量下载的核心代码如下:
# 下载报告清单
for index, row in df_data.iterrows():
print('[ 提示 ]: 正在爬取第{0}/共{1}份报告...'.format(index+1, df_data.shape[0]))
pdf_url = 'http://static.cninfo.com.cn/{0}'.format(row['adjunctUrl'])
savepath = os.path.join(dirpath, row['announcementTitle'] + '.pdf')
res = requests.get(url=pdf_url, stream=True)
with open(f'{savepath}', 'wb') as f:
f.write(res.content)
print('======>> 下载完成')
time.sleep(2)
以上是核心源码,这里省去了非核心部分,需要请查看源码文件。
后续我将主要围绕基金、指数等展开量化策略研究分析,相关的源代码和数据肯定是不会一直公开的,目前仅针对公众号粉丝免费,先到先得吧,后面大概率会收费。
OK,今天就到这,文章的最后,需要再做一个免责声明:上面所有的内容也只是我的个人推测,提到的所有基金/股票代码只是为了演示,仅供参考,不构成投资建议,投资有风险,入市需谨慎。