问题描述
解决方案
在PTrade策略中,所有的账户状态、资金情况以及时间信息都存储在 context 对象中。您可以通过访问 context 下的 portfolio 和 blotter 属性来获取所需信息。
以下是具体的获取方法和代码示例:
1. 获取核心数据的属性
获取账户资金与持仓价值 (context.portfolio)
context.portfolio 对象包含了当前的资金状况和持仓汇总信息:
- 可用资金:
context.portfolio.cash - 账户总资产 (现金 + 持仓市值):
context.portfolio.portfolio_value - 持仓市值 (仅股票/证券价值):
context.portfolio.positions_value - 持仓详情:
context.portfolio.positions(这是一个字典,键为标的代码)
获取当前时间 (context.blotter)
context.blotter 对象用于记录时间和交易细节:
- 当前时间:
context.blotter.current_dt- 返回的是一个 Python
datetime对象。 - 在回测模式下,它是当前回测到的时间点。
- 在实盘模式下,它是系统的当前时间。
- 返回的是一个 Python
2. 代码实现示例
以下是一个完整的策略示例,展示了如何在 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("========================================")
3. 关键点说明
- Python版本兼容性:PTrade环境通常基于Python 3,但在处理字符串格式化时,建议使用
%操作符或.format()方法,以确保在旧版本(如Python 3.5)环境中也能稳定运行。 - 时间类型:
context.blotter.current_dt返回的是datetime.datetime类型,您可以直接使用.year,.month,.day,.hour等属性来获取具体的时间单位,用于编写定时逻辑(例如:只在尾盘交易)。 - 持仓对象:如果您需要获取特定股票的详细持仓(如成本价、可用数量),建议使用
get_position(security_code)函数,或者访问context.portfolio.positions[security_code]。
Q&A
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。