集合竞价选股(附源码)

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

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

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

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

策略思想

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

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

策略主要步骤实现

获取当前交易日日期

now = context.now

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

获取上一交易日日期

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

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

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

·  date需要设置指定日期。

获取当天有交易的股票

  1. not_suspended_info = get_history_instruments(symbols='SHSE.000300', start_date=now, end_date=now)
  2. 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函数进行定时任务配置:

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

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

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

获取沪深300成分股

  1. stock300 = get_history_constituents(index='SHSE.000300',
  2. 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需设置获取成分股的开始与结束日期,这里需要调成上一交易日以获取上一交易日的成分股信息。

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

  1. return_index_his = history_n(symbol=symbol, frequency='1d', count=30,
  2. 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().position函数,返回字典型。

策略回测分析

分析

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

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

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

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

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

附:集合竞价选股源码

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

来源:掘金量化 , myquant.cn

相关阅读: | 量化交易 | 期货模拟交易 |python量化交易 | 股票数据  | 量化交易策略 | 机器学习算法  | 多因子选股 |  

                  | 双均线策略 |  网格交易法 |  海龟交易法  |  跨期套利  | 行业轮动  | 指数增强  | 跨品种套利 | 日内交易 | 

(0)

相关推荐

  • adapt和adjust的区别

    最佳答案:1.adjust和adapt的含义有不同.除了都有适应的意思以外,adjust还有调准(望远镜等),对准,校正,校准(机械等);核算(盈亏);[保]评定(赔偿要求)的意思.而adapt也有改 ...

  • Custom Diagrams

    Custom Diagrams https://github.com/dbeaver/dbeaver/wiki/Custom-Diagrams You can create custom ER dia ...

  • 调整的意思|调整是什么意思

    基本解释 [释义] (动)改变原有的情况使适应客观环境和要求. [构成] 并列式:调+整 [例句] 调整步伐.(作谓语) 近义词 调解.调剂.调治.调节.调理.调度.调动.安排 英文翻译 1.adju ...

  • ​两市明显放量,但沪指难创新高

    两市明显放量,但沪指难创新高 上周五午间,提出了"创指急需反弹确认支撑"的观点,下午指数全部拉红,创业板指也守住了2600点后上行:今天上午再次探低回升,从2593.70点拉高至2 ...

  • 通达信 集合竞价选股器源码:买线1:=...

    通达信 集合竞价选股器 源码: 买线1:=LLV(MA(((C+L+O+H)/4),10),5); 卖线:=HHV(MA(((C+L+O+H)/4),5),5); 倍:=(卖线+买线1)/2; 注:= ...

  • 通达信 集合竞价选股指标源码:A:=R...

    通达信 集合竞价选股指标 源码: A:=REF(C,1); RSI:=SMA(MAX(C-A,0),6,1)/SMA(ABS(C-A),6,1)*100; A4:=RSI<20; ZF:=(C/ ...

  • 筹码峰选股需要这么用,不要在错误使用了(附:选股公式源码)

    最近有朋友问我筹码峰的应用,我结合自己认知,又在网上查了一下,发现很多关于筹码峰的介绍,都是错误的,如果按照网上说的方法去做大概率是亏损的,这里教大家一种比较成熟的筹码选股法,经过我的实盘测试,成功率 ...

  • 股市中最精辟的选股公式,涨停板一看一个准(附源码)

    股市给那些缺乏经济基础的人带来了以小钱赚大钱的机会.对那些才高志大者来说,股市简直就是一块经济福地.然而这个"有经验的人获得很多金钱,有金钱的人获得很多经验"的地方杀机四伏,偶有斩 ...

  • 图解涨停板回调买入法选股指标的用法(附源码)

    涨停板回调买入法原理: 某支股阶段底部连续两涨停,然后震荡回落到第一个涨停板收盘价附近,出现倍理反转向上,收盘价再次收在之前第二个涨停板收盘价上方.这意味着横盘震荡结束,主力将要再次强势拉升. 根据上 ...

  • 短线奇才详解暴涨选股指标,学会抓无数涨停(附源码)

    庄家的选时 天时.地利.人和,三者皆备,事必有所成.如果三者不能兼备,则"天时不如地利,地利不如人和".许多英雄豪杰也常常有"生不逢时"的感叹,据说三国周瑜就叹 ...

  • 抄底选股公式+波段买卖公式讲解(附源码)

    我们经常会听到,市场见底了,某一只股价超跌见底了,那么投资者可以进行抄底吗?抄底的时候要怎么进行选股呢,需要借助波段进行买卖操作吗,其实我们可以借助抄底选股公式或者是波段操作的源码公式进行分析. (学 ...

  • 一位波浪高手教你主升浪战法,非常强势,附选股公式源码

    炒股最重要的一点就是掌握最佳买点,特别是做短线以及超短线的投资者更加要选好买点:都说好的开始是成功的一半,买入股票股价迅速脱离成本,这一桩交易就等于成功了80%,剩下的就是慢慢打磨出场技巧,从而形成完 ...

  • 实盘操作准确率极高的选股公式(附选股公式源码)

    为情所困2019-03-19 收赞分享 对于投资者来说,买进股票就是为了卖个好价钱,就是为了赚钱.在他们的想法里,炒股就是这么简单的一件事情,没有基本面,别讲什么技术面.每个人在刚进入市场的时候,都心 ...