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

1 前言

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

然而,我购买这只基金后,却经历了一个月的持续下跌,导致我的投资亏损接近15%。为了改变这一局面,我不断学习有关基金的知识,希望通过数据分析的方法来量化我的购买决策,以科学的方式获取更多的收益。

2 数据采集/清洗

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

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

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

在这里插入图片描述

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

在这里插入图片描述

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.textres = 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:passdf1 = []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.textres = 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.textres = 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,其余为6df_flashback = df.reindex(index=df.index[::-1])cumulative_growth = []sum_up = 0for i in range(0,1280):cod = float(df_flashback.iloc[i,col])sum_up += codcumulative_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()

在这里插入图片描述

从可视化结果中可以明显看出,自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()

在这里插入图片描述

根据我们的数据可视化结果,可以清晰地看出中欧医疗基金的涨幅已经远远超过了同类基金的均值以及沪深300指数。这样的表现令人印象深刻,表明中欧医疗基金在过去的一段时间里取得了非常可观的业绩。

(2)近一年的涨幅对比

def data_extraction_year(df,col): #df_avg的col=3,其余为6df = df[0:366]df_flashback = df.reindex(index=df.index[::-1])cumulative_growth = []sum_up = 0for i in range(0,366):cod = float(df_flashback.iloc[i,col])cumulative_growth.append(sum_up)sum_up += coddata = {"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()

在这里插入图片描述

我们可以看出中欧医疗基金的涨跌幅度已经趋近于同类基金的均值以及市场指数的均值。这表明在近一年的时间里,中欧医疗基金的表现已经不如之前几年。虽然总体上来看,中欧医疗基金的涨幅仍然是可观的,超过了同类基金的均值以及市场指数的均值,但业绩下滑确实是不可忽视的事实。

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

def data_extraction_month3(df,col): #df_avg的col=3,其余为6df = df[0:80]df_flashback = df.reindex(index=df.index[::-1])cumulative_growth = []sum_up = 0for i in range(0,80):cod = float(df_flashback.iloc[i,col])cumulative_growth.append(sum_up)sum_up += coddata = {"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()

在这里插入图片描述

从图可见中欧医疗的业绩已经远远不如同类均值以及市场均值,与此同时中欧医疗的基金规模不断的扩大。说明散户都认为这时是底部,大家都进行了抄底,但是由于美联储加息政策的出台,造成了情绪恐慌,市场下跌严重。而中欧医疗抗跌能力远远不及同类均值,造成了大量用户损失,这也是我损失的原因。

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

def data_extraction_month(df,col): #df_avg的col=3,其余为6df = df[0:32]df_flashback = df.reindex(index=df.index[::-1])cumulative_growth = []sum_up = 0for i in range(0,32):cod = float(df_flashback.iloc[i,col])cumulative_growth.append(sum_up)sum_up += coddata = {"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()

在这里插入图片描述

从图可见医疗板块在本次市场下跌中是下跌比较严重的板块,并且中欧医疗的抗跌能力非常差,由此可以推出这只基金最大回撤率非常的高。这是股票型基金的特点——大涨大跌。根据我稳健型的投资风格,我可能会放弃这只基金,转站债券、指数基金等具有相对稳定收益的理财产品。

4 结语

通过本次数据分析,我们深入了解了中欧医疗基金的历史表现、市场对比以及投资者评价。投资是一个复杂的过程,涵盖了众多因素和风险。在投资决策中,我们需要综合考虑基金的历史业绩、市场动态、用户评价等因素,制定合理的投资策略。

无论是基金的业绩表现还是市场的波动,都需要我们保持冷静、理性的态度。过去的表现并不能完全预测未来,市场也可能受到各种因素的影响而产生波动。因此,在投资决策中,我们应该保持警惕,随时准备应对市场的变化。

投资需要谨慎,也需要积极的学习和分析。通过数据的深入挖掘,我们能更好地了解基金的特点和市场的变化。在未来的投资征程中,让我们坚持谨慎乐观的态度,保持灵活性,不断优化投资计划,以期获得更稳健的投资回报。

注意:本文的分析仅供参考,投资决策需谨慎。投资者应根据自身情况和市场风险,做出明智的选择。

如果你对Python感兴趣,想要学习python,这里给大家分享一份Python全套学习资料,都是我自己学习时整理的,希望可以帮到你,一起加油!

😝有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓
Python全套学习资料

在这里插入图片描述

1️⃣零基础入门

① 学习路线

对于从来没有接触过Python的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

② 路线对应学习视频

还有很多适合0基础入门的学习视频,有了这些视频,轻轻松松上手Python~
在这里插入图片描述

③练习题

每节视频课后,都有对应的练习题哦,可以检验学习成果哈哈!
在这里插入图片描述

2️⃣国内外Python书籍、文档

① 文档和书籍资料

在这里插入图片描述

3️⃣Python工具包+项目源码合集

①Python工具包

学习Python常用的开发软件都在这里了!每个都有详细的安装教程,保证你可以安装成功哦!
在这里插入图片描述

②Python实战案例

光学理论是没用的,要学会跟着一起敲代码,动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。100+实战案例源码等你来拿!
在这里插入图片描述

