五穷六绝七翻身,大部分炒股的朋友都有听过这句谚语,指的是5月股市比较凄惨,6月会到绝境,7月会迎来大翻身。
封基老师在最近的文章也贴了一个日历效应,指出6月月底的最后一个交易日大概率会上涨的:
上面的数据封基老师用收费的金融软件choice或者wind,拉取得数据。
从上表的确可以看到,最近几年的6月底最后一个交易日,的确红多绿少。
作为一个量化小博主,本着授人与渔的理念,动手利用免费的券商的Ptrade量化平台和10来行代码即可以整理出上表。
本文就带大家使用Ptrade用几行代码演示A日历的日历效应。
除了统计历年6月最后一天的涨跌幅,还可以统计历年5,6,7月的月涨跌分布。
安装Ptrade
Ptrade是券商提供的量化交易软件。
windows上安装ptrade很简单,它是一个exe格式的安装软件,一路点击下一步就可以了,也不用安装本地python和其他第三方依赖。Ptrade上的程序都是在券商服务器运行的。主要它使用是免费的,用于做量化交易,回测,程序自动下单。
api帮助文档和软件下载地址:https://ptradeapi.com
获取数据
因为不涉及程序下单,所以在"研究“模块里面完成本文的所有代码就好了。本文代码亲测运行正常。不多,只有十几二十行。
实际python搞量化,没有什么高深神秘的东西,都是获取数据,计算,下单。
data = get_price(security='000001.SS',start_date='20050101',end_date='20240630',frequency='1d')
上面的代码,用于获取上证指数(00001.SS ),2005年到现在的日线数据。返回数据为dataframe,ptrade获取数据速度很快,点完运行就有数据了,不用等待。
上面的返回的数据没有涨幅这个字段,不过有今收,昨收这2个字段,所以需要多一步计算涨跌幅。
data['percent']=(data['close']/data['preclose']-1)*100
然后写个循环遍历2005年到2024年6月最后一天的涨幅,数据存储到end_of_jun_percnet_result_dict
start_year = 2005 # 因为ptrade历史数据从2005年开始
end_year = 2024
end_of_jun_percnet_result_dict = {}
def last_jun_day_percent_func(year):
full_start_date = '{}-06-25'.format(year)
full_end_date = '{}-07-01'.format(year)
jun_data = data[full_start_date:full_end_date]
end_of_jun = jun_data.iloc[-1]['percent']
end_of_jun_percnet_result_dict[str(year)]=end_of_jun
for year in range(start_year,end_year+1):
last_jun_day_percent_func(year)
执行后,得到数据了,打印一下end_of_jun_percnet_result_dict的值:
然后利用pandas的内置的matplotlib绘图,可以简单地绘出分布图。
其中横坐标为年份,纵坐标为6月最后一天的涨幅。
因月份字体颜色和背景都是黑色,不好区分。
把上面的数据导出到excel。
从2005年到今年,20个统计数据,6月最后一天上证指数的涨幅。
上涨的天数有12天,下跌的天数有8天。上涨的概率60%,概率上上涨的概率不是特别高。但如果从12年之后看的话,13年里面有10年都是上涨的,概率高达77%。
由于15年牛市6月的崩盘,15年6月最后一天暴跌-5%+,最近20年的6月底最后一个交易日的平均涨幅是负的,为 -0.163%。而涨幅中位数则是0.099%
如果你想计算国庆假期前一天的统计数据,只需要把上面的代码里面的:
full_start_date = '{}-06-25'.format(year)
full_end_date = '{}-07-01'.format(year)
按葫芦画瓢改成:
full_start_date = '{}-09-25'.format(year)
full_end_date = '{}-10-01'.format(year)
因为不确定最后一个交易日是几号,所以拿到最后1周的数据,然后取最后一个。
也可以换一个指数计算,比如沪深300就用000300.SS 替换上面代码里面的 000001.SS就可以了。
历年的5月,6月,7月的涨幅分布
同理,用上面的日线数据也可以统计出每年5,6,7月的月涨幅。
代码如下:
month = '05' # /替换这里,换成 06,07 等不同月份
montly_percent_dict ={}
def monthly_percent_func(year_month):
montly_percent_dict[year_month] = (data[year_month].iloc[0]['close']/data[year_month].iloc[0]['preclose'] -1)*100
for year in range(start_year,end_year):
full_date = '{}-{}'.format(year,month)
monthly_percent_func(full_date)
month = ‘05’ # /替换这里,换成 06,07 等不同月份。
计算出5,6,7月份的数据之后绘制柱状图,横轴上方是上涨年份,下方是下跌的年份
把整理到excel
仅仅从概率上来看,反而5月份上证指数上涨的概率最高的。
而6,7月份都在50%附近随机扔骰子。
所以从上面的简单数据统计,就可以证伪上证指数"五穷六绝七翻身"这种说法。
读者朋友也可以动手用代码验证其他指数的规律。
相关资料:
ptrade帮助文档 https://ptradeapi.com