news 2026/9/2 6:46:40

量化交易日志与监控系统搭建_实盘运维经验分享

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
量化交易日志与监控系统搭建_实盘运维经验分享

声明:本文为个人学习笔记,仅供技术交流,不构成任何投资建议。


一、前言

作为一个从业二十年的期货老兵,我深知实盘运维的重要性。策略写得再好,如果运维出问题,一样会亏钱。

今天这篇文章,我来分享一下量化交易日志与监控系统的搭建经验


二、为什么需要日志和监控?

作用说明
问题排查出问题时能快速定位原因
策略复盘记录交易决策过程
异常告警及时发现和处理异常
合规审计保留交易记录

三、日志系统设计

3.1 日志分类

日志类型内容级别
系统日志启动、连接、异常INFO/ERROR
交易日志下单、成交、持仓INFO
策略日志信号、计算过程DEBUG
风控日志风控触发、仓位调整WARNING

3.2 日志配置

importloggingfromlogging.handlersimportRotatingFileHandler,TimedRotatingFileHandlerfromdatetimeimportdatetimeimportosdefsetup_logging(log_dir='logs'):"""配置日志系统"""# 创建日志目录ifnotos.path.exists(log_dir):os.makedirs(log_dir)# 日志格式formatter=logging.Formatter('%(asctime)s | %(levelname)-8s | %(name)s | %(message)s',datefmt='%Y-%m-%d %H:%M:%S')# 根日志器root_logger=logging.getLogger()root_logger.setLevel(logging.DEBUG)# 1. 控制台输出console_handler=logging.StreamHandler()console_handler.setLevel(logging.INFO)console_handler.setFormatter(formatter)root_logger.addHandler(console_handler)# 2. 交易日志(按天切割)trade_handler=TimedRotatingFileHandler(os.path.join(log_dir,'trade.log'),when='midnight',interval=1,backupCount=30,encoding='utf-8')trade_handler.setLevel(logging.INFO)trade_handler.setFormatter(formatter)trade_logger=logging.getLogger('trade')trade_logger.addHandler(trade_handler)# 3. 错误日志error_handler=RotatingFileHandler(os.path.join(log_dir,'error.log'),maxBytes=10*1024*1024,# 10MBbackupCount=5,encoding='utf-8')error_handler.setLevel(logging.ERROR)error_handler.setFormatter(formatter)root_logger.addHandler(error_handler)returnroot_logger# 使用logger=setup_logging()trade_logger=logging.getLogger('trade')logger.info("系统启动")trade_logger.info("下单 | SHFE.rb2505 | BUY | OPEN | 1手 | 3850")

3.3 结构化日志

importjsonfromdatetimeimportdatetimeclassStructuredLogger:"""结构化日志记录器"""def__init__(self,log_file):self.log_file=log_filedeflog(self,event_type,**kwargs):"""记录结构化日志"""record={'timestamp':datetime.now().isoformat(),'event_type':event_type,**kwargs}withopen(self.log_file,'a',encoding='utf-8')asf:f.write(json.dumps(record,ensure_ascii=False)+'\n')deflog_order(self,symbol,direction,offset,volume,price):"""记录订单"""self.log('ORDER',symbol=symbol,direction=direction,offset=offset,volume=volume,price=price)deflog_trade(self,symbol,direction,price,volume,pnl):"""记录成交"""self.log('TRADE',symbol=symbol,direction=direction,price=price,volume=volume,pnl=pnl)deflog_signal(self,symbol,signal,reason):"""记录信号"""self.log('SIGNAL',symbol=symbol,signal=signal,reason=reason)# 使用示例slog=StructuredLogger('logs/structured.jsonl')slog.log_order('SHFE.rb2505','BUY','OPEN',1,3850)slog.log_signal('SHFE.rb2505','BUY','MA5上穿MA20')

四、监控系统设计

4.1 监控指标

指标说明阈值
账户权益实时权益-
日盈亏当日盈亏亏损>3%告警
持仓当前持仓超限告警
系统状态连接状态断线告警
延迟行情延迟>1秒告警

4.2 监控类实现

