1. 程式人生 > >量化交易入門筆記-策略回測與評估

量化交易入門筆記-策略回測與評估

首先,編寫一個簡單的“雙均線量化策略”

程式碼如下:

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%

公式:
A l p h a = α = R p [ R f + β p ( R m R f ) ] Alpha = α = R_p - [R_f + β_p(R_m - R_f)]

  • Rp = 策略年化收益率
  • Rm = 基準年化收益率
  • Rf = 無風險利率(預設是0.04)
  • βp = 策略beta值

根據公式得出:當 α > 0 ,策略相對於風險,獲得了超額收益; α = 0,策略相對於風險,獲得了適當收益; α < 0,策略相對於風險,獲得了較少收益

Beta(貝塔)

意義:

Beta表示投資的系統性風險,反映了策略對大盤變化的敏感性。例如一個策略的Beta為1.5,則大盤漲1%時,策略可能漲1.5%,反之亦然;如果一個策略的Beta為-1.5,說明大盤漲1%的時候,策略可能跌1.5%,反之亦然

公式:
B e t a = β p = C o v ( D p , D m ) V a r ( D m ) Beta = β_p = \frac{Cov(D_p,D_m)}{Var(D_m)}

  • Dp = 策略每日收益
  • Dm = 基準每日收益
  • Cov(Dp,Dm) = 策略每日收益與基準每日收益的協方差
  • Var(Dm) = 基準每日收益的方差

當 β<0,投資組合和基準的走向通常相反,如空頭頭寸類。如果β=0,投資組合和基準的走向沒有相關性,如固定收益類。0<β<1,投資組合和基準的走向相同,但是比基準的移動幅度更小。如果β=1,投資組合和基準的走向相同,並且和基準的移動同謀貼近。如果β>1,投資組合和基準的走向相同,但是比基準的移動幅度更大

Sharpe(夏普比率)

意義:

Sharpe表示每承受一單位總風險,會產生多少超額報酬,可以同時對策略的收益與風險進行綜合考慮

公式:
S h a r p e R a t i o = R p R f σ p Sharpe Ratio = \frac{R_p - R_f}{σ_p}

  • Rp = 策略年化收益率
  • Rf = 無風險利率(預設值為0.04)
  • σp = 策略收益波動率

Sortino(索提諾比率)

意義:

Sortino 表示每承擔一單位的下行風險,將會獲得多少超額回報

公式:
S o r t i n o R a t i o = R p R f σ p d Sortino Ratio = \frac{R_p - R_f}{σ_pd}

  • Rp = 策略年化收益率
  • Rf = 無風險利率(預設值為0.04)
  • σpd = 策略下行波動率

Information Ratio(資訊比率)

意義:

Information Ratio 是用來衡量單位超額風險帶來的σp = 策略收益波動率。資訊比率越大,說明該策略單位跟蹤誤差所獲得的超額收益越高,因此,資訊比率較大的策略的表現要優於資訊比率較低的基準。合理的投資目標應該是在承擔適度風險下,儘可能追求高資訊比率

公式:
I n f o r m a t i o n R a t i o = R p R m σ t Information Ratio = \frac{R_p - R_m}{σ_t}

  • Rp = 策略年化收益率
  • Rm = 基準年華收益率
  • σt = 策略與基準每日收益差值的年化標準差

Volatility(策略波動率)

意義:

公式:
V o l a t i l i t y = σ p = 250 n 1 i = 1 n ( r p r p ) 2 Volatility = σ_p = \sqrt{\frac{250}{n-1} \sum_{i=1}^{n} (r_p-\overline{r_p})^2}

  • rp = 策略每日收益第
  • r- p = 策略每日收益的平均值 = lnΣi=lnrp
  • n = 策略執行天數

Benchmark Volatility(基準波動率)

意義:

Benchmark Volatility 用來測量基準的風險性,波動越大代表基準風險越高

公式:
B e n c h m a r k V o l a t i l i t y = σ m = 250 n 1 i = 1 n ( r m r m ) 2 Benchmark Volatility = σ_m = \sqrt{\frac{250}{n-1} \sum_{i=1}^{n} (r_m-\overline{r_m})^2}

  • rm = 其次每日收益第
  • r- m = 基準每日收益的平均值 = lnΣi=lnrm
  • n = 策略執行天數

Max Drawdown(最大回撤)

意義:

Max Drawdown 描述策略可能出現最糟糕的情況,最極端可能的虧損

公式:
M a x D r a w d o w n = M a x ( P x P v ) / P x Max Drawdown = Max(P_x - P_v)/P_x

相關推薦

量化交易入門筆記-策略評估

首先,編寫一個簡單的“雙均線量化策略” 程式碼如下: def initialize(context): """雙均線量化策略的初始化函式""" # 定義一個區域性變數,儲存要操作的股票 g.security = '000002.XSHE' #

量化交易入門筆記-策略結構

今天是國慶節假期第三天,萬分無聊,心想著不能白白虛度光陰,便想做點什麼——做了一頓美食、和貓咪玩了一會、運動了半小時、看了會書,忽想起一直被擱淺的量化交易,心裡實在忐忑不安。索性就認認真真的研究一番,也不枉這一半日的光陰。在此祝母國國運昌盛,也祝正在看本文章

量化交易入門筆記-KD指標策略

''' 超買超賣型技術指標,即隨機指標KD 實現K在20左右向上交叉D時,則全倉買入 K在80左右向下交叉D時,全倉賣出 ''' import jqdata from jqlib.technical_analysis import * def initialize(context)

量化交易入門筆記-能量型指標策略

