一個典型的雙均線策略


定義

  雙均線策略,通過建立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%


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM