期货日数据维护与使用_日数据维护_合约更新

目录

写在前面

下载最新合约列表

“选择合约所在目录”按钮点击 

“执行”按钮点击

sqlite3代码

按钮点击后执行的代码

子线程代码 

“新增合约json下载”按钮点击

“追加合约json下载”按钮点击


写在前面

本文默认已经创建了项目,如果不知道如何创建一个空项目的,请参看以下两篇博文

PyQt5将项目搬到一个新的虚拟环境中
https://blog.csdn.net/m0_37967652/article/details/122625280
python_PyQt5开发工具结构基础
https://blog.csdn.net/m0_37967652/article/details/131969032

前序:

【期货日数据维护与使用_日数据维护_界面代码】博文

【期货日数据维护与使用_日数据维护_sqlite3数据库创建】 博文

下载最新合约列表

df = DataAPI.FutuGet(secID=u"",ticker=u"",exchangeCD=u"XSGE",contractStatus="",contractObject=u"",prodID="",field=u"",pandas="1")
df.to_csv('futures_XSGE.csv',encoding='utf-8')df = DataAPI.FutuGet(secID=u"",ticker=u"",exchangeCD=u"XDCE",contractStatus="",contractObject=u"",prodID="",field=u"",pandas="1")
df.to_csv('futures_XDCE.csv',encoding='utf-8')df = DataAPI.FutuGet(secID=u"",ticker=u"",exchangeCD=u"XZCE",contractStatus="",contractObject=u"",prodID="",field=u"",pandas="1")
df.to_csv('futures_XZCE.csv',encoding='utf-8')df = DataAPI.FutuGet(secID=u"",ticker=u"",exchangeCD=u"CCFX",contractStatus="",contractObject=u"",prodID="",field=u"",pandas="1")
df.to_csv('futures_CCFX.csv',encoding='utf-8')df = DataAPI.FutuGet(secID=u"",ticker=u"",exchangeCD=u"XSIE",contractStatus="",contractObject=u"",prodID="",field=u"",pandas="1")
df.to_csv('futures_XSIE.csv',encoding='utf-8')

 

从优矿中下载的文件字段列表为:

 ['secID','listDate','secFullName','secShortName','ticker','exchangeCD','contractType','contractObject','priceUnit','minChgPriceNum','minChgPriceUnit','priceValidDecimal','limitUpNum','limitUpUnit','limitDownNum','limitDownUnit','transCurrCD','contMultNum','contMultUnit','tradeMarginRatio','deliYear','deliMonth','lastTradeDate','firstDeliDate','lastDeliDate','deliMethod','deliGrade','tradeCommiNum','tradeCommiUnit','deliCommiNum','deliCommiUnit','listBasisPrice','settPriceMethod','deliPriceMethod','contractStatus','prodID']

想知道字段含义,可以自行到优矿网站查看

“选择合约所在目录”按钮点击 

    def choice_symbol_dir_btn_clicked(self):path = QtWidgets.QFileDialog.getExistingDirectory(self,'选择合约所在目录',SQLITE_FROM_DIR)if not path:returnself.choice_symbol_dir_lineedit.setText(path)pass

定义 SQLITE_FROM_DIR 常量:./tools/sqlite_from_dir/

“执行”按钮点击

更新合约的过程在子线程中进行,任务表示定义为  self.mark_str_step_one 常量,常量定义在 init_data()方法中

更新合约逻辑:
1 将下载所得的最新合约列表文件合并获取到“最新的合约列表”
2 工具中现存的合约都在 t_symbol_basemsg 中
3 将“最新的合约列表”与 t_symbol_basemsg 中的合约进行比对,筛出“新增的合约”
4 工具中现存的在线合约都在 t_online_symbol 中,在线合约即为“待更新日数据的合约”
至此,获得要下载日数据的合约列表。

sqlite3代码

在 sqlite_tool.py 文件中创建 query_all_ticker_deliYear_from_symbol_basemsg 方法,从 t_symbol_basemsg 表格中获取所有的合约名和交割年份

def query_all_ticker_deliYear_from_symbol_basemsg():conn = sqlite3.connect(YOUKUANG_DB_NAME)c = conn.cursor()# ssql_str = '''select ticker,deliYear from t_symbol_basemsg'''c.execute(sql_str)res_list = c.fetchall()# econn.commit()conn.close()return res_listpass

在 sqlite_tool.py 文件中创建 query_all_from_online_symbol 方法,从 t_online_symbol 表格中获取所有在线合约数据

def query_all_from_online_symbol():conn = sqlite3.connect(YOUKUANG_DB_NAME)c = conn.cursor()# ssql_str = '''select product_code,ticker,deliYear,newest_date from t_online_symbol'''c.execute(sql_str)res_list = c.fetchall()# econn.commit()conn.close()return res_list

