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

news2024/11/16 10:42:11

目录

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

主力合约计算逻辑 

数据准备

代码

​下载


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

主力合约计算逻辑 

数据准备

本文以沪银为例,将沪银所有日数据文件放入一个文件夹中,文件名命名方式为 合约名_交割年份.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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1369123.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OBD汽车

相当于客户端与服务器 诊断设备流程 》》》》诊断服务 OBD很多的定死了 Vme就很灵活 WWH 就是两个的结合 OBD15031 SID PID 可以自己定义一些 一个字节255个 两个有效字节 02 01 0D 5555&#xff08;随机值&#xff09;这是请求 两个有效字节 01 OD&#xff08;请求速…

C# Emgu.CV4.8.0读取rtsp流录制mp4可分段保存

【官方框架地址】 https://github.com/emgucv/emgucv 【算法介绍】 EMGU CV&#xff08;Emgu Computer Vision&#xff09;是一个开源的、基于.NET框架的计算机视觉库&#xff0c;它提供了对OpenCV&#xff08;开源计算机视觉库&#xff09;的封装。EMGU CV使得在.NET应用程序…

Java药物不良反应ADR智能监测系统源码

药物不良反应&#xff08;Adverse Drug Reaction&#xff0c;ADR&#xff09;是指在使用合格药品时&#xff0c;在正常的用法和用量下出现的与用药目的无关的有害反应。这些反应往往因药物种类、使用方式、个体差异等因素而异&#xff0c;可能导致患者身体不适、病情恶化。 为保…

多PC文件夹同步方案

在多个工作终端独立具备svn版本库的情况下&#xff0c;可使用本工具进行一键同步。 相较于传统的SVN中心检出更新方案中移动存储设备硬件及文件目录系统多终端间易损坏&#xff0c;本方案更加稳定 资料同步结构&#xff1a; 使用步骤&#xff1a; 1.修改config.ini配置文件 2…

通付盾受邀出席2024安全市场年度大会,荣获“数字安全产业杰出贡献奖”!

1月5日&#xff0c;由国内数字产业独立的第三方调研咨询机构数世咨询主办&#xff0c;以“数字安全&#xff0c;未来可期”为主题的2024安全市场年度大会在北京举办。来自国内网络安全厂商300多人以线上线下方式参加本次大会&#xff0c;通过4个多小时高能演讲&#xff0c;聚焦…

力扣刷题-二叉树-合并二叉树

617.合并二叉树&#xff08;经典&#xff09; 合并二叉树是操作两棵树的题目里面很经典的&#xff0c;如何对两棵树遍历以及处理&#xff1f; 给定两个二叉树&#xff0c;想象当你将它们中的一个覆盖到另一个上时&#xff0c;两个二叉树的一些节点便会重叠。 你需要将他们合并…

type-c接口PD诱骗

小家电Type-C接口PD诱骗&#xff1a;未来充电的便捷与安全 随着科技的不断发展&#xff0c;Type-C接口已经成为了许多小家电产品的标配。而PD&#xff08;Power Delivery&#xff09;诱骗技术&#xff0c;作为一种新兴的充电技术&#xff0c;更是为小家电产品的充电带来了前所…

HTAP(Hybrid Transactional/Analytical Processing)系统之统一存储的实时之道

文章目录 HTAP与时俱进LASER中的存储关键知识LSM&#xff08;Log-Structured Merge Tree&#xff09;SkipList&#xff08;跳表&#xff09;CDC&#xff08;Changed Data Capture&#xff09;SST&#xff08;Sorted Sequence Table&#xff09; 特性列组&#xff08;Column Gro…

MySQL深入——9

如何正确的显示随机信息&#xff1f; 我们来模拟在英语单词app当中随机出现三个英语单词的情况&#xff0c;我们首先创建一张表words&#xff0c;然后给这个表当中插入10000条信息进行量化。 select word from words order by rand() limit 3&#xff1b; order by rand&…

【炼丹神器】wandb实践之sweep超参扫描工具

文章目录 一、四步上手wandb二、四步玩转sweep 参考官方文档&#xff1a;https://docs.wandb.ai/guides/sweeps/define-sweep-configuration 一、四步上手wandb 首先&#xff0c;wandb其实类似tensorboard&#xff0c;mindinsight&#xff0c;都是观察训练时的学习率&#xff0…