fromdatetimeimportdatetime,timeimportloggingclassTradingMonitor:"""交易监控器"""def__init__(self,config):self.config=config self.daily_start_balance=Noneself.last_heartbeat=datetime.now()self.logger=logging.getLogger('monitor')defon_day_start(self,balance):"""每日开始"""self.daily_start_balance=balance self.logger.info(f"交易日开始 | 初始权益:{balance:.2f}")defcheck_daily_pnl(self,current_balance):"""检查日盈亏"""ifself.daily_start_balanceisNone:returnTruepnl=current_balance-self.daily_start_balance pnl_pct=pnl/self.daily_start_balanceifpnl_pct<-self.config['daily_loss_limit']:self.logger.warning(f"日亏损告警 | 亏损:{pnl:.2f}({pnl_pct:.2%})")self.send_alert(f"日亏损告警:{pnl:.2f}({pnl_pct:.2%})")returnFalsereturnTruedefcheck_position(self,position,max_position):"""检查持仓"""total_pos=position.pos_long+position.pos_shortiftotal_pos>max_position:self.logger.warning(f"持仓超限 | 当前:{total_pos}上限:{max_position}")self.send_alert(f"持仓超限:{total_pos}/{max_position}")returnFalsereturnTruedefheartbeat(self):"""心跳检测"""self.last_heartbeat=datetime.now()defcheck_heartbeat(self,timeout_seconds=60):"""检查心跳"""elapsed=(datetime.now()-self.last_heartbeat).total_seconds()ifelapsed>timeout_seconds:self.logger.error(f"心跳超时 | 距上次心跳:{elapsed:.0f}秒")self.send_alert(f"策略心跳超时:{elapsed:.0f}秒")returnFalsereturnTruedefsend_alert(self,message):"""发送告警"""# 钉钉告警self.send_dingtalk(message)# 或微信告警# self.send_wechat(message)defsend_dingtalk(self,message):"""发送钉钉消息"""importrequests webhook=self.config.get('dingtalk_webhook')ifnotwebhook:returndata={"msgtype":"text","text":{"content":f"[量化告警]{message}"}}try:requests.post(webhook,json=data,timeout=5)exceptExceptionase:self.logger.error(f"钉钉发送失败:{e}")

4.3 定时报告

fromdatetimeimportdatetime,timeimportscheduleclassReportGenerator:"""报告生成器"""def__init__(self,api):self.api=apidefgenerate_daily_report(self):"""生成每日报告"""account=self.api.get_account()report=f""" ========== 每日报告 ========== 日期:{datetime.now().strftime('%Y-%m-%d')}账户权益:{account.balance:.2f}可用资金:{account.available:.2f}持仓盈亏:{account.position_profit:.2f}当日盈亏:{account.close_profit:.2f}================================ """logging.info(report)returnreportdefschedule_reports(self):"""设置定时报告"""# 每日收盘后发送报告schedule.every().day.at("15:30").do(self.generate_daily_report)# 每小时发送状态schedule.every().hour.do(self.send_status)# 在主循环中运行# schedule.run_pending()

五、完整监控系统示例

fromtqsdkimportTqApi,TqAuth,TqAccountimportloggingfromdatetimeimportdatetimeimportthreadingimporttime# 配置CONFIG={'broker':'期货公司','account':'资金账号','password':'密码','tq_user':'TQ账户','tq_pass':'TQ密码','symbol':'SHFE.rb2505','daily_loss_limit':0.03,'max_position':5,'dingtalk_webhook':'https://oapi.dingtalk.com/robot/send?access_token=xxx',}# 设置日志setup_logging()logger=logging.getLogger('main')# 初始化监控monitor=TradingMonitor(CONFIG)# 连接APIapi=TqApi(TqAccount(CONFIG['broker'],CONFIG['account'],CONFIG['password']),auth=TqAuth(CONFIG['tq_user'],CONFIG['tq_pass']))account=api.get_account()position=api.get_position(CONFIG['symbol'])# 初始化监控monitor.on_day_start(account.balance)logger.info("策略启动")# 主循环try:whileTrue:api.wait_update()# 心跳monitor.heartbeat()# 监控检查ifnotmonitor.check_daily_pnl(account.balance):logger.warning("触发日亏损限制")# 可以选择停止交易ifnotmonitor.check_position(position,CONFIG['max_position']):logger.warning("持仓超限")# 策略逻辑...exceptKeyboardInterrupt:logger.info("用户中断")exceptExceptionase:logger.error(f"异常:{e}")monitor.send_alert(f"策略异常:{e}")finally:api.close()logger.info("策略停止")

