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

[原创博文] 【干货分享】从零开始学量化:13海龟策略 [推广有奖]

  • 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. 策略原理:
     海龟交易入市法则:系统 1:以 20 日突破为基础的短期 系统;系统 2:以 55 日突破为基础的中长期系统;     海龟交易退出法则:系统 1 采用 10 日突破退出法则: 对于多头头寸而言,在价格跌破过去 10 日最低点时退出;对 空头头寸而言,在价格超过 10 日最高点时退出。总之,如果 价格发生了不利于头寸的 10 日突破,所有单位头寸都要退出。 系统 2 采用 20 日突破退出法则:对多头头寸而言,是 20 日向 下突破,对空头头寸而言,是 20 日向上突破。只要价格发生 了不利于头寸的 20 日突破,所有头寸都会退出。
     本策略只是海龟策略的框架:采用20日突破原则,20日向上突破时进行开仓,20日向下突破时进行平仓。
2. 代码解读:
    2.1 turtle.ini
  1. [strategy]
  2. username=
  3. password=
  4. ;模拟状态
  5. mode=4
  6. td_addr=localhost:8001
  7. strategy_id=
  8. ;订阅代码注意及时更新
  9. subscribe_symbols=

  10. [backtest]
  11. start_time=2016-08-22 09:00:00
  12. end_time=2016-08-26 16:00:00
  13. ;策略初始资金
  14. initial_cash=1000000
  15. ;委托量成交比率,默认=1(每个委托100%成交)
  16. transaction_ratio=1
  17. ;手续费率,默认=0(不计算手续费)
  18. commission_ratio=0
  19. ;滑点比率,默认=0(无滑点)
  20. slippage_ratio=0

  21. [para]
  22. csv_file=stocks.csv
  23. period=20
  24. hop=0.1


  25. ##############################################################
  26. # logger settings
  27. ##############################################################
  28. [loggers]
  29. keys=root

  30. [logger_root]
  31. level=DEBUG
  32. handlers=console,file

  33. [handlers]
  34. keys=console,file

  35. [handler_file]
  36. class=handlers.RotatingFileHandler
  37. args=('strategy_turtle.log','a',1000,5)
  38. formatter=simple

  39. [handler_console]
  40. class=StreamHandler
  41. args = (sys.stdout,)
  42. formatter=simple

  43. [formatters]
  44. keys = simple

  45. [formatter_simple]
  46. format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
  47. datefmt=
复制代码
   2.2 turtle.py
  1. # encoding: utf8

  2. import logging
  3. import logging.config
  4. import pandas as pd
  5. import numpy as np
  6. from gmsdk import *

  7. class TurtleStrategy(StrategyBase):
  8.     def __init__(self, *args, **kwargs):
  9.         super(TurtleStrategy, self).__init__(*args, **kwargs)
  10.         self.__get_param__()
  11.         self.__init_data__()
  12. ;读取参数
  13.     def __get_param__(self):
  14.         self.csv_file = self.config.get('para', 'csv_file')
  15.         self.period = self.config.getint('para', 'period')
  16.         self.hop = self.config.get('para', 'hop') or 0.1
  17. ;读取CSV文件
  18.     def __init_data__(self):
  19.         '''
  20.         read stocks from csv file
  21.         :return:
  22.         '''
  23.         self.sec_ids = []
  24.         self.hist_data = dict()
  25.         self.positions = dict()

  26.         subscribe_symbols = []

  27.         stocks = pd.read_csv(self.csv_file, sep=',')
  28.         for r in stocks.iterrows():
  29.             exchange = r[1][0]
  30.             sec_id = r[1][1]
  31.             buy_amount = r[1][2]
  32.             t = "{0}.{1}".format(exchange, sec_id)

  33.             hl = self.get_highest_lowest_price(t)
  34.             #print (hl)
  35.             self.hist_data[t] = hl + (buy_amount,)   ## high, low, buy_amount


  36.             self.sec_ids.append("{0}".format(sec_id))
  37.             subscribe_symbols.append(t + ".tick")

  38.         self.subscribe(",".join(subscribe_symbols))

  39. ;获取近20日的最高价及最低价
  40.     def get_highest_lowest_price(self, symbol):
  41.         #print(symbol)
  42.         ## get last N dailybars
  43.         hd = self.get_last_n_dailybars(symbol, self.period)

  44.         high_prices = [b.high for b in hd]
  45.         #high_prices.reverse()

  46.         low_prices = [b.low for b in hd]
  47.         #low_prices.reverse()

  48.         return np.max(high_prices), np.min(low_prices)


  49.     def on_tick(self, tick):

  50.         if not tick.sec_id in self.sec_ids:
  51.             pass
  52.             #self.logger.info( "received tick: %s %s %s %s" % (tick.exchange, tick.sec_id, round(tick.last_price,2), tick.last_volume))
  53.         else:
  54.             #self.logger.info( "received tick: %s %s, A: %s B: %s" % (tick.sec_id, round(tick.last_price,2), round(tick.asks[0][0],2), round(tick.bids[0][0],2)))
  55.             symbol = ".".join([tick.exchange, tick.sec_id])

  56.             data = self.hist_data.get(symbol)
  57.             self.hop = float(self.hop)
  58.             #print (data)
  59.             pa = self.get_positions()
  60.             #int pa
  61. ;开仓及平仓
  62.             if data and tick.last_price > data[0]  :  ## check high
  63.                 volume = int(data[2]/(tick.last_price+self.hop)/100)*100  ## get slots, then shares
  64.                 if bool(self.get_position(tick.exchange,tick.sec_id,1)) == 0:
  65.                 #print (to_dict(aaa[0]))
  66.                     self.open_long(tick.exchange, tick.sec_id, tick.last_price + self.hop, volume)
  67.                 #print (tick.exchange, tick.sec_id, tick.last_price + self.hop, volume)

  68.                 #print (tick.sec_id)
  69.             elif data and tick.last_price < data[1]:  ## check low

  70.                 #p = self.get_position(tick.exchange, tick.sec_id, OrderSide_Bid)
  71.                 ps = self.get_positions()
  72.                 for p in ps:
  73.                     sym = ".".join([p.exchange, p.sec_id])
  74.                     self.positions[sym] = p
  75.                     #print (p)

  76.                     ## if not in stock list, close long position
  77.                     if p.sec_id in self.sec_ids:
  78.                         self.close_long(p.exchange, p.sec_id, 0, p.volume)

  79. if __name__ == '__main__':
  80.     ini_file = sys.argv[1] if len(sys.argv) > 1 else 'turtle.ini'
  81.     logging.config.fileConfig(ini_file)
  82.     st = TurtleStrategy(config_file=ini_file)
  83.     st.logger.info("Strategy turtle ready, waiting for data ...")
  84.     ret = st.run()
  85. st.logger.info("Strategy turtle message %s" % st.get_strerror(ret))
