前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何用Python获取基金行情并分析年度表现优异基金,解锁赚钱秘密?

如何用Python获取基金行情并分析年度表现优异基金,解锁赚钱秘密?

原创
作者头像
数人之道
修改2022-01-06 17:31:48
1.2K1
修改2022-01-06 17:31:48
举报
文章被收录于专栏:数据技术数据技术

昨天是 2022 年工作日的第一天,同时也是国内证券市场的第一个交易日,大家在新的一年里有什么投资目标和期许呢?

在制定今年的投资目标和策略之前,不妨来回顾和分析一下 2021 年基金市场的行情和表现,在新的一年里不要当被割的韭菜,科学理性地进行投资活动,解锁赚钱的秘密、基金的密码吧!

非基金小白可直接跳过第一部分。

1. 基金介绍

基金这个词相信大家都不陌生,那基金到底是什么?它又是如何进行分类的?从哪些渠道可以申购?

1.1. 基金是什么

如果你有一笔钱,想要投资货币市场工具、债券、股票这些产品来获得收益,但是自己不够专业又没足够时间钻研,能拿出来的资金也不多。那这时你就可以找一个专业的机构寻求帮助,而这个专业机构就是基金管理公司。

基金管理公司里有专业的人士,帮助你操作资金、赚取收益。这些专业人士就是基金经理。他们赚了钱,可以获得一定的劳务费和佣金,剩下的收益就会按比例分配给购买基金的客户。

当然,我们这里是只针对公募基金来说的。

1.2. 基金的分类

一般来说,从大类上,基金有公募和私募之分。公募基金就是向社会大众开放,谁都能买的基金。一般公募基金投资门槛很低,大部分基金一千元甚至几百元就可以投资了。

而私募基金,小白通常是买不到的。这些私募基金,首先投资门槛就很高,一般都要求投资者有数十万甚至上百万的资产规模。也就是我们说的合格投资者,如果没有这么多钱,就不合格,不具备投资资格。你可以简单理解为私募基金是给那些富人、高净值人士专门设计的基金。

而从细分方向上来说,根据不同的角度和不同的标准,基金可以有不同的分类方式。例如,根据基金单位是否可增加或赎回,可分为开放式基金和封闭式基金;根据组织形态的不同,可分为公司型基金和契约型基金;根据投资风险与收益的不同,可分为成长型、收入型和平衡型基金。而我们重点要介绍的是以下的分类:

根据投资方向和投资产品的不同,市面上较为常见的基金可分为:货币型基金、债券型基金、股票型基金、混合型基金和指数型基金等。

1.2.1. 货币型基金

货币型基金就是以货币市场工具作为主要投资对象的基金。什么叫货币市场工具呢?简单来讲,就是类似于货币的金融产品,比如现金本身就算,除了现金,还有短期国债、回购、一年期以内的定期存款、一年期以内的中央银行票据等等。这些金融工具的特点就是期限很短,流动性特别好,随时可以变现,非常安全、可靠。余额宝就是典型的货币市场基金。

总体上来说,货币市场基金是低风险、且低利率的,我们的零钱、临时资金等,都特别适合投资货币市场基金,但它不适合长期投资,因为从长期来看,它的收益率很有限。

1.2.2. 债券型基金

债券型基金就是以国债、金融债等固定收益类金融工具作为主要投资对象的基金。当一只基金,其投资组合中有 80%以上的仓位都投资于债券,那么这只基金就属于债券基金了。

债券基金的风险和收益相对股票基金来说会更稳健一些,其特点就是:低风险、低收益;收益稳健;费用较低。

1.2.3. 股票型基金

股票型基金就是以权益类金融工具作为主要投资对象的基金。当一只基金,其投资组合中有 80%以上的仓位都投资于证券,那么这只基金就属于股票基金了。

正是由于股票型基金中投资的大部分对象为均股票,因此它本身也有着高风险高收益并存的特点。不过购买了股票基金能够有效分散投资风险,所以相对于直接投资股票来说,它的风险会有所降低,并且收益相比于直接投资股票市场,是可观的。因此,它很适合那些想要投资股票市场但是又缺乏专业投资知识的投资者。

1.2.4. 混合型基金

混合型基金就是同时以货币市场、固定收益类、权益类金融工具作为主要投资对象的基金。根据股票、债券投资比例以及投资策略的不同,混合型基金又可以分为偏债型基金、偏股型基金、配置型基金等多种类型。

