Python量化交易:回测交易接口
Posted 传智教育官方博客
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python量化交易:回测交易接口相关的知识,希望对你有一定的参考价值。
文章目录
学习目标:
了解购买股数、购买资金大小的几种交易方式
了解回测中的市价单和限价单
了解回测中的滑点设置
说明投资组合的定义
了解投资组合的市场价值和资金价值
那么当我们选好了股票之后,其实就可以选择购买或者卖出了。但是注意了这里所说的交易,是在历史数据当中回测的时候去每天判断交易。并不是后面的模拟交易或者实盘交易。
1、用于股票的交易函数
order_shares - 指定股数交易(股票专用)
order_lots - 指定手数交易(股票专用)
order_value - 指定价值交易(股票专用)
order_percent - 一定比例下单(股票专用)
order_target_value - 目标价值下单(股票专用)
更多详细内容参考:https://www.ricequant.com/api/python/chn#methods-implement-after-trading
1.1 交易函数API
1.1.1 order_shares - 指定股数交易(股票专用)
order_shares(id_or_ins, amount, style=MarketOrder())
落指定股数的买/卖单,最常见的落单方式之一。如有需要落单类型当做一个参量传入,如果忽略掉落单类型,那么默认是市价单(market order)。
参数
返回
Order对象
范例
购买Buy 2000 股的平安银行股票,并以市价单发送:
order_shares('000001.XSHE', 2000)
卖出2000股的平安银行股票,并以市价单发送:
order_shares('000001.XSHE', -2000)
购买1000股的平安银行股票,并以限价单发送,价格为¥10:
order_shares('000001.XSHE', 1000, style=LimitOrder(10))
1.1.2 order_target_value - 目标价值下单(股票专用)
order_target_value(id_or_ins, cash_amount, style=OrderType)
买入/卖出并且自动调整该证券的仓位到一个目标价值(暂不支持卖空)。如果还没有任何该证券的仓位,那么会买入全部目标价值的证券。如果已经有了该证券的仓位,则会买入/卖出调整该证券的现在仓位和目标仓位的价值差值的数目的证券。需要注意,如果资金不足,该API将不会创建发送订单。
参数
返回
Order对象
范例
如果现在的投资组合中持有价值¥3000的平安银行股票的仓位并且设置其目标价值为¥10000,以下代码范例会发送价值¥7000的平安银行的买单到市场。(向下调整到最接近每手股数即100的倍数的股数):
order_target_value('000001.XSHE', 10000)
1.1.3 order_target_percent - 目标比例下单(股票专用)
order_target_percent(id_or_ins, percent, style=OrderType)
买入/卖出证券以自动调整该证券的仓位到占有一个指定的投资组合的目标百分比(暂不支持卖空)。
其实我们需要计算一个position_to_adjust (即应该调整的仓位)
position_to_adjust = target_position - current_position
投资组合价值等于所有已有仓位的价值和剩余现金的总和。买/卖单会被下舍入一手股数(A股是100的倍数)的倍数。目标百分比应该是一个小数,并且最大值应该<=1,比如0.5表示50%。
如果position_to_adjust 计算之后是正的,那么会买入该证券,否则会卖出该证券。 需要注意,如果资金不足,该API将不会创建发送订单。
参数
返回
order对象
范例
如果投资组合中已经有了平安银行股票的仓位,并且占据目前投资组合的10%的价值,那么以下代码会买入平安银行股票最终使其占据投资组合价值的15%:
order_target_percent('000001.XSHE', 0.15)
1.2 交易注意事项
出现以下情况,我们的交易会被回测平台自动拒单
portfolio内可用资金不足
下单数量不足一手(股票为100股)
下单价格超过当日涨跌停板限制
当前可卖(可平)仓位不足
股票当日停牌
合约已经退市(到期)或尚未上市
1.3 何为市价单和限价单
撮合机制
我们加入了允许用户自定义撮合机制的功能。您可以在策略编辑页面"更多"选项下选择不同的撮合机制。目前提供的撮合方式有以下两种:
1.当前收盘价。即当前bar发单,以当前bar收盘价作为参考价撮合。
2.下一开盘价。即当前bar发单,以下一bar开盘价作为参考价撮合
市价单与限价单
1、限价单(LimitOrder)如果买单价格>=参考价,或卖单价格<=参考价,以参考价加入滑点影响成交(买得更高,卖得更低)。市价单(MarketOrder)直接以以参考价加入滑点影响成交。
2、成交数量都不超过当前bar成交量的25%。某一分钟成交量10000股,那么回测的时候我们做限制成交不能超过2500股 。一旦超过,市价单会在部分成交之后被自动撤单;限价单会一直在订单队列中等待下一个bar数据撮合成交,直到当日收盘。当日收盘后,所有未成交限价单都将被系统自动撤单。
拓展:需要注意,在当前的分钟回测撮合模式下,用户在回测中无法通过在scheduler调用的函数中一次性实现 卖出 -> 资金释放 -> 买入 这种先卖后买的逻辑的。因为在分钟回测中,卖出并不能立刻成交。
分钟回测及实盘模拟:在一个handle_bar内下单,在该handle_bar结束时统一撮合成交(成交价取决于撮合机制以及滑点设置)。
日回测:在一个handelbar内下单,下单时立刻撮合成交(成交价取决于撮合机制以及滑点设置)。
举例来说,策略A设置每周一开盘进行调仓操作,先卖后买。那么,以下这种方式在分钟回测中无法实现卖出资金立刻释放的(在开启验资的风控情况下,可能导致后面的买入操作因资金不足而拒单):
#scheduler调用的函数需要包括context, bar_dict两个参数
def rebalance(context, bar_dict):
order_shares('000001.XSHE', -100)
order_shares('601998.XSHG', 100)
def init(context):
scheduler.run_weekly(rebalance, weekday=1)
总结
为了更好模拟实际交易中订单对市场的冲击,我们引入滑点的设置。您可以在策略编辑页面"更多"选项下进行滑点设置,允许设置的范围是[0, 1)。该设置将在一定程度上使最后的成交价"恶化",也就是买得更贵,卖得更便宜。我们的滑点方式是按照最后成交价的一定比例进行恶化。例如,设置滑点为0.1,那么如果原本买入交易的成交价为10元,则设置之后成交价将变成11元,即买得更贵。
注:真是交易不需要
1.4 交易的费用
相关介绍参考:https://www.ricequant.com/api/python/chn#backtests-margin
一旦发生了交易,投资组合的资金就会发生变化!那么接下来要介绍的投资组合是什么?
以上是关于Python量化交易:回测交易接口的主要内容,如果未能解决你的问题,请参考以下文章
用Python编程借助现有量化平台编写股票交易策略和回测分析