您的位置:首页 > 其它

股票日内回转交易策略(附源码)

2018-06-07 14:13 141 查看

什么是日内交易?

​ 日内交易(Day Trade)是一种交易模式。主要是指持仓时间短,不留过夜持仓的交易方式。日内交易捕捉入市后能够马上脱离入市成本的交易机会,入市之后如果不能马上获利,就准备迅速离场。因为这种交易方式在市时间短,所以承受的市场波动的风险较低。目前,全球范围内有一些操盘高手采用此交易方式取得稳定的盈利,获得了成功。

日内策略在中国市场可行吗?

​ 与国外市场不同,我国股票市场现阶段施行“T+1”交易,在这个基础上的“T+0”操作,必须是有底仓的高抛低吸。

​ 但凡在日内交易上经验丰富且有很高胜率的选手,在持股期,都会对日内交易拥有极高的兴趣,交易频次也会比较高。以上表述已经暗含了一个隐藏的前提:必须是当天不准备卖出者才能做T,否则会为了几个点的微小价差而得不偿失。

​ 日内交易因为其快速了结和价差较小的特点,交易者盈利的首要条件即为一个交易来回的价差大于交易成本。按照当前券商普遍采用的佣金标准万三计算,一个完整交易轮回的摩擦成本略小于0.2%,从这点看,低佣金使得日内交易的盈利变得相对容易。根据我自身的交易经验,只要参与者对单次盈利预期合理且在介入时间点上不至太过偏离,均能在长久的做T生涯中获得不菲的正收益。