混合基金的特点就是,通过配置多种不同类别的资产,实现投资的多元化,以达到收益与风险之间互相平衡的目的。

1.2.5. 指数型基金

指数型基金实质上是被动型股票基金的一种。被动型是投资理念的一种,是相对于主动型来说的。

股票指数,就是用来反映股票市场上各种股票价格的总体水平,以及他们变动情况的指标。比如上证 50 指数,就是从上海证券交易所的所有股票中,挑选了 50 只具有代表性的股票,用其价格变动的平价情况编制成的价格指数。对主动型投资来说,基金经理的目标就是以上证 50 指数作为基准,在一段时间内跑赢这个指数,从而获得更多超额收益;对被动型投资来说,基金经理的目标就是以上证 50 指数作为基准,将其以相近的权重加入投资组合中,获得跟指数基本一致的收益。

1.2.6. FOF型基金

除了以上基金分类外,还有一种特殊的基金,叫做 FOF,也就是基金中的基金。FOF型基金就是以基金作为主要投资对象的基金。也就是说,这种基金的经理,对市场上的各类基金进行筛选,选择一些不错的基金,来进行投资。

FOF基金的风险性相对更小,对于刚入门的小白来说,面对市场上成千上万的基金,个人挑选的难度和风险都不低,而 FOF 实际上就是基金经理帮助投资者一次买“一篮子基金”,通过专家的二次基金筛选,有效降低风险。

1.2.7. 基金风险及收益程度分布

上面是不同类型基金的风险和收益程度分布图,投资者要根据自身的能力和投资目的来选择最适合自己的基金类型。

1.3. 基金的申购

在基金成立后购买基金的行为就叫申购。不同类型的基金,申购费率也不同。基金的申购费率由高到低为:股票型、混合型、指数型、债券型、货币型。具体的数值如下:

股票型(2%~1.5%)≥混合型(2%~1.5%)>指数型(1%~1.5%)>债券型(0.5%~1%)>货币型(约 0%)

申购基金有 4 个渠道,分别是:银行、证券公司、基金公司、第三方基金代销平台。银行是性价比最低的,不仅产品少,而且申购费率很高;证券公司和基金公司的产品都比较少;第三方基金代销平台不仅产品数量多,而且申购费率比较低,大部分都是 1 折。

2. 基金分析前准备

这次分析的基金数据来源于“蛋卷基金”,其页面是通过 Ajax 来异步传输数据的,有专门的数据接口,需要进行分析。

另外,这次使用 pyecharts 进行数据可视化输出,使用之前需要安装其 Python 库,并进行相应的参数设置。

2.1. URL 及报文分析

2.1.1. URL 分析

通过浏览器的开发者工具,能抓取到基金列表翻页所提交的 URL:

对其 URL 中的参数进行分析:

代码语言:html
复制
https://danjuanapp.com/djapi/v3/filter/fund?type=1&order_by=1m&size=20&page=2

参数分析如下:

  • type: 控制基金类型,就是上文提到的基金分类
  • order_by: 控制统计时间段
  • size: 控制一页的记录数量
  • page: 控制页数

基金类型和时间段参数字典:

代码语言:python
复制
# 基金类型
fund_type = {"股票型": 1, "混合型": 3, "债券型": 2, "货币型": 4, "指数型": 5, "FOF型": 6, "QDII型": 11}
# 统计时间
fund_time = {'近一周': '1w', '近一月': '1m', '近三月': '3m', '近六月': '6m', '近一年': '1y', '近两年': '2y', '近三年': '3y', '近五年': '5y'}

2.1.2. 报文分析

查看返回的报文内容,并进行分析:

返回的报文结果为 json 格式,因此需要引入 json 模块对爬取到的数据进行处理。

其他交易净值、基金规模、基金持仓等等信息的分析方法类似。

2.2. 数据可视化设置

这次使用的是 pyecharts 数据可视化工具中的饼图和柱状图,配置其中的相关参数:

代码语言:python
复制
# 绘制饼图
def pie(name, value, savetitle, title):
    c = (
        # 初始化配置项,内部可设置颜色
        Pie(
            init_opts=opts.InitOpts(
                # 背景颜色
                bg_color="#2c343c"
            )
        )
            .add(
            # 系列名称
            series_name="基金涨跌幅",
            # 系列数据项,格式为[(key1,value1),(key2,value2)]
            data_pair=[list(z) for z in zip(name, value)],
            # 通过半径区分数据大小
            rosetype="radius",
            # 饼图的半径,设置成默认百分比,相对于容器高宽中较小的一项的一半
            radius="55%",
            # 饼图的圆心,第一项是相对于容器的宽度,第二项是相对于容器的高度
            center=["50%", "50%"],
            # 标签配置项
            label_opts=opts.LabelOpts(is_show=False),
        )
            # 全局设置
            .set_global_opts(
            # 设置标题
            title_opts=opts.TitleOpts(
                # 名字
                title="" + str(title),
                subtitle='hugowong绘制,关注公众号:数人之道',
                # 组件距离容器左侧的位置
                pos_left="center",
                # 组件距离容器上方的像素值
                pos_top="20",
                # 设置标题颜色
                title_textstyle_opts=opts.TextStyleOpts(color="#ffffff"),
            ),
            # 图例配置项参数,是否显示图里组件
            legend_opts=opts.LegendOpts(is_show=False),
        )
            # 系列设置
            .set_series_opts(
            # 设置提示
            tooltip_opts=opts.TooltipOpts(
                trigger="item",
                # 显示格式
                formatter="{a} <br/>{b}: {c}% (占{d}%)"
            ),
            # 设置标签颜色
            label_opts=opts.LabelOpts(
                color="rgba(255, 255, 255, 0.3)",
                # 显示格式
                formatter="{b}: {c}%"
            ),
        )
            .render(str(savetitle) + ".html")
    )

对应不同的分析结果,需要使用不同的参数配置,其他配置详见完整代码(关注公众号『数人之道』,回复 2021基金 获取)。

3. 基金表现分析

下面按照分析需求,对基金数据进行爬取、解析、处理、可视化、分析。

3.1. 2021 年收益率前 10 名

爬取各类型基金近一年收益率前 10 名的数据,提取返回的 json 数据中的基金名称及收益率信息,将结果用饼图的形式可视化输出。

【代码】

代码语言:python
复制
# 各类基金指定时间段收益率分析
def fund_analyze1():
    for key in fund_type:
        # 爬取各类基金近一年数据(各取前10名)
        res = requests.get(url=url, headers=headers)
        res.encoding = "utf-8"
        # 解析爬取数据
        fund = json.loads(res.text)
        fund = fund["data"]["items"]
        name = []
        value = []
        # 提取基金名称及对应收益率信息
        for i in range(0, len(fund)):
            name.append(fund[i]["fd_name"])
            value.append(fund[i]["yield"])
        # 数据可视化输出(饼图)
        pie(name, value, str(key) + "基金2021年收益前10名", "[" + str(key) + "]基金2021年收益前10名")

【结果】

【分析】

股票及指数型基金的第一名均遥遥领先,混合及QDII型基金的前十名收益率比较接近(标准差较小),债券型基金的前十名表现十分亮眼。

3.2. 收益率分布分析

爬取各类型基金近一年收益率前 1000 名的数据,对收益率在不同分组区间的基金个数进行统计,分析各类型基金的收益率分布情况,将统计结果用柱状图的形式可视化输出。

【代码】

代码语言:python
复制
# 各类基金指定时间段收益率分布分析
def fund_analyze2():
    for key in fund_type:
        # 爬取各类基金近一年数据(各1000个)
        res = requests.get(url=url, headers=headers)
        res.encoding = "utf-8"
        # 解析爬取数据
        fund = json.loads(res.text)
        fund = fund["data"]["items"]
        name = []
        value = []
        # 提取基金名称及对应收益率信息
        for i in range(0, len(fund)):
            name.append(fund[i]["fd_name"])
            try:
                value.append(fund[i]["yield"])
            except:
                value.append(0)

        # 创建数据表,并转换收益率类型为 float,保留四位小数
        tb_fund = pd.DataFrame({"fund_name": name, "yield": value})
        tb_fund["yield"] = round(tb_fund["yield"].astype(float), 4)

        # 对各类基金的收益率数据进行自动分箱,并统计数量
        count_yield = tb_fund["yield"].value_counts(bins=15).sort_index(ascending=True).to_frame()
        count_yield.columns = ["count_num"]

        name = list(count_yield.index.to_tuples())
        value = count_yield["count_num"].to_list()

        # 数据可视化输出
        bars_non_slider2(name, value, str(key), str(key) + "基金收益率分布", "[" + str(key) + "]基金收益率分布情况")

【结果】

【分析】

