-->

Type something and hit enter

Pages

Singapore Investment


On

神奇的月份效应

我知道你在想什么

这是个很疯狂的注意,股票市场又不是结婚新人,怎么会选日子来起落呢?

请继续读下去,我为你解答

在马股浸淫了5年,时常都会听到网友的流言,

关于哪一个月份赚钱是最容易的,

其中一个例子就是12月份的”橱窗粉饰”,

这个现象背后的原理大概就是基金经理们会开始买进所拥有的股票,

把基金表现”推”上去,所以年尾投资者们才会满意自己所投资的基金

我很好奇,这到底是真的吗?

身为码农的小编,做什么事情决定都会以数据为基础

所以那么有趣的现象当然要用数据找出来!

读取数据

首先我们必须获得马来西亚综合指数KLSE的月数据

我手上已经有一份了,是从Yahoo Finance下载的,

先看看数据长得如何。。

1
2
3
4
5
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...

这是很典型的股票数据,有开市,高点,低点,收市价,交易量的月数据

看着也没什么意思,不如看看波动率。。

马股月波动率

先来看看马股的月波动率,首先我们得计算出每月的波动率

1
2
KLSE_data['Change'] = (KLSE_data['Close'] - KLSE_data['Open'])/KLSE_data['Open']
KLSE_data.plot.line(x = 'Datetime', y = 'Change')
<AxesSubplot:xlabel='Datetime'>

png

可以观察出马股的月波动率都是围绕在0左右,也符合常理

以波动率来看其实没有什么有用的信息,试试看其他分析法

月平均回酬

试试看可视化每个月的平均回酬

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 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')
<AxesSubplot:xlabel='Month'>

png

我把每个月的回酬率取得平均,

再用bar chart来可视化,

看起来12月的回酬率真的比较高

更仔细的月均回酬

其实Bar chart并不会告诉你整个故事,

如果有过高的数值会把平均值拉远,就会有过高或过低的假象

接下来用boxplot来更仔细的可视化这个数据集

(什么是 Boxplot)?

1
2
3
4
5
import matplotlib.pyplot as plt

KLSE_data.boxplot(column = ['Change'], by = 'month',
                 showfliers = True, grid = False)
plt.axhline(y = 0, color = 'green', linestyle = 'dotted')
<matplotlib.lines.Line2D at 0x25932e0b1f0>

png

这时我们就可以看到更完整的细节

12月的确比其他月份来得好(至少10年的数据是这样显示)

惊喜的是,除了12月,有些月份也看起来不错,

其中3,7,10,12月的回酬率都看起来不错

这些信息可以拿来交易吗?

从以上分析看来,小编闻到一个可能获利的交易机会

如果我们每7,10,12月(前3名)买入KLSE,不知结果会如何?

来回测看看!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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'])
<AxesSubplot:xlabel='Datetime'>

png

看起来真的不错哟,我们”成功”的抓住了上涨的月份,逃过了下跌的月份

小编终于不用当码农了,要发财了吗??

其实不是的

  • 第一,过去的回酬不代表未来的回酬
  • 第二,以统计学的角度来看,这数据集太小,而且很可能发生了过度拟合(overfitting)

最后,这好像是给出自己过去中TOTO的号码,

然后开课程教人如何发财,哈哈哈

从未来看过去,一切都看起来理所当然

可是准确地预测未来却没那么简单

结语

从过去10年的数据来看,12月的确是比较容易赚钱的,

这也无形中验证了12月的”橱窗粉饰”效应?

也不好说,就算该效应真的存在,

谁也不敢打包单说未来每个12月都会有”橱窗粉饰”效应

当作是个都市传说吧

最后留个我很喜欢的一句话

“ History doesn’t repeat itself, but it does rhyme. “

“ 歷史不會重演,但是就像文章的押韻一樣,類似的事件還是會再度發生。”

-Mark Twain

https://klse.i3investor.com/blogs/calculatingcandlestickwinrate/2021-04-12-story-h1563279581.jsp

Back to Top