3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 ptrade 平台中,前端界面展示的日志通常是与当前策略进程绑定的。当你修改参数并点击“重启策略”时,系统会销毁旧的策略进程并启动一个新进程。为了节省服务器存储空间和保证界面加载速度,旧进程的控制台日志往往会被系统自动清理。这对于需要长期回溯实盘表现的量化交易者来说,确实是一个痛点。
既然平台前端的日志不可靠,我们可以利用 Python 原生的文件操作能力,结合 ptrade 提供的 get_research_path() 接口,将关键日志直接写入到研究环境的磁盘中。这样,无论策略如何重启,日志文件都会安全地保存在你的个人目录下,随时可以下载导出。
你可以编写一个自定义的日志函数,在调用 ptrade 自带的 log.info() 的同时,将内容追加写入到本地的 .txt 或 .csv 文件中。
import datetime
import os
def initialize(context):
g.security = '600570.SS'
set_universe(g.security)
# 获取研究路径,用于持久化保存文件
g.log_path = get_research_path() + 'my_strategy_log.txt'
write_custom_log("策略启动/重启,初始化完成")
def write_custom_log(content):
"""
自定义日志写入函数,同时输出到控制台和本地文件
"""
# 1. 调用系统日志在界面显示
log.info(content)
# 2. 写入本地文件持久化
try:
now_str = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
log_line = f"[{now_str}] {content}\n"
with open(g.log_path, 'a', encoding='utf-8') as f:
f.write(log_line)
except Exception as e:
log.error(f"写入本地日志失败: {e}")
def handle_data(context, data):
current_price = data[g.security]['close']
if current_price > 50:
order(g.security, 100)
write_custom_log(f"触发买入条件,买入 {g.security} 100股,当前价格 {current_price}")
logging 模块ptrade 的 log 对象本身就是基于 Python 的 logging 模块封装的。你可以直接配置一个 FileHandler,让所有的日志自动输出到文件中。
import logging
import os
def setup_file_logger():
# 获取研究路径
log_dir = get_research_path()
log_file = os.path.join(log_dir, 'strategy_persistent.log')
# 获取 ptrade 的根 logger
logger = logging.getLogger()
# 检查是否已经添加过 FileHandler,避免重复添加
has_file_handler = any(isinstance(h, logging.FileHandler) for h in logger.handlers)
if not has_file_handler:
file_handler = logging.FileHandler(log_file, mode='a', encoding='utf-8')
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
logger.setLevel(logging.INFO)
def initialize(context):
setup_file_logger()
log.info("策略初始化,日志已配置为持久化保存到研究目录。")
g.security = '600570.SS'
set_universe(g.security)
def handle_data(context, data):
log.info("正常记录日志,这条信息不仅会在界面显示,还会保存在文件中。")
对于几个月才看一次的策略,除了保存日志,更重要的是在发生异常时能及时收到通知。ptrade 提供了 set_email_info 接口,可以在策略异常终止时发送邮件。
def initialize(context):
# 设置邮件信息 (需咨询券商当前环境是否支持)
set_email_info("your_email@qq.com", "your_smtp_code", "【PTrade量化-策略异常提醒】")
log.info("邮件报警配置完成")
get_research_path() 后,你可以随时进入 ptrade 的“研究”模块(Jupyter Notebook 环境),找到对应的日志文件并下载到本地电脑,再也不用担心重启策略导致数据丢失了。log_2023_10.txt),方便后续管理和导出。