pyqt调用UI和开启子进程

UI制作 qrc 注意调用UI前把样式表里绑定的资源(qrc)转换成py导入进去 xxx.qrc转xxx.py 两种方法 1命令 pyrcc5 -o icons_rc.py icons.qrc 2外部工具pyrcc 实参 -o $FileNameWithoutExtension$.py $FileNameWithoutExtension$.qrcsdz.qrc→→sdaz.py 在代码里写 import…

Hyperledger Fabric 二进制安装部署 Peer 节点

规划网络拓扑 3 个 orderer 节点&#xff1b;组织 org1 , org1 下有两个 peer 节点&#xff0c; peer0 和 peer1; 组织 org2 , org2 下有两个 peer 节点&#xff0c; peer0 和 peer1; 节点宿主机 IPhosts端口cli192.168.1.66N/AN/Aorderer0192.168.1.66orderer0.example.com70…

前端面试题集合一

Canvas是什么&#xff1f;怎样写Canvas&#xff1f; Canvas是HTML5的一个元素&#xff0c;它使用JavaScript在网页上绘制图形。Canvas是一个矩形区域。它的每一个像素都可以由HTML5语言来控制。使用Canvas绘制路径、框、圆、字符和添加图像有几种方法。 如果要在我们的HTML文…

2024年跨境电商上半年有哪些营销节日?

2024年伊始&#xff0c;跨境电商开启新一轮的营销竞技&#xff0c;那么首先需要客户需求&#xff0c;节假日与用户需求息息相关&#xff0c;那么接下来小编为大家整理2024上半年海外都有哪些节日和假期&#xff1f;跨境卖家如何见针对营销日历选品&#xff0c;助力卖家把握2024…

Spring——Spring AOP1(代理模式Proxy)

代理&#xff08;Proxy&#xff09;模式 1.创建工程 2.代理&#xff08;Proxy&#xff09;模式介绍 作用&#xff1a;通过代理可以控制访问某个对象的方法&#xff0c;在调用这个方法前做前置处理&#xff0c;调用这个方法后做后置处理。&#xff08;即&#xff1a; AOP的微观…

Redis小计(4)

目录 1.Set和Get操作 2.mset和mget 3.mset&#xff0c;mget&#xff0c;set后加参数的优点 4.incr,incrby&#xff0c;incrbyfloat 1.Set和Get操作 flushall&#xff1a;清除所有k-v键值对。&#xff08;删库跑路小技巧&#xff09; set k v[ex | px]&#xff1a;设置超时…

Elementui Radio单选框取消选中

问题&#xff1a; 最近开发一个后台项目的时候用到了单选框&#xff0c;而客户的要求是默认选择一个选项&#xff0c;然后点击可以取消选中。不想自己在手写一个Radio组件&#xff0c;只能在elementui的单选框上修改一下下啦。 1. .native的作用 .native的作用是在给组件添加修…

低代码开发平台在工业领域的应用场景

随着科技的不断发展&#xff0c;低代码开发平台在工业场景中的应用越来越广泛。低代码开发平台通过提供可视化的界面和预构建的模块&#xff0c;使得开发人员能够快速地构建应用程序&#xff0c;而不需要编写大量的代码。这种技术的应用&#xff0c;不仅可以提高开发效率&#…

网络安全之你的浏览器记录真的安全吗?

密码是每个人最私密的东西&#xff0c;轻易是不会展示给他人的&#xff0c;那么我如何能知道你电脑上浏览器里保存的密码呢&#xff1f;浏览器是大家在网上冲浪最常用的软件&#xff0c;在登录一些网站填写账号密码后&#xff0c;浏览器为了方便大家使用&#xff0c;会提示是否…

ArrayList 与 LinkedList 区别?

如果你现在需要准备面试&#xff0c;可以关注我的公众号&#xff1a;”Tom聊架构“&#xff0c;回复暗号&#xff1a;”578“&#xff0c;领取一份我整理的50W字面试宝典&#xff0c;可以帮助你提高80%的面试通过率&#xff0c;价值很高&#xff01;&#xff01; 是否保证线程安…