策略研究集竞选股(源)

原 【策略研究】集合竞价选股(附源码)

什么是集合竞价?有什么用途?

​ 所谓集合竞价就是在当天还没有开盘之前,你可根据前一天的收盘价和对当日股市的预测来输入股票价格,在集合竞价时间里输入计算机主机的所有下单,按照价格优先和时间优先的原则计算出最大成交量的价格,这个价格就会是集合竞价的成交价格,而这个过程被称为集合竞价。

​ 每天开盘价在技术分析上具有重要的意义,目前世界各国股市市场均采用集合竞价的方式来确定开盘价,因为这样可以在一定程度上防止人为操纵现象。

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

策略思想

  • 获取沪深300的成份股数据,并统计其30天内开盘价大于前收盘价的天数,并在该天数大于阈值18的时候加入股票池。

  • 对不在股票池的股票平仓,并等权配置股票池的标的股票,每次交易间隔1个月。

策略主要步骤实现

获取当前交易日日期

now = context.now = context.now

​ 直接调用context.now函数,返回“datetime.datetime”格式

获取上一交易日日期

last_day = get_previous_trading_date(exchange='SHSE', date=now) = get_previous_trading_date(exchange='SHSE', date=now)

​ 获取上一交易日可调用get_previous_trading_date函数,返回值为字符串格式:

  • exchang需要设置交易市场代码。

  • date需要设置指定日期。

获取当天有交易的股票

    not_suspended_info = get_history_instruments(symbols='SHSE.000300', start_date=now, end_date=now)
    not_suspended_symbols = [item['symbol'] for item in not_suspended_info if not item['is_suspended']]not_suspended_info = get_history_instruments(symbols='SHSE.000300', start_date=now, end_date=now)
    not_suspended_symbols = [item['symbol'] for item in not_suspended_info if not item['is_suspended']]

​ 获取当天有交易的股票,即非停牌的股票,首先需获取停牌信息,这里需调用get_history_instruments函数,返回值类型为list[dict],之后就是将所提取的“字典”转换为”list“:

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

  • start_dateend_date需设置获取成分股的开始与结束日期,这里需要调成上一交易日以获取上一交易日的成分股信息。

固定月初调仓

schedule(schedule_func=algo, date_rule='1m', time_rule='09:40:00')(schedule_func=algo, date_rule='1m', time_rule='09:40:00')

​ 固定时间调仓可使用schedule函数进行定时任务配置:

  • schedule_func为调用的策略函数的名称。

  • date_rule可设为1m(一月)。

  • time_rule为开仓日的开仓时间,这里设为每月第一个交易日的09:40:00

获取沪深300成分股

stock300 = get_history_constituents(index='SHSE.000300', start_date=last_day,end_date=last_day)[0]['constituents'].keys() = get_history_constituents(index='SHSE.000300', start_date=last_day,end_date=last_day)[0]['constituents'].keys()

​ 获取指数成分股可调用函数get_history_constituents或者get_constituents,返回值类型为list[dict],这里调用get_history_constituents是因为再回测时需要获取上一交易日的成分股,而get_constituents只能获取最新的成分股:

  • index需要设置获取指数的代码。

  • start_dateend_date需设置获取成分股的开始与结束日期,这里需要调成上一交易日以获取上一交易日的成分股信息。

获取过去交易日的历史信息

return_index_his = history_n(symbol=symbol, frequency='1d', count=30, fields='close,preclose',fill_missing='Last', adjust=ADJUST_PREV, end_time=last_day, df=True) = history_n(symbol=symbol, frequency='1d', count=30, fields='close,preclose',fill_missing='Last', adjust=ADJUST_PREV, end_time=last_day, df=True)

​ 获取历史信息需要调用histor_n函数,默认返回值为“字典“格式,如果参数df设为True,则返回"dataframe"格式

  • symbol设置所需获取的标的代码。

  • frequency获取历史信息的频率,如日线数据设置为1d

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

  • fileds设置返回值的种类。

  • fill_missing需要设置对于空值的填充方式, None- 不填充,NaN- 用空值填充, Last- 用上一个值填充,默认 None

  • adjust需要设置对于复权的处理,ADJUST_NONE or 0: 不复权, ADJUST_PREV or 1: 前复权, ADJUST_POST or 2: 后复权, 默认不复权。

  • end_time需设置获取历史信息的结束时间。

获取持仓信息

positions = context.account().positions() = context.account().positions()

​ 在判断平仓条件时,需要获取持仓信息(包含持仓均价),这就需要调用context.account().position函数,返回字典型。

策略回测分析

分析

​ 我们选取了2017年7月至2017年10月作为回测周期,应用“EV/EBITDA”单因子作为选股基础。可以看出:

  • 胜率(具有盈利的平仓次数与总平仓次数之比)达到了62.5%,也即策略每十次开仓,有六次是盈利的。

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

  • 夏普比率(年化收益率减无风险收益率的差收益波动率之比)超过5,也即承受一单位的风险,会有超过五单位的收益回报

  • 策略收益曲线总体稳定,适合在趋势行情中操作。

 

