当前位置:
文档之家› 量化投资入门教程二——双均线策略
量化投资入门教程二——双均线策略
10 周期均线与 20 日均线的双均线策略;
无持仓时直接按照股票池等权买入;有持仓时,不在股票池中的股票卖出
实现量化投资策略的相关编程并非想象中这么困难,从 Python 的安装到量化 编程的实现只需简单几步(具体见 /q/forum.php?mod=viewthread&tid=54&extra=page%3D1 轻松 安装 Python、掘金量化平台及相关工具包)
2. Python 相关函数 2.1Python 标准函数
功能
函数原型
参数 参数名
含义
返回值
reverse 用于反向列表中元素
list.reverse()
该方法没有返回值,但是会对 列表的元素进行反向排序。
该方法没有返回值,但是会对列表的元
extend
list.extend(seq)
seq
素进行反向排序。
注:更多关于量化策略的教程和分析等精彩内容详见
/q/forum.php
# 初始金额
transaction_ratio=1,
# 成交比率
commission_ratio=0.0000,
# 手续费
slippage_ratio=0.000,
# 滑点
price_type=1) start = time.time() ret = ma.run() end = time.time() print(end - start)
3.金融术语
双均线策略:指的是运用两条不同周期的移动平均线,即短周期移动平均线和 长周期移动平均线的相对大小,研判买进与卖出时机的策略。当短周期的均线 从长期均线的下方,向上穿越至长周期的均线,所形成的交点,称为金叉。当 短周期的均线从长期均线的上方,向下穿越至长周期的均线,所形成的交点, 称为死叉。当出现金叉点时,市场属于多头市场;当出现死叉点时,市场属于 空头市场。
def on_bar(self, bar):
if bar.bar_type == 60:
position = self.get_positions() # 获取持仓量 if len(position) == 0: ##如果没有持仓,设 self.holding = 0
self.holding = 0
get_positions 和证券 ID 组成)和买卖方向的持仓信息。 xchange,
sec_id string 证券代码
策略类和交易服务类都提供该接口。
sec_id, side);
side
int
买卖方向
Position 对 象,持仓信息
open_long
异步开多仓,以参数指定的 symbol、价和
量化投资入门教程二——双 均线策略
目录 1. 策略原理及代码
1.1 策略原理 1.2 策略代码 2. Python 相关函数 2.1Python 标准函数 2.2 掘金接口函数 3.金融术语(双均线策略)
1.策略原理及代码
1.1 策略原理
股票:SHSE.600009;
时间:2016/1/1--2017/1/1 分频数据;
exchange
open_long(exch
量下单。如果价格为 0,为市价单,否则为
ange, sec_id,
限价单。策略类和交易服务类都提供该接
price, volume)
口
sec_id
string string
交易所代码, 如上交所
SHSE
委托下单生成
的 Order 对象 证券代码,如浦发银行
600000
self.close_list.append(bar.close)
if len(self.close_list) < 20: self.MA10 = self.close_list[:] self.MA20 = self.close_list[:]
if len(self.close_list) >= 20: close = np.asarray(self.close_list) self.MA10 = SMA(close, timeperiod=10) # 10 周期均线 self.MA20 = SMA(close, timeperiod=20) # 20 周期均线
if self.holding == 0: if self.MA10[-1] > self.MA20[-1]: # 10 周期均线>20 周期均线开仓 self.open_long('SHSE', '600009', 0, 10000)
if self.holding == 1: if self.MA10[-1] < self.MA20[-1]: # 10 周期均线<20 周期均线平仓 self.close_long('SHSE', '600009', 0, self.volume)
hange, sec_id,
为 0,为市价单,否则为限价单。策略类和
price, volume)
交易服务类都提供该接口。
price
string
证券代码,如浦发银行
600000
委托下单生成
的 Order 对象 委托价,如果 price=0,
float 为市价单,否则为限价
单
volume float 平仓量
if len(position) > 0: if position[0].available_yesterday > 0: # 如果有昨仓,设 self.holding = 1 self.volume = position[0].available_yesterday self.holding = 1 if position[0].available_today > 0: # 如果有今仓,设 self.holding = 2 self.holding = 2
price
float
委托价,如果 price=0, 为市价单,否则为限价 单
volume float 委托量
exchange string
交易所代码, 如上交所 SHSE
close_long
异步平多仓接口,以参数指定的 exchange,
sec_id
close_long(exc
证券代码 sec_id, 价和量下单。如果价格
if self.holding == 2: pass
if __name__ == '__main__':
ma = MA(
username='username',
# 输入用户名
password='password',
# 输入密码
strategy_id='strategy_2',
# 输入策略 ID
subscribe_symbols='SHSE.600009.bar.60', # 输入订阅代码
bar_type, n,
end_time='')
n
int
bar 周期,以秒为单 位,比如 60 即 1 分钟
Bar 列表 bar
提取的数据条数
end_time string
指定截止时间, 如 2015-10-30 15:00:00
exchange string 交易所代码
查询当前策略指定 symbol(由交易所代码 get_position(e
bars = self.get_last_n_bars('SHSE.600009', 60, 20, '2016-01-01 00:00:00') last_closes = [bar.close for bar in bars] # 提取每分钟收盘价 last_closes.reverse() # 查询出的结果为倒序,需反转 self.close_list.extend(last_closes)
功能
函数原型
参数
参数名 类型
说明
返回值
symbol
证券代码, 带交易所代 string 码以确保唯一,如
SHSE.600000
get_last_n_bar
s(symbol, 提取单个代码的最新 n 条 Bar 数据,策略类
bar_type int
get_last_n_bars 和行情服务类都提供该接口。
该方法没有返回值,但会在已 元素列表。 存在的列表中添加新的列表内
容。
返回对象(字符、列表、元组等)长度
len
len(s)
或项目个数。
s
对象
返回对象长度。
append 用于在列表末尾添加新的对象。
list.append(obj)
obj
添加到列表 该方法无返回值,但是会修改
末尾的对 原来的列表。
象。
2.2 掘金接口函数
mode=4, # 选择模式
td_addr='localhost:8001'
)
ma.backtest_config(
start_time='2016-01-01 09:00:00', # 起始时间
end_time='2017-01-01 09:00:00', # 结束时间
initial_cash=1000000,
1.2 策略代码(可直接在 python 中实现)
#!/usr/bin/env python # encoding: utf-8
import numpy as np from gmsdk import * from talib import SMA import time
class MA(StrategyBase): def __init__(self, *args, **kwargs): super(MA, self).__init__(*args, **kwargs) self.close_list = []