1. 想法: 最近在想学了python能做些什么,正好看了一篇python量化投资得介绍,就想能不能用python分析股票,预测股票涨跌。可仔细一想,真是so yang so simple,如果真可以预测,根本轮不到我们写了。哈哈,不过我发现自己在支付宝定投得基金,有时候连续都是买在高点,总是定投时间不对啊,所以就想分析一下这个基金看看周几涨的概率大些,在前一天定投,哈哈,是不是可行?比如沪深300指数相关基金就很多,可不可以分析出下面数据:
**2. 首先要拿到分析数据:**现在网上有很多财经网站可以使用爬虫自动爬到本地,爬取这部分这次先不聊,我们就手动下载到本地吧。推荐网易财经,下载方式如图:
3.程序实现
注意:下载得文件我放在了程序目录下方便
#!/usr/bin/env python
# coding=gbk
#author:liubiao
# @Desc : 分析股票/基金指数,找出定投时机
import pandas as pd
#周数字转成中文周
def get_week_day(dayweek):
week_day_dict = {
0 : '周一',
1 : '周二',
2 : '周三',
3 : '周四',
4 : '周五',
5 : '周六',
6 : '周天',
}
return week_day_dict[dayweek]
#合并股票文件
def get_concat(stocks):
return [pd.read_csv(code+'.csv',encoding='gbk') for code in stocks]
#分析股票,找出周几涨得概率大些
def get_result(df,begaindate):
#清洗数据,把值为None删掉
df = df.loc[df['涨跌幅'] != 'None', :]
#筛选出要分析日期之后得数据
df=df.loc[pd.to_datetime(df['日期'])>pd.to_datetime(begaindate),:]
#增加星期列
df['星期']=pd.to_datetime(df['日期']).dt.dayofweek.map(get_week_day)
#涨跌幅要设置成数组才能比较大小
df['涨跌幅']=df['涨跌幅'].astype(float)
#根据涨跌幅打标涨或跌
df['涨跌']=df['涨跌幅'].map(lambda x : "涨" if x>=0 else "跌")
#增加汇总显示得次数列,赋值无所谓,只要不为空就行
df['次数']=[i for i in range(1,len(df)+1)]
#分组汇总
df=df.groupby(['名称','星期','涨跌'])['次数'].count()
#分组汇总后返回得df不是DataFrame类型,不能使用pivot_table,所以重新创建一个新得df
result=pd.DataFrame(df)
result=result.pivot_table(index =['名称','星期'],columns=['涨跌'],values='次数',aggfunc='first').reset_index()
#排序并保存结果
result.sort_values(by='涨',ascending=False).to_csv('result.csv',index=False,encoding='gbk')
return result
if __name__ == '__main__':
#股票池
stocks=['399300', '000001', '399001']
df = pd.concat(get_concat(stocks), axis=0)
get_result(df,'2019-01-01')
4. 验证数据
我要验证得是沪深300指数相关基金,为了对比我同时分析了上证指数和深证指数。首先我们看下2020年得数据:
get_result(df,'2020-01-01')
get_result(df,'2019-01-01')
get_result(df,'2018-01-01')
6.结论:
分析上面数据可以了解到最近三年来,周二上涨得概率最大,周三下跌得概率最大,所以基金定投最好设置在周一或周五,这样定投买入的时机会大部分买在上涨前。