集合竞价选股策略源码:

 

  1. # coding=utf-8
  2. from __future__ import print_function, absolute_import, unicode_literals
  3. from gm.api import *
  4.  
  5. '''
  6. 本策略通过获取SHSE.000300沪深300的成份股数据并统计其30天内
  7. 开盘价大于前收盘价的天数,并在该天数大于阈值10的时候加入股票池
  8. 随后对不在股票池的股票平仓并等权配置股票池的标的,每次交易间隔1个月.
  9. 回测数据为:SHSE.000300在2015-01-15的成份股
  10. 回测时间为:2017-07-01 08:00:00到2017-10-01 16:00:00
  11. '''
  12.  
  13.  
  14. def init(context):
  15. # 每月第一个交易日的09:40 定时执行algo任务
  16. schedule(schedule_func=algo, date_rule='1m', time_rule='09:40:00')
  17. # context.count_bench累计天数阙值
  18. context.count_bench = 10
  19. # 用于对比的天数
  20. context.count = 30
  21. # 最大交易资金比例
  22. context.ratio = 0.8
  23.  
  24.  
  25. def algo(context):
  26. # 获取当前时间
  27. now = context.now
  28. # 获取上一个交易日
  29. last_day = get_previous_trading_date(exchange='SHSE', date=now)
  30. # 获取沪深300成份股
  31. context.stock300 = get_history_constituents(index='SHSE.000300', start_date=last_day,
  32. end_date=last_day)[0]['constituents'].keys()
  33. # 获取当天有交易的股票
  34. not_suspended_info = get_history_instruments(symbols=context.stock300, start_date=now, end_date=now)
  35. not_suspended_symbols = [item['symbol'] for item in not_suspended_info if not item['is_suspended']]
  36.  
  37. trade_symbols = []
  38. if not not_suspended_symbols:
  39. print('没有当日交易的待选股票')
  40. return
  41.  
  42. for stock in not_suspended_symbols:
  43. recent_data = history_n(symbol=stock, frequency='1d', count=context.count, fields='pre_close,open',
  44. fill_missing='Last', adjust=ADJUST_PREV, end_time=now, df=True)
  45. diff = recent_data['open'] - recent_data['pre_close']
  46. # 获取累计天数超过阙值的标的池.并剔除当天没有交易的股票
  47. if len(diff[diff > 0]) >= context.count_bench:
  48. trade_symbols.append(stock)
  49.  
  50. print('本次股票池有股票数目: ', len(trade_symbols))
  51. # 计算权重
  52. percent = 1.0 / len(trade_symbols) * context.ratio
  53. # 获取当前所有仓位
  54. positions = context.account().positions()
  55. # 如标的池有仓位,平不在标的池的仓位
  56. for position in positions:
  57. symbol = position['symbol']
  58. if symbol not in trade_symbols:
  59. order_target_percent(symbol=symbol, percent=0, order_type=OrderType_Market,
  60. position_side=PositionSide_Long)
  61. print('市价单平不在标的池的', symbol)
  62.  
  63. # 对标的池进行操作
  64. for symbol in trade_symbols:
  65. order_target_percent(symbol=symbol, percent=percent, order_type=OrderType_Market,
  66. position_side=PositionSide_Long)
  67. print(symbol, '以市价单调整至权重', percent)
  68.  
  69.  
  70. if __name__ == '__main__':
  71. '''
  72. strategy_id策略ID,由系统生成
  73. filename文件名,请与本文件名保持一致
  74. mode实时模式:MODE_LIVE回测模式:MODE_BACKTEST
  75. token绑定计算机的ID,可在系统设置-密钥管理中生成
  76. backtest_start_time回测开始时间
  77. backtest_end_time回测结束时间
  78. backtest_adjust股票复权方式不复权:ADJUST_NONE前复权:ADJUST_PREV后复权:ADJUST_POST
  79. backtest_initial_cash回测初始资金
  80. backtest_commission_ratio回测佣金比例
  81. backtest_slippage_ratio回测滑点比例
  82. '''
  83. run(strategy_id='strategy_id',
  84. filename='main.py',
  85. mode=MODE_BACKTEST,
  86. token='token_id',
  87. backtest_start_time='2017-07-01 08:00:00',
  88. backtest_end_time='2017-10-01 16:00:00',
  89. backtest_adjust=ADJUST_PREV,
  90. backtest_initial_cash=10000000,
  91. backtest_commission_ratio=0.0001,
  92. backtest_slippage_ratio=0.0001)

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

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

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

1双均线策略(期货)  量化策略源码https://www.myquant.cn/docs/python_strategyies/153
2alpha对冲(股票+期货)  量化策略源码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

《算法导论 第三版英文版》_高清中文版

《深度学习入门:基于Python的理论与实现》_高清中文版

《深入浅出数据分析》_高清中文版

《Python编程:从入门到实践》_高清中文版

《Python科学计算》_高清中文版

《深度学习入门:基于Python的理论与实现》_高清中文版

《深入浅出数据分析》_高清中文版

《Python编程:从入门到实践》_高清中文版


策略为王是一个很老的票交易软件,包括行情接收、显示、技术指标、策略模拟等。功能很全,该有的都有,在当时也算是专业软件。 不知何故后来人家不再使用,也不再维护,就把码放出来共享,一群好人啊!这是目前通过正常途径能够找到的最好的开交易软件,也是最好的C++示例系统之一。无论您是有意从事票/期货的自动交易,还是学习C++编程,读它的码都是一个很好的开端,我就是这么做的。 策略为王最早的开发环境是VC6。我当时下的代码,最多升级到VS2003。据说能升到VS2005,我没试,但再往上肯定不行了。因为程序所用第三方控件库不支持更高版本的VS,这也是VS讨厌的地方。 后来我用QT编写自己的行情软件,就不再关注策略为王了。 最近兴趣重燃,发现网上有人家升级到VS2008的版本。原来的第三方控件库基本不再使用,功能及界面效果也大打折扣。未使用新的界面库,可以说程序变成了半成品,但这样也好,剩下的都是干货,更有利于研究和学习。无论如何,人家能升级到VS2008我还是很佩服的,做这个事的人应该是下了不少功夫,在此要表示感谢。 基于以前的积累,我对这些程序比较熟悉。在人家的基础上,我又做了点儿工作:把开发环境升级到了VS2015,改了几个错误,加了点儿小功能,加上
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值