PDF下载 下载

算法交易

阅读 8101

算法交易介绍

掘金算法交易采用云服务算法模式,相比策略级算法交易或者本地算法交易有以下特点:

  • 行情/交易延迟小,委托任务的拆单算法在券商专有机房执行,专线行情+内网极速柜台接入
  • 算法可靠,服务级经典算法模型,tick级盘口分析,并提供多项控制参数
  • 运行稳定,执行过程的母单(原始委托任务)、子单(算法根据原始委托任务自动拆解的可执行委托)、回报实时推送到本地

基本规则

  • 算法交易工具仅支持股票交易
  • 部分终端版本无算法交易,以实际有算法交易的实盘为准
  • 算法交易自动拆解的子单等同于普通委托
  • 算法交易自动拆解的子单全部为限价单,且会在终端委托列表内同步显示
  • 算法交易仅管理维护本次任务算法拆解的子单,而不会参考其他等同条件下的其他单

算法适用

  • 适用于母单订单量较大的各类程序化、手工交易场景及其他频繁换仓的用户;母单执行时间大于半小时以上的交易执行,效果更加显著

算法限制

  • 如股票出现临时停牌或涨跌停时,有不能完整完成客户委托数量的可能
  • 用户当日委托的交易金额过大时,可能受到市场流动性不足的影响从而降低算法运行的效果,建议母单量不超过指定交易时段内预期成交量的15%

下单面板

算法交易下单版

点击算法交易(如果版本支持算法交易),则弹出算法交易面板,如图

算法名称:下拉选择可供使用的算法名称,不同的算法应用于不同的交易需求,后续会不断增加算法模型

  • TWAP算法:时间条件优先,能够较高效率的完成拆单任务,用于对时间要求比较高的算法委托任务
  • VWAP算法:市场成交量条件优先,能够更充分的考虑当前市场流动情况,算法决策自由度较大,较高效率避免瞬时冲击成本,用于大单量且价格敏感的算法委托任务
  • ATS-SMART算法:根据用户委托交易特征,通过对市场高频数据的实时分析和处理,利用程序化分析动态选择最优算法执行用户委托。具有高完成度,高稳定性,高隐蔽性,低敞口等特点,在不同持仓风格场景下,中长期均体现出稳定超越TWAP/VWAP基准的效果

TWAP算法和VWAP算法参数

开始时间:策略开始执行的时间(剔除非交易时间段)。如果开始时间早于策略下达时间点时,则使用下达时间作为开始时间
结束时间:策略停止执行的时间(剔除非交易时间段)。过了结束时间还未完成的数量,将会自动释放到指令。算法执行的区间段,时间越短,任务执行强度(委托频率和单笔委托量)越高
量比比例:策略的成交数量与策略执行期间市场的总成交量(不包括策略执行之前和结束之后的市场成交量)之比。对于跟量和跟价策略,量比比例参数是作为目标比例来参考;而对于其它策略,是作为上限来控制
委托最小金额:控制子单单笔委托的最小金额 该参数只适用于股票。A股单位为元
基准价格:算法模型的参考基准价格,子单限价单价格不能超过该价格的不利价位方向;当填入价格为0时,则不设置基准价

ATS-SMART算法参数

开始时间(P1):策略开始执行的时间(剔除非交易时间段)。如果开始时间早于策略下达时间点时,则使用下达时间作为开始时间
结束参考时间(P2): 结束参考时间,和结束时间一致
结束时间(P3):策略停止执行的时间(剔除非交易时间段)。过了结束时间还未完成的数量,将会自动释放到指令。算法执行的区间段,时间越短,任务执行强度(委托频率和单笔委托量)越高
结束时间是否有效:算法在结束时间是否有效,如设为无效,则以收盘时间为结束时间
涨停时是否停止卖出:标的在涨停时是否需要停止卖出
跌停时是否撤单:标的在跌停时是否需要撤单
最小交易金额:控制子单单笔委托的最小金额 该参数只适用于股票。A股单位为元
基准价格:此算法不生效

注意:p3必须晚于p2,p2必须晚于p1,交易时长必须大于3分钟,不得晚于14:55,交易数据不应该早于当前时间

任务列表

算法交易任务列表记录了母单任务列表及子单列表

算法交易任务列表

撤销母单:算法服务会进行撤销操作,撤销当前任务并取消所有未结子单
暂停母单:算法服务处于暂停状态,不再进行子单拆解(ATS-SMART算法不生效)
撤销子单:子单的独立撤销并不属于算法交易范畴,需要在普通委托的未结委托处进行撤销

交易接口

algo_order 算法单委托

get_algo_orders 查询算法母单

algo_order_cancel 撤销算法母单

algo_order_pause 暂停或启动算法母单(ATS-SMART算法不支持)

get_algo_child_orders 查询算法母单的所有子单

on_algo_order_status 算法单状态事件

注意:仅实盘支持算法单, 点击蓝色字体可获取接口具体用法
接口适用于:python、C++、C#

示例

TWAP算法和VWAP算法

  1. # coding=utf-8
  2. from gm.api import *
  3. from gm.model import DictLikeAlgoOrder
  4. from gm.pb.account_pb2 import AlgoOrder
  5. from datetime import timedelta
  6. """
  7. 算法单新增api在 sdk 的 gm.api.trade.py 文件里, 有如下函数, 具体函数签名可点进去看api文档
  8. algo_order
  9. algo_order_cancel
  10. algo_order_pause
  11. get_algo_child_orders
  12. get_algo_orders
  13. 增加的算法单的状态常量
  14. AlgoOrderStatus_Unknown = 0
  15. AlgoOrderStatus_Resume = 1 # 恢复母单
  16. AlgoOrderStatus_Pause = 2 # 暂停母单
  17. AlgoOrderStatus_PauseAndCancelSubOrders = 3 # 暂停母单并撤子单
  18. algo_param算法参数
  19. start_time str 开始时间
  20. end_time str 结束时间
  21. part_rate flaot 量比比例 (0 ~ 1)
  22. min_amount int 委托最小金额
  23. """
  24. # TWAP算法和VWAP算法示例, 仅接口使用示例
  25. def init(context):
  26. time = (context.now + timedelta(seconds=3)).strftime('%H:%M:%S')
  27. schedule(schedule_func=algo, date_rule='1d', time_rule=time)
  28. def algo(context):
  29. # 算法名
  30. algo_name = 'twap'
  31. # 算法参数格式如下
  32. algo_param = {'start_time': '14:00:00','end_time': '16:00:00','part_rate': 0.5, 'min_amount': 1000}
  33. symbol = 'SHSE.600008'
  34. # 基准价, 算法母单需要是限价单
  35. price = current(symbol)[0]['price']
  36. aorder = algo_order(symbol=symbol, volume=2000, side=OrderSide_Buy, order_type=OrderSide_Buy,
  37. position_effect=PositionEffect_Open, price=price, algo_name=algo_name, algo_param=algo_param)
  38. # 提取算法单的 cl_ord_id 委托客户端ID, 用于其它api的查询, 或者撤单时用
  39. context.algo_order_id = aorder[0]['cl_ord_id']
  40. # 暂停或重启或者撤销算法母单
  41. # aorders = get_algo_orders(account='')
  42. # # 暂停订单,修改订单结构的母单状态字段 algo_status为1 恢复母单, 2 暂停母单, 3 暂停母单并撤子单
  43. # alorders01 = [{'cl_ord_id': aorders[0]['cl_ord_id'], 'account_id': aorders[0]['account_id'], 'algo_status': 3}]
  44. # algo_order_pause(alorders01)
  45. # 撤销指定cl_ord_id的算法母单
  46. # aorders = get_algo_orders(account='')
  47. # wait_cancel_orders = [{'cl_ord_id': aorders[0]['cl_ord_id'], 'account_id': aorders[0]['account_id']}]
  48. # algo_order_cancel(wait_cancel_orders)
  49. def on_order_status(context, order):
  50. # 算法子单已成
  51. if order['status'] == 3:
  52. # 查询指定cl_ord_id算法母单的所有子单
  53. child_order = get_algo_child_orders(context.algo_order_id, account='')
  54. print('算法子单: child_order ={}'.format(child_order))
  55. def on_algo_order_status(context, algo_order):
  56. # type: (Context, DictLikeAlgoOrder) -> NoReturn
  57. """
  58. 算法单状态事件. 参数algo_order为算法单的信息
  59. 响应算法单状态更新事情,下算法单后状态更新时被触发
  60. 3.0.125 后增加.
  61. """
  62. print('算法单状态变化: algo_order={}'.format(algo_order))
  63. # 算法母单已报
  64. if algo_order['status'] == 1:
  65. # 查询算法母单, 默认账户account填空
  66. aorders = get_algo_orders(account='')
  67. print('算法母单: aorders ={}'.format(aorders))
  68. if __name__ == '__main__':
  69. '''
  70. strategy_id策略ID,由系统生成
  71. filename文件名,请与本文件名保持一致
  72. mode实时模式:MODE_LIVE回测模式:MODE_BACKTEST
  73. token绑定计算机的ID,可在系统设置-密钥管理中生成
  74. backtest_start_time回测开始时间
  75. backtest_end_time回测结束时间
  76. backtest_adjust股票复权方式不复权:ADJUST_NONE前复权:ADJUST_PREV后复权:ADJUST_POST
  77. backtest_initial_cash回测初始资金
  78. backtest_commission_ratio回测佣金比例
  79. backtest_slippage_ratio回测滑点比例
  80. '''
  81. run(strategy_id='strategy_id',
  82. filename='main.py',
  83. mode=MODE_LIVE,
  84. token='token',
  85. backtest_start_time='2020-11-02 08:00:00',
  86. backtest_end_time='2020-11-02 16:00:00',
  87. backtest_adjust=ADJUST_PREV,
  88. backtest_initial_cash=10000000,
  89. backtest_commission_ratio=0.0001,
  90. backtest_slippage_ratio=0.0001)