复制代码
2.3 stocks.csv
exchangesec_idbuy_amount(楼)
SZSE

300275

200000

SZSE

300001

200000

SHSE

600000

200000

SHSE

600123

200000

SHSE

601988

200000


3. Python相关函数
    3.1 Python标准函数:

功能函数原型参数返回值
参数名含义
read_csv读取csv文件read_csv(s)s文件的路径csv文件
iterrows行遍历



format它通过{}和:来代替传统%方式



append用于在列表末尾添加新的对象。list.append(obj)obj添加到列表末尾的对象。该方法无返回值,但是会修改原来的列表。
join连接字符串数组。将字符串、元组、列表中的元素以指定的字符(分隔符)连接生成一个新的字符串'sep'.join(seq)sep分隔符。可以为空返回一个以分隔符sep连接各个元素后生成的字符串
seq要连接的元素序列、字符串、元组、字典
maxmax() 方法返回给定参数的最大值,参数可以为序列。max( x, y, z, .... )x数值表达式返回给定参数的最大值
y数值表达式
z数值表达式
minmin() 方法返回给定参数的最大值,参数可以为序列。min( x, y, z, .... )x数值表达式返回给定参数的最小值
y数值表达式
z数值表达式


   3.2 掘金接口函数:

功能函数原型参数返回值
参数名类型说明
subscribe订阅行情,策略类和行情服务了都提供该接口。subscribe(symbol_list)symbol_liststring订阅代码列表
get_last_n_dailybars提取单个代码的最新n条DailyBar数据, 策略类和行情服务类都提供该接口。get_last_n_dailybars(symbol, n, end_time='')symbolstring证券代码, 带交易所代码以确保唯一,如SHSE.600000bar列表
nint提取的数据条数
end_timestring指定截止时间, 如2015-10-30 15:00:00
on_tick响应Tick事件,收到Tick数据后本函数被调用。on_tick(tick)tickticktick数据
tick.last_price最新价




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_short异步平空仓接口,以参数指定exchange, 证券代码sec_id, 价和量下单。如果价格为0,为市价单,否则为限价单。策略类和交易服务类都提供该接口。close_short(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异步开空仓接口,以参数指定的exchange, 证券代码sec_id, 价和量下单。如果价格为0,为市价单,否则为限价单。策略类和交易服务类都提供该接口。open_short(exchange, sec_id, price, volume)exchangestring交易所代码, 如上交所SHSE委托下单生成的Order对象
sec_idstring证券代码,如浦发银行600000
pricefloat委托价,如果price=0,为市价单,否则为限价单
volumefloat平仓量


4. 金融术语
海龟交易系统作为一个著名的交易系统,具备三个特征:第一,是一个完整的交易系统,覆盖 了交易的每个环节;第二,是一个机械化的交易系统,不给交易者留下任何主观想象决策的空间和 余地;第三,是一个已经被验证可以盈利的交易系统,在多个期货品种中都可以获得稳定性的收益。
海龟交易系统涵盖了成功交易中的每一个必要环节:买卖市场(买卖什么);头寸规模(买卖 多少);入市(何时买卖);止损(什么时候放弃一个亏损的头寸);退出(什么时候退出一个赢利 的头寸);战术(怎么进行买卖)。





二维码

扫码加我 拉你入群

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

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


顶顶顶~好贴莫沉

使用道具

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

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

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

GMT+8, 2024-3-29 05:57