请选择 进入手机版 | 继续访问电脑版
楼主: 唉人好累66
5877 2

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

  • 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.策略介绍
作为外汇市场上广为流行的一种突破交易策略,HANS123以其简洁的开盘后N根K线的高低点突破,作为交易信号触发的评判标准。这也是一种入场较早的交易模式,配合适当过滤技术,或可提高其胜算。
过滤原理:这个过滤是为了让市场消化品种隔夜的各种信息,当有些突发信息公布,市场分歧很大的时候,开盘会呈现方向不明、宽幅震荡的情况,此时,对任何突破策略都会是灾难,所以忽略这段时间。
策略原理:
  • 日内交易策略,收盘平仓;
  • HANS123在开盘30分钟后准备入场;
  • 上轨=开盘后30分钟高点;
  • 下轨=开盘后30分钟低点;
  • 当价格突破上轨,买入开仓;
  • 当价格跌穿下轨,卖出开仓。
2.策略代码
   2.1配置文件【HANS123.ini】(提示ini配置文件,需要保存成UTF8格式)
  1. [strategy]
  2. td_addr=localhost:8001
  3. username=
  4. password=
  5. strategy_id=
  6. mode=4
  7. ;订阅代码注意及时更新
  8. subscribe_symbols=CFFEX.IF1707.tick,CFFEX.IF1707.bar.60

  9. [backtest]
  10. start_time=2017-6-01 09:00:00
  11. end_time=2017-7-16 15:15:00
  12. initial_cash=10000000
  13. transaction_ratio=1
  14. commission_ratio=0
  15. slippage_ratio=0

  16. [para]
  17. trade_symbol=CFFEX.IF1707
  18. open_time=09:15:00
  19. hans_time=09:45:00
  20. ex_time=15:10:00
  21. limit_times=3
复制代码
   2.2策略文件【HANS123.py】
  1. # encoding: utf-8
  2. from gmsdk.api import StrategyBase
  3. from gmsdk import md
  4. from gmsdk.enums import *
  5. import arrow
  6. import time

  7. # 每次开仓量
  8. OPEN_VOL = 5

  9. # 最大开仓次数
  10. MAX_TRADING_TIMES = 50


  11. class Hans123(StrategyBase):
  12.     def __init__(self, *args, **kwargs):
  13.         super(Hans123, self).__init__(*args, **kwargs)

  14.         # 是否已获取当天时间标识
  15.         self.time_flag = False

  16.         # 是否已获取当天上、下轨数据
  17.         self.data_flag = False

  18.         # 持仓量
  19.         self.long_holding = 0;
  20.         self.short_holding = 0;

  21.         # 当天交易次数
  22.         self.trading_times = 0;

  23.         self.__get_param()

  24.     def __get_param(self):
  25.         '''
  26.         获取配置参数
  27.         '''
  28.         # 交易证券代码
  29.         self.trade_symbol = self.config.get('para', 'trade_symbol')
  30.         pos = self.trade_symbol.find('.')
  31.         self.exchange = self.trade_symbol[:pos]
  32.         self.sec_id = self.trade_symbol[pos + 1:]

  33.         # 开盘时间
  34.         self.open_time = self.config.get('para', 'open_time')

  35.         # hans时间
  36.         self.hans_time = self.config.get('para', 'hans_time')

  37.         # 强制平仓时间
  38.         self.ex_time = self.config.get('para', 'ex_time')

  39.     def __get_time(self, cur_utc):
  40.         '''
  41.         获取当天的重要时间参数
  42.         '''
  43.         utc = arrow.get(cur_utc).replace(tzinfo='local')
  44.         cur_date = utc.format('YYYY-MM-DD')
  45.         FMT = '%s %s'
  46.         self.today_open_time = FMT % (cur_date, self.open_time)
  47.         print('today open time: %s' % self.today_open_time)

  48.         self.today_hans_time = FMT % (cur_date, self.hans_time)
  49.         print('today hans time: %s' % self.today_hans_time)

  50.         today_ex_time = FMT % (cur_date, self.ex_time)
  51.         print('today exit time:%s' % today_ex_time)

  52.         self.ex_time_utc = arrow.get(today_ex_time).replace(tzinfo='local').timestamp
  53.         self.hans_time_utc = arrow.get(self.today_hans_time).replace(tzinfo='local').timestamp

  54.     def __init_band_data(self, bar_type):
  55.         '''
  56.         获取上、下轨数据
  57.         '''
  58.         bars = self.get_bars(self.trade_symbol, bar_type, self.today_open_time, self.today_hans_time)
  59.         close_list = [bar.close for bar in bars]

  60.         # 上轨
  61.         self.upr_band = max(close_list)
  62.         print('upper band:%s' % self.upr_band)

  63.         # 下轨
  64.         self.dwn_band = min(close_list)
  65.         print('down band: %s' % self.dwn_band)

  66.     def on_tick(self, tick):
  67.         '''
  68.         tick行情事件
  69.         '''
  70.         # 获取最新价
  71.         self.last_price = tick.last_price

  72.     def on_bar(self, bar):
  73.         '''
  74.         bar周期数据事件
  75.         '''
  76.         # 获取当天的时间参数
  77.         if self.time_flag is False:
  78.             self.__get_time(bar.utc_time)
  79.             self.time_flag = True

  80.         # 计算上、下轨
  81.         if bar.utc_time < self.ex_time_utc and bar.utc_time > self.hans_time_utc:
  82.             if self.time_flag is True and self.data_flag is False:
  83.                 self.__init_band_data(bar.bar_type)
  84.                 self.data_flag = True

  85.         # 休市前强平当天仓位
  86.         if bar.utc_time > self.ex_time_utc:
  87.             if self.long_holding > 0:
  88.                 self.close_long(self.exchange, self.sec_id, 0, self.long_holding)
  89.                 print('exit time close long: %s, vol: %s' % (self.trade_symbol, self.long_holding))
  90.                 self.long_holding = 0

  91.             elif self.short_holding > 0:
  92.                 self.close_short(self.exchange, self.sec_id, 0, self.short_holding)
  93.                 print('exit time close long: %s, vol: %s' % (self.trade_symbol, self.short_holding))
  94.                 self.short_holding = 0
  95.             return

  96.         if self.trading_times > MAX_TRADING_TIMES:
  97.             print('trading times more than max trading times, stop trading')
  98.             return

  99.         # 交易时间段
  100.         if bar.utc_time > self.hans_time_utc and bar.utc_time < self.ex_time_utc:
  101.             if bar.close > self.upr_band:
  102.                 if self.short_holding > 0:
  103.                     # 有空仓,先平空仓
  104.                     self.close_short(self.exchange, self.sec_id, 0, self.short_holding)
  105.                     print('close short: %s, vol:%s' % (self.trade_symbol, self.short_holding))
  106.                     self.short_holding = 0

  107.                 # 开多仓
  108.                 self.open_long(self.exchange, self.sec_id, 0, OPEN_VOL)
  109.                 print('open long: %s, vol:%s' % (self.trade_symbol, OPEN_VOL))
  110.                 self.long_holding += OPEN_VOL

  111.                 # 开仓次数+1
  112.                 self.trading_times += 1
  113.             elif bar.close < self.dwn_band:
  114.                 if self.long_holding > 0:
  115.                     # 有多仓,先平多仓
  116.                     self.close_long(self.exchange, self.sec_id, 0, self.long_holding)
  117.                     print('close long: %s, vol:%s' % (self.trade_symbol, self.long_holding))
  118.                     self.long_holding = 0

  119.                 # 开空仓
  120.                 self.open_short(self.exchange, self.sec_id, 0, OPEN_VOL)
  121.                 print('open short: %s, vol:%s' % (self.trade_symbol, OPEN_VOL))
  122.                 self.short_holding += OPEN_VOL

  123.                 # 开仓次数+1
  124.                 self.trading_times += 1

  125. if __name__ == '__main__':
  126.     hans123 = Hans123(config_file='Hans123.ini')
  127.     ret = hans123.run()
  128. print(hans123.get_strerror(ret))
