问题描述
请教聚宽跑模拟策略的时候,每天的交易日志保存到文件里,怎么保存?代码如何写?保存路径如何?
解决方案
在聚宽(JoinQuant)平台上运行模拟策略时,如果希望将每天的交易日志或自定义信息保存到文件中,可以使用聚宽提供的专用 API:write_file。
1. 保存路径说明
使用 write_file(path, content, append=False) 保存的文件,默认路径位于您聚宽账号的「投资研究」模块的根目录下。也就是说,当策略执行写入操作后,您可以直接切换到聚宽的「投资研究」页面,在文件列表中找到并查看该文件。
2. 核心 API 介绍
write_file(path, content, append=False)
- path: 相对路径,相对于您的私有空间(投资研究)的根目录的路径,例如
'my_log.txt'。 - content: 需要写入的文件内容,必须是字符串(
str)格式。 - append: 是否为追加模式。保存日志时务必将其设置为
True,否则每次写入都会清空之前的内容。
3. 代码示例
通常,我们会在每天收盘后的 after_trading_end 函数中,获取当天的成交记录,并将其格式化为字符串追加保存到日志文件中。以下是完整的代码示例:
# 导入聚宽函数库
import jqdata
def initialize(context):
# 设定沪深300作为基准
set_benchmark('000300.XSHG')
# 开启动态复权模式(真实价格)
set_option('use_real_price', True)
# 每天买入一点平安银行作为测试交易
run_daily(market_open, time='09:30')
def market_open(context):
# 每天市价买入100股平安银行,用于产生交易记录
order('000001.XSHE', 100)
# 收盘后运行函数,用于处理和保存日志
def after_trading_end(context):
# 获取当天的所有成交记录
trades = get_trades()
# 获取当前日期字符串
current_date = context.current_dt.strftime('%Y-%m-%d')
# 初始化当天的日志内容
log_content = f"\n========== {current_date} 交易日志 ==========\n"
if not trades:
log_content += "今日无成交记录。\n"
else:
# 遍历当天的成交记录并格式化
for trade_id, trade in trades.items():
log_line = f"时间: {trade.time}, 标的: {trade.security}, 价格: {trade.price}, 数量: {trade.amount}, 订单号: {trade.order_id}\n"
log_content += log_line
# 将日志内容追加写入到投资研究根目录下的 'sim_trade_log.txt' 文件中
# 注意:append=True 表示追加写入,不会覆盖历史记录
write_file('sim_trade_log.txt', log_content, append=True)
# 在系统日志中也打印一条提示
log.info(f"{current_date} 的交易日志已成功保存至投资研究目录下的 sim_trade_log.txt")
4. 注意事项
- 追加模式:一定要记得加上
append=True参数,否则第二天写入时会把第一天的日志覆盖掉。 - 文件查看:策略运行后,前往聚宽导航栏的「投资研究」,即可看到
sim_trade_log.txt文件,双击即可查看或下载。 - 数据格式:
write_file的content参数只接受字符串。如果是字典或列表等复杂数据结构,请先使用json.dumps()或字符串拼接将其转换为字符串后再保存。