在本系列第一篇中,我們介紹了技術(shù)分析的基本指標(biāo)“雙均線”。但是僅僅靠?jī)筛€回測(cè)的結(jié)果似乎并不是特別理想,最直接的改進(jìn)思路就是給開倉(cāng)和平倉(cāng)條件加點(diǎn)過濾器,也就是加上一些限制條件。點(diǎn)擊閱讀:量化學(xué)習(xí) | GTquant量化回測(cè)框架之雙均線策略(一)
但是僅僅靠?jī)筛€回測(cè)的結(jié)果似乎并不是特別理想,最直接的改進(jìn)思路就是給開倉(cāng)和平倉(cāng)條件加點(diǎn)過濾器,也就是加上一些限制條件。

之前我們只要看到短線上穿長(zhǎng)線,我們就開多倉(cāng),但是實(shí)際上漲趨勢(shì)也許并不穩(wěn)定,此時(shí)我們可以給開倉(cāng)條件加個(gè)閾值機(jī)制,即僅僅短線上穿長(zhǎng)線還不夠,要等短線超過長(zhǎng)線一定程度,上漲趨勢(shì)比較穩(wěn)定的時(shí)候才開倉(cāng);平倉(cāng)條件也可以加上閾值機(jī)制,如短線下穿長(zhǎng)線不急著平倉(cāng),可能還有反彈的機(jī)會(huì)(其實(shí)是加入了均值回歸的思想),所以我們也加上一個(gè)緩沖段,僅當(dāng)短線下穿長(zhǎng)線一定距離后才平倉(cāng)。

除了增加閾值機(jī)制之外,你也可以增加止盈和止損機(jī)制,總之優(yōu)化的方法是很多啦~本文采取以下優(yōu)化,當(dāng)然你們也可以做出自己的嘗試哦,說不定能得到更好的結(jié)果~
雙均線策略優(yōu)化:在簡(jiǎn)單移動(dòng)平均基礎(chǔ)上加上開倉(cāng)過濾條件和止損機(jī)制:
開倉(cāng)條件(加上閾值機(jī)制):
短線上穿長(zhǎng)線,且短線與長(zhǎng)線的距離 > 開倉(cāng)觸發(fā)倍數(shù) × 觀察期內(nèi)收盤價(jià)標(biāo)準(zhǔn)差
平倉(cāng)條件(加上閾值機(jī)制和止損機(jī)制):
短線下穿長(zhǎng)線,或前一日收盤價(jià) < 開倉(cāng)時(shí)價(jià)格 - 最大容忍損失
按上述優(yōu)化的策略回測(cè)如下:

1from GTquant import *
2import talib as ta
1class RefinedSMAStrategy(Strategy):
2
3 def __init__(self, short_term, long_term):
4
5 Strategy.__init__(self)
6
7 # 設(shè)置長(zhǎng)短均線周期
8 self.short_term = short_term
9 self.long_term = long_term
10
11 # 創(chuàng)建空list,用于在運(yùn)行on_bar時(shí)記錄計(jì)算均線的數(shù)據(jù)
12 self.bar_record = []
13
14 # long_price屬性用于存儲(chǔ)開倉(cāng)時(shí)價(jià)格,用于計(jì)算止損價(jià)格
15 self.long_price = None
16
17 def on_bar(self, bar):
18
19 # 重寫父類on_bar方法實(shí)現(xiàn)策略邏輯,on_bar是從DataSource—>Backtester—>再交給Strategy的on_bar
20 # 更新用于計(jì)算均線的數(shù)據(jù)
21 self.bar_record.append(bar.close)
22
23 if len(self.bar_record) > self.long_term:
24
25 # 計(jì)算長(zhǎng)短均線數(shù)據(jù)
26 short_term_ma = np.mean(self.bar_record[-self.short_term-1: -1])
27 long_term_ma = np.mean(self.bar_record[-self.long_term-1: -1])
28 distance = short_term_ma - long_term_ma
29
30 # 計(jì)算觀察期內(nèi)收盤價(jià)標(biāo)準(zhǔn)差
31 std = np.std(self.bar_record[-self.long_term-1: -1])
32
33 # 獲取資金和持倉(cāng)賬戶
34 # 從父類Strategy類中繼承g(shù)et_position方法,從而連接到了AccountSystem中獲取相關(guān)數(shù)據(jù)
35 position_account = self.get_position()
36 cash_account = self.get_cash_account()
37
38 # 當(dāng)前沒有持倉(cāng)時(shí)
39 # 當(dāng)短期均線大于長(zhǎng)期均線一定距離,滿倉(cāng)買入
40 if position_account.position.get(bar.symbol, 0)==0:
41 if distance > 0.2 * std:
42 self.long_price = bar.open
43 self.stop_lose_price = self.long_price*(1 - 2/100)
44 volume = cash_account.cash//(bar.open*100) * 100
45 self.send_order(bar.symbol, bar.datetime, bar.open, volume, is_buy=True)
46
47 # 當(dāng)前有持倉(cāng)時(shí)
48 # 當(dāng)短線下穿長(zhǎng)線,或達(dá)到止損價(jià)格,清倉(cāng)
49 else:
50 if (distance < 0) or (self.bar_record[-1] < self.stop_lose_price):
51 volume = position_account.position.get(bar.symbol, 0)
52 self.send_order(bar.symbol, bar.datetime, bar.open, volume, is_buy=False)
1backtester = BackTester(
2 start_datetime='2010-01-01',
3 end_datetime='2018-01-01',
4 symbol='600837',
5 initial_cash=100000,
6 data_source=TushareDataSource,
7 strategy=RefinedSMAStrategy(short_term=5, long_term=20),
8)
9backtester.start_backtest()
從回測(cè)圖可以看到,對(duì)于同樣的一只股票、同樣的回測(cè)區(qū)間,稍微改進(jìn)一下原有的策略就成效顯著啦!精益求精的同學(xué)們也可以動(dòng)手開發(fā)自己的策略哦~通過兩次實(shí)踐,想必大家對(duì)雙均線策略已經(jīng)比較熟悉啦。
(7).png)
金程推薦: AQF培訓(xùn) AQF培訓(xùn)機(jī)構(gòu) AQF是什么意思
AQF考友群:760229148
金融寬客交流群:801860357
微信公眾號(hào):量化金融分析師
聲明▎更多內(nèi)容請(qǐng)關(guān)注微信號(hào)量化金融分析師。原創(chuàng)文章,歡迎分享,若需引用或轉(zhuǎn)載請(qǐng)保留此處信息。




