问题描述
解决方案
在 PTrade 的融资融券(两融)账户中,若要直接使用自有资金买入股票作为担保品,或者卖出持有的担保品股票,需要使用 margin_trade 函数。
该函数专门用于担保品买卖,区别于融资买入(margincash_open)和融券卖出(marginsec_open)。
核心函数说明
margin_trade(security, amount, limit_price=None, market_type=None)
- security: 股票代码(例如
'600570.SS')。 - amount: 交易数量。
- 正数 (+):代表担保品买入(使用自有资金买入)。
- 负数 (-):代表担保品卖出(卖出持仓股票换回资金)。
- limit_price: (可选)限价单的价格。如果不传且不传
market_type,默认以最新价限价委托。 - market_type: (可选)市价委托类型(如 2 代表本方最优价格,4 代表最优五档即时成交剩余撤销等)。
策略代码示例
以下是一个完整的策略示例,展示了如何在两融账户中进行担保品的买入和卖出操作。
def initialize(context):
"""
初始化函数,设置股票池和全局变量
"""
# 设置要操作的股票代码
g.security = '600570.SS'
# 设置股票池(虽然实盘主要看持仓,但设置universe是好习惯)
set_universe(g.security)
# 设置一个标志位,用于控制示例中的买卖逻辑
g.traded = False
def handle_data(context, data):
"""
盘中运行函数,每个周期(如每天或每分钟)运行一次
"""
# 获取当前股票的最新价
current_price = data[g.security]['close']
# 示例逻辑:仅执行一次
if not g.traded:
# ---------------------------------------------------
# 场景 1:担保品买入 (使用自有资金买入股票)
# ---------------------------------------------------
# 方式 A:限价买入 100 股,价格为当前价
log.info("开始担保品买入: %s" % g.security)
margin_trade(g.security, 100, limit_price=current_price)
# 方式 B:市价买入 100 股 (使用 market_type=2 本方最优)
# margin_trade(g.security, 100, market_type=2)
# ---------------------------------------------------
# 场景 2:担保品卖出 (卖出持仓股票)
# ---------------------------------------------------
# 注意:卖出时 amount 为负数
# 检查是否有持仓,避免卖空
position = get_position(g.security)
if position.amount >= 100:
log.info("开始担保品卖出: %s" % g.security)
# 限价卖出 100 股
margin_trade(g.security, -100, limit_price=current_price)
g.traded = True
def before_trading_start(context, data):
"""
盘前处理
"""
pass
def after_trading_end(context, data):
"""
盘后处理
"""
pass
注意事项
- 适用范围:
margin_trade仅在两融账号(信用账户)的交易环境或两融回测中有效。如果是普通股票账户,请使用order系列函数。 - 资金与持仓:
- 买入时,使用的是账户里的可用资金(自有资金),不会产生融资负债。
- 卖出时,卖出的是账户里的担保品持仓,获得的资金会优先偿还负债(如果有),剩余部分变为可用资金。
- 市价委托:如果使用市价委托(
market_type),请确保了解不同参数(如 0, 1, 2, 3, 4, 5)对应的具体市价策略(如五档即成剩撤、本方最优等),这与普通交易的order_market参数定义一致。
Q&A
Q1: 在两融账户里使用 order() 函数会发生什么?
A1: 在 PTrade 的两融交易模块中,通常建议使用专用的两融函数。虽然部分券商环境可能兼容 order() 映射为担保品买卖,但为了代码的明确性和避免歧义,强烈建议使用 margin_trade 来进行普通买卖,使用 margincash_open 进行融资买入,使用 marginsec_open 进行融券卖出。
Q2: margin_trade 买入的股票可以用来抵押融资吗?
A2: 可以。通过 margin_trade 买入的股票即成为您的担保品(Collateral)。系统会根据该股票的折算率自动计算您的保证金可用余额,从而增加您的融资融券额度。
Q3: 如何查询当前账户里有哪些股票可以作为担保品卖出?
A3: 您可以使用 get_position(security) 函数获取特定股票的持仓,或者使用 get_positions() 获取所有持仓。返回对象的 amount 属性即为总持仓数量,enable_amount 为可用数量。