分享一个pyton均线略

版权声明:无情不似多情苦,一寸还成千万缕。天涯地角有穷时,只有相思无尽处。 https://blog.csdn.net/u011078141/article/details/89453306

原 分享一个python均线策略

来源:掘金量化社区 myquant.cn  ,转载请注明出处,谢谢.

简单的基于ta-lib的均线策略示例

策略简介,主要是基于分时线的close线跟MA之间的关系出信号,同时对信号有个简单的过滤逻辑,同时展示了怎么调用gmsdk来做仓位管理。订单管理并没有在代码中体现, 如果需要对委托订单的状态进行跟踪,还需要增加on_order_status函数,用来跟踪订单的执行状态。

策略逻辑: 用分时bar线的收盘价跟ma线之间的交叉关系发出信号,并根据配置做一个简单的信号过滤。 用一个数列配置下单量,在出信号后,根据已有持仓状态确定是否开仓,或者是继续加仓,或者是回调加仓,还是加仓次数达上限后主动平仓出场。

在代码中添加了一些注释,希望有助于阅读。

注: 代码仅为示例,各参数设置和逻辑都不够严谨,切勿直接用于实盘交易。


  
  
  1. #!/usr/bin/env python
  2. # encoding: utf-8
  3. import time
  4. from talib.abstract import SMA
  5. import numpy as np
  6. from collections import deque
  7. from gmsdk import *
  8. # 算法用到的一些常量,阀值,主要用于信号过滤
  9. eps = 1e- 6
  10. threshold = 0. 235
  11. tick_size = 0. 2
  12. half_tick_size = tick_size / 2
  13. significant_diff = tick_size * 2.6
  14. class MA(StrategyBase):
  15. "" " strategy example1: MA decision price cross long MA, then place a order, temporary reverse trends place more orders " ""
  16. def __init__(self, *args, **kwargs):
  17. #import pdb; pdb.set_trace()
  18. super(MA, self).__init_ _(*args, **kwargs)
  19. # 策略初始化工作在这里写,从外部读取静态数据,读取策略配置参数等工作,只在策略启动初始化时执行一次。
  20. # 从配置文件中读取配置参数
  21. self.exchange = self.config.get( "para", "trade_exchange")
  22. self.sec_id = self.config.get( "para", "trade_symbol")
  23. self.symbol = ".".join([ self.exchange, self.sec_id])
  24. self.last_price = 0. 0
  25. self.trade_unit = [ 1.0, 2.0, 4.0, 8.0, 5.0, 3.0, 2.0, 1.0, 1.0, 0. 0] ## [8.0, 4.0, 2.0, 1.0]
  26. self.trade_count = 0
  27. self.trade_limit = len( self.trade_unit)
  28. self.window_size = self.config.getint( "para", "window_size") or 60
  29. self.timeperiod = self.config.getint( "para", "timeperiod")
  30. self.bar_type = self.config.getint( "para", "bar_type")
  31. self.close_buffer = deque(maxlen= self.window_size)
  32. self.significant_diff = self.config.getfloat( "para", "significant_diff") or significant_diff
  33. # prepare historical bars for MA calculating
  34. # 从数据服务中准备一段历史数据,使得收到第一个bar后就可以按需要计算ma
  35. last_closes = [bar.close for bar in self.get_last_n_bars( self.symbol, self.bar_type, self.window_size)]
  36. last_closes.reverse() #因为查询出来的时间是倒序排列,需要倒一下顺序
  37. self.close_buffer.extend(last_closes)
  38. # 响应bar数据到达事件
  39. def on_bar(self, bar):
  40. # 确认下bar数据是订阅的分时
  41. if bar.bar_type == self. bar_type:
  42. # 把数据加入缓存
  43. self.close_buffer.append(bar.close)
  44. # 调用策略计算
  45. self.algo_action()
  46. # 响应tick数据到达事件
  47. def on_tick(self, tick):
  48. # 更新市场最新成交价
  49. self.last_price = tick.last_price
  50. def on_execution(self, execution):
  51. #打印订单成交回报信息
  52. print "received execution: %s" % execution.exec_type
  53. #策略的算法函数,策略的交易逻辑实现部分
  54. def algo_action(self):
  55. #数据转换,方便调用ta-lib函数进行技术指标的计算,这里用SMA指标
  56. close = np.asarray( self.close_buffer)
  57. ma = SMA({ "close" :close}, timeperiod= self.timeperiod)
  58. delta = round(close[- 1] - ma[- 1], 4) # 最新数据点,bar的收盘价跟ma的差
  59. last_ma = round(ma[- 1], 4) # 均线ma的最新值
  60. momentum = round( self.last_price - last_ma, 4) # 当前最新价格跟ma之间的差,成交价相对ma偏离
  61. #print "close: ", close
  62. print( "close ma delta: {0}, last_ma: {1}, momentum: {2}".format(delta, last_ma, momentum))
  63. a_p = self.get_position( self.exchange, self.sec_id, OrderSide_Ask) #查询策略所持有的空仓
  64. b_p = self.get_position( self.exchange, self.sec_id, OrderSide_Bid) #查询策略所持有的多仓
  65. # 打印持仓信息
  66. print ( "pos long: {0} vwap: {1}, pos short: {2}, vwap: {3}".format(b_p.volume if b_p else 0. 0,
  67. round(b_p.vwap, 2) if b_p else 0. 0,
  68. a_p.volume if a_p else 0. 0,
  69. round(a_p.vwap, 2) if a_p else 0. 0))
  70. if delta > threshold and momentum >= significant_diff: ## 收盘价上穿均线,且当前价格偏离满足门限过滤条件,多信号
  71. # 没有空仓,且没有超出下单次数限制
  72. if (a_p is None or a_p.volume < eps) and self.trade_count < self. trade_limit:
  73. # 依次获取下单的交易量,下单量是配置的一个整数数列,用于仓位管理,可用配置文件中设置
  74. vol = self.trade_unit[ self.trade_count]
  75. # 如果本次下单量大于0, 发出买入委托交易指令
  76. if vol > eps:
  77. self.open_long( self.exchange, self.sec_id, self.last_price, vol)
  78. self.trade_count += 1 #增加计数
  79. else:
  80. # 如果有空仓,且达到本次信号的交易次数上限
  81. if a_p and a_p.volume > eps and self.trade_count == self. trade_limit:
  82. self.close_short( self.exchange, self.sec_id, self.last_price, a_p.volume) # 平掉所有空仓
  83. self.trade_count = 0
  84. else:
  85. # 有空仓时,且上次交易信号后没达到交易次数限制,继续加空
  86. vol = self.trade_unit[ self.trade_count] if self.trade_count < self.trade_limit else 0. 0
  87. self.trade_count += 1
  88. if vol > eps:
  89. self.open_short( self.exchange, self.sec_id, self.last_price, vol)
  90. elif delta < -threshold and momentum <= - significant_diff: ## bar 收盘价下穿ma均线,且偏离满足信号过滤条件
  91. # 没有多仓时,开空
  92. if (b_p is None or b_p.volume < eps) and self.trade_count < self. trade_limit:
  93. vol = self.trade_unit[ self.trade_count]
  94. self.trade_count += 1
  95. if vol > eps:
  96. self.open_short( self.exchange, self.sec_id, self.last_price, vol)
  97. else:
  98. # 已有多仓,且达到了交易次数限制,平掉多仓
  99. if b_p and b_p.volume > eps and self.trade_count == self. trade_limit:
  100. self.close_long( self.exchange, self.sec_id, self.last_price, b_p.volume)
  101. self.trade_count = 0
  102. else:
  103. # 已有多仓,且没有达到交易次数限制,继续加多
  104. vol = self.trade_unit[ self.trade_count] if self.trade_count < self.trade_limit else 0. 0
  105. self.trade_count += 1
  106. if vol > eps:
  107. self.open_long( self.exchange, self.sec_id, self.last_price, vol)
  108. else: ## 其他情况,忽略不处理
  109. ## get positions and close if any
  110. #self.trade_count = 0 ## reset trade count
  111. pass
  112. # 策略启动入口
  113. if __name_ _ == "__main__":
  114. # 初始化策略
  115. ma = MA(config_file= "strategy_ma.ini")
  116. #import pdb; pdb.set_trace() # python调试开关
  117. print "strategy ready, waiting for market data ......"
  118. # 策略进入运行,等待数据事件
  119. ret = ma.run()
  120. # 打印策略退出状态
  121. print "MA :", ma.get_strerror(ret)