③Python小游戏源码

如果觉得上面的实战案例有点枯燥,可以试试自己用Python编写小游戏,让你的学习过程中增添一点趣味!
在这里插入图片描述

4️⃣Python面试题

我们学会了Python之后,有了技能就可以出去找工作啦!下面这些面试题是都来自阿里、腾讯、字节等一线互联网大厂,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
在这里插入图片描述
在这里插入图片描述

5️⃣Python兼职渠道

而且学会Python以后,还可以在各大兼职平台接单赚钱,各种兼职渠道+兼职注意事项+如何和客户沟通,我都整理成文档了。
在这里插入图片描述

上述所有资料 ⚡️ ,朋友们如果有需要的,可以扫描下方👇👇👇二维码免费领取🆓
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/245077.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

内容过滤算法:构建数字世界的守护者

目录 引言 1. 内容过滤算法概述 2. 内容过滤算法的分类 2.1 关键词过滤算法 2.2 统计模型 2.3 机器学习算法 2.4 深度学习算法 3. 内容过滤算法在实际应用中的体现 3.1 电子邮件过滤 3.2 社交媒体内容过滤 3.3 网络搜索引擎 4. 内容过滤算法的挑战与未来发展 4.1 对…

TOP-K问题和向上调整算法和向下调整算法的时间复杂度问题的分析

TOP-K问题 TOP-K问题:即求数据结合中前K个最大的元素或者最小的元素,一般情况下数据量都比较大 比如:专业前10名、世界500强、富豪榜、游戏中前100的活跃玩家等 对于Top-K问题,能想到的最简单直接的方式就是排序,但是…

【java+vue+微信小程序项目】从零开始搭建——健身房管理平台(1)spring boot项目搭建、vue项目搭建、微信小程序项目搭建

项目笔记为项目总结笔记,若有错误欢迎指出哟~ 【项目专栏】 【java+vue+微信小程序项目】从零开始搭建——健身房管理平台(1)项目搭建 持续更新中… java+vue+微信小程序项目】从零开始搭建——健身房管理平台 项目简介Java项目搭建(IDEA)1.新建项目2.项目类型3.项目设置4…

MySQL 的 NULL 是怎么存储的?

目录 一、MySQL介绍 二、什么是NULL 三、MySQL 的 NULL 是怎么存储的 一、MySQL介绍 MySQL是一种关系型数据库管理系统(RDBMS),它是一种开源软件,由瑞典MySQL AB公司开发,后被Sun Microsystems收购,现在…

难以置信,一个小小的需求让我捣鼓出一个提效的网站来

难以置信,一个小小的需求让我捣鼓出一个提效的网站来 需求介绍 事情是这样的,有个群友在业务当中碰到一个小小的需求,需求是这样的: 页面当中存在多个输入框,输入框的 value 值是一个数值组成的字符串(盲猜应该是身份…

【面试经典150 | 二分查找】搜索二维矩阵

文章目录 写在前面Tag题目来源题目解读解题思路方法一:二分查找 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更…… 专栏内容以分析题目为主,并附带一些对于本题涉及到的数据结构等…

【Unity动画】Unity 动画播放的流程

本文以2D为案例,讲解Unity 播放动画的流程 准备和导入2D动画资源 外部导入序列帧生成的 Unity内部制作的 外部导入的3D动画 2.创建动画过程 打开时间轴Ctrl6 选中场景中的一个未来需要播放动画的物体 回到时间轴点击Create一个新动画片段 拖动2D动画资源放入…

Redis数据库

服务器结构 struct redisServer {/* General */pid_t pid; /* Main process pid. */pthread_t main_thread_id; /* Main thread id */char *configfile; /* Absolute config file path, or NULL */char *executable; /* Absolut…

科研小白必收藏,手把手教你写医学论文!

一篇完整的论文应包括标题、摘要、引言、方法、结果、讨论、致谢、参考文献八个部分,每个部分的写作都有技巧。 1.标题 标题一般采用名词词组或名词短语的形式,个别杂志也允许陈述句的形式。标题必须简单、明了,醒目。题目要新颖&#xff0c…

分享74个节日PPT,总有一款适合您

分享74个节日PPT,总有一款适合您 74个节日PPT下载链接:https://pan.baidu.com/s/18YHKkyJsplx-Gjj7ofpFrg?pwd6666 提取码:6666 Python采集代码下载链接:采集代码.zip - 蓝奏云 学习知识费力气,收集整理更不易…

quickapp_快应用_父子组件传值

目录 页面级组件自定义组件(子组件)引入自定义组件(子组件)父组件给子组件传值子组件给父组件进行传值父组件调用子组件的方法 页面级组件 在pages中定义的组件被称为页面级组件。 页面级组件(等同于Vue页面),通过路由配置可以进行页面跳转。 自定义组件(子组件)…

JS学习--类型转换

函数转换 parseInt() 转换之前,首先会分析该字符串。判断位置为0处的字符串,判断是否为有效数字,若否,直接返回NaN,不再继续; 若是,继续打印直到不为数字的地方停止 parseFloat() 转换之前&…