按钮点击后执行的代码

    def excute_step_one_btn_clicked(self):dir_path = self.choice_symbol_dir_lineedit.text()if len(dir_path) <= 0:QtWidgets.QMessageBox.information(self,'提示','请选择合约所在目录',QtWidgets.QMessageBox.Yes)returnpre_map = {'dir_path': dir_path,'cur_deliYear': self.deliYear_spinbox.value()}self.start_caculate_thread(self.mark_str_step_one, pre_map)pass

子线程代码 

子线程中任务名为 self.mark_str_step_one 的执行代码,于 running_caculate_thread 方法中对应任务名下

dir_path = data['dir_path']
cur_deliYear = data['cur_deliYear']
exist_tickers_list = sqlite_tool.query_all_ticker_deliYear_from_symbol_basemsg()
exist_temp_tickers_list = []
for item in exist_tickers_list:exist_temp_tickers_list.append(f"{item[0]}_{item[1]}")pass
file_list = os.listdir(dir_path)
# 逐一读取合约文件,筛出新增的合约,合并到一个df中
new_df = pd.DataFrame()
for item in file_list:file_path = dir_path + os.path.sep + itemdf = pd.read_csv(file_path)df['temp_ticker'] = df['ticker'].astype('str').str.cat(df['deliYear'].astype('str'),'_')one_df = df.loc[(~df['temp_ticker'].isin(exist_temp_tickers_list)) & (df['deliYear']>=cur_deliYear)].copy()if len(one_df)>0:new_df = pd.concat([new_df,one_df])pass
# 将新增的合约插入到 t_symbol_basemsg 中,并导出到 new.json文件
if len(new_df)>0:pre_list = new_df.loc[:,self.symbol_basemsg_column_list].values.tolist()sqlite_tool.batch_insert_symbol_basemsg(pre_list)self.thread_out_log(f"新增合约{len(pre_list)}")new_json = new_df['ticker'].values.tolist()with open(SQLITE_TO_DIR + 'new.json','w',encoding='utf-8') as fw:json.dump(new_json,fw)pass
# 追加的ticker列表
self.thread_out_log(f"开始计算要追加的ticker列表:")
online_tickers = sqlite_tool.query_all_from_online_symbol()
df_online = pd.DataFrame(columns=self.online_symbol_column_list,data=online_tickers)
df_group = df_online.groupby(by='newest_date')
target_json_dir = SQLITE_TO_DIR + 'append' + os.path.sep
if not os.path.exists(target_json_dir):os.mkdir(target_json_dir)
for name,group in df_group:name_str = name.replace('-','')append_json = group['ticker'].values.tolist()target_file_path = target_json_dir + name_str + '.json'with open(target_file_path,'w',encoding='utf-8') as fw:json.dump(append_json,fw)
pre_map = {"mark_str":self.mark_str_step_one,"data":None
}
self.signal_excute.emit(pre_map)
pass

“新增合约json下载”按钮点击

    def new_symbol_json_down_btn_clicked(self):new_json_path = SQLITE_TO_DIR + 'new.json'if not os.path.exists(new_json_path):QtWidgets.QMessageBox.information(self,'提示','没有新增的合约',QtWidgets.QMessageBox.Yes)returnpath = QtWidgets.QFileDialog.getExistingDirectory(self,'选择要保存的路径','.')if not path:returnoutput_path = path + os.path.sep + 'new.json'shutil.copy(new_json_path, output_path)self.write_log('新增的合约列表导出完毕')QtWidgets.QMessageBox.information(self,'提示','新增的合约列表导出完毕',QtWidgets.QMessageBox.Yes)pass

“追加合约json下载”按钮点击

    def append_symbol_json_down_btn_clicked(self):append_json_dir = SQLITE_TO_DIR + 'append' + os.path.sepfile_list = os.listdir(append_json_dir)if len(file_list) <= 0:QtWidgets.QMessageBox.information(self,'提示','没有要追加的合约',QtWidgets.QMessageBox.Yes)returnpath = QtWidgets.QFileDialog.getExistingDirectory(self,'选择要保存的路径','.')if not path:returnfor item in file_list:src_file_path = append_json_dir + itemtarget_file_path = path + os.path.sep + itemshutil.copy(src_file_path, target_file_path)self.write_log('待追加日数据的合约列表导出完毕')QtWidgets.QMessageBox.information(self,'提示','待追加日数据的合约列表导出完毕',QtWidgets.QMessageBox.Yes)pass

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++: 求1+2+3+...+n

