Python小项目:葛兰中欧医疗基金数据分析

1 前言

2022年1月末,正值年前,股票商场继续大幅跌落,与之相应的基金商场也出现了近一周的继续跌势。作为一个资深的出资者,我承认自己曾是一名“韭菜”,在2021年12月初购买了中欧医疗健康混合C基金。这只基金由医疗板块的佼佼者葛兰担任基金司理。尽管我听闻葛兰是医疗板块最出色的基金司理之一,而医疗职业又是民生大计,其时我对这次出资有着极高的期望,期待着取得可观的收益。

但是,我购买这只基金后,却经历了一个月的继续跌落,导致我的出资亏损挨近15%。为了改变这一局面,我不断学习有关基金的知识,希望经过数据剖析的方法来量化我的购买决策,以科学的方法获取更多的收益。

2 数据收集/清洗

数据来源与所需数据 为了进行精确的数据剖析,咱们将从天天基金网获取必要的数据。以下是咱们需求收集的数据:

  1. 中欧医疗健康混合C基金的前史净值和日涨幅数据。
  2. 同类型基金(医疗职业)的前史净值均值和日涨幅数据。
  3. 沪深300指数基金的前史净值和日涨幅数据。
  4. 中欧医疗健康混合C基金的用户谈论数据。

针对中欧医疗健康混合C的前史净值以及日涨幅、同类型基金(医疗)的前史净值的均值以及日涨幅、沪深300指数基金前史净值以及日涨幅数据运用Python的requests库对天天基金网进行爬取。点击“基金档案”并查找“中欧医疗健康混合C”能够看到基金净值的表格,网站截图如下所示:

Python小项目:葛兰中欧医疗基金数据分析

而且经过天天基金网的板块检索挑选与中欧医疗类似的七只基金,基金代码分别是007613、001563、003581、005043、007111、005044、110023。具体操作如下图所示:

Python小项目:葛兰中欧医疗基金数据分析

2.1 数据收集

#导入相应的包
import requests
import re
import json
import pandas as pd
#爬取中欧医疗数据
df_list = []
for i in range(1,65):
    url = "http://api.fund.eastmoney.com/f10/lsjz?callback=jQuery18304159015262110892_1643544350831&fundCode=003096&pageIndex={}&pageSize=20&startDate=&endDate=&_=1643545365216".format(i)
    headers = {
        "Referer":"http://fundf10.eastmoney.com/jjjz_003096.html",
        "User-Agent":'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:92.0) Gecko/20100101 Firefox/92.0',
    }
    resp = requests.get(url,headers=headers)
    html = resp.text
    res = re.findall('\((.*?)\)',html)
    datas = json.loads(res[0])["Data"]["LSJZList"]
    df = pd.DataFrame(datas)
    df_list.append(df)
df_data = pd.concat(df_list)
df_data.to_csv('中欧医疗健康混合C (003096).csv',index=False,encoding="utf_8_sig")
#爬取同医疗类型基金数据并核算净值均值方便以后比照
same_type = ["007613","001563","003581","005043","007111","005044","110023"]
pages = [25,64,62,50,34,50,64]
df_list = []
for index in range(1,65):
    lis = []
    for i in range(0,7):
        if pages[i] >= index:
            lis.append(same_type[i])
        else:
            pass
    df1 = []
    for i in lis:
        url = "http://api.fund.eastmoney.com/f10/lsjz?callback=jQuery18304159015262110892_1643544350831&fundCode={}&pageIndex={}&pageSize=20&startDate=&endDate=&_=1643545365216".format(i,index)
        headers = {
        "Referer":"http://fundf10.eastmoney.com/jjjz_{}.html".format(i),
        "User-Agent":'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:92.0) Gecko/20100101 Firefox/92.0',
        }
        resp = requests.get(url,headers=headers)
        html = resp.text
        res = re.findall('\((.*?)\)',html)
        datas = json.loads(res[0])["Data"]["LSJZList"]
        df = pd.DataFrame(datas)
        df1.append(df)
    df_new = pd.concat(df1,keys=lis)
    df_list.append(df_new)
df_data = pd.concat(df_list)
df_data.to_csv('同类基金.csv',index=True,encoding="utf_8_sig")
#爬取沪深300指数净值
df_list = []
for i in range(1,65):
    url = "http://api.fund.eastmoney.com/f10/lsjz?callback=jQuery18304159015262110892_1643544350831&fundCode=050002&pageIndex={}&pageSize=20&startDate=&endDate=&_=1643545365216".format(i)
    headers = {
        "Referer":"http://fundf10.eastmoney.com/jjjz_050002.html",
        "User-Agent":'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:92.0) Gecko/20100101 Firefox/92.0',
    }
    resp = requests.get(url,headers=headers)
    html = resp.text
    res = re.findall('\((.*?)\)',html)
    datas = json.loads(res[0])["Data"]["LSJZList"]
    df = pd.DataFrame(datas)
    df_list.append(df)
