问题描述
解决方案
在PTrade量化交易引擎中,handle_data 是处理盘中交易逻辑的核心必选函数。它在交易时间内按指定的周期频率(日线或分钟线)运行。该函数接收两个重要参数:context 和 data。
1. context 参数
context 是一个 Context对象,用于存放当前的账户及持仓等全局上下文信息。通过它,你可以获取策略运行时的各种状态。
主要包含的内容:
context.portfolio: 账户信息对象(Portfolio),包含当前可用资金(cash)、持仓总价值(positions_value)、总权益(portfolio_value)等。context.portfolio.positions: 当前持仓字典,key为标的代码,value为Position对象(包含持仓量、成本价等)。context.blotter.current_dt: 当前单位时间的开始时间(datetime对象),可用于获取当前回测或交易的精确时间。context.previous_date: 前一个交易日。
2. data 参数
data 是一个 字典(dict),用于存放当前周期(日线策略为当天,分钟策略为这一分钟)的行情数据。
主要特点与结构:
- Key: 标的代码(如
'600570.SS')。 - Value:
SecurityUnitData对象,包含该标的在当前周期的基础行情数据。 - 包含的属性:
dt(时间)、open(开盘价)、close(收盘价)、price(最新价)、high(最高价)、low(最低价)、volume(成交量)、money(成交额)。 - 注意: 为了加速,
data中的数据只包含通过set_universe设置的股票池中所订阅标的的信息。你可以通过data[security]['close']的方式快速获取某个标的的当前收盘价。
代码示例
以下是一个简单的示例,展示如何在 handle_data 中使用这两个参数:
def initialize(context):
g.security = '600570.SS'
set_universe(g.security)
def handle_data(context, data):
# 1. 使用 data 参数获取当前价格
current_price = data[g.security]['close']
log.info('当前时间: %s, 最新价格: %s' % (context.blotter.current_dt, current_price))
# 2. 使用 context 参数获取当前可用资金
available_cash = context.portfolio.cash
# 3. 使用 context 参数获取当前持仓
current_position = context.portfolio.positions.get(g.security, None)
amount = current_position.amount if current_position else 0
# 简单的交易逻辑:如果有资金且未持仓,则买入
if available_cash > current_price * 100 and amount == 0:
order(g.security, 100)
log.info('买入100股 %s' % g.security)
掌握 context 和 data 的使用,是编写PTrade量化策略的基础。