美文网首页量化交易量化学习笔记量化交易
用Python分析春节前后的中国A股市场行情(附源代码)

用Python分析春节前后的中国A股市场行情(附源代码)

作者: 刀客特鹿 | 来源:发表于2018-02-10 21:19 被阅读23次

    最近中国股市也因受到海外市场波动的影响的振幅非常大,又由于马上面临春节了,股市里的钱是取出来放到货币基金里好呢,还是继续放在股市里好呢?

    除了对于宏观,行业,个股的分析和把握,我们从历史市场表现的角度也来看下吧,供大家的投资计划作参考。

    好了,废话不多说,先上结论

    一、上证指数的春节前后表现,2005年-2017年

    1. 春节前一工作日的涨跌情况

    2.春节后一工作日的涨跌情况

    3. 春节前5个工作日

    4. 春节后5个工作日

    从上面的分析可以看出,上证指数在春节前一周和后一周的上涨可能性还是相对比较高的。尤其是春节前一周。

    接下来,再来看看其他指数的表现:

    二、沪深300指数

    1. 春节前一工作日的涨跌情况

    2. 春节后一工作日的涨跌情况

    3. 春节前5个工作日的涨跌情况

    4. 春节后5个工作日的涨跌情况

    三、深圳成分股指数

    1. 春节前一工作日的涨跌情况

    2. 春节后一工作日的涨跌情况

    3. 春节前5个工作日的涨跌情况

    4. 春节后5个工作日的涨跌情况

    四、创业板指数

    1. 春节前一工作日的涨跌情况

    2. 春节后一工作日的涨跌情况

    3. 春节前5个工作日的涨跌情况

    4. 春节后5个工作日的涨跌情况

    综上,上证,沪深300,深圳,创业板四个指数,基本上是同步的,在节前节后的第一个工作日没有明显的上涨下跌偏向。但是在前后一周都出现了以上涨为多数的情况,尤其是创业板,连续七年,节后一周收涨,不知道今年还会不会延续呢?

    以下是所有的源代码:

    import pandas as pd

    pd.set_option('expand_frame_repr', False)

    import os

    os.chdir('D:/all_trading_data/Every_days_analysis/')

    from Basic_Functions import Functions

    import matplotlib.pyplot as plt

    ## 1.读取春节假日表,并计算前后指定工农昨日

    def get_df_sf(n=5):

        df_sf = pd.read_csv('input_data/spring_festival.csv')

        # df_sf[['start','end']] = pd.to_datetime(df_sf[['start','end']])

        df_sf['start'] = pd.to_datetime(df_sf['start'])

        df_sf['end'] = pd.to_datetime(df_sf['end'])

        # 获取春节前一个交易日的日期

        df_sf['春节前一天'] = df_sf['start'] - pd.Timedelta(days=1)

        df_sf['春节前一天判断工作日'] = df_sf['春节前一天'].dt.dayofweek

        i = 0

        for date in df_sf['春节前一天判断工作日']:

            if date == 5:  # 如果是星期六再减一天

                df_sf.loc[i, '春节前一工作日'] = df_sf.loc[i, '春节前一天'] - pd.Timedelta(days=1)

            elif date == 6:  # 如果是星期天再减2天

                df_sf.loc[i, '春节前一工作日'] = df_sf.loc[i, '春节前一天'] - pd.Timedelta(days=2)

            else:

                df_sf.loc[i, '春节前一工作日'] = df_sf.loc[i, '春节前一天']

            i += 1

        df_sf['春节后一天'] = df_sf['end'] + pd.Timedelta(days=1)

        df_sf['春节后一天判断工作日'] = df_sf['春节后一天'].dt.dayofweek

        i = 0

        for date in df_sf['春节后一天判断工作日']:

            if date == 5:  # 如果是星期六再加2天

                df_sf.loc[i, '春节后一工作日'] = df_sf.loc[i, '春节后一天'] + pd.Timedelta(days=2)

            elif date == 6:  # 如果是星期天再加1天

                df_sf.loc[i, '春节后一工作日'] = df_sf.loc[i, '春节后一天'] + pd.Timedelta(days=1)

            else:

                df_sf.loc[i, '春节后一工作日'] = df_sf.loc[i, '春节后一天']

            i += 1

        df_sf['春节前指定日'] = df_sf['春节前一工作日'] - pd.Timedelta(days=n)

        df_sf['春节后指定日'] = df_sf['春节后一工作日'] + pd.Timedelta(days=n)

        return df_sf

    # 春节后一段时间的涨跌幅

    def get_df_change(df_sf, df_index, type=0):

        df_sf = df_sf.copy()

        df_index = df_index.copy()

        name = {0: '前', 1: '后'}

        i = 0

        for year in df_sf['year']:

            start = df_sf.loc[i, '春节{}指定日'.format(name[type])]

            end = df_sf.loc[i, '春节{}一工作日'.format(name[type])]

            if type == 0:

                total_change = (df_index.loc[(df_index['date'] >= pd.to_datetime(start)) & (df_index['date'] <= pd.to_datetime(end)), 'index_change'] + 1.0).prod()

            elif type == 1:

                total_change = (df_index.loc[(df_index['date'] >= pd.to_datetime(end)) & (df_index['date'] <= pd.to_datetime(start)), 'index_change'] + 1.0).prod()

            # total_change = df_index.loc[(df_index['date'] >= pd.to_datetime(start)) & (df_index['date'] <= pd.to_datetime(end)), 'index_change'].sum()

            df_sf.loc[i, 'index_change'] = total_change - 1

            i += 1

        print df_sf

        # exit()

        return df_sf

    # 作图

    def get_plot(df, index_code, n, type):

        df = df.copy()

        df['index_up'] = df.loc[df['index_change'] >= 0, 'index_change']

        df['index_down'] = df.loc[df['index_change'] < 0, 'index_change']

        fig = plt.figure(figsize=(14,6))

        # ax = fig.add_subplot(1,1,1)

        # ax.set_title(str(index_code))

        # ax.set_xlabel('Time')  # 设置横坐标x轴的名字

        # ax.set_ylabel('Change')  # 设置Y轴

        name = {0: 'back', 1: 'forward'}

        plt.title(str(index_code) + '_spring_festival_index_change_' + name[type] + '_' + str(n))

        plt.xlabel('Time')

        plt.ylabel('Change')

        # plt.bar(df['year'], df['index_change'])

        plt.bar(df['year'], df['index_up'], fc='r')

        plt.bar(df['year'], df['index_down'], fc='g')

        plt.show()

    if __name__ == '__main__':

        ## 读取指数数据

        # index_code = '000001.SH'  # 上证指数

        # index_code = '000300.SH'  # 沪深300

        # index_code = '399001.SZ'  # 深圳成指

        index_code = '399006.SZ'  # 创业板指

        type = 1  # 0代表节前, 1代表节后

        n = 5

        df_index = Functions.import_index_data_wande(index_code=index_code, start_date='20050101')

        df_sf = get_df_sf(n=n)

        df_sf = get_df_change(df_sf, df_index, type=type)

        print "上涨次数:%d" % df_sf.loc[df_sf['index_change'] >= 0, 'index_change'].count()

        print "下跌次数:%d" % df_sf.loc[df_sf['index_change'] < 0, 'index_change'].count()

        print "平均涨跌幅:%.4f%%" % (df_sf['index_change'].mean() * 100.00)

        print "最大涨幅:%.4f%%" % (df_sf['index_change'].max() * 100.00)

        print "最大跌幅:%.4f%%" % (df_sf['index_change'].min() * 100.00)

        get_plot(df_sf, index_code, n, type)

    当然,以上的结果都纯属统计结果,如果只是拿以上的结果作为你个人的投资建议,风险还是比较大的,如果在宏观经济,行业研究,个股分析上,再加上一定的数理统计,则会让你事半功倍。

    毕竟,投资的道路没有捷径。给大家拜个早年,祝大家节日快乐~红包多多~

    可能对于初学者而言,即使有上述源代码,可能还是会觉得较难理解。那么,建议各位想学习python并研究交易的朋友们可以考虑《Python量化入门》课程系列,非常适合零基础的朋友们,获得所有的股票历史数据,并建立自己的交易策略,建议购买课程后深入学习。

    课程评价

    优点:这套课程特别适合对Python,pandas都没掌握的同学,和“入门”二字很贴切。虽然价要收取一定的费用,但是对于零基础的同学还是墙裂推荐。当然我的笔记是完全免费的,但这个只能作为点心,毕竟正餐才是最有营养的~而且还有大量的源代码A股所有的股票历史交易数据。

    缺点:只能用微信访问学习,PC端的话要通过微信客户端访问。

    系列总课时约12多个小时,会获得课程讲解的所有源代码。如要深入熟练掌握,课外练习可能需要100小时+。

    课程传送门:

    相关文章

      网友评论

        本文标题:用Python分析春节前后的中国A股市场行情(附源代码)

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