量化投資學習筆記79——實現量化交易經典策略:雙均線策略
搜尋了一下,主要實現雙均線策略,布林帶策略,海龜交易法,多因子選股,網格交易法這幾種策略。
首先看雙均線策略,參考這兩篇:
http://www。
snailtoday。com/archives
/18598
https://
zhuanlan。zhihu。com/p/43
317574
由短週期均線自下方向上穿越長週期的均線,則形成“金叉”,反之為“死叉”。雙均線金叉的時候,表明該股票很強勢,反之很弱勢,我們就在強勢的時候買,弱勢的時候賣。
# coding:utf-8
# 雙均線策略實現
import
backtrader
as
bt
import
backtest
import
math
# 雙均線策略類
class
SmaCross
(
bt
。
Strategy
):
params
=
dict
(
pfast
=
5
,
pslow
=
30
)
def
log
(
self
,
txt
,
dt
=
None
):
dt
=
dt
or
self
。
datas
[
0
]
。
datetime
。
date
(
0
)
(
‘
%s
,
%s
’
%
(
dt
。
isoformat
(),
txt
))
def
__init__
(
self
):
sma1
=
bt
。
ind
。
SMA
(
period
=
self
。
p
。
pfast
)
sma2
=
bt
。
ind
。
SMA
(
period
=
self
。
p
。
pslow
)
self
。
crossover
=
bt
。
ind
。
CrossOver
(
sma1
,
sma2
)
self
。
dataclose
=
self
。
datas
[
0
]
。
close
self
。
order
=
None
def
next
(
self
):
if
not
self
。
position
:
if
self
。
crossover
>
0
:
cash
=
self
。
broker
。
get_cash
()
stock
=
math
。
ceil
(
cash
/
self
。
dataclose
/
100
)
*
100
-
100
(
“數量”
,
stock
)
self
。
order
=
self
。
buy
(
size
=
stock
,
price
=
self
。
datas
[
0
]
。
close
)
self
。
log
(
“買入”
)
elif
self
。
crossover
<
0
:
self
。
order
=
self
。
close
()
self
。
log
(
“賣出”
)
if
__name__
==
“__main__”
:
start
=
“2018-01-01”
end
=
“2020-07-05”
name
=
[
“300etf”
]
code
=
[
“510300”
]
backtest
=
backtest
。
BackTest
(
SmaCross
,
start
,
end
,
code
,
name
,
10000
)
backtest
。
run
()
backtest
。
output
()
期末資金
:
8760。36
夏普比例
:
-
0。2841412997849817
年化收益率
:
OrderedDict
([(
2018
,
-
0。22430925900000043
),
(
2019
,
0。19074554997170012
),
(
2020
,
-
0。0515497175750389
)])
最大回撤
:
23。20
,
最大回撤週期292
總收益率
:
-
0。13
表現不好,是虧的。一開始沒注意,預設買入數量是1股,要自己計算後設定買入數量。
再修改一下backtest類,將回測結果資料儲存到一個Series裡,方便不同策略比較。
# 計算勝率資訊
def _winInfo(self):
trade_info = self。__results[0]。analyzers。TA。get_analysis()
total_trade_num = trade_info[“total”][“total”]
win_num = trade_info[“won”][“total”]
lost_num = trade_info[“lost”][“total”]
self。__backtestResult[“交易次數”] = total_trade_num
self。__backtestResult[“勝率”] = win_num/total_trade_num
self。__backtestResult[“敗率”] = lost_num/total_trade_num
# 計算並儲存回測結果指標
def _Result(self):
self。__backtestResult[“賬戶總額”] = self。getValue()
self。__backtestResult[“總收益率”] = self。__results[0]。analyzers。RE。get_analysis()[“rtot”]
self。__backtestResult[“年化收益率”] = self。__results[0]。analyzers。RE。get_analysis()[“rnorm”]
self。__backtestResult[“夏普比率”] = self。__results[0]。analyzers。sharpe。get_analysis()[“sharperatio”]
self。__backtestResult[“最大回撤”] = self。__results[0]。analyzers。DD。get_analysis()。max。drawdown
self。__backtestResult[“最大回撤期間”] = self。__results[0]。analyzers。DD。get_analysis()。max。len
# 計算勝率資訊
self。_winInfo()
# 獲取回測指標
def getResult(self):
return self。__backtestResult
這個策略並不咋樣啊。
另外backtrader貌似沒有直接計算α、β、資訊比例等指標的方法,自己實現吧。等下次吧。
程式碼地址:
https://
github。com/zwdnet/MyQua
nt/tree/master/47
我發文章的三個地方,歡迎大家在朋友圈等地方分享,歡迎點“在看”。
我的個人部落格地址:https://zwdnet。github。io
我的知乎文章地址:
https://www。
zhihu。com/people/zhao-y
ou-min/posts
我的微信個人訂閱號:趙瑜敏的口腔醫學學習園地