神奇的月份效应
我知道你在想什么
这是个很疯狂的注意,股票市场又不是结婚新人,怎么会选日子来起落呢?
请继续读下去,我为你解答
在马股浸淫了5年,时常都会听到网友的流言,
关于哪一个月份赚钱是最容易的,
其中一个例子就是12月份的”橱窗粉饰”,
这个现象背后的原理大概就是基金经理们会开始买进所拥有的股票,
把基金表现”推”上去,所以年尾投资者们才会满意自己所投资的基金
我很好奇,这到底是真的吗?
身为码农的小编,做什么事情决定都会以数据为基础
所以那么有趣的现象当然要用数据找出来!
读取数据
首先我们必须获得马来西亚综合指数KLSE的月数据
我手上已经有一份了,是从Yahoo Finance下载的,
先看看数据长得如何。。
import pandas as pd
KLSE_data = pd.read_csv('MKLSE.csv',parse_dates=['Datetime'])
KLSE_data.head(5)
Datetime | Open | High | Low | Close | Adj Close | Volume | |
---|---|---|---|---|---|---|---|
0 | 2010-10-31 | 1468.45 | 1505.66 | 1462.27 | 1505.66 | 1,505.66 | 123,952,000,118,754,000,000,000,000,000,000,00… |
1 | 2010-11-30 | 1510.69 | 1531.99 | 1474.02 | 1485.23 | 1,485.23 | 89,809,800,125,250,500,000,000,000,000,000,000… |
2 | 2010-12-31 | 1482.69 | 1529.95 | 1477.57 | 1518.91 | 1,518.91 | 153,042,000,150,431,000,000,000,000,000,000,00… |
3 | 2011-01-31 | 1524.53 | 1576.95 | 1505.36 | 1519.94 | 1,519.94 | 142,815,000,204,667,000,000,000,000,000,000,00… |
4 | 2011-02-28 | 1524.74 | 1544.35 | 1474.38 | 1491.25 | 1,491.25 | 122,139,600,155,642,000,000,000,000,000,000,00… |
这是很典型的股票数据,有开市,高点,低点,收市价,交易量的月数据
看着也没什么意思,不如看看波动率。。
马股月波动率
先来看看马股的月波动率,首先我们得计算出每月的波动率
KLSE_data['Change'] = (KLSE_data['Close'] - KLSE_data['Open'])/KLSE_data['Open']
KLSE_data.plot.line(x = 'Datetime', y = 'Change')
可以观察出马股的月波动率都是围绕在0左右,也符合常理
以波动率来看其实没有什么有用的信息,试试看其他分析法
月平均回酬
试试看可视化每个月的平均回酬
# We need calendar module to parse into months in words
import calendar
KLSE_data['month'] = KLSE_data['Datetime'].dt.month
temp_data = KLSE_data.groupby(['month'])
month = pd.DataFrame(columns = ['Month','Change'])
for index,m in temp_data:
temp_month = m['month'].iloc[0]
mm = calendar.month_abbr[temp_month]
temp_change = m['Change'].mean()
month = month.append({'Month': temp_month,
'Change': temp_change}, ignore_index=True)
month.plot(x = 'Month', y = 'Change', kind = 'bar')
我把每个月的回酬率取得平均,
再用bar chart来可视化,
看起来12月的回酬率真的比较高
更仔细的月均回酬
其实Bar chart并不会告诉你整个故事,
如果有过高的数值会把平均值拉远,就会有过高或过低的假象
接下来用boxplot来更仔细的可视化这个数据集
(什么是 Boxplot?)?
import matplotlib.pyplot as plt
KLSE_data.boxplot(column = ['Change'], by = 'month',
showfliers = True, grid = False)
plt.axhline(y = 0, color = 'green', linestyle = 'dotted')
这时我们就可以看到更完整的细节
12月的确比其他月份来得好(至少10年的数据是这样显示)
惊喜的是,除了12月,有些月份也看起来不错,
其中3,7,10,12月的回酬率都看起来不错
这些信息可以拿来交易吗?
从以上分析看来,小编闻到一个可能获利的交易机会
如果我们每7,10,12月(前3名)买入KLSE,不知结果会如何?
来回测看看!
KLSE_data['signal'] = KLSE_data['month'].apply(lambda x: 1 if (x==7 or x == 10 or x == 12) else 0)
KLSE_data['return'] = KLSE_data['Change']*KLSE_data['signal']
KLSE_data['Capital'] = 0
InitialCapital = KLSE_data['Close'].loc[0]
for i in range(0,len(KLSE_data)):
if i == 0:
KLSE_data.loc[i, 'Capital'] = InitialCapital
else:
KLSE_data.loc[i, 'Capital'] = ((KLSE_data['return'].loc[i] + 1.0)
* KLSE_data['Capital'].loc[i - 1])
KLSE_data.plot.line(x='Datetime',y=['Capital','Close'])
看起来真的不错哟,我们”成功”的抓住了上涨的月份,逃过了下跌的月份
小编终于不用当码农了,要发财了吗??
其实不是的
- 第一,过去的回酬不代表未来的回酬
- 第二,以统计学的角度来看,这数据集太小,而且很可能发生了过度拟合(overfitting)
最后,这好像是给出自己过去中TOTO的号码,
然后开课程教人如何发财,哈哈哈
从未来看过去,一切都看起来理所当然
可是准确地预测未来却没那么简单
结语
从过去10年的数据来看,12月的确是比较容易赚钱的,
这也无形中验证了12月的”橱窗粉饰”效应?
也不好说,就算该效应真的存在,
谁也不敢打包单说未来每个12月都会有”橱窗粉饰”效应
当作是个都市传说吧
最后留个我很喜欢的一句话
History doesn’t repeat itself, but it does rhyme.
Mark Twain
歷史不會重演,但是就像文章的押韻一樣,類似的事件還是會再度發生
纯属分享,无买卖建议