df_data = pd.concat(df_list)
df_data.to_csv('博时沪深300指数A (050002).csv',index=False,encoding="utf_8_sig")

2.2 数据清洗

import os
import re
import math
import pandas as pd
df_base = pd.read_csv('中欧医疗健康混合C (003096).csv')
df_avg = pd.read_csv('同类医疗基金均值.csv')
df_300 = pd.read_csv('博时沪深300指数A (050002).csv')
def data_extraction(df,col): #df_avg的col=3,其他为6
    df_flashback = df.reindex(index=df.index[::-1])
    cumulative_growth = []
    sum_up = 0
    for i in range(0,1280):
        cod = float(df_flashback.iloc[i,col])
        sum_up += cod
        cumulative_growth.append(sum_up)
    data = {
        "FSRQ":pd.Series(df_flashback["FSRQ"].values),
        "DWJZ":pd.Series(df_flashback["DWJZ"].values),
        "JZZZL":pd.Series(df_flashback["JZZZL"].values),
        "DWZZL":pd.Series(cumulative_growth)
    }
    new_df = pd.DataFrame(data)
    return new_df

3 净值可视化

为了更好地理解中欧医疗基金的前史走势和成绩体现,咱们将运用 pyecharts 结合 DataFrame 进行数据可视化。pyecharts 供给了强大的绘图方法,而 DataFrame 则作为数据的基础,让咱们能够更方便地呈现剖析成果。

(1)运用 DataFrame 进行图画制作 在进行数据剖析时,数据一般存储在 DataFrame 中,为了更好地运用这些数据进行图画制作,咱们能够结合 pyecharts 库,运用 DataFrame 的 plot 方法来进行图画制作。经过这种方法,咱们能够轻松地生成交互式图表,以及更好地展示数据之间的联系和改变。

(2)图表多样性 pyecharts 供给了各种图表类型,例如折线图、柱状图、散点图等,能够依据数据的性质和剖析的需求挑选合适的图表类型。同时,这些图表也支持交互功用,例如鼠标悬停、扩大缩小等,使数据可视化更加生动和有趣。

经过净值可视化,咱们能够更直观地观察中欧医疗基金的前史净值走势,与同类基金以及商场指数的比照状况。这将有助于咱们更深化地了解基金的体现,从而为出资决策供给更多的依据。

中欧医疗健康混合C前史净值数据可视化

from eplot import eplot
df1 = pd.Series(data_extraction(df_base,6)['DWJZ'].values.tolist(),
                  index= data_extraction(df_base,6)['FSRQ'].values.tolist())
df1.eplot()

Python小项目:葛兰中欧医疗基金数据分析

从可视化成果中能够显着看出,自2016年11月8日中欧医疗健康混合C基金建立之初,该基金在短时间内取得了显著的上涨,一直继续到2021年5月左右,净值达到了约4.5。但是,自2021年开始,该基金的净值开始连续跌落,这也是导致我亏损的主要原因之一。

中欧医疗健康混合C与其他基金比照

(1)中欧医疗建立以来涨幅比照

from pyecharts.charts  import Line #导入折线图
from pyecharts import options as opts 
line=(
    Line()
    .set_global_opts(
        tooltip_opts=opts.TooltipOpts(is_show=False),
        xaxis_opts=opts.AxisOpts(type_="category"),
        yaxis_opts=opts.AxisOpts(
            type_="value",
            axistick_opts=opts.AxisTickOpts(is_show=True),
            splitline_opts=opts.SplitLineOpts(is_show=True),
        ),
    )
    .add_xaxis(xaxis_data=data_extraction(df_base,6)["FSRQ"].values.tolist())
    .add_yaxis(
        series_name="中欧医疗",
        y_axis=data_extraction(df_base,6)["DWZZL"].values.tolist(),
        symbol="emptyCircle",
        is_symbol_show=True,
        label_opts=opts.LabelOpts(is_show=False),
    )
    .add_yaxis(
        series_name="沪深300",
        y_axis=data_extraction(df_300,6)["DWZZL"].values.tolist(),
        symbol="emptyCircle",
        is_symbol_show=True,
        label_opts=opts.LabelOpts(is_show=False),
    )
    .add_yaxis(
        series_name="同类均值",
        y_axis=data_extraction(df_avg,3)["DWZZL"].values.tolist(),
        symbol="emptyCircle",
        is_symbol_show=True,
        label_opts=opts.LabelOpts(is_show=False),
    )
)
line.render_notebook()

Python小项目:葛兰中欧医疗基金数据分析

依据咱们的数据可视化成果,能够清晰地看出中欧医疗基金的涨幅现已远远超过了同类基金的均值以及沪深300指数。这样的体现令人形象深化,标明中欧医疗基金在过去的一段时间里取得了十分可观的成绩。

(2)近一年的涨幅比照

def data_extraction_year(df,col): #df_avg的col=3,其他为6
    df = df[0:366]
    df_flashback = df.reindex(index=df.index[::-1])
    cumulative_growth = []
    sum_up = 0
    for i in range(0,366):
        cod = float(df_flashback.iloc[i,col])
        cumulative_growth.append(sum_up)
        sum_up += cod
    data = {
        "FSRQ":pd.Series(df_flashback["FSRQ"].values),
        "DWJZ":pd.Series(df_flashback["DWJZ"].values),
        "JZZZL":pd.Series(df_flashback["JZZZL"].values),
        "DWZZL":pd.Series(cumulative_growth)
    }
    new_df = pd.DataFrame(data)
    return new_df
from pyecharts.charts  import Line #导入折线图
x = data_extraction_year(df_base,6)["FSRQ"].values.tolist()
y1 = data_extraction_year(df_base,6)["DWZZL"].values.tolist()
y2 = data_extraction_year(df_300,6)["DWZZL"].values.tolist()
y3 = data_extraction_year(df_avg,3)["DWZZL"].values.tolist()
line=(
    Line()
    .set_global_opts(
        tooltip_opts=opts.TooltipOpts(is_show=False),
        xaxis_opts=opts.AxisOpts(type_="category"),
        yaxis_opts=opts.AxisOpts(
            type_="value",
            axistick_opts=opts.AxisTickOpts(is_show=True),
            splitline_opts=opts.SplitLineOpts(is_show=True),
        ),
    )
    .add_xaxis(xaxis_data=x)
    .add_yaxis(
        series_name="中欧医疗",
        y_axis=y1,
        symbol="emptyCircle",
        is_symbol_show=True,
        label_opts=opts.LabelOpts(is_show=False),
    )
    .add_yaxis(
        series_name="沪深300",
        y_axis=y2,
        symbol="emptyCircle",
        is_symbol_show=True,
        label_opts=opts.LabelOpts(is_show=False),
    )
    .add_yaxis(
        series_name="同类均值",
        y_axis=y3,
        symbol="emptyCircle",
        is_symbol_show=True,
        label_opts=opts.LabelOpts(is_show=False),
    )
)
line.render_notebook()

Python小项目:葛兰中欧医疗基金数据分析

咱们能够看出中欧医疗基金的涨跌起伏现已趋近于同类基金的均值以及商场指数的均值。这标明在近一年的时间里,中欧医疗基金的体现现已不如之前几年。尽管总体上来看,中欧医疗基金的涨幅仍然是可观的,超过了同类基金的均值以及商场指数的均值,但成绩下滑确实是不行忽视的事实。

(3)近三个月的涨幅比照

def data_extraction_month3(df,col): #df_avg的col=3,其他为6
    df = df[0:80]
    df_flashback = df.reindex(index=df.index[::-1])
    cumulative_growth = []
    sum_up = 0
    for i in range(0,80):
        cod = float(df_flashback.iloc[i,col])
        cumulative_growth.append(sum_up)
        sum_up += cod
    data = {
        "FSRQ":pd.Series(df_flashback["FSRQ"].values),
        "DWJZ":pd.Series(df_flashback["DWJZ"].values),
        "JZZZL":pd.Series(df_flashback["JZZZL"].values),
        "DWZZL":pd.Series(cumulative_growth)
    }
    new_df = pd.DataFrame(data)
    return new_df
from pyecharts.charts  import Line #导入折线图
x = data_extraction_month3(df_base,6)["FSRQ"].values.tolist()
y1 = data_extraction_month3(df_base,6)["DWZZL"].values.tolist()
y2 = data_extraction_month3(df_300,6)["DWZZL"].values.tolist()
y3 = data_extraction_month3(df_avg,3)["DWZZL"].values.tolist()
line=(
    Line()
    .set_global_opts(
        tooltip_opts=opts.TooltipOpts(is_show=False),
        xaxis_opts=opts.AxisOpts(type_="category"),
        yaxis_opts=opts.AxisOpts(
            type_="value",
            axistick_opts=opts.AxisTickOpts(is_show=True),
            splitline_opts=opts.SplitLineOpts(is_show=True),
        ),
    )
    .add_xaxis(xaxis_data=x)
    .add_yaxis(
        series_name="中欧医疗",
        y_axis=y1,
        symbol="emptyCircle",
        is_symbol_show=True,
        label_opts=opts.LabelOpts(is_show=False),
    )
    .add_yaxis(
        series_name="沪深300",
        y_axis=y2,
        symbol="emptyCircle",
        is_symbol_show=True,
        label_opts=opts.LabelOpts(is_show=False),
    )
    .add_yaxis(
        series_name="同类均值",
        y_axis=y3,
        symbol="emptyCircle",
        is_symbol_show=True,
        label_opts=opts.LabelOpts(is_show=False),
    )
)
line.render_notebook()

Python小项目:葛兰中欧医疗基金数据分析

从图可见中欧医疗的成绩现已远远不如同类均值以及商场均值,与此同时中欧医疗的基金规划不断的扩大。说明散户都以为这时是底部,大家都进行了抄底,但是因为美联储加息方针的出台,造成了心情惊惧,商场跌落严重。而中欧医疗抗跌能力远远不及同类均值,造成了大量用户丢失,这也是我丢失的原因。

(4)近一个月的涨幅比照

def data_extraction_month(df,col): #df_avg的col=3,其他为6
    df = df[0:32]
    df_flashback = df.reindex(index=df.index[::-1])
    cumulative_growth = []
    sum_up = 0
    for i in range(0,32):
        cod = float(df_flashback.iloc[i,col])
        cumulative_growth.append(sum_up)
        sum_up += cod
    data = {
        "FSRQ":pd.Series(df_flashback["FSRQ"].values),
        "DWJZ":pd.Series(df_flashback["DWJZ"].values),
        "JZZZL":pd.Series(df_flashback["JZZZL"].values),
        "DWZZL":pd.Series(cumulative_growth)
    }
    new_df = pd.DataFrame(data)
    return new_df
from pyecharts.charts  import Line #导入折线图
x = data_extraction_month(df_base,6)["FSRQ"].values.tolist()
y1 = data_extraction_month(df_base,6)["DWZZL"].values.tolist()
y2 = data_extraction_month(df_300,6)["DWZZL"].values.tolist()
y3 = data_extraction_month(df_avg,3)["DWZZL"].values.tolist()
line=(
    Line()
    .set_global_opts(
        tooltip_opts=opts.TooltipOpts(is_show=False),
        xaxis_opts=opts.AxisOpts(type_="category"),
        yaxis_opts=opts.AxisOpts(
            type_="value",
            axistick_opts=opts.AxisTickOpts(is_show=True),
            splitline_opts=opts.SplitLineOpts(is_show=True),
        ),
    )
    .add_xaxis(xaxis_data=x)
    .add_yaxis(
        series_name="中欧医疗",
        y_axis=y1,
        symbol="emptyCircle",
        is_symbol_show=True,
        label_opts=opts.LabelOpts(is_show=False),
    )
    .add_yaxis(
        series_name="沪深300",
        y_axis=y2,
        symbol="emptyCircle",
        is_symbol_show=True,
        label_opts=opts.LabelOpts(is_show=False),
    )
    .add_yaxis(
        series_name="同类均值",
        y_axis=y3,
        symbol="emptyCircle",
        is_symbol_show=True,
        label_opts=opts.LabelOpts(is_show=False),
    )
)
line.render_notebook()

Python小项目:葛兰中欧医疗基金数据分析

从图可见医疗板块在本次商场跌落中是跌落比较严重的板块,而且中欧医疗的抗跌能力十分差,由此能够推出这只基金最大回撤率十分的高。这是股票型基金的特色——大涨大跌。依据我稳健型的出资风格,我或许会抛弃这只基金,转站债券、指数基金等具有相对安稳收益的理财产品。

4 结语

经过本次数据剖析,咱们深化了解了中欧医疗基金的前史体现、商场比照以及出资者点评。出资是一个复杂的过程,涵盖了很多要素和危险。在出资决策中,咱们需求综合考虑基金的前史成绩、商场动态、用户点评等要素,拟定合理的出资策略。

无论是基金的成绩体现还是商场的动摇,都需求咱们保持镇定、理性的情绪。过去的体现并不能完全预测未来,商场也或许受到各种要素的影响而产生动摇。因而,在出资决策中,咱们应该保持警惕,随时预备应对商场的改变。

出资需求慎重,也需求活跃的学习和剖析。经过数据的深化挖掘,咱们能更好地了解基金的特色和商场的改变。在未来的出资征途中,让咱们坚持慎重达观的情绪,保持灵活性,不断优化出资计划,以期取得更稳健的出资回报。

留意:本文的剖析仅供参考,出资决策需慎重。出资者应依据自身状况和商场危险,做出明智的挑选。

Python小项目:葛兰中欧医疗基金数据分析