量化投资入门教程六——技术指标MA策略
目录
1. 策略原理及代码 1.1策略原理 1.2策略代码 1.2.1ATR.ini 1.2.2ATR.py 1.2.3stock_pool.csv 2. Python相关函数 2.1Python标准函数 2.2掘金接口函数 3.金融术语(移动平均线)
1.策略原理及代码 1.1策略原理
基于ta-lib的MA策略。如果当前价格高于MA,买入股票;如果当前价格低于MA,卖出股票。
实现量化投资策略的相关编程并非想象中这么困难,从Python的安装到量化编程的实现只需简单几步(具体见
http://zjshe.cn/q/forum.php?mod=viewthread&tid=54&extra=page=1轻松安装Python、掘金量化平台及相关工具包) 1.2策略代码(可直接在python中实现) 1.2.1 ma.ini [strategy]
username= password= ;回测模式 mode=4
td_addr=localhost:8001 strategy_id=
;订阅代码注意及时更新
subscribe_symbols=SHFE.ag1705.tick,SHFE.ag1705.bar.60
[backtest]
start_time=2017-02-15 21:00:00 end_time=2017-03-07 16:00:00
;策略初始资金 initial_cash=10000000
;委托量成交比率,默认=1(每个委托100%成交) transaction_ratio=1
;手续费率,默认=0(不计算手续费) commission_ratio=0.0004
;滑点比率,默认=0(无滑点) slippage_ratio=0
price_type=1 ;基准
bench_symbol=SHSE.000300 [para]
trade_exchange=SHFE trade_symbol=ag1705 window_size=200 bar_type=60 tick_size=1 significant_diff=21 timeperiod=20
############################################################## # logger settings
############################################################## [loggers] keys=root
[logger_root] level=DEBUG
handlers=console,file
[handlers] keys=console,file
[handler_file]
class=handlers.RotatingFileHandler
args=('ma.log','a','maxBytes=10000','backupCount=5') formatter=simple
[handler_console] class=StreamHandler
args = (sys.stdout,) formatter=simple
[formatters] keys = simple
[formatter_simple]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s datefmt=
1.2.2 ma.py
#!/usr/bin/env python # encoding: utf-8
import numpy as np
from collections import deque from gmsdk import * from talib import SMA
# 算法用到的一些常量,阀值,主要用于信号过滤 eps = 1e-6 threshold = 0.235 tick_size = 0.2
half_tick_size = tick_size / 2 significant_diff = tick_size * 2.6
class MA(StrategyBase):
''' strategy example1: MA decision price cross long MA, then place a order, temporary reverse trends place
more orders '''
def __init__(self, *args, **kwargs): #import pdb; pdb.set_trace() super(MA, self).__init__(*args, **kwargs)
# 策略初始化工作在这里写,从外部读取静态数据,读取策略配置参数等工作,只在策略启动初始化时执行一
次。
# 从配置文件中读取配置参数
self.exchange = self.config.get('para', 'trade_exchange') self.sec_id = self.config.get('para', 'trade_symbol')
self.symbol = \self.last_price = 0.0
self.trade_unit = [3, 1, 2, 0] # self.trade_count = 0
self.trade_limit = len(self.trade_unit)
self.window_size = self.config.getint('para', 'window_size') or 200 self.timeperiod = self.config.getint('para', 'timeperiod') or 20 self.bar_type = self.config.getint('para', 'bar_type') or 60 self.close_buffer = deque(maxlen=self.window_size)
self.significant_diff = self.config.getfloat('para', 'significant_diff') or significant_diff
# prepare historical bars for MA calculating
# 从数据服务中准备一段历史数据,使得收到第一个bar后就可以按需要计算ma last_closes = [bar.close for bar in self.get_last_n_bars(self.symbol, self.bar_type,
self.window_size,end_time=self.start_time)]
last_closes.reverse() #因为查询出来的时间是倒序排列,需要倒一下顺序 self.close_buffer.extend(last_closes)
# 响应bar数据到达事件 defon_bar(self, bar):
# 确认下bar数据是订阅的分时 if bar.bar_type == self.bar_type: # 把数据加入缓存 self.close_buffer.append(bar.close) # 调用策略计算 self.algo_action()
# 响应tick数据到达事件 defon_tick(self, tick): # 更新市场最新成交价 self.last_price = tick.last_price
defon_execution(self, execution): #打印订单成交回报信息
print((\
#策略的算法函数,策略的交易逻辑实现部分 defalgo_action(self): # type: () -> object
#数据转换,方便调用ta-lib函数进行技术指标的计算,这里用SMA指标