想起来很久之前实习面试某基金公司数据科学家岗位的时候,终面因为做的期货系统翻车了,现在把代码找出来,有几个点还是没改,就这么放上面引以为鉴吧
PS:需要注意到零点变为第二天时的情况,再就是能做好看点就做好看点吧,比如多画图。。。

'''@Description:期货分钟 bar@Author:Jiawei@Email:@Date:2022/3/27@LastEditors:Jiawei@LastEidtTime:2022/3/31
'''import pandas as pd
from datetime import datetime
from openpyxl import Workbook
from openpyxl.utils.dataframe import dataframe_to_rows#pandas初始化设置
#显示所有行
pd.set_option('display.max_columns', None)
#显示所有列
pd.set_option('display.max_rows', None)
#设置最大宽度
pd.set_option('display.width', 999)
#设置字段value显示长度
pd.set_option('max_colwidth', 99)#文件初始化
#读取数据文件到pandas
data = pd.read_parquet('interview.parquet', engine='pyarrow')
#数据基础清洗,去掉有缺失值的行
data = data.dropna()
#去重后获取所有交易所的ID
ExID = data['ExchangeID'].unique()
#去重后获取所有合约的ID
InsID = data['InstrumentID'].unique()'''数据检查'''
def data_check():print('***************************开始进行数据检查***************************')#统计LocalTime的单调性print('正在统计LocalTime单调性,请稍等...')local_time = data['LocalTime']#遍历所有localtime,存储相邻元素之间的大小关系monotony = [local_time[i] <= local_time[i + 1] for i in range(len(local_time) - 1)]#如果列表中存在false则说明存在大于的情况,此时再分类判断if False in monotony:#如果存在false的情况下同时又存在true,则说明同时存在大于和小于等于情况,即为不单调if True in monotony:print('LocalTime不具有单调性')#仅存在false则证明都为大于的情况,即为单减else:print('LocalTime单调递减')else:print('LocalTime单调递增')#分交易所统计for ExchangeID in ExID:#分交易所对UpdateTime,UpdateMullisec进行遍历,查看其单调性print('正在统计{}的(UpdateTime,UpdateMullisec)单调性,请稍等...'.format(ExchangeID))#将原始数据保存到time_exchangedata_exchange = data[data['ExchangeID'] == ExchangeID]#由于UpdateTime为string类,故sort后再使用字符串比对进行比较#开辟新空间,获取一个排序后的UpdateTime,UpdateMullisec数据time_orderedtime_ordered = data_exchange.copy()#sort_values对两列进行排序时,顺序均为升序,先UpdateTime后UpdateMillisectime_ordered = time_ordered.sort_values(by=['UpdateTime', 'UpdateMillisec'], ascending=[True, True])#设置计数器,确保全部数据遍历结束后再输出单调性count = 0#由于默认数据为实时流式接受,故默认该数据不会递减接受(若是需要考虑逆序需要增加递减序列,增加一次比对)for i in range(len(data_exchange)):if (data_exchange.iloc[i] != time_ordered.iloc[i]).any():print(ExchangeID + '(UpdateTime, UpdateMyllisec)不单调')breakcount = count + 1if (count == len(data_exchange)):print(ExchangeID + '(UpdateTime, UpdateMyllisec)单调递增')#探索每个交易所的tick的推送频率#本方案关注获取的数据中平均每秒的推送频率print('正在探索{}的tick推送频率,请稍等...'.format(ExchangeID))num = len(data_exchange)time = data_exchange.iloc[num - 1]["LocalTime"] - data_exchange.iloc[0]["LocalTime"]#LocalTime推送的时间为从1970年1月1日00:00:00开始按秒计算的偏移量,查询后发现为纳秒time = time / 1000000000frequence = num / timeprint('{}的tick推送频率为{}次/秒'.format(ExchangeID, frequence))#探索ActionDay,TradingDay和实际交易时间的关系#百度获知部分交易所的ActionDay,TradingDay在一天的某一时间前会出现差异,因此验证此规律并找出分界时间点print('正在探索{}的ActionDay,TradingDay和实际交易时间的关系,请稍等...'.format(ExchangeID))#设置标志位,如果遍历结束之后ActionDay和TradingDay的关系都没有变化,则说明一致,如果变化了则置为0flag = 1for i in range(len(data_exchange) - 1):if data_exchange.iloc[i]['ActionDay'] != data_exchange.iloc[i]['TradingDay'] and \data_exchange.iloc[i + 1]['ActionDay'] == data_exchange.iloc[i + 1]['TradingDay']:print('{}的ActionDay,TradingDay在{}及之前不一致,之后一致'.format(ExchangeID, data_exchange.iloc[i]['UpdateTime']))flag = 0breakif flag:print(ExchangeID + '的ActionDay,TradingDay一致')#自定标准数据检查#根据Volume和Turnover的单调性判断是否有异常数据#根据合约号进行分类for instrument in InsID:data_instrument = data[data['InstrumentID'] == instrument]volume = data_instrument['Volume']turnover = data_instrument['Turnover']#遍历该合约下所有Volume和Turnover,存储相邻元素之间的大小关系for i in range(len(volume) - 1):if volume.iloc[i] > volume.iloc[i + 1]:print('Volume Data Exception:{}'.format(data_instrument).iloc[i + 1])for i in range(len(turnover) - 1):if turnover.iloc[i] > turnover.iloc[i + 1]:print('Turnover Data Exception:{}'.format(data_instrument).iloc[i + 1])'''分钟bar生成'''
def minute_bar_generator():print('***************************开始生成分钟bar***************************')#经百度查询知LocalTime为纳秒级,故经过单位转换取整后再使用strftime转换为time格式,便于后续分钟计算data['LocalTime'] = [datetime.fromtimestamp(j // 1000000000).strftime("%Y-%m-%d %H:%M:%S") for j in data['LocalTime']]#初始化参数#由于字段包含映射信息,故采用字典存储结果,每个合约对应一个dataframeresult = {}#tmp储存该分钟内价格信息tmp = {}#记录该合约上次交易的成交价lastprice = {}#用于判断成交量是否改变,如果改变证明交易发生,则把数据写入字典prevolume = {}#判断新送入的数据是否属于之前的时间time_record = []#根据合约号进行分类,定义当地时间,开盘价,最高价,最低价,收盘价for instrument in InsID:result[instrument] = pd.DataFrame(columns=['LocalTime', 'Opening', 'Highest', 'Lowest', 'Closing'])tmp[instrument] = list()ins_data = data[data["InstrumentID"] == instrument]lastprice[instrument] = ins_data.iloc[0]['LastPrice']prevolume[instrument] = ins_data.iloc[0]['Volume']#根据所提供的tick数据,模拟流式的行情接收(按照LocalTime顺序一条条到达)#问题:查看了拿到的数据之后发现成交时间并不是递增的,那么开盘价到底是推送来的第一个数据还是按照时间排序之后的第一个数据num = len(data)for i in range(num):localtime = data.iloc[i]["LocalTime"]#保证同一分钟数据时间戳相同,防止因为秒数不同后续认定为不同时间,将秒位置位00,方便后续处理localtime = localtime[:-2]+'00'#扫描到新的时间即新增时间,或者扫到最后一个数据if not (localtime in time_record) or i == (num-1):#新增时间time_record.append(localtime)#进入该分钟内for instrument in InsID:#tmp[instrument]为空if tmp[instrument] == list():opening = lastprice[instrument]high_p = 0low_p = 0closing = lastprice[instrument]#存在数据时else:opening = tmp[instrument][0]high_p = max(tmp[instrument])low_p = min(tmp[instrument])closing = tmp[instrument][-1]#将更新后的该分钟数据存入该合约的dataframenew = pd.DataFrame({"LocalTime": [time_record[-1]], 'Opening': [opening], 'Highest': [high_p], 'Lowest': [low_p], 'Closing': [closing]})result[instrument] = result[instrument].append(new)#存储完后进行重置,防止后续遍历中判断出错tmp[instrument] = list()ins = data.iloc[i]['InstrumentID']#如果成交量变化,证明发生过交易,则更新上次成交价if data.iloc[i]['Volume'] - prevolume[ins] > 0:tmp[ins].append(data.loc[i]['LastPrice'])#更新合约的数据lastprice[ins] = data.iloc[i]['LastPrice']prevolume[ins] = data.iloc[i]['Volume']print('***************************分钟bar已生成,正在写入xlsx***************************')#利用workbook接口将数据写入xlsxbook = Workbook()# 存储数据,每个合约对应一个sheetfor instrument in InsID:sheet = book.create_sheet(instrument)for row in dataframe_to_rows(result[instrument], index=False, header=True):sheet.append(row)#删除第一页sheetdel book["Sheet"]book.save("MinuteBar.xlsx")print('***************************分钟bar程序已完成***************************')return#本脚本可以被import到其他脚本中使用
if __name__ == '__main__':data_check()minute_bar_generator()

