# 记录和日志

# 记录指标

记录自定义指标,用于回测结果展示和导出:

record(**kwargs)
get_recorded_data()
1
2

说明:

  1. record用于记录自定义指标。
  2. get_recorded_data用于获取已记录指标。

例如:

record(price=price, ma5=ma5, cash=context.portfolio.available_cash)
1

# 日志log

日志对象支持常用方法:

log.info("message")
log.warn("message")
log.error("message")

print(..., flush=True)
1
2
3
4
5

说明:

  • print远程 stdout 有缓冲,必须带flush,不可用sys

例如:

log.info("当前时间: %s", context.current_dt)
log.info("当前总资产: %s", context.portfolio.total_value)
1
2

# 全局变量

平台提供全局变量对象 g,用于保存用户自定义状态。

示例:

def init(context):
    g.stock = "000001.SZ"
    g.buy_count = 0


def handle_bar(context, bar_dict):
    if g.buy_count == 0:
        order(g.stock, 1000)
        g.buy_count += 1
1
2
3
4
5
6
7
8
9

建议:

  • 简单策略可以使用 context 保存变量。
  • 需要跨函数共享的变量可以使用 g
  • 不要覆盖系统字段,例如 context.portfoliocontext.run_info

# 查询运行态诊断

info = get_runtime_info()
print(info["run"]["symbols"])
print(info["execution"]["order_execution"])
1
2
3

get_runtime_info() 返回只读的 lambda-runtime-info/v1 字典,可在 init/handle_bar 内供策略和云平台排查。本接口不触发行情读取、不改变订单、持仓或回测执行状态。run_backtest/run_signal 返回后会将 active 置为 false;调用方必须先检查该字段,不能把残留诊断当作活动任务状态。

字段 说明
active / execution_mode 当前是否存在活动任务,以及 backtestsignal 执行模式
strategy_id / job_id 信号任务身份;普通回测未设置时为 null
run.symbols / run.universe_source / run.universe_finalized 当前股票池、来源和是否已定稿。回测和信号执行均在 init(context) 返回前保持候选状态;随后以 context.stock 定稿,universe_source 固定为 context.stock,后续回调中 universe_finalized=true
run.benchmark 实际生效基准,包含策略内 set_benchmark() 修改
run.current_datetime / previous_datetime 当前和上一根策略事件时间;未进入 bar 时为 null
execution 初始资金、执行价模式、延迟 bar、滑点、手续费、限量和未来数据策略
data.latest_bar_datetime / current_bars 当前已可见行情的最近时间及各标的当前收盘价快照
data.data_context SignalJob 预检后已有的数据来源诊断;普通回测或尚未预检时为 null