量化策略系列教程:14海龜策略

天天跟小哥要策略,你們也不怕累著小哥~不過我願意!哈哈哈~今兒給大家來個新策略,這幾天策略更新的慢一些,因為要做python教程視頻,大家不要太著急哈~證經社量化社區 - 證經社

PS:悟空傳還挺好看的嘿!倪妮的這個紫霞也挺好美的哈~

1. 策略原理:

海龜交易系統作為一個著名的交易系統,具備三個特徵:第一,是一個完整的交易系統,覆蓋 了交易的每個環節;第二,是一個機械化的交易系統,不給交易者留下任何主觀想像決策的空間和 餘地;第三,是一個已經被驗證可以盈利的交易系統,在多個期貨品種中都可以獲得穩定性的收益。

海龜交易系統涵蓋了成功交易中的每一個必要環節:買賣市場(買賣什麼);頭寸規模(買賣 多少);入市(何時買賣);止損(什麼時候放棄一個虧損的頭寸);退出(什麼時候退出一個贏利 的頭寸);戰術(怎麼進行買賣)。

海龜交易入市法則:系統 1:以 20 日突破為基礎的短期 系統;系統 2:以 55 日突破為基礎的中長期系統; 海龜交易退出法則:系統 1 採用 10 日突破退出法則: 對於多頭頭寸而言,在價格跌破過去 10 日最低點時退出;對 空頭頭寸而言,在價格超過 10 日最高點時退出。總之,如果 價格發生了不利於頭寸的 10 日突破,所有單位頭寸都要退出。 系統 2 採用 20 日突破退出法則:對多頭頭寸而言,是 20 日向 下突破,對空頭頭寸而言,是 20 日向上突破。只要價格發生 了不利於頭寸的 20 日突破,所有頭寸都會退出。

本策略只是海龜策略的框架:採用20日突破原則,20日向上突破時進行開倉,20日向下突破時進行平倉。

2. 代碼解讀:

2.1 turtle.ini

[strategy]nusername=npassword=n;模擬狀態nmode=4ntd_addr=localhost:8001nstrategy_id=n;訂閱代碼注意及時更新nsubscribe_symbols=nn[backtest]nstart_time=2016-08-22 09:00:00nend_time=2016-08-26 16:00:00n;策略初始資金ninitial_cash=1000000n;委託量成交比率,默認=1(每個委託100%成交)ntransaction_ratio=1n;手續費率,默認=0(不計算手續費)ncommission_ratio=0n;滑點比率,默認=0(無滑點)nslippage_ratio=0nn[para]ncsv_file=stocks.csvnperiod=20nhop=0.1nnn##############################################################n# logger settingsn##############################################################n[loggers]nkeys=rootnn[logger_root]nlevel=DEBUGnhandlers=console,filenn[handlers]nkeys=console,filenn[handler_file]nclass=handlers.RotatingFileHandlernargs=(strategy_turtle.log,a,1000,5)nformatter=simplenn[handler_console]nclass=StreamHandlernargs = (sys.stdout,)nformatter=simplenn[formatters]nkeys = simplenn[formatter_simple]nformat=%(asctime)s - %(name)s - %(levelname)s - %(message)sndatefmt=n

2.2 turtle.py

# encoding: utf8nnimport loggingnimport logging.confignimport pandas as pdnimport numpy as npnfrom gmsdk import *nnclass TurtleStrategy(StrategyBase):n def __init__(self, *args, **kwargs):n super(TurtleStrategy, self).__init__(*args, **kwargs)n self.__get_param__()n self.__init_data__()n;讀取參數n def __get_param__(self):n self.csv_file = self.config.get(para, csv_file)n self.period = self.config.getint(para, period)n self.hop = self.config.get(para, hop) or 0.1n;讀取CSV文件n def __init_data__(self):n n read stocks from csv filen :return:n n self.sec_ids = []n self.hist_data = dict()n self.positions = dict()nn subscribe_symbols = []nn stocks = pd.read_csv(self.csv_file, sep=,)n for r in stocks.iterrows():n exchange = r[1][0]n sec_id = r[1][1]n buy_amount = r[1][2]n t = "{0}.{1}".format(exchange, sec_id)nn hl = self.get_highest_lowest_price(t)n #print (hl)n self.hist_data[t] = hl + (buy_amount,) ## high, low, buy_amountnnn self.sec_ids.append("{0}".format(sec_id))n subscribe_symbols.append(t + ".tick")nn self.subscribe(",".join(subscribe_symbols))nn;獲取近20日的最高價及最低價n def get_highest_lowest_price(self, symbol):n #print(symbol)n ## get last N dailybarsn hd = self.get_last_n_dailybars(symbol, self.period)nn high_prices = [b.high for b in hd]n #high_prices.reverse()nn low_prices = [b.low for b in hd]n #low_prices.reverse()nn return np.max(high_prices), np.min(low_prices)nnn def on_tick(self, tick):nn if not tick.sec_id in self.sec_ids:n passn #self.logger.info( "received tick: %s %s %s %s" % (tick.exchange, tick.sec_id, round(tick.last_price,2), tick.last_volume))n else:n #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)))n symbol = ".".join([tick.exchange, tick.sec_id])nn data = self.hist_data.get(symbol)n self.hop = float(self.hop)n #print (data)n pa = self.get_positions()n #int pan;開倉及平倉n if data and tick.last_price > data[0] : ## check highn volume = int(data[2]/(tick.last_price+self.hop)/100)*100 ## get slots, then sharesn if bool(self.get_position(tick.exchange,tick.sec_id,1)) == 0:n #print (to_dict(aaa[0]))n self.open_long(tick.exchange, tick.sec_id, tick.last_price + self.hop, volume)n #print (tick.exchange, tick.sec_id, tick.last_price + self.hop, volume)nn #print (tick.sec_id)n elif data and tick.last_price < data[1]: ## check lownn #p = self.get_position(tick.exchange, tick.sec_id, OrderSide_Bid)n ps = self.get_positions()n for p in ps:n sym = ".".join([p.exchange, p.sec_id])n self.positions[sym] = pn #print (p)nn ## if not in stock list, close long positionn if p.sec_id in self.sec_ids:n self.close_long(p.exchange, p.sec_id, 0, p.volume)nnif __name__ == __main__:n ini_file = sys.argv[1] if len(sys.argv) > 1 else turtle.inin logging.config.fileConfig(ini_file)n st = TurtleStrategy(config_file=ini_file)n st.logger.info("Strategy turtle ready, waiting for data ...")n ret = st.run()nst.logger.info("Strategy turtle message %s" % st.get_strerror(ret))n

2.3 stocks.csv

如果想了解相關的python函數和掘金介面函數,走下方通道:

zjshe.cn/q/forum.php?

有不了解的可以給小編留言哦,小編會細心為大家解答~

推薦閱讀:

進程間通信和線程間通信的區別?
小說人物關係的可視化
Python中對位元組流/二進位流的操作:struct模塊簡易使用教程
為什麼大多數編程語言被設計成函數只有一個返回值,而不是多個?
求大神們推薦python入門書籍(爬蟲方面)?

TAG:量化 | 策略 | Python |