问题描述
我想要编写一个融资融券策略,请问如何用代码实现融资买入和融券卖出?
解决方案
在PTrade中,融资融券(两融)交易有专门的API接口。与普通买卖不同,两融交易需要区分是“融资买入”还是“融券卖出”。
以下是具体的代码实现方式及说明:
核心函数说明
-
融资买入 (Long/Leveraged Buy)
- 函数:
margincash_open(security, amount, limit_price=None, market_type=None) - 说明: 向券商借钱买入股票。
- 参数:
security: 股票代码(如 '600519.SS')。amount: 买入数量(必须为正整数,通常为100的倍数)。limit_price: (可选) 限价价格。如果不传,默认使用最新价。
- 函数:
-
融券卖出 (Short Sell)
- 函数:
marginsec_open(security, amount, limit_price=None) - 说明: 向券商借股票卖出(做空)。
- 参数:
security: 股票代码。amount: 卖出数量(必须为正整数)。limit_price: (可选) 限价价格。
- 函数:
完整策略示例代码
以下代码展示了一个简单的策略:在初始化时设置标的,在盘中检查最大可买/可卖数量,并执行融资买入和融券卖出操作。
def initialize(context):
# 设置要操作的标的,这里以贵州茅台为例
g.security = '600519.SS'
# 设置股票池
set_universe(g.security)
# 设置一个标志位,防止在示例中重复下单
g.traded = False
def handle_data(context, data):
# 如果已经交易过,则不再执行
if g.traded:
return
# ---------------------------------------------------
# 1. 融资买入示例
# ---------------------------------------------------
# 查询该标的当前最大可融资买入数量
# 返回的是一个字典,key是股票代码,value是数量
cash_open_info = get_margincash_open_amount(g.security)
max_cash_buy = cash_open_info.get(g.security, 0)
log.info("最大可融资买入数量: %s" % max_cash_buy)
# 如果额度足够,买入100股
if max_cash_buy >= 100:
# 下单:融资买入 100股
margincash_open(g.security, 100)
log.info("执行融资买入: %s, 数量: 100" % g.security)
else:
log.info("融资额度不足,无法买入")
# ---------------------------------------------------
# 2. 融券卖出示例
# ---------------------------------------------------
# 查询该标的当前最大可融券卖出数量
sec_open_info = get_marginsec_open_amount(g.security)
max_sec_sell = sec_open_info.get(g.security, 0)
log.info("最大可融券卖出数量: %s" % max_sec_sell)
# 如果额度足够,卖出100股
if max_sec_sell >= 100:
# 下单:融券卖出 100股
marginsec_open(g.security, 100)
log.info("执行融券卖出: %s, 数量: 100" % g.security)
else:
log.info("融券券源不足,无法卖出")
# 标记为已交易
g.traded = True
注意事项
- 账户权限:该代码仅在两融账号(信用账户)的交易环境或支持两融的回测环境中有效。如果在普通股票账户运行会报错或无效。
- 标的限制:并非所有股票都支持融资融券。可以使用
get_margincash_stocks()获取融资标的列表,使用get_marginsec_stocks()获取融券标的列表。 - 查询额度:在实盘中,直接下单可能会因为额度不足或券源不足而失败。建议在下单前调用
get_margincash_open_amount(查询可融资数量)或get_marginsec_open_amount(查询可融券数量)进行检查。 - 平仓操作:
- 融资买入的平仓操作是 卖券还款,使用函数
margincash_close(security, amount)。 - 融券卖出的平仓操作是 买券还券,使用函数
marginsec_close(security, amount)。
- 融资买入的平仓操作是 卖券还款,使用函数