期货日数据维护与使用_日数据维护_主力合约计算逻辑

目录

主力合约换月规则(文化财经)

主力合约计算逻辑 

数据准备

代码

​下载


主力合约换月规则(文化财经)

主力合约计算逻辑 

数据准备

本文以沪银为例,将沪银所有日数据文件放入一个文件夹中,文件名命名方式为 合约名_交割年份.csv

代码

def caculate_main_from_zero():
    main_column_list = ['ticker','deliYear','tradeDate','openPrice','highestPrice','lowestPrice','closePrice','settlePrice','turnoverVol','turnoverValue','openInt']
    # 放置品种所有日数据文件,文件名 合约名_交割年份.csv
    pre_dir = r'E:/temp000/'
    file_list = os.listdir(pre_dir)
    # 将合约日文件合并到一个pd.DataFrame()中
    df = pd.DataFrame()
    for item in file_list:
        file_path = pre_dir + item
        item_str = item.split('.')[0]
        ticker = item_str.split('_')[0]
        deliYear = item_str.split('_')[1]
        df_one = pd.read_csv(file_path,encoding='utf-8')
        df_one['ticker'] = ticker
        df_one['deliYear'] = deliYear
        df = pd.concat([df,df_one])
        pass
    # 去除数据为空的数据
    df.dropna(inplace=True)
    if len(df)<=0:
        print('所有合约数据为空')
        return
    # 按日期分组
    df['o_date'] = pd.to_datetime(df['tradeDate'])
    df.sort_values(by='o_date',ascending=True,inplace=True)
    df['row_i'] = [i for i in range(len(df))]
    df_group = df.groupby(by='o_date',as_index=False)
    df_main = pd.DataFrame()
    cur_main_ticker = None
    cur_main_deliYear = None
    pre_next_ticker = None
    pre_next_deliYear = None
    next_change_yeah = False
    for name,group in df_group:
        if len(group)<=1:
            # 当日只有一条日数据,那该数据对应的合约即为主力合约
            df_main = pd.concat([df_main,group.iloc[[0]]])
            cur_main_ticker = group.iloc[0]['ticker']
            cur_main_deliYear = group.iloc[0]['deliYear']
            pass
        else:
            # 当日有多条日数据,分别计算成交量最大和持仓量最大的合约
            # 成交量最大合约
            df_vol = group.sort_values(by='turnoverVol',ascending=False)
            # 持仓量最大合约
            df_inte = group.sort_values(by='openInt',ascending=False)
            # 如果成交量最大与持仓量最大为同一合约
            if df_vol.iloc[0]['row_i'] == df_inte.iloc[0]['row_i']:
                if not cur_main_ticker:
                    # 不存在前主力合约,那该合约即为主力合约
                    df_main = pd.concat([df_main,df_vol.iloc[[0]]])
                    cur_main_ticker = df_vol.iloc[0]['ticker']
                    cur_main_deliYear = df_vol.iloc[0]['deliYear']
                    pass
                else:
                    if next_change_yeah:
                        # 有【预备主力合约】
                        if df_vol.iloc[0]['ticker'] == pre_next_ticker and df_vol.iloc[0]['deliYear']==pre_next_deliYear:
                            # 【预备主力合约】继昨日是成交量和持仓量同时最大后,今日还是成交量和持仓量最大,切换
                            df_main = pd.concat([df_main, df_vol.iloc[[0]]])
                            cur_main_ticker = pre_next_ticker
                            cur_main_deliYear = pre_next_deliYear
                            next_change_yeah = False
                            pass
                        else:
                            # 【预备主力合约】继昨日是成交量和持仓量同时最大后,今日不济,【预备主力合约】撤销
                            next_change_yeah = False
                            # ----------- 【当日成交量最大和持仓量最大 为同一个合约】 延续当前合约 start
                            # 存在前主力合约,判断该合约是否与前主力合约一致
                            if df_vol.iloc[0]['ticker'] == cur_main_ticker and df_vol.iloc[0][
                                'deliYear'] == cur_main_deliYear:
                                # 一致,主力合约延续,不切换
                                df_main = pd.concat([df_main, df_vol.iloc[[0]]])
                                pass
                            else:
                                # 不一致,主力合约延续,不切换;预备下一交易日切换
                                one_df = group.loc[(group['ticker'] == cur_main_ticker) & (
                                            group['deliYear'] == cur_main_deliYear)].copy()
                                df_main = pd.concat([df_main, one_df.iloc[[0]]])
                                next_change_yeah = True
                                pre_next_ticker = df_vol.iloc[0]['ticker']
                                pre_next_deliYear = df_vol.iloc[0]['deliYear']
                                pass
                            # ----------- 【当日成交量最大和持仓量最大 为同一个合约】 延续当前合约 end
                            pass
                        pass
                    else:
                        # 无【预备主力合约】
                        # ----------- 【当日成交量最大和持仓量最大 为同一个合约】 延续当前合约 start
                        # 存在前主力合约,判断该合约是否与前主力合约一致
                        if df_vol.iloc[0]['ticker'] == cur_main_ticker and df_vol.iloc[0][
                            'deliYear'] == cur_main_deliYear:
                            # 一致,主力合约延续,不切换
                            df_main = pd.concat([df_main, df_vol.iloc[[0]]])
                            pass
                        else:
                            # 不一致,主力合约延续,不切换;预备下一交易日切换
                            one_df = group.loc[
                                (group['ticker'] == cur_main_ticker) & (group['deliYear'] == cur_main_deliYear)].copy()
                            df_main = pd.concat([df_main, one_df.iloc[[0]]])
                            next_change_yeah = True
                            pre_next_ticker = df_vol.iloc[0]['ticker']
                            pre_next_deliYear = df_vol.iloc[0]['deliYear']
                            pass
                        # ----------- 【当日成交量最大和持仓量最大 为同一个合约】 延续当前合约 end
                        pass
                pass
            else:
                # 成交量最大和持仓量最大不是同一合约
                if not cur_main_ticker:
                    df_main = pd.concat([df_main,df_vol.iloc[[0]]])
                    cur_main_ticker = df_vol.iloc[0]['ticker']
                    cur_main_deliYear = df_vol.iloc[0]['deliYear']
                    pass
                else:
                    if df_vol.iloc[0]['ticker']==cur_main_ticker and df_vol.iloc[0]['deliYear']==cur_main_deliYear:
                        df_main = pd.concat([df_main,df_vol.iloc[[0]]])
                    elif df_inte.iloc[0]['ticker'] == cur_main_ticker and df_inte.iloc[0]['deliYear']==cur_main_deliYear:
                        df_main = pd.concat([df_main,df_inte.iloc[[0]]])
                    else:
                        df_main = pd.concat([df_main,df_vol.iloc[[0]]])
                        cur_main_ticker = df_vol.iloc[0]['ticker']
                        cur_main_deliYear = df_vol.iloc[0]['deliYear']
                        pass
                    pass
                pass
            pass
        pass
    if len(df_main) <=0:
        print('主力合约条数为0')
        return
    df_main = df_main.loc[:,main_column_list].copy()
    df_main.to_csv(pre_dir + 'AG.csv',encoding='utf-8')
    pass

