3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在PTrade策略中,所有的账户状态、资金情况以及时间信息都存储在 context 对象中。您可以通过访问 context 下的 portfolio 和 blotter 属性来获取所需信息。
以下是具体的获取方法和代码示例:
context.portfolio)context.portfolio 对象包含了当前的资金状况和持仓汇总信息:
context.portfolio.cashcontext.portfolio.portfolio_valuecontext.portfolio.positions_valuecontext.portfolio.positions (这是一个字典,键为标的代码)context.blotter)context.blotter 对象用于记录时间和交易细节:
context.blotter.current_dt
datetime 对象。以下是一个完整的策略示例,展示了如何在 handle_data 中打印这些信息:
def initialize(context):
# 初始化股票池,这里以恒生电子为例
g.security = '600570.SS'
set_universe(g.security)
def handle_data(context, data):
# 1. 获取当前时间
# context.blotter.current_dt 是一个 datetime 对象
current_dt = context.blotter.current_dt
# 格式化时间字符串,方便阅读
time_str = current_dt.strftime("%Y-%m-%d %H:%M:%S")
# 2. 获取账户资金信息
# 可用资金
available_cash = context.portfolio.cash
# 账户总资产 (可用资金 + 持仓市值)
total_assets = context.portfolio.portfolio_value
# 持仓市值
market_value = context.portfolio.positions_value
# 累计收益率
returns = context.portfolio.returns
# 3. 打印日志信息
log.info("========================================")
log.info("当前时间: %s" % time_str)
log.info("可用资金: %.2f" % available_cash)
log.info("持仓市值: %.2f" % market_value)
log.info("账户总值: %.2f" % total_assets)
log.info("当前收益率: %.2f%%" % (returns * 100))
# 4. 获取具体某只股票的持仓数量 (如果有持仓)
position = get_position(g.security)
if position.amount > 0:
log.info("标的 %s 持仓数量: %d, 持仓成本: %.2f" % (g.security, position.amount, position.cost_basis))
log.info("========================================")
% 操作符或 .format() 方法,以确保在旧版本(如Python 3.5)环境中也能稳定运行。context.blotter.current_dt 返回的是 datetime.datetime 类型,您可以直接使用 .year, .month, .day, .hour 等属性来获取具体的时间单位,用于编写定时逻辑(例如:只在尾盘交易)。get_position(security_code) 函数,或者访问 context.portfolio.positions[security_code]。Q: context.portfolio.portfolio_value 和 context.portfolio.positions_value 有什么区别?
A: portfolio_value 是账户的总资产,等于“可用现金”加上“所有持仓的当前市值”。而 positions_value 仅仅是“所有持仓的当前市值”,不包含现金。
Q: 如何判断当前是否是回测环境还是交易环境?
A: 可以使用 is_trade() 函数。如果返回 True,表示当前在交易环境中运行;如果返回 False,表示在回测环境中运行。
Q: context.blotter.current_dt 在日线回测和分钟回测中有什么不同?
A: 在分钟级别回测中,current_dt 会随着每一分钟的K线推进而变化(例如 09:31, 09:32...)。在日线级别回测中,handle_data 通常在收盘时运行,current_dt 通常显示为当天的 15:00:00。