策略实现(基于掘金量化平台

策略思想

  • 本策略首先买入“SHSE.600000”股票10000股。

  • 根据300s的数据来计算“MACD(12,26,9)”线。

  • “MACD”水下金叉,配合均线多头排列的时候买入1000股,“MACD”水上死叉,配合均线空头排列的时候卖出1000股。

  • 每日操作的股票数不超过原有仓位,并于收盘前把仓位调整至开盘前的仓位。

策略主要步骤实现

订阅数据

[code]subscribe(symbols=symbols, frequency='300s', count=35, wait_group=True)
(symbols=symbols, frequency='300s', count=35, wait_group=True)[/code]

​ 订阅数据需要在定义

init
函数里面设置,并调用
subscribe
函数:

  • symbols
    需要设置订阅的标的代码。

  • frequency
    需设置订阅数据的周期级别,这里设置
    1d
    表示以一天为周期。

  • count
    需要设置获取的bar的数量

数据获取

[code]recent_data = context.data(symbol=symbol, frequency='300s', count=35, fields='close')
= context.data(symbol=symbol, frequency='300s', count=35, fields='close')[/code]

​ 订阅数据之后,需要获取已经订阅的数据来进行操作,这时需调用

context.data
函数:

  • symbols
    需要设置订阅的标的代码。

  • frequency
    需设置订阅数据的周期级别,这里设置
    1d
    表示以一天为周期。

  • count
    需要设置获取的bar的数量

  • fields
    需要设置返回值的种类

获取当前bar的时间

[code]def on_bar(context, bars):
   bar = bars[0]
   day = bar.bob.strftime('%Y-%m-%d %H:%M:%S')
on_bar(context, bars):    bar = bars[0]    day = bar.bob.strftime('%Y-%m-%d %H:%M:%S')[/code]

​ 在

on_bar
函数里,需要判断当前
bar
是否为当天交易的最后一根,以判断是否平仓,这里可直接过去传入
bar
的信息。

参数名 类型 说明
symbol str 标的代码
frequency str 频率
open float 开盘价
close float 收盘价
high float 最高价
low float 最低价
amount float 成交额
volume float 成交量
position long 持仓量
pre_close float 前收盘价
bob datetime.datetime bar开始时间
eob datetime.datetime bar结束时间

回测报告

分析

​ 我们选取了2016年1月至2016年7月作为回测周期,保利地产(600048)作为标的股票,可以看出:

  • 胜率(具有盈利的平仓次数与总平仓次数之比)达到了46%,当然,您可以根据需要,制定别的高胜率的开平仓条件。

  • 卡玛比率(年化收益率与历史最大回撤之比)是使用最大回撤率来衡量风险。采用最大回撤率来衡量风险,关注的是最极端的情况。卡玛比率越高表示策略承受每单位最大损失获得的报酬越高。在这里卡玛比率达到了1.4。

  • 夏普比率(年化收益率减无风险收益率的差收益波动率之比)达到0.78。

  • 策略收益曲线与标的股票收益具有很大相关性,日内交易的关键点在于手续费的控制,在提高胜率的同时,尽量提高盈亏比,使得平仓的价差收益大于手续费的损耗。

 

股票日内回转交易策略源码:

 

  1. # coding=utf-8
  2. from __future__ import print_function, absolute_import, unicode_literals
  3. try:
  4. import talib
  5. except:
  6. print('请安装TA-Lib库')
  7. from gm.api import *
  8.  
  9. '''
  10. 本策略首先买入SHSE.600000股票10000股
  11. 随后根据60s的数据来计算MACD(12,26,9)线,并在MACD>0的时候买入100股,MACD<0的时候卖出100股
  12. 但每日操作的股票数不超过原有仓位,并于收盘前把仓位调整至开盘前的仓位
  13. 回测数据为:SHSE.600000的60s数据
  14. 回测时间为:2017-09-01 08:00:00到2017-10-01 16:00:00
  15. '''
  16.  
  17.  
  18. def init(context):
  19. # 设置标的股票
  20. context.symbol = 'SHSE.600000'
  21. # 用于判定第一个仓位是否成功开仓
  22. context.first = 0
  23. # 订阅浦发银行, bar频率为1min
  24. subscribe(symbols=context.symbol, frequency='60s', count=35)
  25. # 日内回转每次交易100股
  26. context.trade_n = 100
  27. # 获取昨今天的时间
  28. context.day = [0, 0]
  29. # 用于判断是否触发了回转逻辑的计时
  30. context.ending = 0
  31.  
  32.  
  33. def on_bar(context, bars):
  34. bar = bars[0]
  35. if context.first == 0:
  36. # 最开始配置仓位
  37. # 需要保持的总仓位
  38. context.total = 10000
  39. # 购买10000股浦发银行股票
  40. order_volume(symbol=context.symbol, volume=context.total, side=PositionSide_Long,
  41. order_type=OrderType_Market, position_effect=PositionEffect_Open)
  42. print(context.symbol, '以市价单开多仓10000股')
  43. context.first = 1.
  44. day = bar.bob.strftime('%Y-%m-%d')
  45. context.day[-1] = day[-2:]
  46. # 每天的仓位操作
  47. context.turnaround = [0, 0]
  48. return
  49.  
  50. # 更新最新的日期
  51. day = bar.bob.strftime('%Y-%m-%d %H:%M:%S')
  52. context.day[0] = bar.bob.day
  53. # 若为新的一天,获取可用于回转的昨仓
  54. if context.day[0] != context.day[-1]:
  55. context.ending = 0
  56. context.turnaround = [0, 0]
  57. if context.ending == 1:
  58. return
  59.  
  60. # 若有可用的昨仓则操作
  61. if context.total >= 0:
  62. # 获取时间序列数据
  63. symbol = bar['symbol']
  64. recent_data = context.data(symbol=symbol, frequency='60s', count=35, fields='close')
  65. # 计算MACD线
  66. macd = talib.MACD(recent_data['close'].values)[0][-1]
  67. # 根据MACD>0则开仓,小于0则平仓
  68. if macd > 0:
  69. # 多空单向操作都不能超过昨仓位,否则最后无法调回原仓位
  70. if context.turnaround[0] + context.trade_n < context.total:
  71. # 计算累计仓位
  72. context.turnaround[0] += context.trade_n
  73. order_volume(symbol=context.symbol, volume=context.trade_n, side=PositionSide_Long,
  74. order_type=OrderType_Market, position_effect=PositionEffect_Open)
  75. print(symbol, '市价单开多仓', context.trade_n, '股')
  76. elif macd < 0:
  77. if context.turnaround[1] + context.trade_n < context.total:
  78. context.turnaround[1] += context.trade_n
  79. order_volume(symbol=context.symbol, volume=context.trade_n, side=PositionSide_Short,
  80. order_type=OrderType_Market, position_effect=PositionEffect_Close)
  81. print(symbol, '市价单平多仓', context.trade_n, '股')
  82. # 临近收盘时若仓位数不等于昨仓则回转所有仓位
  83. if day[11:16] == '14:55' or day[11:16] == '14:57':
  84. position = context.account().position(symbol=context.symbol, side=PositionSide_Long)
  85. if position['volume'] != context.total:
  86. order_target_volume(symbol=context.symbol, volume=context.total, order_type=OrderType_Market,
  87. position_side=PositionSide_Long)
  88. print('市价单回转仓位操作...')
  89. context.ending = 1
  90. # 更新过去的日期数据
  91. context.day[-1] = context.day[0]
  92.  
  93.  
  94. if __name__ == '__main__':
  95. '''
  96. strategy_id策略ID,由系统生成
  97. filename文件名,请与本文件名保持一致
  98. mode实时模式:MODE_LIVE回测模式:MODE_BACKTEST
  99. token绑定计算机的ID,可在系统设置-密钥管理中生成
  100. backtest_start_time回测开始时间
  101. backtest_end_time回测结束时间
  102. backtest_adjust股票复权方式不复权:ADJUST_NONE前复权:ADJUST_PREV后复权:ADJUST_POST
  103. backtest_initial_cash回测初始资金
  104. backtest_commission_ratio回测佣金比例
  105. backtest_slippage_ratio回测滑点比例
  106. '''
  107. run(strategy_id='strategy_id',
  108. filename='main.py',
  109. mode=MODE_BACKTEST,
  110. token='token_id',
  111. backtest_start_time='2017-09-01 08:00:00',
  112. backtest_end_time='2017-10-01 16:00:00',
  113. backtest_adjust=ADJUST_PREV,
  114. backtest_initial_cash=2000000,
  115. backtest_commission_ratio=0.0001,
  116. backtest_slippage_ratio=0.0001)

文章来源:掘金量化交易平台 ,转载请注册出处!

 

----------------------------------------------------------------------------------------------------------------------------------------------------------

更多经典股票/期货量化策略源码查看:

1 双均线策略(期货)  量化策略源码 https://www.myquant.cn/docs/python_strategyies/153
2 alpha对冲(股票+期货)  量化策略源码 https://www.myquant.cn/docs/python_strategyies/101
3 集合竞价选股(股票) 量化策略源码 https://www.myquant.cn/docs/python_strategyies/102
4 多因子选股(股票)  量化策略源码 https://www.myquant.cn/docs/python_strategyies/103
5 网格交易(期货)  量化策略源码 https://www.myquant.cn/docs/python_strategyies/104
6 指数增强(股票)  量化策略源码 https://www.myquant.cn/docs/python_strategyies/105
7 跨品种套利(期货)量化策略源码 https://www.myquant.cn/docs/python_strategyies/106
8 跨期套利(期货) 量化策略源码 https://www.myquant.cn/docs/python_strategyies/107
9 日内回转交易(股票)量化策略源码 https://www.myquant.cn/docs/python_strategyies/108
10 做市商交易(期货) 量化策略源码 https://www.myquant.cn/docs/python_strategyies/109
11 海龟交易法(期货) 量化策略源码 https://www.myquant.cn/docs/python_strategyies/110
12 行业轮动(股票) 量化策略源码 https://www.myquant.cn/docs/python_strategyies/111
13 机器学习(股票) 量化策略源码 https://www.myquant.cn/docs/python_strategyies/112
阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: