问题描述
解决方案
在PTrade策略中,所有的账户资金和持仓信息都存储在 context 对象中。具体来说,主要通过 context.portfolio 对象来获取。
以下是获取您所需信息的具体方法:
1. 获取当前可用现金
使用 context.portfolio.cash 可以获取当前账户的可用资金(不包含冻结资金)。
2. 获取持仓信息
使用 context.portfolio.positions 可以获取当前所有持仓的字典。
- 字典的键 (Key):是标的代码(例如
'600570.SS')。 - 字典的值 (Value):是
Position对象,包含了该标的的具体持仓详情。
3. 获取具体持仓数量和成本
对于每一个 Position 对象,可以通过以下属性获取详情:
.amount:总持仓数量。.cost_basis:持仓成本价格(通常是摊薄成本)。.enable_amount:可用数量(即可以卖出的数量,T+1制度下可能小于总持仓)。
代码示例
您可以将以下代码复制到您的策略中(例如放在 handle_data 或 after_trading_end 中)来查看账户详情:
def initialize(context):
# 这里设置股票池,仅作演示
g.security = '600570.SS'
set_universe(g.security)
def handle_data(context, data):
# 1. 获取当前可用现金
available_cash = context.portfolio.cash
log.info("当前可用现金: %s" % available_cash)
# 2. 获取所有持仓信息
# context.portfolio.positions 是一个字典
positions_dict = context.portfolio.positions
# 判断是否有持仓
if len(positions_dict) > 0:
log.info("当前持有以下股票:")
# 遍历持仓字典
for security_code, position_obj in positions_dict.items():
# 过滤掉持仓量为0的标的(虽然通常字典里只包含有持仓的,但加判断更稳健)
if position_obj.amount > 0:
# 股票代码
symbol = position_obj.sid
# 持仓数量
amount = position_obj.amount
# 持仓成本
cost = position_obj.cost_basis
# 可用数量
enable_amount = position_obj.enable_amount
log.info("股票: %s, 数量: %s, 成本: %s, 可卖数量: %s" % (symbol, amount, cost, enable_amount))
else:
log.info("当前为空仓状态")
补充说明:查询单只股票
如果您只想查询特定某一只股票的持仓情况,可以使用 get_position 函数,这样更直接:
# 获取特定股票的持仓对象
position = get_position('600570.SS')
if position.amount > 0:
log.info("恒生电子持仓数量: %s" % position.amount)
log.info("恒生电子持仓成本: %s" % position.cost_basis)
else:
log.info("未持有恒生电子")