【Python爬虫实战】5分钟学会筛选优质债券基金
前言
大家好,我是程序员阿浪,上一期我们介绍了货币基金的筛选规则和爬虫教程,没有想到基金营的同学们也因此对爬虫很感兴趣,在这里阿浪非常感谢基金营朋友们的鼓励和支持(●’◡’●),对于非计算机专业的同学来说,初次听到爬虫这个概念可能会比较陌生。如果想要学习爬虫的话,可能需要先学习一下python编程语言,当然如果特别感兴趣可以在公众号内留言私信【爬虫的学习方法】,阿浪会针对非计算机专业的同学去快速学习爬虫给一些针对性的建议。
如果有很多同学想学习的话,后期我会考虑写一篇关于爬虫实战详细教程的推送(手把手教你如何分析网页的那种)d===( ̄▽ ̄*)b,有需要的盆友赶快关注起来吧!( •̀ ω •́ )✧
本文筛选出来的基金结果不构成投资建议,因为荐股犯法( ̄▽ ̄)",小伙伴们也不要听信什么荐股群,只有自己真正学到了理财的知识,才知道自己投哪只基金/股票,如果盲目的跟着别人投,是很容易被市场割韭菜的。
PS:基金训练营毕业证书 (说明本文的基金筛选指标有理论参考依据)✌ 至于如果有朋友想问我这门课的质量如何,可以去我的公众号给我留言私信。这里以爬虫教程为主。
如果这篇文章对您有帮助,欢迎您给文章(三连思密达!)点赞、在看并关注我的微信公众号【THU小鱼干杂货铺】(可扫描文末二维码),原创码字不易,您的支持是对我最大的鼓励!
一、债券基金
1.什么是债券基金
债券基金是80%以上投资债券的基金,投资产品收益比较稳定。一般分为纯债基金、一级债基、二级债基三类,债券型基金的投资以国债、金融债等固定预期收益类金融工具为主,因此债券基金风险较低,预期收益较稳定。
债券基金的优点包括:
1.门槛低,对资金量较少的投资者比较友好
2.专业人士打理,有专业的基金经理和团队帮我们投资
3.投资债券基金的收益相对较高
2.债券基金适合人群
如果不想承担股市风险,追求稳定的预期收益,或是投资新手,那么建议选择债券甚至纯债基金。相对而言,纯债基金的波动更较小,预期收益更稳定。
3.如何筛选债券基金
1.基金成立时间在3年以上
2.基金的规模在10亿-100亿中间
3.优先选择累积3年以上收益率更高
4.优先选择费率(基金服务费用)更低的基金
5.考察基金经理的综合评定。基金经理的从业年限在3年以上,基金经理更换不频繁,越稳定越好。
4.根据个人需求选择合适的债券基金
债券基金后缀的ABC主要区别在于收费方式的不同。
当债券基金筛选好后,根据个人手里资金的情况:
- 如果是短期投资(1-2年),可以选择C类债券,其销售服务费率只有0.35%,而AB类的前后端申购费率通常高于C类。
- 如果是长期持有(5年或5年以上)可选择B类,后端收费的方式,持有时间越长费率越优惠。
- 如果不知道投资多久,那就选择A类,一次性支付前端申购费。
二、爬虫步骤
0.目标
爬取天天基金网上优质的债券基金筛选信息,存入excel表格
1.引入库
from bs4 import BeautifulSoup #网页解析,获取数据
import re #正则表达式,进行文字匹配
import urllib.request,urllib.error #指定url,获取网页数据
import xlwt #进行excel操作
import json #解析网页的json对象字符串
2.准备爬虫需要的模块
2.1 URL访问模块
该模块主要通过构造浏览器客户端头部(伪装作用)发送request请求获取数据。
# 得到一个指定URL的网页内容
def askURL(url):
#head主要是伪装作用,用户代理,告诉服务器,我们是什么类型的浏览器
# 本质上是告诉浏览器我们可以接收什么类型的文件内容
head={
"Referer": "http://fund.eastmoney.com/data/hbxfundranking.html",
"User-Agent":" Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36"
}
request = urllib.request.Request(url,headers=head)
html = ""
try:
response = urllib.request.urlopen(request)
# print(response.read().decode("utf-8"))
html = response.read().decode("utf-8")
# print(html)
except urllib.error.URLError as e:
if(hasattr(e,"code")):
print(e.code)
if(hasattr(e,"reason")):
print(e.reason)
return html
2.2 Json处理模块
该模块主要用于处理网页异步加载的信息,通过分析网站后发现,债券基金的信息需要在json字符串中获取。
#从html处理成标准json数据
def html2json(html):
html = html.strip() #去掉前后空格
# print(html)
findjson = re.compile(r'^var rankData =(.*)',re.S)
dict = re.findall(findjson,str(html))[0]
return json.loads(dict.strip())
2.3 正则表达式模块
正则表达式模块在此处作为全局变量处理,也可单独放在方法getData()内作局部变量。
findFundScale = re.compile(r'.*:(.*?)亿元',re.S) #基金规模,re.S忽略换行符
2.4 基金经理信息封装模块
除货币基金外,大多数基金都需要考察该基金经理的能力。因此将该模块单独封装,为后期筛选其他基金(如混合基金、股票基金)做准备,以后分析的话就可以直接用啦!
def checkFundManager(fund_code):
findManageDate = re.compile(r'<strong>上任日期:</strong>(.*?)</p>')
manager_url = "http://fund.eastmoney.com/f10/jjjl_"+str(fund_code)+".html"
html = askURL(manager_url)
soup = BeautifulSoup(html,"html.parser")
item = soup.find_all('div', class_="jl_intro")
#获得一个a标签,如:<a href="http://fund.eastmoney.com/manager/30428548.html" style="color:#333; text-decoration:none;">裴禹翔</a>
a_tag = item[0].find_all('a')[1]
managerName = a_tag.string #经理名字
manageDate = re.findall(findManageDate,str(item[0]))[0] #经理上任管理该基金起始日期
table = soup.find_all('table',class_="w782 comm jloff")
beginWorkDate = table[1].find_all('tr')[-1].find_all('td')[3].string #经理从业日期
return managerName,beginWorkDate,manageDate
2.5 爬取天天基金网页模块
该模块是爬虫的核心部分,完整爬取逻辑可见代码注释
def getData(baseUrl):
datalist = []
html = askURL(baseUrl) #基金列表json
detail_html = askURL(baseUrl+"&sh=table") #基金详情页json
#转为json格式
funds_json = html2json(html)
detail_html_json = html2json(detail_html)
for i in range(0,len(funds_json['datas'])):
fund_info = []
fund = funds_json['datas'][i].split(',')
print("当前正在爬取 %s 的基金信息..." %fund[1])
#添加基金代码
fund_info.append(fund[0])
# 添加基金名称
fund_info.append(fund[1])
#添加近3年收益
fund_info.append(fund[11])
'''进入基金详情页,获取基金规模'''
soup = BeautifulSoup(detail_html_json['datas'][i], "html.parser") # 将抓取的html网页转换为树形结构的文档
item = soup.find_all('ul', class_="ul-info") # 查找符合要求的字符串,形成列表
scale = re.findall(findFundScale, str(item))[0]
# 添加基金规模(单位:亿元)
fund_info.append(scale)
# 添加手续费信息
if (fund[-1] == ''):
fund_info.append('0.00%')
else:
fund_info.append(fund[-1])
managerName, beginWorkDate, manageDate = checkFundManager(fund[0])
#添加基金经理名字,从业日期,上任该基金日期
fund_info.append(managerName)
fund_info.append(beginWorkDate)
fund_info.append(manageDate)
datalist.append(fund_info)
return datalist
2.6 保存数据转存Excel模块
#保存数据
def saveData(datalist,savepath):
print("saving...")
book = xlwt.Workbook(encoding="utf-8",style_compression=0) # 创建workbook对象
sheet = book.add_sheet("债券基金信息",cell_overwrite_ok=True) # 创建工作表单
col = ("基金代码","基金名称","近3年收益率","基金规模(亿元)","手续费率","基金经理名称","基金经理起始从业日期","基金经理上任该基金日期")
for i in range(0,len(col)):
sheet.write(0,i,col[i]) #写一行列名
for i in range(0,len(datalist)):
print("写入第%d条."%(i+1))
data = datalist[i]
for j in range(0,len(col)):
sheet.write(i+1,j,data[j])
book.save(savepath) # 保存数据表
print("saved.")
3.执行main函数
def main():
# nx=71表示基金成立年限>7年,sc=3n表示近三年收益率;st=desc表示按收益率降序,pi=1从第一页开始,pn=20表示显示20条,这里改成200,直接取前200只债券基金
url = "http://fund.eastmoney.com/data/FundGuideapi.aspx?dt=0&ft=zq&sd=&ed=&nx=71&sc=3n&st=desc&pi=1&pn=200"
# 1.爬取网页,获取数据
datalist = getData(url)
# 3.保存数据
savepath = "债券基金信息表.xls"
saveData(datalist,savepath)
三、运行过程&结果展示
债券基金的关键指标已经罗列在表格中,依据债券基金的筛选原则,最终可筛选出44只符合条件的优质基金(截至爬取日期),完整基金信息的Excel表格和源代码可在公众号回复关键词【债券基金】免费获取~
四、总结
本文主要对债券基金的筛选流程和爬虫实操进行了代码讲解,可在我的公众号【THU小鱼干杂货铺】(微信号:DryGoodsShare)回复关键词【债券基金】获取完整代码和筛选结果Excel表。后期完善代码后我将把源码放入我的github仓库,码字不易,期待您的点赞、在看和关注!(B站说:内心强大的人从不吝啬赞美和鼓励( •̀ ω •́ )✧)
大佬们的 【三连】 就是阿浪创作的最大动力,如果本篇博客有任何错误和建议,欢迎大佬们留言!
我是阿浪,对所有未知都要心存敬畏,永远保持一颗好奇心,我们下期见!