问题描述
解决方案
在PTrade策略运行中,所有的账户资金和持仓汇总信息都存储在 context.portfolio 对象中。您可以通过访问该对象的不同属性来实时获取您所需的各项数据。
以下是获取总资产、可用现金、持仓市值和累计收益率的具体方法:
1. 获取方式详解
在 handle_data、before_trading_start 或 after_trading_end 等函数中,通过传入的 context 参数访问 portfolio 对象:
-
总资产 (Total Assets):
使用context.portfolio.portfolio_value。
含义:当前持有的标的市值与现金的总和。 -
可用现金 (Available Cash):
使用context.portfolio.cash。
含义:当前账户中可用于买入的资金(不包含挂单冻结的资金)。 -
持仓市值 (Market Value of Positions):
使用context.portfolio.positions_value。
含义:当前持有的所有标的的总市值。 -
累计收益率 (Cumulative Returns):
使用context.portfolio.returns。
含义:相对于初始资金的当前收益比例(例如 0.15 代表 15%)。
2. 代码示例
以下是一个完整的策略示例代码,展示了如何在盘中实时打印这些信息:
def initialize(context):
# 初始化设置,这里设置一支股票作为示例
g.security = '600570.SS'
set_universe(g.security)
def handle_data(context, data):
# 1. 获取总资产
total_assets = context.portfolio.portfolio_value
# 2. 获取可用现金
available_cash = context.portfolio.cash
# 3. 获取持仓市值
market_value = context.portfolio.positions_value
# 4. 获取累计收益率
total_returns = context.portfolio.returns
# 打印日志查看结果
log.info("========== 账户实时状态 ==========")
log.info("总资产: %.2f" % total_assets)
log.info("可用现金: %.2f" % available_cash)
log.info("持仓市值: %.2f" % market_value)
log.info("累计收益率: %.2f%%" % (total_returns * 100))
# 简单的交易逻辑示例:有现金就买入
if available_cash > 10000:
order_value(g.security, 10000)
3. 补充说明
- 浮动盈亏 (PnL): 如果您需要获取当前的浮动盈亏金额,可以使用
context.portfolio.pnl。 - 已用资金: 如果需要查看已被占用的资金(包括持仓占用),可以使用
context.portfolio.capital_used。 - 单只股票持仓: 如果需要获取特定股票的持仓详情(如持仓数量、成本价),请使用
get_position(security)接口或访问context.portfolio.positions[security]。
Q&A
Q: context.portfolio.cash 获取的资金包含冻结资金吗?
A: 不包含。context.portfolio.cash 指的是当前可用资金。如果您下了单但尚未成交,这部分资金会被冻结,不会包含在 cash 中,直到撤单或成交后状态变更。
Q: context.portfolio.returns 是如何计算的?
A: 它是基于策略的初始资金计算的。公式大致为:(当前总资产 - 初始资金) / 初始资金。
Q: 如何获取单只股票的持仓盈亏?
A: 可以通过 get_position('股票代码').long_pnl(多头浮动盈亏)来获取单只标的的盈亏情况。
Q: 这些数据在回测和实盘中是一样的吗?
A: 接口调用方式是一样的。但在实盘交易中,资金和持仓信息的同步依赖于柜台推送或查询,通常会有极短的延迟(秒级),而回测中数据是即时结算的。