期货MinuteBarGenerator相关推荐

  1. 2022-2028年中国能源期货市场深度调研及投资前景预测报告

    [报告类型]产业研究 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了能源期货行业相关概述.中国能源期货行业运行环境.分析了中国能源期货行 ...

  2. 以太坊今日大涨7.5%,芝商所备战“以太坊期货”

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 据The Block报道,芝加哥商品交易所(CME)预计将于7月15日改变以太坊相关的参考利率和指数,消息人士称,这可能 ...

  3. BCH期货要来了?这家公司想让BCH成为第二大加密货币

    由加密传播者 Roger Ver 支持的 Bitcoin.com 公司正在研究多个想法,以提高人们对比特币现金的兴趣,包括期货合约. 该公司交易所部门负责人 David Shin 表示,其目标是使比特 ...

  4. js 点击最后一个 和倒数第二个_期货及期权品种的最后交易日,您都了解吗?...

    针对临近交割月份的合约,流动性会变差,交易所也会相应的提高保证金率,所以为了控制账户风险,在临近交割月份合约的最后交易日之前,及时自行完成移仓是很有必要的.那么持有临近交割月份合约的自然人客户应该在多 ...

  5. capdriverconnect 黑色_【中信期货黑色(动力煤)】港口库存低位,结构性矛盾突出——周报20201101...

    文:黑色建材组  本报告主要贡献人:李世朋 转自于中信期货黑色建材组 11月01日 周度报告 近期重点报告 20201030:建筑业需求高点将至,看好制造业继续向好--10月大宗商品宏观中观月报 20 ...

  6. 五矿期货携手神策数据,深耕数字化 5 大应用,加速金融科技创新增长

    经众多权威媒体公认的 "中国最佳期货公司"五矿期货,长久以来一直选择神策数据作为其金融科技创新应用的合作伙伴. 五矿期货经过二十余载的砥砺前行,已经成长为行业内具有较大影响力的期货 ...

  7. python应用于期货_Python期货量化交易基础教程(17)

    16.14.异步任务: 16.14.1.使用协程任务: 函数create_task()用来创建协程任务,并将任务加入事件循环以实现异步并发. wait_update()不能用在协程中,若在协程中等待业 ...

  8. 恒生证券期货行业用户维稳工作指引(一)

    恒生证券期货行业用户维稳工作指引<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office&quo ...

  9. 铁矿怎么来_铁矿期货今日创出新高908.5点 为何老有人错过行情

    铁矿期货01合约今日创出新高908.5点位,对于后市该如何分析今天我们来聊一聊: 为啥有人要做空铁矿 前段时间有人给我发信息说卖空了铁矿期货,而且还要补仓铁矿的空单,为何如何看待,我说铁矿的趋势还是向 ...

