问题描述
解决方案
在 PTrade 中,要在下单前判断某只股票是否可以进行融资买入(即是否为融资标的),可以使用 get_margincash_stocks() 接口。
该接口会返回当前市场上所有可融资买入的标的列表。您只需要判断目标股票代码是否存在于该列表中即可。
实现步骤
- 获取融资标的列表:调用
get_margincash_stocks()获取所有可融资股票代码的列表。 - 判断资格:使用 Python 的
in关键字判断您的目标股票代码是否在该列表中。 - 执行交易:如果判断为 True,则使用
margincash_open进行融资买入;否则不操作或打印提示。
策略代码示例
以下是一个完整的策略示例,展示了如何在每日交易开始前获取融资标的列表,并在盘中判断指定股票是否可融资买入。
def initialize(context):
# 设置我们要操作的股票,例如恒生电子
g.security = '600570.SS'
# 设置股票池
set_universe(g.security)
def before_trading_start(context, data):
# 获取当前市场上所有的融资标的列表
# 建议在盘前获取一次,避免在handle_data中频繁调用接口
g.margin_cash_stocks = get_margincash_stocks()
if g.margin_cash_stocks:
log.info("成功获取融资标的列表,数量:%s" % len(g.margin_cash_stocks))
else:
log.warn("未获取到融资标的列表,请检查账户权限或回测设置")
def handle_data(context, data):
# 获取目标股票代码
target_stock = g.security
# 1. 判断是否为融资标的
# 注意:g.margin_cash_stocks 是一个列表,包含如 ['600570.SS', '000001.SZ', ...]
if target_stock in g.margin_cash_stocks:
log.info("股票 %s 是融资标的,准备进行融资买入" % target_stock)
# 2. 检查是否已持仓(防止重复下单,仅作示例逻辑)
position = get_position(target_stock)
if position.amount == 0:
# 3. 下单:融资买入 100 股
# 注意:融资买入需使用 margincash_open 接口
margincash_open(target_stock, 100)
log.info("融资买入下单成功")
else:
log.info("股票 %s 不是融资标的,无法进行融资买入" % target_stock)
注意事项
- 账户类型:此功能仅在**融资融券(两融)**账户或回测模式下有效。如果是普通股票账户,调用此接口可能会返回空或报错,且无法执行
margincash_open。 - 数据更新:融资标的名单可能会调整,建议在
before_trading_start中每日更新一次列表。 - 代码后缀:PTrade 中的股票代码包含后缀(如
.SS或.SZ),get_margincash_stocks()返回的列表也包含后缀,比对时请确保格式一致。
Q&A
Q: get_margincash_stocks() 接口在回测中可以使用吗?
A: 可以。在回测模式下,该接口会返回回测日期当时交易所披露的融资标的列表,避免了使用未来数据。
Q: 如果我想判断股票是否可以“融券卖出”,应该用哪个接口?
A: 判断融券卖出资格,请使用 get_marginsec_stocks() 接口,它返回的是可融券标的列表。
Q: 融资买入下单时,可以使用普通的 order() 函数吗?
A: 不可以。融资买入必须使用 margincash_open() 函数。普通的 order() 函数使用的是自有资金买入(担保品买入)。