int i 1; int sum 0; class Sum { public:Sum(){sum i;i;} };class Solution { public:int Sum_Solution(int n) {Sum a[n]; //调用n次sum的构造函数return sum;} };

imazing破解版百度云2.17.3(附激活许可证下载)

iMazing是一款强大的 iOS 设备管理软件&#xff0c;不管是 iPhone、iPad 或 iPod Touch 设备&#xff0c;只要将 iOS 设备连接到计算机&#xff0c;就可以处理不同类型的数据。 iPhone 和 iPad 备份 借助 iMazing 的独有 iOS 备份技术&#xff08;无线、隐私和自动&#xff09…

HTML5大作业-精致版个人博客空间模板源码

文章目录 1.设计来源1.1 博客主页界面1.2 博主信息界面1.3 我的文章界面1.4 我的相册界面1.5 我的工具界面1.6 我的源码界面1.7 我的日记界面1.8 我的留言板界面1.9 联系博主界面 2.演示效果和结构及源码2.1 效果演示2.2 目录结构2.3 源代码 源码下载 作者&#xff1a;xcLeigh …

im6ull学习总结(三-3)freetype

1、Freetype简介 FreeType是一个开源的字体渲染引擎&#xff0c;主要用于将字体文件转换为位图或矢量图形&#xff0c;并在屏幕上渲染出高质量的字体。它提供了一组API&#xff0c;使开发者能够在自己的应用程序中使用和呈现字体。 FreeType最初是作为一个独立项目开发的&…

yiyan.baidu.com生成爬取天气预报,并以xls的形式保存到本地

import requests import xlwt import json# 创建工作簿对象 workbook xlwt.Workbook(encodingutf-8-sig) # 创建工作表对象 worksheet workbook.add_sheet(天气数据)# 设置单元格样式 style xlwt.easyxf(font: bold True;)# 定义列标题 headers [date, city, country, weat…

windows和liunx对比及Linux分类

windows一定比liunx差吗&#xff0c;这绝对是天大误解&#xff0c;不是说你常用的开始是liunx就代表windows差 windows和liunx对比 有人说Linux性能远高于Windows&#xff0c;这个笔者是不认可的&#xff0c;给Linux套上一个图形界面&#xff0c;你再使劲美化一下&#xff0c…

数据结构 模拟实现Queue队列(双链表模拟)

目录 一、队列的概念 二、队列的接口 三、队列的方法实现 &#xff08;1&#xff09;offer方法 &#xff08;2&#xff09;poll方法 &#xff08;3&#xff09;peek方法 &#xff08;4&#xff09;size方法 &#xff08;5&#xff09;isEmpty方法 四、最终代码 一、队…

解决 POST http://x.x.x.x:8000/aaa/ net::ERR_CONNECTION_TIMED_OUT

记录一下我遇到的问题和解决办法 我的项目前后端分离&#xff0c;在前端用的vue访问后端时连接不上后端&#xff0c;一切操作都触发不了后端&#xff0c;数据也传不到后端去&#xff1b; 原因&#xff1a;url有问题&#xff0c;url地址写的不是本机&#xff0c;所以导致连接超…

python 深度学习 记录遇到的报错问题11

本篇继python 深度学习 记录遇到的报错问题10-CSDN博客 六、ValueError: cannot convert float NaN to integer 报错&#xff1a; 原因&#xff1a;这个错误通常是因为在尝试将NaN值转换为整数时发生的。NaN表示“非数字”&#xff0c;它无法转换为整数。在 Python 中&#xf…

单调栈模版

单调栈需要两个数组&#xff0c;一个值数组&#xff0c;一个模拟栈数组&#xff0c;拿一道题来举例。 模拟栈数组中存储下标&#xff0c;单调栈顾名思义单调增或者单调减&#xff0c;并不是索引单调增或者单调减&#xff0c;这意义&#xff0c;我们要的是索引对应的值单调增或者…

使用Spring Cache优化数据库访问

使用Spring Cache优化数据库访问 在这篇博客中&#xff0c;我们将学习如何使用Spring Cache来优化数据库访问&#xff0c;提高系统性能。我们将创建一个简单的图书管理应用作为示例&#xff0c;并演示如何通过缓存减少对数据库的频繁查询。 1. 项目结构 首先&#xff0c;我们…

全网最强的Spring源码入门教程(包含IOC、AOP、事务、MVC)

一. ioc 1.1 bd的收集 1.1.1 基于xml 入口 AbstracApplicationtContext.refresh -> AbstracApplicationtContext.obtainFreshBeanFactory() -> 调用到子类 AbstractRefreshableApplicationContext.loadBeanDefinitions() -> AbstractXmlApplicationContext.loadBeanDe…