最新文章

  1. 影响网站权重的关键性因素有哪些?
  2. linux+离线+搜狗,Ubuntu离线安装Sogou拼音(附老版本安装)
  3. shell习题第6题:监听80端口
  4. Matlab看跌期权二叉树,欧式期权二叉树MATLAB程序
  5. 【数据结构与算法】顺序栈的Java实现
  6. 【Java从0到架构师】分布式框架通信核心基础 - 序列化(JDK、Protobuf)、远程过程调用 RMI
  7. NDCG、AUC介绍
  8. Selenium实现QQ空间说说自动点赞
  9. FLOPS和FLOPs、GFLOPs区别与计算
  10. Pycharm菜单栏消失,(File 、view消失)快速调出来的方法。(Professional Edition 2022版)
  11. 熊出没电锯机器人哪一集_熊出没伐木机器人第几集 熊出没光头强造伐木机器人是哪一集?...
  12. 【历史上的今天】2 月 23 日:英格玛密码机申请专利;戴尔电脑创始人出生;Mellanox 收购 EZchip
  13. DataMatrix 编码生成和译码原理即方法
  14. 刷题体验第一天——《录鼎记》第一章
  15. VISIO画出占满页面的PDF矢量图
  16. ng-model、ng-bind、ng-value使用区别
  17. MyHandler.h对消息accu的处理
  18. java背单词软件_求背英语单词的手机JAVA软件
  19. 国内的多语言网站主要体现在哪几方面
  20. 修改autor后面邮箱_最后冲刺!2020年国自然标书终极修改和形式审查要点!!!...

热门文章

  1. ecshop开发中首次登陆增加会员积分
  2. SP—FLASH—TOOL 报错的问题
  3. python 去除如下字符串中 的所有中括号
  4. 蔡高厅高等数学25-导数和差积的求导法则的证明
  5. C语言中如何转换汉中,行走,从汉中到刺桐
  6. 职场 | 2019届毕业生 银行,运营商,外企的笔面试经验(完结)
  7. win10系统托盘图标不见了_win10系统英特尔核芯显卡托盘图标不见了的图文办法...
  8. 中科大的AI图像/视频编解码综述
  9. 这份书单Java后端程序员必读,你读过几本呢
  10. 微信公众号(二)扩展分享