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

浏览: 2001

image.png

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

阅读本文大概需要4分钟

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

数据集:

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

  • 数据收集

  • 数据清洗

  • 数据存储

  • 数据分析

1.数据的收集

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

image.png

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

image.png

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

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


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

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

image.png

2.数据的清洗

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

image.png

3.数据的存储

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

image.png

然后存的csv文件长这样:

image.png

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

image.png

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】

和9000个小伙伴一起加油

来源 | 菜鸟学Python

作者 | xinxin






推荐 2
本文由 菜鸟学Python 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册