复制代码

   
3.回测结果

4.代码涉及的函数   
   4.1Python相关函数
功能函数原型参数返回值
参数名含义
sys提供了一系列有关Python运行环境的变量和函数。
sys.argv[0]当前程序名
sys.argv获取当前正在执行的命令行参数的参数列表(list)。sys.argvsys.argv[1]第一个参数
sys.argv[2]第二个参数
arrow标准的时间日期库。
time返回当前时间的时间戳time.time()返回当前时间的时间戳
len返回对象(字符、列表、元组等)长度或项目个数。len(s)s对象返回对象长度。
append用于在列表末尾添加新的对象。list.append(obj)obj添加到列表末尾的对象。该方法无返回值,但是会修改原来的列表。
   4.2掘金接口函数
功能函数原型参数返回值
参数名类型说明
on_bar响应Bar事件,收到Bar数据后本函数被调用。on_bar(bar)barbarbar数据
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平仓量
open_short异步开空仓,以参数指定的symbol、价和量下单。如果价格为0,为市价单,否则为限价单。策略类和交易服务类都提供该接口open_short(exchange, sec_id, price, volume)exchangestring交易所代码, 如上交所SHSE委托下单生成的Order对象
sec_idstring证券代码,如浦发银行600000
pricefloat委托价,如果price=0,为市价单,否则为限价单
volumefloat委托量
close_short异步平空仓接口,以参数指定的exchange, 证券代码sec_id, 价和量下单。如果价格为0,为市价单,否则为限价单。策略类和交易服务类都提供该接口。close_long(exchange, sec_id, price, volume)exchangestring交易所代码, 如上交所SHSE委托下单生成的Order对象
sec_idstring证券代码,如浦发银行600000
pricefloat委托价,如果price=0,为市价单,否则为限价单
volumefloat平仓量
















二维码

扫码加我 拉你入群

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

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

关键词:从零开始 ans Transaction Commission exchanges

本帖被以下文库推荐

后续还会继续上干货策略,好东西希望和大家一起分享,如果想了解更多精彩的量化方面的内容进入证经社——http://q.***了解更多吧~

使用道具

vicjack 发表于 2018-10-3 00:58:41 |显示全部楼层 |坛友微信交流群
楼主您好,有点小问题:
您用的是开盘30min的收盘价来算上下轨。

close_list = [bar.close for bar in bars]

# 上轨
self.upr_band = max(close_list)
print('upper band:%s' % self.upr_band)

# 下轨
self.dwn_band = min(close_list)
print('down band: %s' % self.dwn_band)

最好应该用30min内max来当上轨,min来当下轨。

使用道具

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

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

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

GMT+8, 2024-3-28 21:04