''' 能量型指標,即情緒指標BRAR、帶著能量線CR、成效量變異率VR1 當AR<40、BR<40、BR<AR、CR<40、VR<40時,買入股票 當AR1>180、BR>400、C4>400、VR>450,賣出股票 ''' i

量化交易入門筆記-MACD指標策略

''' 實現DIFF、DEA均為正,DIFF向上突破DEA,買入股票; DIFF、DEA均為負,DIFF向下突破DEA,賣出股票 ''' import jqdata from jqlib.technical_analysis import * def initialize(cont

量化交易入門筆記-多股票持倉策略

''' 同時操作多隻股票 價格高於5天平均價*1.008,則買入 價格小於5天平均價*0.996,則賣出 ''' import jqdata def initialize(context): """初始化函式""" # 設定要操作的股票池 g.stocks

量化交易入門筆記-多股票追漲策略

''' 股票在當日收盤30分鐘內漲幅達到9.5%~9.9%時間段,進行買入操作,在第二天開盤賣出 需要注意的是,該策略需要按分鐘進行回測 ''' import jqdata def initialize(context): """初始化函式""" # 開啟動態復權模

量化交易入門筆記-小市值股票策略

''' 篩選出市值介於20億~30億的股票 選取其中市值最小的三隻股票 然後每天開盤買入,持有5個交易日,然後調倉 ''' import jqdata def initialize(context): """初始化函式""" # 設定參考基

量化交易入門筆記-資料獲取函式 二

gt_fundamentals() 函式 該函式可查詢一隻股票或多隻股票的財務資料,其語法如下: get_fundamentals(query_object, date=None, statDate=None) 引數解析: query_object : 這是

量化交易入門筆記-資料獲取函式 一

history()函式 history()獲取歷史資料,可查詢多個標的單個數據欄位,返回資料格式為 DataFrame 或 Dict(字典),其語法格式如下: history(count, unit='1d', field='avg',

量化交易入門筆記-Datetime和Time模組

Python 中,通常有三種方式用來表示時間,分別是時間戳、格式化的字串、元組(struct_time)方式 時間戳 一般來講,時間戳表示的是從1970年1月1日00:00:00開始按秒計算的偏移量。可以運用"type(time.time())",返回的是 float 。

量化交易入門筆記-Pandas庫

Pandas 是基於 Numpy 構建的,讓以 Numpy 為中心的應用變得更加簡單 Pandas 提供了大量快速便捷地處理資料的函式和方法,這也是使 Pandas 成為強大的高效的資料分析環境的重要因素之一 Pandas 的資料結構主要有三種 Series

量化交易入門筆記-Numpy庫

Numpy 庫是高效能科學計算和資料分析的基礎包,不是 Python 的標準庫,是 Python 的第三方庫。 這裡使用JoinQuant量化交易平臺免費提供的基於 IPython Notebook 的研究平臺 ndarray 陣列基礎 Python 中用列表

自己做量化交易軟體(7)通通量化設計2-雙均線策略

前一篇介紹了回測類的設計,我們這篇簡單介紹一下回測程式設計。 我們以5日均線和20日均線的交叉作為買賣點策略,來計算對一隻股票交易的收益情況。這裡僅僅是一個雙均線策略演示的例子。讀者可以在此基礎上,修改為自己的策略。 程式test_df01.py 是雙均線回測程

量化投資策略框架(一):勝率的估算

上次簡單介紹了回測之前的一些準備工作。這裡,將進一步介紹如何對一個投資策略就行完整的回測。 雜言:人啊,還是要做自己喜歡做的事情。勇於嘗試,是非常好的,當感覺不合適的時候,要儘早跳出。年輕人,還是不要太安逸,所以從財富跳到了私募。事情也是自己喜歡做的了。有時你會糾結,

python交易框架之坑爹的類類之間變數的傳輸

python類之間變數的傳輸的時候變數是字串和變數是列表或者字典是完全不同的: 試著把self.time的格式分別用字串,列表,和字典,看輸出的結果: import time class Book: def __init__(self): se

量化交易入門書籍推薦

第一部分:預備知識 【1】《投資學》   作者:博迪,凱恩,馬庫斯 既然是搞量化,算半瓶水搞科學的,就不應該本能的排斥學院的東西。這本書對於投資交易的入門非常系統了,有了對市場的基本認識,瞭解前人在量化工作上的一些重要發展,才有可能在正確的基礎上建立自己的想法和直覺

量化交易學習筆記(一) ---- 量化交易基本名詞概念

量化交易基本名詞概念 三大經典指標 1.夏普比率(Shape Ratio),也稱夏普指數,它指的是投資回報與風險的比例。夏普比率代表投資人每多承擔一份風險,就可以拿到幾份回報,若為正值,代表基金

量化交易入門(自學第一天)——股票(一)

一、股市的交易規則(在百度百科自行整理的) 股市的交易時間是:上午9:30——11:30 和 下午1:00——3:00。 買入和賣出的手續費(佣金)大約在成交金額的0.05%,不足5元按5元算(具體按照各大券商的標準來定)。賣出股票時收印花稅:成交金額的千分之一。 自2015年8月1日起

量化交易課程筆記(一)——理工生跨界做量化的開啟姿勢

1. 必修課程 股票基礎知識 策略實戰技巧 量化交易體系 量化交易工程實現 專業量化賽道的必修課 2. 學了就能贏嗎? 交易是一種博弈過程,結果充滿不確定性。目前來看,股票盈利的人大概只有10%,期貨和期權更少。 3. 量化交易的發展歷程