股票型、指数型、QDII型基金大多数都是亏损状态,且亏得多的也不在少数,同时也有少数收益十分的高,可见这几种基金的高风险及高收益共存的特点。货币型基金稳打稳扎,但收益较少。债券型及 FOF 型基金在平稳的表现中也有少数超常发挥的存在。混合型基金的表现最为优异,没有出现亏损的基金,最低收益也有 11%以上,且不乏高收益的存在。

这几种类型的基金中只有混合型、债券型、货币型的基金没有出现亏损,债券和货币基金是意料之中,而混合型基金也有这样亮眼的成绩确实有点意料之外。

3.3. 各阶段涨跌幅分析

爬取各类型基金近一年收益率排名第一的基金数据,获取其在各个时间段的收益涨跌幅情况,分析优异基金各个阶段的表现,将结果用多系列柱状图的形式可视化输出。

【代码】

代码语言:python
复制
# 各类排名第一基金不同时间段涨跌幅分析
def fund_analyze3():
    name = ['近一周', '近一月', '近三月', '近六月', '近一年', '近两年', '近三年', '近五年']
    fund_value = {}

    for key in fund_type:
        # 爬取各类基金近一年数据
        res = requests.get(url=url, headers=headers)
        res.encoding = "utf-8"
        fund = json.loads(res.text)
        # 获取各类排名第一的基金代号
        first_fd_code = fund["data"]["items"][0]["fd_code"]

        # 爬取排名第一的基金各个时间段的涨跌幅情况
        res = requests.get(url=f_url, headers=headers)
        res.encoding = "utf-8"
        fund = json.loads(res.text)
        fund = fund["data"]

        f_values = []

        # 为避免值缺失的情况,加上异常处理;并转换收益率为 float 型,取四位小数
        # 近一周
        try:
            f_values.append('%.4f' % float(fund["nav_grl1w"]))
        except:
            f_values.append(0)
        # 近一月
        try:
            f_values.append('%.4f' % float(fund["nav_grl1m"]))
        except:
            f_values.append(0)
        # 近三月
        try:
            f_values.append('%.4f' % float(fund["nav_grl3m"]))
        except:
            f_values.append(0)
        # 近六月
        try:
            f_values.append('%.4f' % float(fund["nav_grl6m"]))
        except:
            f_values.append(0)
        # 近一年
        try:
            f_values.append('%.4f' % float(fund["nav_grl1y"]))
        except:
            f_values.append(0)
        # 近两年
        try:
            f_values.append('%.4f' % float(fund["nav_grl2y"]))
        except:
            f_values.append(0)
        # 近三年
        try:
            f_values.append('%.4f' % float(fund["nav_grl3y"]))
        except:
            f_values.append(0)
        # 近五年
        try:
            f_values.append('%.4f' % float(fund["nav_grl5y"]))
        except:
            f_values.append(0)

        # 在字典中添加
        fund_value[key] = f_values

    # 数据可视化输出(柱状图)
    bars(name, fund_value, "各类第一基金不同时段涨跌幅", "各类第一基金阶段涨跌幅")

【结果】

【分析】

各类型基金的第一名最近三个月的表现都平平,甚至有回落的迹象。股票、指数及混合型基金的第一名,近几年来的收益涨幅都相当可观。

3.4. 近 60 个交易日净值情况

爬取各类型基金近一年收益率排名第一的基金数据,获取其在近 60 个交易日的历史净值(单位价值)数据,分析优异基金的历史波动情况,将结果用区域拉伸缩放的柱状图的形式可视化输出。

【代码】

代码语言:python
复制
# 各类排名第一基金近60个交易日净值分析
def fund_analyze4():
    for key in fund_type:
        # 爬取各类基金近一年数据
        res = requests.get(url=url, headers=headers)
        res.encoding = "utf-8"
        fund = json.loads(res.text)
        # 获取各类排名第一的基金代号
        first_fd_code = fund["data"]["items"][0]["fd_code"]

        # 获取各类排名第一基金近60个交易日的净值
        res = requests.get(url=f_url, headers=headers)
        res.encoding = "utf-8"
        fund = json.loads(res.text)
        fund = fund["data"]["items"]
        name = []
        value = []
        for j in range(0, len(fund)):
            name.append(fund[j]["date"])
            value.append(fund[j]["nav"])
        # 数据可视化输出(带拉伸的柱状图)
        bars_slider(name, value, str(key), str(key) + "基金近60个交易日净值", "[" + str(key) + "]基金近60个交易日净值")

【结果】

【分析】

股票型基金第一名近 60 个交易日稳中带升;混合型基金第一名近 60 个交易日稳中带升、近期回落、偶有波折;债券型基金第一名近 60 个交易日有一段波峰,但近期回落明显;指数型基金第一名近 60 个交易日后期显得吃力;QDII型基金第一名近 60 个交易日爬升后劲不足。

3.5. 重仓股分析

爬取股票型及混合型基金近一年收益率排名前 50 的基金数据,获取每只基金的前十大持仓股名称及对应份额进行汇总统计,挑选出股票型及混合型基金各自的前 20 名持仓股票,分析基金最为青睐的股票,将结果用柱状图的形式可视化输出。

【代码】

代码语言:python
复制
# 股票型及混合型基金重仓股票分析
def fund_analyze5():
    for key in fund_type:
        # 爬取股票型及混合型基金近一年数据(各取前50名)
        if str(fund_type[key]) == '2':
            break
        res = requests.get(url=url, headers=headers)
        res.encoding = "utf-8"
        fund = json.loads(res.text)
        fund = fund["data"]["items"]
        fd_code = []
        stock_name = []
        percent = []
        # 提取基金代号
        for i in range(0, len(fund)):
            fd_code.append(fund[i]["fd_code"])

        # 获取基金对应的持仓股名称及份额
        for j in range(0, len(fd_code)):
            res = requests.get(url=f_url, headers=headers)
            res.encoding = "utf-8"
            stock = json.loads(res.text)
            stock = stock["data"]["stock_list"]
            for k in range(0, len(stock)):
                stock_name.append(stock[k]["name"])
                percent.append(stock[k]["percent"])
        # 设置每个基金请求间隔时间
        time.sleep(0.5)

        # 创建数据表
        tb_stocks = pd.DataFrame({"stock_name": stock_name, "hold_percent": percent})
        # 汇总持仓份额
        sum_stocks = tb_stocks.groupby("stock_name", as_index=False).sum()
        # 按份额从高到低排序,并将份额转换格式后保留两位小数
        sum_stocks = sum_stocks.sort_values("hold_percent", ascending=False)
        sum_stocks["hold_percent"] = round(sum_stocks["hold_percent"].astype(float), 2)

        # 选取前20大持仓
        name = sum_stocks["stock_name"].head(20).to_list()
        value = sum_stocks["hold_percent"].head(20).to_list()

        # 数据可视化输出
        bars_non_slider(name, value, str(key), str(key) + "基金前20大持仓股票", "[" + str(key) + "]基金前20大持仓股票")

【结果】

【分析】

股票型基金中,最受青睐的明星股票是“宁德时代”,其余前五位分别是天齐锂业、赣锋锂业、杉杉股份、华友钴业。股票型基金重仓的前五位中有四个都是新能源材料行业的企业。

混合型基金中,最受青睐的明星股票同样是“宁德时代”,其余前五位分别是赛轮轮胎、天合光能、阳光电源、天齐锂业。混合型基金重仓的前五位中同样有四个都是新能源材料行业的企业,且有两个持仓跟股票型基金是重合的。

看来投资者和基金经理一致看多新能源材料行业

4. 结语

鉴于时间和精力有限,这次对爬取的基金数据只做了部分视角的分析,大家可以自行从其他不同的角度进行分析,挖掘出有价值的信息。例如,资产规模情况、新基金与老基金收益对比、明星基金经理及其管理基金分析等等。

最后提醒一句:投资有风险,理财需谨慎!本文不构成任何投资建议!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 基金介绍
    • 1.1. 基金是什么
      • 1.2. 基金的分类
        • 1.2.1. 货币型基金
        • 1.2.2. 债券型基金
        • 1.2.3. 股票型基金
        • 1.2.4. 混合型基金
        • 1.2.5. 指数型基金
        • 1.2.6. FOF型基金
        • 1.2.7. 基金风险及收益程度分布
      • 1.3. 基金的申购
      • 2. 基金分析前准备
        • 2.1. URL 及报文分析
          • 2.1.1. URL 分析
          • 2.1.2. 报文分析
        • 2.2. 数据可视化设置
        • 3. 基金表现分析
          • 3.1. 2021 年收益率前 10 名
            • 3.2. 收益率分布分析
              • 3.3. 各阶段涨跌幅分析
                • 3.4. 近 60 个交易日净值情况
                  • 3.5. 重仓股分析
                  • 4. 结语
                  相关产品与服务
                  容器服务
                  腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档