指数型基金和其他类型的基金相比,在以下方面很有优势:1、指数型基金的费用较低。 2、购买指数基金相当于购买一篮子股票,因此风险比较小。3、指数型业绩比较透明。由于指数基金跟踪的是某一指数,所以基金净值的变动,可直接看指数的涨跌幅即可,这样不会有造假的情况发生。4、指数型基金管理风险小。所以结合以上的优点,我从天天基金网的指数型板块中爬取出管理指数型基金的基金经理信息,和自成立以来业绩较好的基金,和其他对比的信息,来帮助我们更好的选取指数型基金。
1.2目标
1.在指数型基金榜单中,通过计算基金经理名字出现的次数将基金经理的名字做成词云。
2.在指数型基金榜单中,把所有基金中日收益前五的基金,通过日收益将其作为折线图。
3.在指数型基金榜单中,把所有出现在榜单中的基金公司作为饼状图,来分析在榜单中出现最多的公司。
4.在指数型基金榜单中,把排名前5的基金规模做成直方图。
第二章python开发环境的构建
2.1准备工作
2.1.1所需软件
1.Anaconda: Anaconda是⼀个开源的Python发⾏版本,其包含了conda、Python等180多个科学包及其依赖项。Anaconda里有一系列python编程中所需要到的工具包,安装了Anaconda就相当于安装好了python工作环境,就不要再安装python了。
2.Pycharm: PyCharm是一种Python IDE(Integrated Development Environment,集成开发环境),带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如调试、语法高亮、项目管理、代码跳转、智能提示、自动完成、单元测试、版本控制。此外,该IDE提供了一些高级功能,以用于支持Django框架下的专业Web开发。
3.软件下载地址:
Anaconda:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/
pycharm: http://www.jetbrains.com/pycharm/download/#section=windows
2.1.2软件安装
1.安装anaconda:
(1)打开下载好的软件
(2)next
(3)到了这一步(图1.1)选择all users
图2.1
(4)选择安装位置
(5)选择好安装位置后,把两个对勾都选上(图1.2),上面的对勾意思是把他添加到系统变量,这个如果不勾选,安装完成后需要手动配置环境变量,比较麻烦
图2.2
(6)点击安装,等待几分钟anaconda就安装完成了
2.安装pycharm
Pycharm安装只需要下一步,下一步就行。需要注意的是选择存储空间,不要选择到C盘,安装好pycharm后紧接着要做的是配置anaconda编译环境,环境配置就是安装虚拟环境,让程序可以在这个环境中运行
2.1.3配置anaconda编译环境
1.打开pycharm,选择新建工程,选择已存在的(如图2.3)
图2.3
2.选择好后,将anaconda的安装位置添加到pycharm中
3.前两步做完后将此对勾打上,目的是之后创建工程都不用重新配置环境了(如图2.4)
图2.4
2.1.4python安装库的方法
首先需要再网络环境下进行安装,安装时确保网络通畅
- 第一步:win+r,在输入框中输入cmd,回车后进入命令行(如图2.5)
图2.5
- 第二步: 输入命令pip install 模块名字,输入后按下回车开始安装
示例:pip install PyExecJS,打开命令行输入命令(如图2.6)
图2.6、
- 指定版本的下载:pip install模块名==版本
- 如需导出自己安装的模块将其导出到一个记事本则需要在命令框输入:pip freeze > D:\模块.txt
- 安装命令:pip install -r D:\模块.txt
第三章 用到的网络知识
1.用谷歌浏览器来分析本次大作业中所需要的网页知识,爬取的网址:开放式基金排行 _ 天天基金网
(1)首先打开网页,按键盘f12键打开开发者模式。来分析数据来源
(2)打开后选network按f5刷新网页,等待数据全部载入。
Network作用:从发起网页页面请求Request后分析HTTP请求后得到的各个请求资源信息(包括状态、资源类型、大小、所用时间等)。简单来说就是network中会记录网页当里面的所有数据,包括文字,图片,视频,音频只要能在网页上看到的,他都会在network中加载出来都会被记录。打开网站按f12查看network信息,此时信息是没有被记录的。所以要在第一次打开network后刷新页面,等待数据全部载入
(3)刷新以后数据就会重新加载一遍,加载完成以后要在network中找到当前数据所对应的位置在哪里。
在network中有一个搜索功能用于 搜索想要找到的数据,输入后点击回车,如下图,在数据重新加载后在搜索框输入想要找到的数据,输入基金代码008828按下回车,搜索框的下边就会显示搜索结果。点击搜索结果,就会找到数据的json格式的信息,这些信息和网页中的数据相对应(如图3.1)
图3.1
(4)找到这些数据的地址,headers中可以看到请求的详细信息
headers是发送请求时携带的头部信息。如:authentication/cookie、响应的数据格式:content-type,响应状态码,请求方式,请求地址等信息。我们需要的是请求地址,所以找到request url 此路径就是我们需要的地址(如图3.3)
图3.3
(5)引用request库来发送请求
访问地址就是上面headers中获取到的url,使用requests的get方法来模拟浏览器去向服务器请求资源,请求的时候服务器会进行核验身份,当身份校验不通过时就访问不到资源,所以要在前面加一个身份校验,在代码中加入如下信息:
"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-CN,zh-TW;q=0.9,zh;q=0.8,en-US;q=0.7,en;q=0.6",
"Cache-Control": "max-age=0", "Connection": "keep-alive",
"Cookie":"st_si=58946294636267;st_asi=delete;ASP.NET_SessionId=ypqb3d0kofgfdg521nug0dyb;EMFUND1=null;EMFUND2=null;EMFUND3=null;EMFUND4=null;EMFUND5=null;EMFUND6=null;EMFUND7=null;EMFUND8=null;EMFUND0=null;EMFUND9=051015:20:30@#$%u6052%u751F%u524D%u6D77%u4E2D%u8BC1%u8D28%u91CF%u6210%u957FC@%23%24006144; qgqp_b_id=6427a9f78607f4caa31ec9513b0bfb95;
st_pvi=80410761630013;
st_sp=2022-05-10%2014%3A49%3A04; st_inirUrl=http%3A%2F%2Ffund.eastmoney.com%2Fdata%2Ffundranking.html; st_sn=2; st_psi=20220510152029613-112200305282-7583427755",
"Host": "fund.eastmoney.com", "If-Modified-Since": "Tue, 10 May 2022 07:07:51 GMT",
"If-None-Match":"W/\"627a0f47-25ef9\"",
"Referer": "http://fund.eastmoney.com/data/fundranking.html",
"Upgrade-Insecure-Requests": "1",
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36"}
这些信息来源于request headers(如下图3.4)。把这些数据添加好后再去访问服务器拿数据,就可以拿到了。
图3.4
第四章 源码
import execjs
import matplotlib
import matplotlib.pyplot as plt
import pandas as pd
import requests
from bs4 import BeautifulSoup
from wordcloud import WordCloud
def detail(code):
headers = {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
"Accept-Encoding": "gzip, deflate", "Accept-Language": "zh-CN,zh-TW;q=0.9,zh;q=0.8,en-US;q=0.7,en;q=0.6",
"Cache-Control": "max-age=0", "Connection": "keep-alive",
"Cookie": "st_si=58946294636267; st_asi=delete; ASP.NET_SessionId=ypqb3d0kofgfdg521nug0dyb; EMFUND1=null; EMFUND2=null; EMFUND3=null; EMFUND4=null; EMFUND5=null; EMFUND6=null; EMFUND7=null; EMFUND8=null; EMFUND0=null; EMFUND9=05-10 15:20:30@#$%u6052%u751F%u524D%u6D77%u4E2D%u8BC1%u8D28%u91CF%u6210%u957FC@%23%24006144; qgqp_b_id=6427a9f78607f4caa31ec9513b0bfb95; st_pvi=80410761630013; st_sp=2022-05-10%2014%3A49%3A04; st_inirUrl=http%3A%2F%2Ffund.eastmoney.com%2Fdata%2Ffundranking.html; st_sn=2; st_psi=20220510152029613-112200305282-7583427755",
"Host": "fund.eastmoney.com", "If-Modified-Since": "Tue, 10 May 2022 07:07:51 GMT",
"If-None-Match": "W/\"627a0f47-25ef9\"", "Referer": "http://fund.eastmoney.com/data/fundranking.html",
"Upgrade-Insecure-Requests": "1",
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36"}
url = f'http://fund.eastmoney.com/{code}.html'
rep = requests.get(url, headers=headers)
rep.encoding = 'utf-8'
soup = BeautifulSoup(rep.text, 'lxml')
info = soup.select(
'.infoOfFund > table > tr > td')
dt = {}
for item in info:
sp = item.text.split(':')
# print(sp)
line = {sp[0]: ''.join(str(x).replace('\xa0', '') for x in sp[1:])}
dt.update(line)
# print(dt)
# print(dt)
return dt
def loop():
headers = {"Accept": "*/*", "Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-CN,zh-TW;q=0.9,zh;q=0.8,en-US;q=0.7,en;q=0.6",
"Cookie": "st_si=58946294636267; st_pvi=80410761630013; st_sp=2022-05-10%2014%3A49%3A04; st_inirUrl=; st_sn=1; st_psi=20220510144904564-112200312936-6392067033; st_asi=delete; ASP.NET_SessionId=ypqb3d0kofgfdg521nug0dyb",
"Host": "fund.eastmoney.com", "Proxy-Connection": "keep-alive",
"Referer": "http://fund.eastmoney.com/data/fundranking.html",
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36"}
data = []
for page in range(1, 33):
url = f'http://fund.eastmoney.com/data/rankhandler.aspx?op=ph&dt=kf&ft=zs&rs=&gs=0&sc=rzdf&st=desc&sd=2021-05-07&ed=2022-05-07&qdii=|&tabSubtype=,,,,,0&pi={page}&pn=50&dx=1&v=0.18189555619917375'
rep = requests.get(url, headers=headers)
docjs = execjs.compile(rep.text)
res = docjs.eval('rankData')['datas']
for item in res:
print(item)
data.append(str(item).split(','))
df = pd.DataFrame(data, dtype=str)
df.to_excel('zsjj.xlsx', index=False)
def read_excel():
df = pd.read_excel('zsjj.xlsx', dtype=str)[0]
data = []
for code in df:
# print(code)
res = detail(code)
print(res)
data.append(res)
df = pd.DataFrame(data)
df.to_excel('info.xlsx')
def word_cloud():
content = pd.read_excel('info.xlsx')['基金经理'].tolist()
max_content = ' '.join(content)
wordcloud = WordCloud(
font_path='/System/Library/fonts/PingFang.ttc',
background_color="white", width=1000, height=880).generate(max_content)
plt.imshow(wordcloud, interpolation="bilinear")
plt.axis("off")
plt.savefig('基金经理名字词云图.png')
plt.show()
def bar():
df = pd.read_excel('info.xlsx')
df['基金规模'] = df['基金规模'].apply(lambda x: str(x).split('亿元')[0])
df.sort_values(by='基金规模', ascending=False).head(5)
name = df['管 理 人'].tolist()
day = df['基金规模'].tolist()
dt = dict(zip(name, day))
print(dt)
title = '指数型前五的基金中基金规模直方图'
counts = dt
p_name = '指数型前五的基金中基金规模直方图'
num = 5
x_aixs = []
y_aixs = []
c_order = sorted(counts.items(), key=lambda x: x[1], reverse=True)
for c in c_order[:num]:
x_aixs.append(c[0])
y_aixs.append(c[1])
plt.rcParams['font.family'] = ['sans-serif']
plt.rcParams['font.sans-serif'] = ['Arial Unicode MS']
plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
plt.bar(x_aixs, y_aixs)
plt.title(title)
plt.xticks(rotation=45)
plt.savefig(f'{p_name}.png')
plt.show()
def pie():
title = '指数型基金中出现的基金公司'
data = pd.read_excel('info.xlsx')['管 理 人'].value_counts()[:10].to_dict()
plt.rcParams['font.sans-serif'] = ['Arial Unicode MS']
plt.figure(figsize=(6, 6))
label = data.keys()
explode = [0.01] * len(data)
values = data.values()
plt.pie(values, explode=explode, labels=label, autopct='%5.1f%%')
plt.title(title)
plt.savefig(f'{title}.jpg')
plt.show()
def line():
df = pd.read_excel('zsjj.xlsx').sort_values(by=6, ascending=False).head(5)
name = df[1].tolist()
day = df[6].tolist()
dt = dict(zip(name, day))
title = '收益前5的基金日收益折线图'
x_la = '基金'
y_la = '收益'
data = dt
p_name = '收益前5的基金日收益折线图'
plt.rcParams['font.sans-serif'] = ['Arial Unicode MS']
x = list(data.keys())[:10]
y = list(data.values())[:10]
plt.plot(x, y, "r", marker='*', ms=10, label="a")
plt.xticks(rotation=45)
plt.xlabel(x_la)
plt.ylabel(y_la)
plt.title(title)
plt.legend(loc="upper left")
for x1, y1 in zip(x, y):
plt.text(x1, y1 + 1, str(y1), ha='center', va='bottom', fontsize=20, rotation=0)
plt.savefig("{}.jpg".format(p_name))
plt.show()
if __name__ == '__main__':
# loop()
# read_excel()
# word_cloud()
# line()
# pie()
bar()