结果存储为 AG.csv

下载

链接:https://pan.baidu.com/s/1X0O4ZtwX8_ZmdDJB4DJXTA 
提取码:jjdz

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
《证券期货数据模型建设的理论与实践》是一本介绍证券期货行业数据模型建设的理论和实践的专业书籍。该书系统地阐述了数据模型建设的理论基础和实际操作过程,并提供了一些实例来加深理解。下面将简要介绍该书的主要内容。 该书首先介绍了证券期货数据模型的基本概念和作用,并深入探讨了数据模型在业务分析、系统设计和数据管理等方面的重要性。接着,书中详细介绍了数据模型的基本要素和建设过程,包括数据模型的结构设计、属性定义和关系建立等内容。此外,该书还介绍了常用的数据建模方法和工具,如实体-关系模型、层次模型和面向对象模型等。 在理论基础的介绍之后,该书详细说明了数据模型建设的具体实践过程。首先,书中介绍了数据需求分析和数据建模的方法和技巧,以帮助读者理解数据模型建设的关键问题和解决方案。其次,书中介绍了数据模型的实施和验证方法,包括模型评估、模型调整和模型验证等过程。最后,书中还介绍了数据模型维护和更新的方法和技巧,以确保数据模型的长期有效性和适应性。 总的来说,《证券期货数据模型建设的理论与实践》是一本系统全面介绍证券期货行业数据模型建设的专业书籍。通过阅读该书,读者可以了解数据模型建设的理论基础和实际操作过程,为证券期货数据模型的建设提供指导和借鉴。该书对于从事证券期货业务分析、系统设计和数据管理的专业人士,以及对数据模型建设感兴趣的读者,具有一定的参考价值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值