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

目录

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

主力合约计算逻辑 

数据准备

代码

​下载


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

主力合约计算逻辑 

数据准备

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Git删除远程仓库某次提交记录后的所有提交

1、鼠标右键->git bash here&#xff0c;然后cd切换到代码目录&#xff1b; 2、git log查看提交记录&#xff0c;获取commit id 3、git reset commit id&#xff08;commit id指要保留的最新的提交记录id&#xff09; 4、git push --force&#xff0c;强制push 如果出现…

TypeScript基础(五)泛型

✨ 专栏介绍 TypeScript是一种由微软开发的开源编程语言&#xff0c;它是JavaScript的超集&#xff0c;意味着任何有效的JavaScript代码都是有效的TypeScript代码。TypeScript通过添加静态类型和其他特性来增强JavaScript&#xff0c;使其更适合大型项目和团队开发。 在TypeS…

【机器学习】模型参数优化工具:Optuna使用分步指南(附XGB/LGBM调优代码)

常用的调参方式和工具包 常用的调参方式包括网格搜索(Grid Search)、**随机搜索(Random Search)和贝叶斯优化(Bayesian Optimization)**等。 工具包方面&#xff0c;Scikit-learn提供了GridSearchCV和RandomizedSearchCV等用于网格搜索和随机搜索的工具。另外&#xff0c;有一…

CodeWave智能开发平台--03--目标:应用创建--08联系人管理

摘要 本文是网易数帆CodeWave智能开发平台系列的第11篇&#xff0c;主要介绍了基于CodeWave平台文档的新手入门进行学习&#xff0c;实现一个完整的应用&#xff0c;本文主要完成08联系人管理 CodeWave智能开发平台的11次接触 CodeWave参考资源 网易数帆CodeWave开发者社区…

Linux第21步_取消鼠标中键的复制粘贴功能

在ubuntu18.04操作系统中&#xff0c;选中文本后&#xff0c;若按下鼠标中键&#xff0c;就可以执行复制粘贴&#xff0c;相当于 CtrlshiftC 后又按了 CtrlshiftV。在Linux系统中&#xff0c;基本上都是这么配置的。在windows系统中&#xff0c;我们习惯用Ctrl-C复制&#xff0…

intellij idea导入别人项目版本问题解决方案

当导入别人的项目太慢,原因是gradle版本不一致,这时android studio自动下载匹配的gradle版本导致长时间下载的问题。原因主要还是&#xff1a;这个下载地址是国外的&#xff0c;需要翻墙&#xff0c;否则会特别慢。 1.一般下载下来的项目都有这些文件夹&#xff0c;在导入项目…

51单片机介绍

1 单片机简介 单片机&#xff0c;英文Micro Controller Unit&#xff0c;简称MCU 内部集成了CPU、RAM、ROM、定时器、中断系统、通讯接口等一系列电脑的常用硬件功能 单片机的任务是信息采集&#xff08;依靠传感器&#xff09;、处理&#xff08;依靠CPU&#xff09;和硬件设…

uniapp 创建组件

组件&#xff1a;用于将某个功能的 HTML、CSS、JS 封装到一个文件中&#xff0c;提高代码的复用性和可维护性。 创建组件 一、在根目录中创建 components 文件夹&#xff0c;右键点击新建组件。 二、输入组件名称、选择默认模板、点击创建组件。 三、在组件中正常编写内容即可…

AcWing 203. 同余方程(扩展欧几里得算法)

题目链接 203. 同余方程 - AcWing题库高质量的算法题库https://www.acwing.com/problem/content/205/ 来源 《算法竞赛进阶指南》, NOIP2012提高组 题解 本题中的同余方程可以转化为ax by 1的形式&#xff0c;利用扩展欧几里得算法可以求得特解为&#xff0c;则通解为。 代…

Linux系统使用超详细(九)~用户和组管理

本篇将要梳理有关用户和用户组的学习笔记&#xff0c;内容主要是基本的概念理解和常用命令的使用方法 &#xff01; 目录 一、用户和用户组认识 1.1用户说明 1.1.1查看用户信息 ①id命令&#xff1a; ②whoami 命令 ③cat /etc/passwd 命令 ④getent passwd 命令 ⑤仅显…

Python轴承故障诊断 (十)基于VMD+CNN-Transfromer的故障分类

目录 1 变分模态分解VMD的Python示例 2 轴承故障数据的预处理 2.1 导入数据 2.2 故障VMD分解可视化 3 基于VMDCNN-Transformer的轴承故障诊断分类 3.1 定义VMD-CNN-Transformer分类网络模型 3.2 设置参数&#xff0c;训练模型 3.3 模型评估 代码、数据如下&#xff1a…

​如何在iOS手机上查看应用日志

引言 在开发iOS应用过程中&#xff0c;查看应用日志是非常重要的一项工作。通过查看日志&#xff0c;我们可以了解应用程序运行时的状态和错误信息&#xff0c;帮助我们进行调试和排查问题。本文将介绍两种方法来查看iOS手机上的应用日志&#xff0c;并提供相应的操作步骤。 …

vercel部署twikoo后评论收不到通知邮件问题解决方法

&#x1f4cc; 前言&#xff1a;本文主要是总结一下在vercel部署twikoo后收不到评论邮件通知问题的解决方法&#xff0c;本人在各种查资料无果后最终去twioo的git官方项目的issue中找到某位大佬给出的原因以及解决方案&#xff0c;故做此记录&#xff0c;希望对遇到此问题的同学…

Nodejs 第三十一章(响应头和请求头)

响应头 HTTP响应头&#xff08;HTTP response headers&#xff09;是在HTTP响应中发送的元数据信息&#xff0c;用于描述响应的特性、内容和行为。它们以键值对的形式出现&#xff0c;每个键值对由一个标头字段&#xff08;header field&#xff09;和一个相应的值组成。 例如…

C++面试宝典第17题:找规律填数

题目 仔细观察下面的数字序列,找到规律,并填写空白处的数字。 (1)1, 2, 4, 7, 11, 16, __ (2)-1, 2, 7, 28, __, 126 (3)6, 10, 18, 32, 57, __ (4)19, 6, 1, 2, 11, __ (5)2, 3, 5, 7, 11, __ (6)1, 8, 9, 4, __, 1/6 (7)1, 2, 3, 7, 16, __, 321 (8)1, 2, …

【Python学习】Python学习9-字符串

目录 【Python学习】Python学习9-字符串 前言创建语法访问字符串的值字符串拼接Python 转义字符Python字符串运算符Python格式化字符串Python 三引号Unicode字符串Python 的字符串内建函数参考 文章所属专区 Python学习 前言 本章节主要说明Python的字符串类型。 创建语法 …

Spring MVC组件

1.DispatcherServlet前端控制器 用户请求到达前端控制器&#xff0c;它就相当于mvc模式中的c&#xff0c;dispatcherServlet 是整个流程控制的中心&#xff0c;由它调用其它组件处理用户的请求&#xff0c;dispatcherServlet 的存在降低了组件之间的耦合性。 2.HandlerMappin…

蓝牙物联网多个核心应用场景开发与应用细化分析

蓝牙物联网是指利用蓝牙技术将物理设备与互联网连接起来&#xff0c;实现设备之间的信息共享与互通。蓝牙物联网在各个领域得到了广泛应用&#xff0c;并且在未来有着巨大的发展潜力。本文将围绕蓝牙物联网的五大核心应用场景进行介绍&#xff0c;包括智能家居、智能健康、智能…

Mac M1 Parallels CentOS7.9 Install Jenkins

官网: https://www.jenkins.io/ 文中涉及的jenkins’s rpm链接: https://pan.baidu.com/s/1BSe62pGdJCtDUAimaniEMA?pwd6666 一、Install & Check Java Env Oracle官网下载Java: https://www.oracle.com/cn/ # 拷贝到Jenkins服务器 scp Downloads/jdk-8u391-linux-aarch…

再谈前端算法

楔子 – 青蛙跳台阶什么是算法算法实例 &#xff1a; 实现一个LRU缓存 实现 LRUCache扩展&#xff1a; ES6 Map Map的创建和初始化&#xff1a;添加键值对&#xff1a;获取键值对&#xff1a;检查Map中是否存在某个键&#xff1a;删除键值对&#xff1a;遍历Map&#xff1a;获取…