量化入门 - JoinQuant入门学习1
下单相关的API
参考连接:https://www.joinquant.com/view/community/detail/3c7c9e987e011d531cf81222c83f7925
order(security, amount,...)
下单指定股数
股票示例
- order('000001.XSHE',100)
买进100股平安银行
- order('000001.XSHE',-100)
卖出100股平安银行,如果没有仓位,会有相关的warning
- order('000001.XSHE',99)
下单数不足一手,调整为0股,订单取消,返回None,会有相关的warning
期货示例
- order('IF1901',10,side='long')
开多10手IF1901 默认side='long',所以当开多仓或者平多仓时可以不指定side
- order('IF1901',-5,side='short')
平空5手IF1901,如果空仓仓位不足5手,则平掉所有空仓,有相关warning
order_target(security, amount, ...)
调整指定股票到指定股数
股票示例(假设下单前已经持有了平安银行500股且全部可平仓):
- order_target('000001.XSHE',700)
调整平安银行的持股数至700股,也就是再买入200股平安银行
- order_target('000001.XSHE',200)
调整平安银行的持股数至200股,也就是卖出300股平安银行
- order_target('000001.XSHE',500)
目标数量已满足,不再调整
- 注:
当value为0时,即时有不足100股的股票,也会全部进行平仓
期货示例(假设下单前已经持有了IF1901空单5手,多单3手)
- order_target('IF901.CCFX',2,side='long')
调整多单仓位至2手,之前已经有3手多单,所以平掉一手多单
- order_target('IF901.CCFX',7,side='short')
调整空单仓位至7手,之前已经有5手空单,所以在开2手空单
- order_target('IF901.CCFX',5,side='short')
空单仓位数量已经满足,不再调整,不会创建order对象,返回None,会有相关日志输出
order_value(security, value, ....)
下单指定金额用来购买指定股票,遵循向下取整原则。
股票示例(假设平安银行下单时最新价为10元):
- order_value('000001.XSHE',10000)
10000/10 = 1000股 ,买入平安银行1000股
- order_value('000001.XSHE',750)
7500/10 = 750股,调整为700股,买入平安银行700股
- order_value('000001.XSHE',999)
999/10 = 99.9股,调整为0股,不会创建order对象,返回None,会有相关日志输出
- order_value('000001.XSHE',-2000)
-2000/10 = -200 股,等同于order('000001.XSHE',-200)
order_target_value(security, value, ...)
下单让仓位指定到指定的金额,会自动计算来价格来控制持仓。
股票示例(假设目前已持有平安银行500股且全部可平仓,下单时最新价为10元):
- order_target_values('000001.XSHE',10000)
10000/10 = 1000股,也就是再买入500股平安银行
- order_target_values('000001.XSHE',5000)
5000/10 = 500股,目标数量已满足,不会创建order对象,返回None,会有相关日志输出
- order_target_values('000001.XSHE',5999)
5999/10 = 599.9股,调整为500股,目标数量已满足,不会创建order对象,返回None,会有相关日志输出
- order_target_values('000001.XSHE',3550)
3550/10 = 355股,应当卖出145股,调整为100股,卖出100股平安银行
- 注:
当value为0时,即时有不足100股的股票,也会全部进行平仓
关于order/trader对象以及订单处理
参考链接:https://www.joinquant.com/view/community/detail/2ecedbc451f8345c2aefdc11fcd0d1a6
订单处理
从委托到成交的流程:
- 订单创建->订单检查->报单->确认委托->撮合,在订单检查时未通过则订单取消;
- 非交易时间下单会等待交易时间再进行撮合,每天16:00对所有未完成订单信息进行撤销(期货交易所将夜盘归于下一个交易日)
Order下单后,持仓/可用资金变化情况
- 所有市价单下单之后同步完成(也即 order_XXX 系列函数返回时完成), context.portfolio 会同步变化。
- 限价单,下单之后 context.portfolio.available_cash 和 context.portfolio.positions 不会同步变化 ,以order StockOrder出现的时间为准。
- 无论市价单还是限价单,买入时仓位资金会同步变化(如果已下单,未成交,会冻结对应的资金到locked_cash),卖出时每产生一个Trade对象(交易)账户资金同步变化一次。
交易函数
下限价单指定style=LimitOrderStyle(目标价位) 即可, 买入时不能高于目标价位, 卖出时不能低于目标价位, 如果不满足, 则等待满足后再交易,注意股票的交易单位为每手100股。
下单失败可以查看日志中对应时间点的warning,有详细说明
下单可能的失败原因:
- 标的数量经调整后变成0 (请看下面的说明)。
- 标的停牌。
- 标的成交量不足以交易(涨停,跌停等)。
- 标的未上市或者退市。
- 标的不存在。
- 为股票、基金开了空单。
- 选择了不存在的仓位号,如没有建立多个仓位,而设定pindex的数大于0。
注意,下单如果是废单,那么返回值是None,所以不能打印Order订单的实际数据。
交易订单会遵循的原则
- 卖出时会根据您持有股票的数量来限制您卖出的数量。
- 我们会遵守A股交易规则: 每次交易数量只能是100的整数倍, 但是卖光所有股票时不受这个限制。
- 在下单时会根据您当前的可用资金,成交量等对下单股数进行调整。
- 您在触发下单信息时自己打印的成交记录(信息)并不是特别可靠,请以实际结果及日志信息为准,系统会在每天16:00取消所有未完成交易(撤单),查询get_orders(status=OrderStatus.canceled)需要在16点至17点之间查询。
Order对象
重点注意:每天17点聚宽会对order对象进行归类,17点之后在调取get_orders获取的order对象就是属于第二天的订单,那么在get_orders获取当天的订单的时候就会出现错误
get_orders会返回一个Order对象,里面是UserOrder对象的值
UserOrder({'status': open, 'style': LimitOrderStyle: _limit_price=7.58, 'order_id': 1536135521, 'price': 0.0, 'pindex': 0, 'amount': 100, 'action': u'open', 'security': '000001.XSHE', 'side': u'long', 'filled': 0, 'add_time': datetime.datetime(2016, 6, 1, 9, 30)})
OrderStatus对象
-
通过 order对象.status 获取到的结果是一个枚举对象。
-
如果想查询状态是否是某种状态,需要获取具体的属性或者和status对象直接进行比较。
-
由于(回测/模拟)16点会撤销未完成订单,17点后通过get_orders等获取的order对象归属于下一交易日,所以查询时需要注意这两个时间点。
# 盘后获取当天未完成的订单(包括盘后自动撤销的限价单)
def func(context): #16:00之后,17点之前运行
order_dict = get_orders(status = OrderStatus.canceled)
获取trader中的信息
## 收盘后运行函数
def after_market_close(context):
#得到当天所有成交记录
trades = get_trades()
# 循环去打印出每一单的成交记录
for _trade in trades.values():
log.info('成交记录:'+str(_trade))
print('-'*50)
聚宽投资研究使用
参考连接:https://www.joinquant.com/view/community/detail/34426b055bc8600cba6abec85d164ea5
其实聚宽的投资研究环境使用的Jupyter,本地安装Anaconda环境都会去自动安装Jupyter,提供了非常方便的python实时运行环境,方便做数据分析研究。聚宽的研究模块支持以下功能
- 每个Cell独立运行,实时查看结果;
- 支持使用matplotlib/seaborn等Python库画各种统计图;
- 支持Markdown和代码混排,可读性更好;
- Notebook支持分享到社区,方便与大家交流;
常用的快捷键(命令模式下)
![ image-20210728164850268.png常用的快捷键(编辑模式下)
快捷键总结
两种模式
- 编辑模式 (默认,Enter 键启)
- 命令行模式(按键esc)
编辑模式
- Tab : 代码补全或缩进
- Shift-Tab : 提示
- ctrl-/:注释
- Ctrl-A : 全选
- Ctrl-Z : 复原
- Ctrl-Home : 跳到单元开头
- Ctrl-Up : 跳到单元开头
- Ctrl-End : 跳到单元末尾
- Ctrl-Down : 跳到单元末尾
- Ctrl-Delete : 删除后面一个字
- Shift-Enter : 运行本单元,选中下一单元
- Ctrl-Enter : 运行本单元
- Alt-Enter : 运行本单元,在下面插入一单元
- Ctrl-S : 文件存盘
- Up : 光标上移或转入上一单元
- Down :光标下移或转入下一单元
- Esc : 进入命令模式
命令行模式
- Shift-Enter : 运行本单元,选中下个单元
- Ctrl-Enter : 运行本单元
- Alt-Enter : 运行本单元,在其下插入新单元
- Y : 单元转入代码状态
- M :单元转入markdown状态
- R : 单元转入raw状态
- 1 : 设定 1 级标题
- 2 : 设定 2 级标题
- 3 : 设定 3 级标题
- Up : 选中上方单元
- K : 选中上方单元
- Down : 选中下方单元
- J : 选中下方单元
- Shift-K : 扩大选中上方单元
- Shift-J : 扩大选中下方单元
- A : 在上方插入新单元
- B : 在下方插入新单元
- X : 剪切选中的单元
- C : 复制选中的单元
- Shift-V : 粘贴到上方单元
- V : 粘贴到下方单元
- Z : 恢复删除的最后一个单元
- D,D : 删除选中的单元
- Shift-M : 合并选中的单元
- S : 文件存盘
- L : 转换行号
- H : 显示快捷键帮助
- I,I : 中断Notebook内核
- 0,0 : 重启Notebook内核
- Enter : 转入编辑模式