量化策略系列教程:08空中花園策略(SkyPark)

小哥一直覺得空中花園這個策略名字很浪漫,哈哈~

好好學習天天向上證經社量化社區 - 證經社

1.策略介紹及主要特點

策略介紹:

空中花園屬於日內突破策略,是期貨CTA日內策略。空中花園比較看重開盤突破。開盤時的高開或者低開均說明有大的利好或者利空使得開盤大幅遠離昨天的收盤價。開盤突破,是最快的一種入場方式。當然出錯的概率也最高。因此為了提高策略的勝率,空中花園策略加了額外的條件,也就是開盤要大幅高開或者低開,形成一個空窗,因此顧名思義稱為空中花園,然後再根據是否突破上下軌來進行開倉判斷。這樣一來,策略的勝率將大大提高,不過由於對高開或者低開的幅度要求過高,一般是超過1%,因此使得策略的交易次數可能相對其它策略而言要偏低一些。開盤第一根K線是收陽還是收陰,是判斷日內趨勢可能運動方向的標準。在當天開盤高開或低開時更有效。

策略主要特點:

日內交易策略,當日收盤平倉; 空中花園在當天高開或低開時使用,即當開盤價>=昨天收盤價*1.01 或開盤價<=昨天收盤價*0.99 時:

  • 上軌=第一根K線的最高價;
  • 下軌=第一根K線的最低價;
  • 當價格突破上軌,買入開倉;
  • 當價格跌穿下軌,賣出開倉;
  • 當日收盤平倉

2.策略代碼

本策略的回測平台使用的是掘金量化平台,平台詳細介紹及安裝說明請見文後鏈接。

2.1配置文件

配置文件中,需要按照各自信息進行配置。

username:填寫掘金平台賬號;

password:填寫掘金平台賬號密碼;

strategy_id:填寫掘金平台上策略的strategy_id(友情提示,此處策略ID非策略名稱);

subscribe_symbols:填寫訂閱的信號代碼;

trade_symbol:填寫交易信號代碼;

策略ID獲取步驟:

1)登陸掘金平台,創建策略,點擊【模擬交易】,然後選擇對應的策略。

2)進入策略後,在策略ID後,點擊複製,即將策略ID複製成功

2.2策略代碼

配置文件【SkyPark.ini】,代碼:

<font size="2"><font size="3" face="宋體">[strategy]n;td_addr=localhost:8001nusername= npassword= nstrategy_id= n;回測模式nmode=4n;訂閱代碼注意及時更新nsubscribe_symbols=CFFEX.IF1707.tick,CFFEX.IF1707.bar.60nn[backtest]nstart_time=2017-06-01 09:00:00nend_time=2017-07-13 15:00:00ninitial_cash=10000000ntransaction_ratio=1ncommission_ratio=0nslippage_ratio=0nn[para]ntrade_symbol=CFFEX.IF1707nfirst_kline_time=09:30:00nfirst_kline_time1=09:31:00nend_time=14:55:00nopen_long_size=0.01nopen_short_size=0.01n</font></font>n

策略文件【SkyPark.py】,代碼:

<font size="2"><font size="3" face="宋體"># encoding: utf-8nfrom gmsdk.api import StrategyBasenfrom gmsdk import mdnfrom gmsdk.enums import *nimport arrownimport timenn# 每次開倉量nOPEN_VOL = 5nnnclass SkyPark(StrategyBase):n def __init__(self, *args, **kwargs):n super(SkyPark, self).__init__(*args, **kwargs)n # 上、下軌n self.upr = Nonen self.dwn = Nonenn # 開倉標識n self.open_long_flag = Falsen self.open_short_flag = Falsenn # 持倉量n self.holding = 0nn self.__get_param()n self.__init_data()nn def __get_param(self):n n 獲取配置參數n n # 交易證券代碼n self.trade_symbol = self.config.get(para, trade_symbol)n pos = self.trade_symbol.find(.)n self.exchange = self.trade_symbol[:pos]n self.sec_id = self.trade_symbol[pos + 1:]nn FMT = %s %sn today = arrow.now().date()nn # 第一根K線時間n first_kline_time = self.config.get(para, first_kline_time)n et = FMT % (today.isoformat(), first_kline_time)n self.first_kline_time_str = etnn first_kline_time1 = self.config.get(para, first_kline_time1)n et = FMT % (today.isoformat(), first_kline_time1)n self.first_kline_time_str1 = etn # 平倉時間n end_time = self.config.get(para, end_time)n et = FMT % (today.isoformat(), end_time)n self.end_trading = arrow.get(et).replace(tzinfo=local).timestampn print("end time %s" % (et))nn # 開多閥值n self.open_long_size = self.config.getfloat(para, open_long_size)n # 開空閥值n self.open_short_size = self.config.getfloat(para, open_short_size)nn def __init_data(self):n dailybars = self.get_last_dailybars(self.trade_symbol)n if len(dailybars) > 0:n self.pre_close = dailybars[0].closenn # 第一根K線數據n while self.upr is None or self.dwn is None:n print(waiting for get the first K line...)n bars = self.get_bars(self.trade_symbol, 60, self.first_kline_time_str, self.first_kline_time_str1)n if len(bars) > 0:n self.upr = bars[0].high # 上軌n self.dwn = bars[0].low # 下軌n print(upr:%s, dwn: %s % (self.upr, self.dwn))nn if bars[0].open > self.pre_close * (1 + self.open_long_size):n self.open_long_flag = True # 開多倉標識n elif bars[0].open > self.pre_close * (1 - self.open_short_size):n self.open_short_flag = True # 開空倉標識n else:n print(Do not meet the trading condition, today do not trading.)n breaknn time.sleep(1)nn def on_tick(self, tick):n # 最新報價n self.close = tick.last_pricenn def on_bar(self, bar):n n bar周期數據事件n n if self.open_long_flag and self.close > self.upr and 0 == self.holding:n self.open_long(self.exchange, self.sec_id, 0, OPEN_VOL)n self.holding += OPEN_VOLn print(open long: last price %s, vol %s % (self.close, OPEN_VOL))n elif self.open_short_flag and self.close < self.dwn and 0 == self.holding:n self.open_short(self.exchange, self.sec_id, 0, OPEN_VOL)n self.holding += OPEN_VOLn print(open short: last price %s, vol %s % (self.close, OPEN_VOL))nn # 日內平倉n if bar.utc_time > self.end_trading:n if self.open_long_flag and self.holding > 0:n self.close_long(self.exchange, self.sec_id, 0, self.holding)n self.holding = 0n self.open_long_flag = Falsen print(end trading time close long, vol: %s % self.holding)n elif self.open_short_flag and self.holding > 0:n self.close_short(self.exchange, self.sec_id, 0, self.holding)n self.holding = 0n self.open_short_flag = Falsen print(end trading time close short, vol: %s % self.holding)nnif __name__ == __main__:n sky_park = SkyPark(config_file=SkyPark.ini)n ret = sky_park.run()nprint(sky_park.get_strerror(ret))</font></font>n

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

http://zjshe.cn/q/forum.php?mod=viewthread&tid=55&extra=page%3D1

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


推薦閱讀:

TAG:量化 | 策略 | Python |