概述
在建立自己的量化策略回测系统之前,我们必须对策略回测中的一些接口有一定的了解.
API文档
交易函数
指定通达信行情接口格式,股票交易
order_shares-指定通达信行情接口格式,股票交易(股票专用)
落指定股数的买/卖单,最常见的落单方式之如有需要落单类型当做一个参量传入,如果忽略掉落单类型,那么默认是市价单(marketorder)
参数:
id_or_ins | str 或 instrument 对象 | order_book_id 或 symbol 或 instrument 对象,用户必须指定 |
amount | float-required | 需要落单的股数。正数代表买入,负数代表卖出。将会根据一手 xx 股来向下调整到一手的倍数,比如中国 A 股就是调整成 100 股的倍数。 |
style | OrderType | 订单类型,默认是市价单。目前支持的订单类型有: style=MarketOrder(), style=LimitOrder(limit_price) |
返回:
Order对象
范例:
购买Buy2000股的平安银行股票,并以市价单发送:
卖出2000股的平安银行股票,并以市价单发送:
购买1000股的平安银行股票,并以限价单发送,价格为¥10:
目标价值下单
order_target_value-目标价值下单(股票专用)
买入/卖出并且自动调整该证券的仓位到一个目标价值(暂不支持卖空).如果还没有任何该证券的仓位,那么会买入全部目标价值的证券.如果已经有了该证券的仓位,则会买入/卖出调整该证券的现在仓位和目标仓位的价值差值的数目的证券。需要注意,如果资金不足,该API将不会创建发送订单。
交易注意事项
拒单
出现以下情况,我们的交易会被回测平台自动拒单:
protfolio内可用资金不足下单数量不足一手(100股股票为一手)下单价格超过当然涨停跌停板限制当前可买(可卖)仓位不足股票当日停牌合约已经退市(到期)或尚未上市
市价vs限价
限价单(LimitOrder)如果买单价格>=参考价.或卖单价格<=参考价,以参考价加入滑点影响成交(买的更高,卖的更低).市价单(MarketOrder)直接以参考价加入滑点影响成交.
成数量都不能超过当前bar成交量的25%.比如某一分钟成交量10000股,那么回测的时候我们做限制成交不能超过2500股.一旦超过,市价单在部分成交之后被自动撤单.限价单会一直在订单队伍中等待下一个bar数据撮合成交,直到当日收盘.当日收盘后,所有未成交限价单都将被系统自动撤单.
为了更好的模拟实际交易中订单对市场的冲击,我们引入滑点的设置.您可以在策略编辑页面“更多”选项下进行滑点设置,允许设置的范围是[0,.该设置将在一定程度上使用最后的成交价“恶化”.也就是买的更贵,卖的更便宜.我们的滑点方式就是按照最后成交的一定比例进行恶化.例如,设置滑点为0.1,那么如果原本买入交易的成交价为10元,则设置之后成交价将变成11元.
注:真实交易不需要滑点.
交易的费用
投资组合
投资组合是由投资人或金融机构所持有的股票,债券,金融衍生品等组成的集合
查看投资组合信息
我们之前提到过一个context参数,这个参数中就包含了投资组合的信息.
context属性
now-当前时间
使用以上的方式就可以在handle_bar中拿到当前的bar的时间,比如daybar的花就是那天的时间,minutebar的话就是这一分钟的时间.
返回数据类型为datetimdatetime
portfolio-投资组合信息
该投资组合在单一股票或者期货策略中分别为股票投资组合和期货投资组合.在股票+期货的混合策略中代表汇总之后的总投资组合.
stock_account-股票资金账户信息
代码实现
def handle_bar(context, bar_dict):
# 开始编写你的主要的算法逻辑
# bar_dict[order_book_id] 可以拿到某个证券的bar信息
# context.portfolio 可以拿到现在的投资组合信息
# 使用order_shares(id_or_ins, amount)方法进行落单
# TODO: 开始编写你的算法吧!
# 购买股票
order_target_percent(context.s1, 0.1)
order_target_percent('000004.XSHE', 0.1)
# 资金, 仓位
print(context.stock_account)
print('-----------------------')
print(context.portfolio.positions.keys())
print(context.portfolio.positions[context.s1].quantity)
print('-----------------------')
print('投资组合的可用资金为', context.portfolio.cash)
print('投资组合的市场价值为',context.portfolio.market_value)
print('投资组合的总价值为', context.portfolio.total_value)
文章为作者独立观点,不代表股票交易接口观点