ATS-SMART算法示例

  1. # coding=utf-8
  2. from gm.api import *
  3. from gm.model import DictLikeAlgoOrder
  4. from gm.pb.account_pb2 import AlgoOrder
  5. from datetime import timedelta
  6. """
  7. 算法单新增api在 sdk 的 gm.api.trade.py 文件里, 有如下函数, 具体函数签名可点进去看api文档
  8. algo_order
  9. algo_order_cancel
  10. algo_order_pause
  11. get_algo_child_orders
  12. get_algo_orders
  13. start_time str 开始时间
  14. end_time_referred str 结束参考时间(不能超过14:55:00)
  15. end_time str 结束时间(不能超过14:55:00)
  16. end_time_valid int 结束时间是否有效,如设为无效,则以收盘时间为结束时间, 1为有效, 0为无效
  17. stop_sell_when_dl int 涨停时是否停止卖出, 1为是,0为否
  18. cancel_when_pl int 跌停时是否撤单, 1为是, 0为否
  19. min_trade_amount int 最小交易金额
  20. """
  21. # ATS-SMART算法示例, 仅接口使用示例
  22. def init(context):
  23. time = (context.now + timedelta(seconds=3)).strftime('%H:%M:%S')
  24. schedule(schedule_func=algo, date_rule='1d', time_rule=time)
  25. def algo(context):
  26. # 算法名
  27. algo_name = 'ATS-SMART'
  28. # 算法参数格式如下
  29. algo_param = {'start_time': '13:00:00', 'end_time_referred': '14:55:00', 'end_time': '14:00:00', 'end_time_valid': 1, 'stop_sell_when_dl': 1,
  30. 'cancel_when_pl': 0, 'min_trade_amount': 100000}
  31. symbol = 'SHSE.600008'
  32. # 基准价, 算法母单需要是限价单
  33. price = current(symbol)[0]['price']
  34. aorder = algo_order(symbol=symbol, volume=2000, side=OrderSide_Buy, order_type=OrderSide_Buy,
  35. position_effect=PositionEffect_Open, price=price, algo_name=algo_name, algo_param=algo_param)
  36. # 提取算法单的 cl_ord_id 委托客户端ID, 用于其它api的查询, 或者撤单时用
  37. context.algo_order_id = aorder[0]['cl_ord_id']
  38. # 撤销指定cl_ord_id的算法母单
  39. # aorders = get_algo_orders(account='')
  40. # wait_cancel_orders = [{'cl_ord_id': aorders[0]['cl_ord_id'], 'account_id': aorders[0]['account_id']}]
  41. # algo_order_cancel(wait_cancel_orders)
  42. def on_order_status(context, order):
  43. # 算法子单已成
  44. if order['status'] == 3:
  45. # 查询指定cl_ord_id算法母单的所有子单
  46. child_order = get_algo_child_orders(context.algo_order_id, account='')
  47. print('算法子单: child_order ={}'.format(child_order))
  48. def on_algo_order_status(context, algo_order):
  49. # type: (Context, DictLikeAlgoOrder) -> NoReturn
  50. """
  51. 算法单状态事件. 参数algo_order为算法单的信息
  52. 响应算法单状态更新事情,下算法单后状态更新时被触发
  53. 3.0.125 后增加.
  54. """
  55. print('算法单状态变化: algo_order={}'.format(algo_order))
  56. # 算法母单已报
  57. if algo_order['status'] == 1:
  58. # 查询算法母单, 默认账户account填空
  59. aorders = get_algo_orders(account='')
  60. print('算法母单: aorders ={}'.format(aorders))
  61. if __name__ == '__main__':
  62. '''
  63. strategy_id策略ID,由系统生成
  64. filename文件名,请与本文件名保持一致
  65. mode实时模式:MODE_LIVE回测模式:MODE_BACKTEST
  66. token绑定计算机的ID,可在系统设置-密钥管理中生成
  67. backtest_start_time回测开始时间
  68. backtest_end_time回测结束时间
  69. backtest_adjust股票复权方式不复权:ADJUST_NONE前复权:ADJUST_PREV后复权:ADJUST_POST
  70. backtest_initial_cash回测初始资金
  71. backtest_commission_ratio回测佣金比例
  72. backtest_slippage_ratio回测滑点比例
  73. '''
  74. run(strategy_id='3acc8b6e-af54-11e9-b2de-00163e0a4100',
  75. filename='main.py',
  76. mode=MODE_LIVE,
  77. token='2c4e3c59cde776ebc268bf6d7b4c457f204482b3',
  78. backtest_start_time='2020-11-02 08:00:00',
  79. backtest_end_time='2020-11-02 16:00:00',
  80. backtest_adjust=ADJUST_PREV,
  81. backtest_initial_cash=10000000,
  82. backtest_commission_ratio=0.0001,
  83. backtest_slippage_ratio=0.0001)
0 篇笔记