美文网首页
基金定投,选周几合适?用数据告诉你答案

基金定投,选周几合适?用数据告诉你答案

作者: Z_5a16 | 来源:发表于2020-04-24 16:34 被阅读0次

    不少股民认为“黑色星期四”真的存在,它有个更形象的名字叫“法定砸盘日”。
    一周中,星期四往往表现比较差,跌的天数多,涨的天数少。

    股市的涨跌真的存在周内效应吗?是否可以用周内效应选择最优的基金定投日?

    我考察了时间周期内指数在周一至周五每一天涨跌幅观察周内效应的真实性。并随机选择了一支指数型基金,分别在周一至周五模拟定投计算最终收益。

    研究思路

    【1】观察对比十年中不同交易日指数涨跌次数。
    【2】观察不同交易日上证指数涨跌幅的平均值和中位数的趋势变化,及涨跌幅的分布情况。
    【3】观察随机年份的涨跌幅热力图变化规律。
    【4】模拟在不同交易日进行周定投,比较最终收益情况,确定基金定投最适宜时间。

    指数涨跌

    时间范围:2010.1 ~ 2019.12
    研究指数:上证指数

    第一步:导入数据,简单的数据清洗
    上证指数原数据
    sh = pd.read_csv('sh000001.csv')
    sh['date'] = pd.to_datetime(sh.date,format = '%Y年%m月%d日') #格式化时间
    sh['change'] = sh['change'].str.strip("%").astype(float)  #删除尾部的%
    
    清洗后的数据
    第二步:统计周一到周五的涨跌次数
    sh['weekday'] = sh['date'].apply(lambda x:x.strftime("%a"))  #添加weekday列
    sh_count = sh[['date','change','weekday']]
    sh_count['up'] = sh_count.change.apply(lambda x:1 if x>0 else 0)  #涨记为1,跌记为0
    sh_count_plot = sh_count.pivot_table(['up'],index = 'date',columns = 'weekday').up
    sh_count_plot = sh_count_plot.apply(lambda x: x.value_counts())
    ind = ['Mon','Tue','Wed','Thu','Fri']
    sh_count_plot = sh_count_plot[ind].T.rename(columns = {0.0:'down',1.0:'up'})
    plt.style.use('ggplot')
    fig = plt.figure(figsize = (18,4))
    rects = sh_count_plot.plot.bar()
    plt.legend(loc = 'lower right')
    for x,y in zip(range(5),sh_count_plot['down']):
        plt.text(x-0.24,y+5,y)
    for x,y in zip(range(5),sh_count_plot['up']):
        plt.text(x,y+5,y)
    

    得到下图:

    周内涨跌幅统计

    红色代表2010至2019年中跌的天数,蓝色代表涨的天数,我们可以发现只有周四下跌的天数明显多于上涨天数。

    第三步:统计周内涨跌幅情况
    groupby_weekday = sh.groupby('weekday')
    groupby_weekday.change.agg(['mean','median'])
    plt.rcParams['font.sans-serif']=['SimHei']  #更改中文字体
    plt.rcParams['axes.unicode_minus']=False  #在坐标轴上显示负数
    fig = plt.figure(figsize = (12,12))
    ax1 = fig.add_subplot(221)
    groupby_weekday.change.mean()[ind].plot.bar()
    plt.title('2010-2019 上证指数涨跌幅 - 平均值')
    ax2 = fig.add_subplot(222)
    groupby_weekday.change.median()[ind].plot.bar()
    plt.title('2010-2019 上证指数涨跌幅 - 中位数')
    ax3 = fig.add_subplot(212)
    sns.boxplot(x = 'weekday',y = 'change',data = sh,width=0.5,order = ind)
    plt.title('2010-2019 上证指数涨跌幅')
    

    得到以下图表:

    周内涨跌幅情况

    以上是上证指数在一周不同交易日下的涨跌幅变化趋势,观察涨跌幅中位数(上右)可知,从周一起涨跌幅逐渐下降,跌至周四达到了最低点,在周五有着一定程度的回升。

    从平均值和中位数观察,周四的日间收益显著为负。

    观察周内涨跌幅分布箱线图(下),多数时间里,日间涨跌幅并没有显著的分布差异,可能由于市场重大消息多在周末发布,周一存在更大的涨跌波动,周三的涨跌波动相对来说比其他交易日稳定。

    第四步:观察2019年涨跌幅热力图,验证前述观察结果
    sh['year'] = sh.date.values.astype('datetime64[Y]')
    sh['week'] = sh['date'].apply(lambda x:x.strftime("%W"))
    sh_map = sh.loc[sh.year == '2019-01-01'].pivot_table(['change'],index = 'week',columns = 'weekday').change[ind]
    plt.figure(figsize = (8,10))
    sns.heatmap(sh_map,annot=True,cmap = 'bwr',vmax = 3,vmin = -3)
    

    得到以下热力图:
    红色表示涨,蓝色代表跌,颜色深浅表示涨跌的幅度大小。灰色表示非交易日。


    2019年涨跌幅热力图.png

    和前述的观察情况相似,周一的涨跌幅最为激烈,周三的涨跌最平缓,周四少有大涨且下跌天数更多,多数跌幅在-1.5%以内的。

    模拟基金定投,确定最优定投日

    测算区间:2019.1 ~2019.12
    定投时长:1年
    定投方式:周定投
    指数基金:161005

    第一步:在天天基金网爬取基金数据

    import requests
    from requests.exceptions import RequestException
    import re
    import pandas as pd
    import json
    
    def get_page(url,pageIndex):
        try:
            params = {
                    'callback':'jQuery18308045767721798707_1585145300869',
                    'fundCode':fundCode,
                    'pageIndex':pageIndex,
                    'pageSize':20,
                    }
            cookie = 'cowCookie=true; intellpositionL=1010.4px; intellpositionT=855px; st_si=03047315947006; EMFUND0=null; EMFUND1=null; EMFUND2=null; EMFUND3=null; EMFUND4=null; EMFUND5=null; EMFUND6=null; EMFUND7=null; EMFUND8=null; EMFUND9=03-24 21:21:42@#$%u5BCC%u56FD%u5929%u60E0%u6210%u957F%u6DF7%u5408A@%23%24161005; qgqp_b_id=a8c19f9e77e34585421eb18a9f4db628; st_pvi=94850569615659; st_sp=2020-03-23%2014%3A58%3A22; st_inirUrl=https%3A%2F%2Fwww.baidu.com%2Flink; st_sn=13; st_psi=20200324212743881-112200304021-0048551629; st_asi=delete'
            headers = {
                    'Cookie':cookie,
                    'Host':'api.fund.eastmoney.com',
                    'Referer':'http://fundf10.eastmoney.com/jjjz_161005.html',
                    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36 LBBROWSER'
                    }
            response = requests.get(url,headers=headers,params=params)
            if response.status_code == 200:
                return response.text
        except RequestException:
            return None
        
    def turn_df(html):
        text = re.findall('\((.*?)\)',html)[0]  #提取dict
        LSJZList = json.loads(text)['Data']['LSJZList']  #获取历史净值
        TotalCount = json.loads(text)['TotalCount']  #用于计算页码
        LSJZ = pd.DataFrame(LSJZList)  # 转化为DataFrame格式
        return LSJZ
    
        
    def main():
        url = 'http://api.fund.eastmoney.com/f10/lsjz'
        df_LSJZ = pd.DataFrame(columns = ['DWJZ','FSRQ','JZZZL','LJJZ','SGZT','SHZT'])
        for i in range(1,176):
            pageIndex = i
            html = get_page(url,pageIndex)
            page_data = turn_df(html)
            df_LSJZ = df_LSJZ.append(page_data)
        df_LSJZ.to_csv('LSJZ161005.csv',encoding = 'utf_8_sig')
        
        
    if __name__ == '__main__':
        fundCode = '161005'
        main() 
    

    爬取的数据在excel简单清洗下,得到如下表格:

    第二步:模拟2019年周一至周五不同交易日定投,计算利润
    df['units'] = 100/df.NAV  # 计算每个交易日定投100元能获得的份额
    auto2019 = df.loc[df.year == '2019-01-01'][['date','NAV','weekday','units']].sort_values(by = ['date'])
    auto2019['fix'] = auto2019.NAV * auto2019.units
    auto2019['cost'] = auto2019.groupby(['weekday']).cumsum()['fix']
    auto2019['profit'] = auto2019.NAV * auto2019['cumsum'] - auto2019.cost
    

    得到下表,模拟2019年分别在不同的交易日定投100元,需要的成本(cost),累计份额(cumsum),profit(利润)等数据


    image.png

    第三步:观察对比不同时间定投的走势与最终收益对比

    fig = plt.figure(figsize = (16,6))
    plt.plot(auto2019.query("weekday == 'Mon'").date,auto2019.query("weekday == 'Mon'").profit,label = 'Monday')
    plt.plot(auto2019.query("weekday == 'Tue'").date,auto2019.query("weekday == 'Tue'").profit,label = 'Tuesday')
    plt.plot(auto2019.query("weekday == 'Wed'").date,auto2019.query("weekday == 'Wed'").profit,label = 'Wednesday')
    plt.plot(auto2019.query("weekday == 'Thu'").date,auto2019.query("weekday == 'Thu'").profit,label = 'Thursday')
    plt.plot(auto2019.query("weekday == 'Fri'").date,auto2019.query("weekday == 'Fri'").profit,label = 'Friday')
    plt.legend()
    
    不同交易日定投的利润走势

    以上是2019年内分别将定投日设为周一、周二、周三、周四、周五时,累计获得的利润走势图。
    发现在不同交易日定投的利润走势没有明显的利润差异。

    接下来再看看2019年最后5个交易日的具体利润:

    x = auto2019.tail()['weekday']
    y = auto2019.tail()['profit']
    r = auto2019.tail()['rate']
    plt.bar(x,y,width = 0.5)
    for x,y,r in zip(range(5),y,r):
        plt.text(x-0.25,y+5,round(y, 2))
        plt.text(x-0.25,500,round(r, 3))
    
    2019年定投最终利润

    观察可知,周内效应对基金定投的结果影响微乎其微,但是选择在周四定投,无论从利润还是利润率上,都略高于其他交易日,为期一年的定投差异最大也仅有百元内的差异,几乎没有什么差别。

    研究结论

    【1】周内效应在我国A股市场内广泛存在,周四下跌的概率相对更大。
    【2】一周内,周一的股市涨跌幅波动较大,可能受周末发布的消息影响,行情最亢奋,其后组件走低,而周三的股市波动相对平缓,周四最低迷,周五轻微反弹。
    【3】周内效应在基金定投上的影响不明显,时间段内存在一定程度差异,随定投时间拉长,定投次数增加,差异会被逐渐抹平。因此,定投日的选择不足以作为基金定投策略,更关键的是坚持,低点多投,高点止盈。如果一定要确定一个最佳定投日,按照观测结果来看,周四仍是最优选。

    这里的研究样本较小,大家可以在代码中增加更多的基金来测试,此演示仅作为参考。

    相关文章

      网友评论

          本文标题:基金定投,选周几合适?用数据告诉你答案

          本文链接:https://www.haomeiwen.com/subject/pjomihtx.html