定義
雙均線策略,通過建立m天移動平均線,n天移動平均線,則這兩條均線必有交點。若m>n,n天平均線“上穿越”m天均線則為買入點,反之為賣點。該策略基於不同天數均線的交叉點,抓住股票的強勢和弱勢時刻,進行交易。
對於每一個交易日,都可以計算出前N天的移動平均值,然后把這些移動平均值連起來,成為一條線,就叫做N日移動平均線。一般由5日均線(MA5),10日均線(MA10)
比如前5個交易日的收盤價分別為10,9,9,10,11元,那么,5日的移動平均股價為9.8元。同理,如果下一個交易日的收盤價為12,那么在下一次計算移動平均值的時候,需要計算9,9,10,11,12元的平均值,也就是10.2元。將這平均值連起來,就是均線。
如下圖,收盤價是藍線,橙色的線表示5日的移動平均線。

可以看到股票價格的波動比5天均線的波動要大,這是因為5天均線取的是前5個交易日的均值,相當於做了一個平滑
雙均線
股名思義,就是兩條天數不同的移動平均線,比如,一天是5日的移動平均線,另一條是10日的移動平均線。如圖,藍色是5天均線,黃色為10日均線

金叉和死叉
由時間短的均線(如上圖藍色的線)在下方向上穿越時間長一點的均線(如上圖黃色的線),為金叉,反之為死叉
雙均線策略
構建一個簡單的策略:認為雙均線金叉的時候,表示股票很強勢,反之很弱勢,那么我們就在強勢的時候買入,弱勢的時候賣出即可
使用聚寬平台進行代碼的編寫與回測
# 導入函數庫 from jqdata import * # 初始化函數,設定基准等等 def initialize(context): # 設定滬深300作為基准 set_benchmark('000300.XSHG') # 開啟動態復權模式(真實價格) set_option('use_real_price', True) # 輸出內容到日志 log.info() log.info('初始函數開始運行且全局只運行一次') # 過濾掉order系列API產生的比error級別低的log # log.set_level('order', 'error') ### 股票相關設定 ### # 股票類每筆交易時的手續費是:買入時佣金萬分之三,賣出時佣金萬分之三加千分之一印花稅, 每筆交易佣金最低扣5塊錢 set_order_cost(OrderCost(close_tax=0.001, open_commission=0.0003, close_commission=0.0003, min_commission=5), type='stock') ## 運行函數(reference_security為運行時間的參考標的;傳入的標的只做種類區分,因此傳入'000300.XSHG'或'510300.XSHG'是一樣的) # 開盤前運行 run_daily(before_market_open, time='before_open', reference_security='000300.XSHG') # 開盤時運行 run_daily(market_open, time='open', reference_security='000300.XSHG') # 收盤后運行 run_daily(after_market_close, time='after_close', reference_security='000300.XSHG') ## 開盤前運行函數 def before_market_open(context): # 輸出運行時間 log.info('函數運行時間(before_market_open):'+str(context.current_dt.time())) # 給微信發送消息(添加模擬交易,並綁定微信生效) # send_message('美好的一天~') # 要操作的股票:萬科A股(g.為全局變量) g.security = '000002.XSHE' ## 開盤時運行函數 def market_open(context): log.info('函數運行時間(market_open):'+str(context.current_dt.time())) security = g.security #設置均線窗口長度 n1 = 5 n2 = 10 # 獲取股票的收盤價 close_date = attribute_history(security,n2+2,'1d',['close'],df = False) #獲取過去ma_n1天的平均價格 ma_n1=close_date['close'][-n1:].mean() #獲取過去ma_n2 天的平均價格 ma_n2=close_date['close'][-n2:].mean() #取得當前現金 cash = context.portfolio.available_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) #繪制n2日均線價格 record(ma_n2 = ma_n2) ## 收盤后運行函數 def after_market_close(context): log.info(str('函數運行時間(after_market_close):'+str(context.current_dt.time()))) #得到當天所有成交記錄 trades = get_trades() for _trade in trades.values(): log.info('成交記錄:'+str(_trade)) log.info('一天結束') log.info('##############################################################')

可以看出該策略從2016/4/25到2018/4/27收益率27.19,策略年化利率13.14%,最大回撤25.64%
