楼主: 唉人好累66
3245 1

[交易策略] 【干货分享】从零开始学量化:02双均线策略 [推广有奖]

  • 0关注
  • 41粉丝

讲师

55%

还不是VIP/贵宾

-

威望
1
论坛币
1457 个
通用积分
5.0477
学术水平
11 点
热心指数
14 点
信用等级
11 点
经验
3660 点
帖子
214
精华
0
在线时间
119 小时
注册时间
2016-9-24
最后登录
2020-4-8

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
1. 策略原理:
    股票:SHSE.600009;
    时间:2016/1/1--2017/1/1分频数据;
    10周期均线与20日均线的双均线策略;
    无持仓时直接按照股票池等权买入;
    有持仓时,不在股票池中的股票卖出。


2. 代码解读:
  1. #!/usr/bin/env python
  2. # encoding: utf-8

  3. import numpy as np
  4. from gmsdk import *
  5. from talib import SMA
  6. import time

  7. class MA(StrategyBase):
  8.     def __init__(self, *args, **kwargs):
  9.         super(MA, self).__init__(*args, **kwargs)
  10.         self.close_list = []

  11.         bars = self.get_last_n_bars('SHSE.600009', 60, 20, '2016-01-01 00:00:00')
  12.         last_closes = [bar.close for bar in bars]  # 提取每分钟收盘价
  13.         last_closes.reverse()  # 查询出的结果为倒序,需反转
  14.         self.close_list.extend(last_closes)

  15.     def on_bar(self, bar):

  16.         if bar.bar_type == 60:

  17.             position = self.get_positions()  # 获取持仓量
  18.             if len(position) == 0:  ##如果没有持仓,设self.holding = 0
  19.                 self.holding = 0
  20.             if len(position) > 0:
  21.                 if position[0].available_yesterday > 0:  # 如果有昨仓,设self.holding = 1
  22.                     self.volume = position[0].available_yesterday
  23.                     self.holding = 1
  24.                 if position[0].available_today > 0:  # 如果有今仓,设self.holding = 2
  25.                     self.holding = 2

  26.         self.close_list.append(bar.close)

  27.         if len(self.close_list) < 20:
  28.             self.MA10 = self.close_list[:]
  29.             self.MA20 = self.close_list[:]
  30.         if len(self.close_list) >= 20:
  31.             close = np.asarray(self.close_list)
  32.             self.MA10 = SMA(close, timeperiod=10)  # 10周期均线
  33.             self.MA20 = SMA(close, timeperiod=20)  # 20周期均线

  34.         if self.holding == 0:
  35.             if self.MA10[-1] > self.MA20[-1]:  # 10周期均线>20周期均线开仓
  36.                 self.open_long('SHSE', '600009', 0, 10000)

  37.         if self.holding == 1:
  38.             if self.MA10[-1] < self.MA20[-1]:  # 10周期均线<20周期均线平仓
  39.                 self.close_long('SHSE', '600009', 0, self.volume)

  40.         if self.holding == 2:
  41.             pass

  42. if __name__ == '__main__':
  43.     ma = MA(
  44.         username='username',                       # 输入用户名
  45.         password='password',                       # 输入密码
  46.         strategy_id='strategy_2',                 # 输入策略ID
  47.         subscribe_symbols='SHSE.600009.bar.60',  # 输入订阅代码
  48.         mode=4,  # 选择模式
  49.         td_addr='localhost:8001'
  50.     )
  51.     ma.backtest_config(
  52.         start_time='2016-01-01 09:00:00',  # 起始时间
  53.         end_time='2017-01-01 09:00:00',    # 结束时间
  54.         initial_cash=1000000,                # 初始金额
  55.         transaction_ratio=1,                 # 成交比率
  56.         commission_ratio=0.0000,             # 手续费
  57.         slippage_ratio=0.000,                # 滑点
  58.         price_type=1)
  59.     start = time.time()
  60.     ret = ma.run()
  61.     end = time.time()
  62.     print(end - start)
复制代码


3. Python相关函数
    3.1 Python标准函数:
功能函数原型参数返回值
参数名含义
reverse用于反向列表中元素list.reverse()该方法没有返回值,但是会对列表的元素进行反向排序。
extend该方法没有返回值,但是会对列表的元素进行反向排序。list.extend(seq)seq元素列表。该方法没有返回值,但会在已存在的列表中添加新的列表内容。
len返回对象(字符、列表、元组等)长度或项目个数。len(s)s对象返回对象长度。
append用于在列表末尾添加新的对象。list.append(obj)obj添加到列表末尾的对象。该方法无返回值,但是会修改原来的列表。
3.2 掘金接口函数:
功能函数原型参数返回值
参数名类型说明
get_last_n_bars提取单个代码的最新n条Bar数据,策略类和行情服务类都提供该接口。get_last_n_bars(symbol, bar_type, n, end_time='')symbolstring证券代码, 带交易所代码以确保唯一,如SHSE.600000Bar列表
bar_typeintbar周期,以秒为单位,比如60即1分钟bar
nint提取的数据条数
end_timestring指定截止时间, 如2015-10-30 15:00:00
get_positions查询当前策略指定symbol(由交易所代码和证券ID组成)和买卖方向的持仓信息。策略类和交易服务类都提供该接口。get_position(exchange, sec_id, side);exchangestring交易所代码Position对象,持仓信息
sec_idstring证券代码
sideint买卖方向
open_long异步开多仓,以参数指定的symbol、价和量下单。如果价格为0,为市价单,否则为限价单。策略类和交易服务类都提供该接口open_long(exchange, sec_id, price, volume)exchangestring交易所代码, 如上交所SHSE委托下单生成的Order对象
sec_idstring证券代码,如浦发银行600000
pricefloat委托价,如果price=0,为市价单,否则为限价单
volumefloat委托量
close_long异步平多仓接口,以参数指定的exchange, 证券代码sec_id, 价和量下单。如果价格为0,为市价单,否则为限价单。策略类和交易服务类都提供该接口。close_long(exchange, sec_id, price, volume)exchangestring交易所代码, 如上交所SHSE委托下单生成的Order对象
sec_idstring证券代码,如浦发银行600000
pricefloat委托价,如果price=0,为市价单,否则为限价单
volumefloat平仓量

4. 金融术语:
双均线策略:指的是运用两条不同周期的移动平均线,即短周期移动平均线和长周期移动平均线的相对大小,研判买进与卖出时机的策略。当短周期的均线从长期均线的下方,向上穿越至长周期的均线,所形成的交点,称为金叉。当短周期的均线从长期均线的上方,向下穿越至长周期的均线,所形成的交点,称为死叉。当出现金叉点时,市场属于多头市场;当出现死叉点时,市场属于空头市场。


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:从零开始 双均线 Available yesterday positions

沙发
唉人好累66 发表于 2017-7-25 15:38:55 |只看作者 |坛友微信交流群
后续还会继续上干货策略,好东西希望和大家一起分享,如果想了解更多精彩的量化方面的内容进入证经社——http://zjshe.cn/q/forum.php?gid=36了解更多吧~

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jr
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-25 13:15