以下是它用的配置文件示例


  
  
  1. [ strategy]
  2. ;md_addr= 120.24 .228 .187: 8000
  3. td_addr=localhost: 8001
  4. password= 123456
  5. mode= 2
  6. strategy_id=stategy_4
  7. subscribe_symbols=SHFE.ag1512.tick,SHFE.ag1512.bar .60
  8. ;start_time= 2014 -05 -26 09: 00: 00
  9. ;end_time= 2014 -05 -26 16: 00: 00
  10. [ para]
  11. trade_exchange=SHFE
  12. trade_symbol=ag1512
  13. window_size= 20
  14. bar_type= 15
  15. tick_size= 1
  16. significant_diff= 21
  17. timeperiod= 20
  18. ##############################################################
  19. # logger settings
  20. ##############################################################
  21. [ loggers]
  22. keys=root
  23. [ logger_root]
  24. level=DEBUG
  25. handlers=console,file
  26. [ handlers]
  27. keys=console,file
  28. [ handler_file]
  29. class=handlers.RotatingFileHandler
  30. args=( "strategy_dual_ma.log", "a", "maxBytes=10000", "backupCount=5")
  31. formatter=simple
  32. [ handler_console]
  33. class=StreamHandler
  34. args = (sys.stdout,)
  35. formatter=simple
  36. [ formatters]
  37. keys = simple
  38. [ formatter_simple]
  39. format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
  40. datefmt=

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

推荐文章阅读:

1 网格交易策略(附策略源码与收益图) https://www.myquant.cn/community/topic/548/2
2 指数增强策略 https://www.myquant.cn/community/topic/527
3 日内回转交易策略 https://www.myquant.cn/community/topic/526
4 跨期套利策略 https://www.myquant.cn/community/topic/525
5 跨品种价差套利策略 https://www.myquant.cn/community/topic/524
6 集合竞价选股 https://www.myquant.cn/community/topic/523
7 基于EV/EBITDA倍数估值法的Alpha对冲策略 https://www.myquant.cn/community/topic/522
8 行业轮动策略 https://www.myquant.cn/community/topic/521
9 海龟交易法则 https://www.myquant.cn/community/topic/520


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

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

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

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

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

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

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

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


猜你喜欢

转载自blog.csdn.net/u011078141/article/details/89453306