美文网首页Python程序员联盟@IT·互联网代码改变世界
初步分析1000只基金,20w交易日的数据|哪天买最划算

初步分析1000只基金,20w交易日的数据|哪天买最划算

作者: 菜鸟学python | 来源:发表于2017-06-03 16:48 被阅读325次

    这是菜鸟学Python的第83篇原创文章

    阅读本文大概需要4分钟

    前面几篇文章讲了很多零零碎碎的知识点,有同学抱怨说,你的数据量太少了,比如上一篇的基金和房价啊,好今天我们就来一个稍微大一点的数据集,我爬去了某财经网站的1000只基金的,累计20W交易日数据,然后做了简单的分析,我们希望知道周一到周五哪一天定投买基金最划算,也就是说我们要统计出周一到周五哪一天跌的概率最大

    数据集:

    基金一共有6500多只基金,我现在先取其中的1000只基金, 全年的交易数据,然后用Pandas分析,大家猜猜看哪一天的买最划算(今天这个实例用到前面所学的很多知识,算是一个小的综合练习吧)

    数据收集

    数据清洗

    数据存储

    数据分析

    1.数据的收集

    1).数据的收集我们采用爬虫去爬取,爬虫的库很多,我比较喜欢用requests,据说这个库是最人性化的爬虫库。(关于爬虫的知识网上很多,我这边就不对requests库展开介绍,大家可以自行去网上查一下).我们从某财经网站爬取数据,我们要获取基金的交易数据长这样:

    2).我们只获取2个元素:日期,净值增长率

    3).我们输入网站的url,开始时间和截止时间

    用requests获取网站内容,记住我们把编码改成utf-8,不然会有乱码

    4).然后分析一下网页,发现我们要的数据其实藏在里面,我们用BeautifulSoup去处理数据,BS用起来比较方便,但是速度很慢一些,如果要快的话,大家也可以用lxml库去解析html.

    5).用BS的find_all获取所有的,然后对里面的内容进行解析

    2.数据的清洗

    拿到数据之后,我们要进行清洗,去掉一些杂质,提取我们想要的数据。因为我们要计算星期几,所以还需要对应的写一个函数来把日期转成星期,用datatime就可以了(datetime我前面文章讲的非常详细,大家可以自己翻一下历史文章都说Python时间处理很好玩还简单,真的吗)

    3.数据的存储

    我们把处理之后的数据,需要存起来,有很多方法可以处理,我们可以存到数据库里面,Sqlite,Mongodb,Sql都可以,也可以存成文件json,csv,excel都可以.这些数据的处理我前面都讲过,这里我用一个比较简单的方法存成csv文件吧.

    然后存的csv文件长这样:

    4.数据的分析

    好下面进入我们最精彩的地方,前面都是铺垫,现在数据已经在我们手上了,我们可以随需所欲的挖掘数据的秘密了,怎么挖掘呢,当然是我们的主角要登场了,Pandas呀,我们前面几篇文章一直都在讲Pandas,好下面快来看看如何处理吧

    1). 读取CSV文件

    pandas有一个非常强大的库read_csv(file),可以直接把csv文件转成DateFrame数据结构,非常方便

    2).利用DataFrame对数据进行处理

    比如我们前面爬虫一个基金110011的数据,经过前面几步,可以获得数据如下:

    比如:全年一共是264个的交易数据

    易方达中小盘混合(110011)_基金净值_财经_凤凰网

    264

    Total fund: 1

    date  rate(%)  fund_value  weekday

    0    2017-05-24    -0.53      3.5416        3

    1    2017-05-23     0.55      3.5606        2

    2    2017-05-22     0.16      3.5410        1

    3    2017-05-19     1.08      3.5352        5

    4    2017-05-18    -0.29      3.4974        4

    5    2017-05-17    -1.16      3.5075        3

    。。。

    261  2016-04-28     0.08      2.4802        4

    262  2016-04-27     0.02      2.4783        3

    263  2016-04-26     0.58      2.4779        2

    [264 rows x 4 columns]

    获取的是一个264*4大的表数据

    3).日期处理

    目前我们的date是第二列,我们需要做一些数据处理,把date作为index,我们用pandas非常强大的to_datetime函数

    df['date']=pd.to_datetime(df['date'])

    #把日期作为index

    df=df.set_index('date')

    rate(%)  fund_value  weekday

    date

    2017-05-24    -0.53      3.5416        3

    2017-05-23     0.55      3.5606        2

    2017-05-22     0.16      3.5410        1

    2017-05-19     1.08      3.5352        5

    2017-05-18    -0.29      3.4974        4

    看日期变成了index了吧,有同学说为啥要这样处理呢,因为后面有很多操作都是跟时间相关的,比如我们要提取周线,月线,等等

    4).看一下1年有多少天是跌的

    统计基金净值增长率<0就可以了

    df_price_decline=df[df['rate(%)']<0]

    为了显示方便我们取前5个

    rate(%)  fund_value  weekday

    date

    2017-05-24    -0.53      3.5416        3

    2017-05-18    -0.29      3.4974        4

    2017-05-17    -1.16      3.5075        3

    2017-05-10    -0.24      3.3885        3

    2017-05-08    -1.17      3.3945        1

    5.Pandas进一步分析

    然后我们需要用到Pandas里面一个非常重要的功能,分组功能,这个功能非常强大,后面我会写一篇文章专门介绍,这里我们先简单运用一下.

    我们对weekday进行分组,然后统计出周一到周五,每天都跌的次数

    比如:我们把基金的时间取最近一个月的交易日的数据:s_date,e_date='2017-4-25','2017-5-24'

    weekday_df=df_price_decline.groupby('weekday')

    print weekday_df

    >>

    rate(%)  fund_value  weekday

    date

    2017-05-24    -0.53      3.5416        3

    2017-05-18    -0.29      3.4974        4

    2017-05-17    -1.16      3.5075        3

    2017-05-10    -0.24      3.3885        3

    2017-05-08    -1.17      3.3945        1

    2017-05-04    -0.27      3.4343        4

    2017-04-28    -0.74      3.4117        5

    2017-04-26    -0.65      3.4349        3

    统计出weekday

    print weekday_df.size()

    >>

    weekday

    1    1

    3    4

    4    2

    5    1

    dtype: int64

    发现近一个月:

    星期一:跌1次

    星期二:跌0次

    星期三:跌4次

    星期五:跌1次

    很明显星期三跌的次数多,也就是概率很大,这只是一个基金最近1个月的数据,我们同理取获取1年的数据,并且抽取1000来只基金的数据,看看是什么情况呢

    #排序一个,并取第一个

    print weekday_df.size().sort_values(ascending=False)

    >>

    weekday

    3    4

    4    2

    5    1

    1    1

    dtype: int64

    #获取跌的天数最多的那个

    print weekday_df.size().sort_values(ascending=False).head(1)

    >>

    weekday

    3    4

    dtype: int64

    top_weekday_price_decline.index[0]就是我们返回的跌幅最多的天数

    -1表示有一些基金有一些基金爬取的数据是0

    比如:

    易方达天天理财货币A(000009)_基金净值_财经_凤凰网

    0

    易方达天天理财货币B(000010)_基金净值_财经_凤凰网

    0

    6.1000只基金,全年的交易数据

    前面的代码框架基本已经成型,然后把s_date,e_date改为'2016-4-25','2017-5-24',取1年内的数据,用另外一个爬虫取1000只基金,把返回的天数放到一个列表里面,用Counter统计一下就可以了

    运行结果:

    华夏成长混合(000001)_基金净值_财经_凤凰网

    264

    中海可转债债券A(000003)_基金净值_财经_凤凰网

    264

    中海可转债债券C(000004)_基金净值_财经_凤凰网

    264

    嘉实增强信用定期债券(000005)_基金净值_财经_凤凰网

    264

    鹏华国企债债券(000007)_基金净值_财经_凤凰网

    264

    。。。

    东方红稳健精选混合A(001203)_基金净值_财经_凤凰网

    263

    东方红稳健精选混合C(001204)_基金净值_财经_凤凰网

    263

    建信稳健回报灵活配置混合(001205)_基金净值_财经_凤凰网

    264

    广发聚惠混合A(001206)_基金净值_财经_凤凰网

    264

    Total fund: 1000

    [(5, 356), (3, 238), (2, 133), (4, 29), (1, 28)]

    也就是说1000只基金里面有星期五跌的356次,看来周五是个好的买入时间,但是随着样本数变多,相信结果还是会变的~~当然也可以对某只基金进行分析,或者某一类比股票型,混合型这样会更近准

    好了Pandas综合小练习就到这里了,这个代码是静态爬虫,我没有用多线程,也没有用爬虫框架去做,因为爬1000只基金数据分析大概只要7分钟,后面我会再写一篇用多线程去爬,这样会快很多。数据分析的大门已经逐渐打开,随着数据分析教程的深入,后面还会有更多好玩的数据分析案例,我会穿插在教程中讲,敬请期待~~

    更多精彩内容,源码分享,请关于微信公众号"菜鸟学python"

    历史人气文章

    Python语言如何入门

    Python写个迷你聊天机器人|生成器的高级用法

    同学,学Python真的不能这样学

    全网爬取6500多只基金|看看哪家基金最强

    用Python破解微软面试题|24点游戏

    一道Google的算法题 |Python巧妙破解

    相关文章

      网友评论

        本文标题:初步分析1000只基金,20w交易日的数据|哪天买最划算

        本文链接:https://www.haomeiwen.com/subject/gkkmfxtx.html