昨天在论坛看到有网友的一个提问:
对于很多投资来说,印象中最近这几年,尤其是前面的~,周四跌的概率是比较大的,有时候会被戏谑为“法定砸盘日”。
好奇百度了一下:
前面几条都是指向了星期四。
实际情况是怎样的呢?笔者也是挺感兴趣的,因为作为一名赌徒,对概率统计这些数据还是挺感兴趣的。那么我们使用python对数据进行回测。感兴趣的读者也可以跟着我在一些回测平台上练习,代码很少,不超过50行哈。
当然,如果有本地数据的读者,也可以在自己本地电脑上参数。
1.获取数据
start='0101'end='2027'df = DataAPI.MktIdxdGet(indexID=u"",ticker=u"000300",tradeDate=u"",beginDate=start,endDate=end,exchangeCD=u"XSHE,XSHG",field=u"",pandas="1")
时间区间使用1月1日到10月27日,跨度为,样本足够大了,标的指数为沪深300,平时笔者很少使用上证指数或者上证50作为回测,原因是里面权重中GJD占比过多,有种被操纵的痕迹,当然,读者也可以尝试使用这些指数进行回测统计,只需要把ticker=u"000300" 替换为"000001" 就可以了。
得到的数据格式是dataframe:
解释:上面展示了10条数据,可以看到每天的开盘,收盘,成交量,换手率,涨跌幅很多指标,在这个回测中,我们只需要2个指标就够了,一个是日期,用来判断当天是星期几,一个是涨跌幅,用来统计当天是涨还是跌。
2.判读某天是星期几
import datetimedef weekday(day_str): return datetime.datetime.strptime(day_str,'%Y-%m-%d').strftime('%w')
创建上面的weekday函数用于判断某一天是星期几。
我们可以简单测试下,以-10-28测试:
看到返回的是3,说明结果正确,今天就是星期三。
然后我们把这个函数应用到全部的行,通过传入每一行的tradeDate 交易日字段,计算出改行的星期X 中的X。
df['weekday']=df['tradeDate'].map(weekday)
看到最后红框位置,多了一列,那个就是当他属于星期几。
3. 数据分析统计
接下来就是数据分析了,对日期进行聚合,意思是把星期一的数据合在一起,星期二的数据和一起,然后同理星期三,星期四,星期五,最后会有五堆数据。
df.groupby('weekday')
就使用这一句语句就可以了。
然后分组统计:
for day,df_day in df.groupby('weekday'): print('星期{}'.format(day)) raise_count= len(df_day[df_day['CHGPct']>0]) drop_count = len(df_day[df_day['CHGPct']<0]) ratio = (raise_count-drop_count)*1.00/(raise_count+drop_count)*100 print('涨的天数: {}'.format(raise_count)) print('跌的天数: {}'.format(drop_count)) print('涨跌比: {:.2f}'.format(ratio)) print('')
上面根据每一组中,涨跌幅的个数统计一个比例ratio,表示在星期X中上涨占比,如果是正的,说明星期X的上涨概率比较大的,反之当天下跌的概率较大。
然后运行一下,很快结果就出来了:
上面结果显示:周四下跌的天数的确要比上涨的天数多了100天!!涨跌比为 -17%,所有星期四的总天数为219+300= 519 天
但是,but,周五上涨的概率是最大的,ratio值为15%, 周五上涨的概率最大!这个数据与平时印象很不一样,一般人都认为周四周五一般跌比较多,所以有时候个人感觉会受很多因素影响的,感觉未必准,所以才有数据量化分析,数据不会说谎。(前提不要拿到被造了假的数据来分析哈)
如下面这张图,在正方形的顶点加了个白色和灰色的加号后,你是否觉得画布被扭曲了呢。所以眼见不一定为实,途听不一定为真。
上面的分析只是从统计分析来看待星期一到五哪一天上涨/下的的概率大,只供参考,并没有实际指导你在哪天买卖意义,意思是亏钱了你别来找我,嘻嘻。
由于微信改版后不再是按时间顺序推送文章,如果后续想持续关注笔者的最新观点,请务必将公众号设为星标,并点击右下角的“赞”和“在看”,不然我又懒得更新了哈,还有更多很好玩的数据等着你哦。