首先冯丙,編寫一個(gè)簡單的“雙均線量化策略”
代碼如下:
def initialize(context):
"""雙均線量化策略的初始化函數(shù)"""
# 定義一個(gè)局部變量,保存要操作的股票
g.security = '000002.XSHE' # 萬科A
# 設(shè)定滬深300作為基準(zhǔn)
set_benchmark('000300.XSHG')
# 開啟動(dòng)態(tài)復(fù)權(quán)遭京,使用真實(shí)價(jià)格交易
set_option('use_real_price', True)
# 設(shè)定成交量比例
set_option('order_volume_ratio', 1)
# 股票類交易手續(xù)費(fèi):買入時(shí)傭金的萬分之三胃惜,賣出時(shí)ew傭金的萬分之三加
# 千分之一的印花稅泞莉,每筆交易傭金最低扣5元錢
set_order_cost(OrderCost(open_tax=0,
close_tax=0.001,
open_commission=0.0003,
close_commission=0.0003,
close_today_commission=0,
min_commission=5), type='stock')
# 運(yùn)行函數(shù)
run_daily(trade, 'every_bar')
def trade(context):
"""雙均線量化策略的交易程序函數(shù)"""
security = g.security
# 設(shè)定均線
n1 = 5
n2 = 10
# 獲取股票的收盤價(jià)
close_data = attribute_history(
security=security,
count=n2+2,
unit='1d',
fields=['close'],
df=True)
# 取得過去 ma_n1 天的平均價(jià)格
ma_n1 = close_data['close'][-n1:].mean()
# 取得過去 ma_n2 天的平均價(jià)格
ma_n2 = close_data['close'][-n2:].mean()
# 取得當(dāng)前的現(xiàn)金
cash = context.portfolio.cash
# 如果當(dāng)前有余額,并且 n1 日無線大于 n2 日無線
if ma_n1 > ma_n2:
# 用所有 cash 買入股票
order_value(security, cash)
# 記錄這次買入
log.info('Buying %s' % (security))
# 如果 n1 日無線小于 n2 日無線船殉,并且目前有頭寸
elif ma_n1 < ma_n2 and context.portfolio.positions[security].closeable_amount > 0:
# 全部賣出
order_target(security, 0)
# 記錄這次賣出
log.info('Selling %s' % (security))
# 繪制 n1 日均線價(jià)格
record(ma_n1=ma_n1)
# 繪制 ma_n2 日均線價(jià)格
record(ma_n2=ma_n2)
然后設(shè)置回測的開始時(shí)間鲫趁、結(jié)束時(shí)間、回測資金和回測頻率利虫,點(diǎn)擊“運(yùn)行回測”
回測結(jié)果如下:
了解Bar的概念
一根完整的K線相當(dāng)于一個(gè)Bar挨厚,根據(jù)時(shí)間序列的不同,有分鐘Bar糠惫、小時(shí)Bar疫剃、日Bar等
當(dāng)選擇“每天”頻率時(shí),算法在每根日線Bar上都會(huì)運(yùn)行一次寞钥,即每天運(yùn)行一次
同理慌申,選擇“分釧”頻率時(shí),算法會(huì)在每根分鐘Bar上運(yùn)行一次理郑,即每分鐘運(yùn)行一次
了解量化策略的風(fēng)險(xiǎn)指標(biāo)
一個(gè)策略的好壞蹄溉,可以能過以下幾個(gè)指標(biāo)來判斷
風(fēng)險(xiǎn)指標(biāo)有利于投資者對策略進(jìn)行客觀的評價(jià)。需要注意的是您炉,無論是回測還是模擬柒爵,所有風(fēng)險(xiǎn)指標(biāo)都只會(huì)根據(jù)每天收盤后的收益計(jì)算并每天更新一次,并不會(huì)考慮盤中的收益情況
Alpha(阿爾法)
意義:
投資中面臨著系統(tǒng)性風(fēng)險(xiǎn)(即Beta)和非系統(tǒng)性風(fēng)險(xiǎn)(即Alpha)赚爵,Alpha是投資者獲得與市場波動(dòng)無關(guān)的回報(bào)棉胀。比如投資者獲得了15%的回報(bào),其基準(zhǔn)獲得了10%的回報(bào)冀膝,那么Alpha或者價(jià)值增值部分就是5%
公式:
- Rp = 策略年化收益率
- Rm = 基準(zhǔn)年化收益率
- Rf = 無風(fēng)險(xiǎn)利率(默認(rèn)是0.04)
- βp = 策略beta值
根據(jù)公式得出:當(dāng) α > 0 唁奢,策略相對于風(fēng)險(xiǎn),獲得了超額收益窝剖; α = 0麻掸,策略相對于風(fēng)險(xiǎn),獲得了適當(dāng)收益赐纱; α < 0脊奋,策略相對于風(fēng)險(xiǎn),獲得了較少收益
Beta(貝塔)
意義:
Beta表示投資的系統(tǒng)性風(fēng)險(xiǎn)疙描,反映了策略對大盤變化的敏感性诚隙。例如一個(gè)策略的Beta為1.5,則大盤漲1%時(shí)起胰,策略可能漲1.5%久又,反之亦然;如果一個(gè)策略的Beta為-1.5,說明大盤漲1%的時(shí)候籽孙,策略可能跌1.5%烈评,反之亦然
公式:
- Dp = 策略每日收益
- Dm = 基準(zhǔn)每日收益
- Cov(Dp,Dm) = 策略每日收益與基準(zhǔn)每日收益的協(xié)方差
- Var(Dm) = 基準(zhǔn)每日收益的方差
當(dāng) β<0,投資組合和基準(zhǔn)的走向通常相反犯建,如空頭頭寸類讲冠。如果β=0,投資組合和基準(zhǔn)的走向沒有相關(guān)性适瓦,如固定收益類竿开。0<β<1,投資組合和基準(zhǔn)的走向相同,但是比基準(zhǔn)的移動(dòng)幅度更小玻熙。如果β=1否彩,投資組合和基準(zhǔn)的走向相同,并且和基準(zhǔn)的移動(dòng)同謀貼近嗦随。如果β>1列荔,投資組合和基準(zhǔn)的走向相同,但是比基準(zhǔn)的移動(dòng)幅度更大
Sharpe(夏普比率)
意義:
Sharpe表示每承受一單位總風(fēng)險(xiǎn)枚尼,會(huì)產(chǎn)生多少超額報(bào)酬贴浙,可以同時(shí)對策略的收益與風(fēng)險(xiǎn)進(jìn)行綜合考慮
公式:
- Rp = 策略年化收益率
- Rf = 無風(fēng)險(xiǎn)利率(默認(rèn)值為0.04)
- σp = 策略收益波動(dòng)率
Sortino(索提諾比率)
意義:
Sortino 表示每承擔(dān)一單位的下行風(fēng)險(xiǎn),將會(huì)獲得多少超額回報(bào)
公式:
- Rp = 策略年化收益率
- Rf = 無風(fēng)險(xiǎn)利率(默認(rèn)值為0.04)
- σpd = 策略下行波動(dòng)率
Information Ratio(信息比率)
意義:
Information Ratio 是用來衡量單位超額風(fēng)險(xiǎn)帶來的σp = 策略收益波動(dòng)率署恍。信息比率越大崎溃,說明該策略單位跟蹤誤差所獲得的超額收益越高,因此盯质,信息比率較大的策略的表現(xiàn)要優(yōu)于信息比率較低的基準(zhǔn)袁串。合理的投資目標(biāo)應(yīng)該是在承擔(dān)適度風(fēng)險(xiǎn)下,盡可能追求高信息比率
公式:
- Rp = 策略年化收益率
- Rm = 基準(zhǔn)年華收益率
- σt = 策略與基準(zhǔn)每日收益差值的年化標(biāo)準(zhǔn)差
Volatility(策略波動(dòng)率)
意義:
公式:
- rp = 策略每日收益第
- r- p = 策略每日收益的平均值 = lnΣi=lnrp
- n = 策略執(zhí)行天數(shù)
Benchmark Volatility(基準(zhǔn)波動(dòng)率)
意義:
Benchmark Volatility 用來測量基準(zhǔn)的風(fēng)險(xiǎn)性呼巷,波動(dòng)越大代表基準(zhǔn)風(fēng)險(xiǎn)越高
公式:
- rm = 其次每日收益第
- r- m = 基準(zhǔn)每日收益的平均值 = lnΣi=lnrm
- n = 策略執(zhí)行天數(shù)
Max Drawdown(最大回撤)
意義:
Max Drawdown 描述策略可能出現(xiàn)最糟糕的情況囱修,最極端可能的虧損
公式:
- Px, Pv = 策略某日股票和現(xiàn)金的總價(jià)值
注:本文章為個(gè)人學(xué)習(xí)筆記,參考了一些書籍與官方教程王悍,不作任何商業(yè)用途蔚袍!