问题描述
/
解决方案
在 ptrade 量化交易平台中,order_target、order_value 和 order_target_value 等高级下单函数确实不支持国债逆回购交易。要实现逆回购的“全仓卖出”(即把账户所有可用资金用于参与逆回购),你需要手动计算可用资金所能购买的逆回购数量,并使用基础的 order 函数进行下单。
实现步骤
- 获取可用资金:通过
context.portfolio.cash获取当前账户的可用资金。 - 计算可交易张数:国债逆回购的面值为 100 元/张,且最低申购金额为 1000 元(即 10 张),步长也为 10 张。因此,需要将可用资金除以 100 计算出总张数,并向下取整到 10 的倍数。
- 使用 order 函数下单:逆回购的本质是借出资金,因此在 ptrade 中委托方向必须为卖出(即 amount 必须为负数)。
Python 代码示例
以下是一个在每天尾盘自动将所有可用资金进行深市 1 天期国债逆回购(131810.SZ)的策略示例:
def initialize(context):
# 设置逆回购标的,例如深市1天期逆回购
g.security = '131810.SZ'
set_universe(g.security)
# 设定每天 14:50 执行逆回购操作(交易场景下时间可根据券商配置调整)
run_daily(context, reverse_repo_all_cash, time='14:50')
def reverse_repo_all_cash(context):
# 1. 获取当前可用资金
available_cash = context.portfolio.cash
# 2. 计算可以申购的张数
# 逆回购面值100元/张,10张起步,必须是10的整数倍
# 计算最大可买张数
max_amount = int(available_cash / 100)
# 向下取整到10的倍数
trade_amount = (max_amount // 10) * 10
# 3. 判断是否满足最低申购门槛(10张)
if trade_amount >= 10:
# 逆回购委托方向为卖出,amount 必须为负数
order(g.security, -trade_amount)
log.info(f"全仓卖出逆回购 {g.security},数量:{-trade_amount}张,占用资金约:{trade_amount * 100}元")
else:
log.info(f"可用资金不足1000元,无法参与逆回购。当前可用资金:{available_cash}元")
def handle_data(context, data):
pass
注意事项
- 负数委托:在
order函数中,逆回购的amount必须传入负数(例如-10表示卖出 10 张)。 - 数量限制:逆回购最小申购金额为 1000 元(10 张),如果计算出的
trade_amount小于 10,会导致委托失败,因此必须进行>= 10的判断。 - 价格参数:如果不传入
limit_price,系统会默认使用行情快照的最新价(即当前的年化收益率)进行报单。如果需要指定收益率,可以传入limit_price参数(例如limit_price=2.5)。 - 精度问题:国债逆回购的价格精度通常为小数点后三位,如果使用限价单,请注意价格的精度处理。