六、运维最佳实践

6.1 日志管理

  1. 日志分级:DEBUG/INFO/WARNING/ERROR
  2. 日志切割:按天或按大小切割
  3. 日志保留:保留30天以上
  4. 定期清理:避免磁盘满

6.2 监控告警

  1. 分级告警:不同级别不同处理
  2. 告警去重:避免重复告警
  3. 告警升级:持续告警升级通知
  4. 告警测试:定期测试告警通道

6.3 故障恢复

  1. 自动重连:网络断开自动重连
  2. 状态恢复:重启后恢复状态
  3. 数据备份:定期备份配置和日志

七、我的运维配置

组件选择
量化框架TqSdk
日志库Python logging
告警钉钉机器人
监控自建脚本
服务器阿里云ECS

选择TqSdk的原因是API简洁,容易集成日志和监控逻辑。


八、总结

量化交易运维的核心:

  1. 日志完善:记录所有关键信息
  2. 监控及时:异常第一时间发现
  3. 告警有效:告警信息准确、及时
  4. 定期复盘:分析日志优化策略

希望这篇文章对你有所帮助!


声明:本文基于个人学习经验整理,仅供技术交流参考,不构成任何投资建议。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/2 23:29:48

加注机远程监控智慧运维系统方案

行业背景加注机是一种实现流体&#xff08;如润滑油、润滑脂、制冷剂等&#xff09;‌定量输送‌的专用设备&#xff0c;对于保障机械设备正常运行、延长使用寿命、减少磨损及能耗具有至关重要的作用&#xff0c;广泛应用于汽车制造、机械加工、航空航天、交通运输等多个领域&a…

作者头像 李华
网站建设 2026/9/2 16:11:45

规范呼吸防护 守护石棉工肺部健康

石棉作为一种具备高强度、耐高低温等特性的矿物纤维&#xff0c;曾在多个工业领域得到广泛应用。然而&#xff0c;它已被明确列为一类人类致癌物。长期吸入石棉纤维会诱发石棉肺、肺癌、胸膜间皮瘤等严重疾病&#xff0c;且相关疾病潜伏期长、病情不可逆&#xff0c;对石棉工的…

作者头像 李华
网站建设 2026/9/2 21:56:13

PCB陶瓷基板从原料到出货的全流程追溯

PCB 陶瓷基板的质量直接决定电子设备的可靠性与寿命&#xff0c;尤其在车规、航空、功率半导体等高端场景&#xff0c;质量管控是供应商的核心竞争力。一套完善的质量管控体系&#xff0c;需覆盖原料采购、制程加工、检测验证、出货交付全流程&#xff0c;实现可追溯、可量化、…

作者头像 李华
网站建设 2026/9/3 1:45:02

技术解析 | 从 DAB 到 5G 广播:全球五大数字广播标准硬核技术全解(一)

摘要不止是参数对比。本文深挖 DAB、DRM、CDR 等五大标准的物理层架构差异&#xff0c;并针对 2026 年 5G 广播融合与中国DRM 落地等关键变局进行技术解读。引言在频谱资源日益稀缺与用户体验需求升级的双重驱动下&#xff0c;模拟广播向数字广播的演进已是定局。然而&#xff…

作者头像 李华
网站建设 2026/9/2 23:10:28

CNN的FLOPs:从理论计算到实战避坑指南

CNN的FLOPs&#xff1a;从理论计算到实战避坑指南 引言 在模型轻量化与部署成为焦点的今天&#xff0c;FLOPs作为衡量计算复杂度的核心指标&#xff0c;频繁出现在论文与工程报告中。然而&#xff0c;你是否曾疑惑&#xff1a;FLOPs低就一定代表模型快吗&#xff1f;为何有时优…

作者头像 李华