量化交易入門筆記-策略回測與評估
首先,編寫一個簡單的“雙均線量化策略”
程式碼如下:
def initialize(context):
"""雙均線量化策略的初始化函式"""
# 定義一個區域性變數,儲存要操作的股票
g.security = '000002.XSHE' # 萬科A
# 設定滬深300作為基準
set_benchmark('000300.XSHG')
# 開啟動態復權,使用真實價格交易
set_option('use_real_price', True)
# 設定成交量比例
set_option('order_volume_ratio' , 1)
# 股票類交易手續費:買入時佣金的萬分之三,賣出時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')
# 執行函式
run_daily(trade, 'every_bar' )
def trade(context):
"""雙均線量化策略的交易程式函式"""
security = g.security
# 設定均線
n1 = 5
n2 = 10
# 獲取股票的收盤價
close_data = attribute_history(
security=security,
count=n2+2,
unit='1d',
fields=['close'],
df=True)
# 取得過去 ma_n1 天的平均價格
ma_n1 = close_data['close'][-n1:].mean()
# 取得過去 ma_n2 天的平均價格
ma_n2 = close_data['close'][-n2:].mean()
# 取得當前的現金
cash = context.portfolio.cash
# 如果當前有餘額,並且 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 日均線價格
record(ma_n1=ma_n1)
# 繪製 ma_n2 日均線價格
record(ma_n2=ma_n2)
然後設定回測的開始時間、結束時間、回測資金和回測頻率,點選“執行回測”
回測結果如下:
瞭解Bar的概念
一根完整的K線相當於一個Bar,根據時間序列的不同,有分鐘Bar、小時Bar、日Bar等
當選擇“每天”頻率時,演算法在每根日線Bar上都會執行一次,即每天執行一次
同理,選擇“分鐘”頻率時,演算法會在每根分鐘Bar上執行一次,即每分鐘執行一次
瞭解量化策略的風險指標
一個策略的好壞,可以能過以下幾個指標來判斷
風險指標有利於投資者對策略進行客觀的評價。需要注意的是,無論是回測還是模擬,所有風險指標都只會根據每天收盤後的收益計算並每天更新一次,並不會考慮盤中的收益情況
Alpha(阿爾法)
意義:
投資中面臨著系統性風險(即Beta)和非系統性風險(即Alpha),Alpha是投資者獲得與市場波動無關的回報。比如投資者獲得了15%的回報,其基準獲得了10%的回報,那麼Alpha或者價值增值部分就是5%
公式:
- Rp = 策略年化收益率
- Rm = 基準年化收益率
- Rf = 無風險利率(預設是0.04)
- βp = 策略beta值
根據公式得出:當 α > 0 ,策略相對於風險,獲得了超額收益; α = 0,策略相對於風險,獲得了適當收益; α < 0,策略相對於風險,獲得了較少收益
Beta(貝塔)
意義:
Beta表示投資的系統性風險,反映了策略對大盤變化的敏感性。例如一個策略的Beta為1.5,則大盤漲1%時,策略可能漲1.5%,反之亦然;如果一個策略的Beta為-1.5,說明大盤漲1%的時候,策略可能跌1.5%,反之亦然
公式:
- Dp = 策略每日收益
- Dm = 基準每日收益
- Cov(Dp,Dm) = 策略每日收益與基準每日收益的協方差
- Var(Dm) = 基準每日收益的方差
當 β<0,投資組合和基準的走向通常相反,如空頭頭寸類。如果β=0,投資組合和基準的走向沒有相關性,如固定收益類。0<β<1,投資組合和基準的走向相同,但是比基準的移動幅度更小。如果β=1,投資組合和基準的走向相同,並且和基準的移動同謀貼近。如果β>1,投資組合和基準的走向相同,但是比基準的移動幅度更大
Sharpe(夏普比率)
意義:
Sharpe表示每承受一單位總風險,會產生多少超額報酬,可以同時對策略的收益與風險進行綜合考慮
公式:
- Rp = 策略年化收益率
- Rf = 無風險利率(預設值為0.04)
- σp = 策略收益波動率
Sortino(索提諾比率)
意義:
Sortino 表示每承擔一單位的下行風險,將會獲得多少超額回報
公式:
- Rp = 策略年化收益率
- Rf = 無風險利率(預設值為0.04)
- σpd = 策略下行波動率
Information Ratio(資訊比率)
意義:
Information Ratio 是用來衡量單位超額風險帶來的σp = 策略收益波動率。資訊比率越大,說明該策略單位跟蹤誤差所獲得的超額收益越高,因此,資訊比率較大的策略的表現要優於資訊比率較低的基準。合理的投資目標應該是在承擔適度風險下,儘可能追求高資訊比率
公式:
- Rp = 策略年化收益率
- Rm = 基準年華收益率
- σt = 策略與基準每日收益差值的年化標準差
Volatility(策略波動率)
意義:
公式:
- rp = 策略每日收益第
- r- p = 策略每日收益的平均值 = lnΣi=lnrp
- n = 策略執行天數
Benchmark Volatility(基準波動率)
意義:
Benchmark Volatility 用來測量基準的風險性,波動越大代表基準風險越高
公式:
- rm = 其次每日收益第
- r- m = 基準每日收益的平均值 = lnΣi=lnrm
- n = 策略執行天數
Max Drawdown(最大回撤)
意義:
Max Drawdown 描述策略可能出現最糟糕的情況,最極端可能的虧損
公式: