用Python告诉你马股哪个月最容易赚钱!

神奇的月份效应

我知道你在想什么

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

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

在马股浸淫了5年,时常都会听到网友的流言,
关于哪一个月份赚钱是最容易的,
其中一个例子就是12月份的”橱窗粉饰”,
这个现象背后的原理大概就是基金经理们会开始买进所拥有的股票,
把基金表现”推”上去,所以年尾投资者们才会满意自己所投资的基金

我很好奇,这到底是真的吗?
身为码农的小编,做什么事情决定都会以数据为基础

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

读取数据

首先我们必须获得马来西亚综合指数KLSE的月数据
我手上已经有一份了,是从Yahoo Finance下载的,

先看看数据长得如何。。

import pandas as pd

KLSE_data = pd.read_csv('MKLSE.csv',parse_dates=['Datetime'])

KLSE_data.head(5)
DatetimeOpenHighLowCloseAdj CloseVolume
02010-10-311468.451505.661462.271505.661,505.66123,952,000,118,754,000,000,000,000,000,000,00…
12010-11-301510.691531.991474.021485.231,485.2389,809,800,125,250,500,000,000,000,000,000,000…
22010-12-311482.691529.951477.571518.911,518.91153,042,000,150,431,000,000,000,000,000,000,00…
32011-01-311524.531576.951505.361519.941,519.94142,815,000,204,667,000,000,000,000,000,000,00…
42011-02-281524.741544.351474.381491.251,491.25122,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

纯属分享,无买卖建议

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

Verified by MonsterInsights