Road to Skill

股市真有黑色星期四吗?

2019-04-28  本文已影响16人  混沌边缘的伊卡洛斯

一直以来,A股流行黑色星期四的说法,这个说法是否只是大家的感觉还是真有数据支持?带着这个问题,今天就用数据来检验一下

首先需要取到每日数据,幸好现在日收盘价的数据不难获得,tushare还有免费的公开接口,我取从2000年开始到今天的数据,指数收盘价,然后计算一下每日的收益率

import pandas as pd
import numpy as np
import tushare as ts

start_d = '2000'
end_d = '2019-5'
bk = 'sh' # sh=上证指数 sz=深圳成指 hs300=沪深300指数 sz50=上证50 zxb=中小板 cyb=创业板

shIdx = ts.get_k_data(bk, start=start_d, end=end_d)[['date','close']]
shIdx['ret'] = np.log(shIdx.close/shIdx.close.shift(1))
shidx = shIdx.set_index('date')

这里有一个小窍门,收益率要取对数,为什么呢?一般来说如果今天的价格比昨天低,收益就是负的,但是直接用今天的价格除以昨天的价格,得到的只是一个小于1的数,比如0.8之类的,虽然明白小于1就是亏损了,但是如果不统计为负数就比较麻烦,特别是进行收益率累加的时候,明明亏损了,加出来的还是一个正数,还要除以最初的资本才知道亏了,这就不方便,用对数就会将小于1的变为负数,看一下计算的结果就明白了

In [1]: shidx.tail()
Out[1]:
              close       ret
date
2019-04-22  3215.04 -0.017195
2019-04-23  3198.59 -0.005130
2019-04-24  3201.61  0.000944
2019-04-25  3123.83 -0.024594
2019-04-26  3086.40 -0.012054

In [2]: shidx.tail().ret.sum()
Out[2]: -0.0580292401363575

对照股市行情看,25日和26日分别跌了2.4%和1.2%,这一周也跌了5个多点,很好地反应了真实情况。

有了每日收益率,接下来能不能只看星期四的收益情况呢?这个也是可以的,pandas的时间序列支持频率选择,具体细节可以看pandas.date_range的帮助文档,先产生一个固定的周时间序列,可以只有星期一或星期二、星期三、星期四……,例如我只留下周五的序列,可以这样做

In [19]: rng = pd.date_range(start_d, end_d, freq='w-fri')

In [20]: rng
Out[20]:
DatetimeIndex(['2000-01-07', '2000-01-14', '2000-01-21', '2000-01-28',
               '2000-02-04', '2000-02-11', '2000-02-18', '2000-02-25',
               '2000-03-03', '2000-03-10',
               ...
               '2019-02-22', '2019-03-01', '2019-03-08', '2019-03-15',
               '2019-03-22', '2019-03-29', '2019-04-05', '2019-04-12',
               '2019-04-19', '2019-04-26'],
              dtype='datetime64[ns]', length=1008, freq='W-FRI')

然后从全部数据中用reindex进行选择过滤,留下的就只有星期五的数据了,再剩下的工作就非常简单,统计一下大于0的(上涨)和总体的比率就能算出上涨概览,我这里写出代码供各位看官参考

def up_ratio(freq):
    # 获得时间序列
    rng = pd.date_range(start_d, end_d, freq=freq)
    d = [str(d)[:10] for d in rng]

    # 过滤选择
    ret_f = shidx.reindex(d).ret
    ret_f.dropna(inplace=True) # 无效的数据要清除,即使是周一也会有放假

    # 返回:总交易天数,上涨的天数,上涨天数/总天数
    c = ret_f.count()
    u = ret_f[ret_f > 0].count()
    r =  u/c
    return c, u, r

# 统计从周一到周五的情况
w = ['w-mon', 'w-tue', 'w-wed', 'w-thu', 'w-fri']
[print(up_ratio(x)) for x in w]

代码写完了,看看结果,先看上证的情况(将bk设置为sh),很明显,周四的上涨天数明显很少,比率只有45.8%

(917, 513, 0.559432933478735)
(939, 541, 0.5761448349307774)
(947, 503, 0.5311510031678986)
(939, 430, 0.4579339723109691)
(936, 492, 0.5256410256410257)

再看深证成指的情况(将bk设置为sz),周四仍然是最低的45.7%

(917, 481, 0.52453653217012)
(939, 517, 0.5505857294994675)
(947, 488, 0.515311510031679)
(939, 429, 0.45686900958466453)
(936, 490, 0.5235042735042735)

最后再看看创业板的情况(将bk设置为cyb),周四也是最低,是44.6%

(419, 231, 0.5513126491646778)
(434, 238, 0.5483870967741935)
(439, 228, 0.5193621867881549)
(437, 195, 0.4462242562929062)
(434, 214, 0.4930875576036866)

结论

看来传说中的黑色星期四并不是空穴来风,这20年左右的数据应该还是很有说服力的,我还发现另外两个亮点:

  1. 周二的行情最好,基本上上涨天数占到了55%左右,上证达到了57%,这是不是可以总结出一个红色星期二呢?😄
  2. 上证板块明显强于创业板,所以……你懂的

有兴趣的看官还可以自行检测一下沪深300和中小板的数据,情况应该差不多

上一篇下一篇

猜你喜欢

热点阅读