天天看點

python實作雙均線政策

本文采用了聚寬平台接口進行量化政策設定:

一、效果圖

雙均線政策:雙均線政策,當五日均線位于十日均線上方則買入,反之賣出。

二、證券知識:

政策收益(Total Returns)

最容易了解的一個概念,政策收益也就是政策開始到結束,總資産的變化率。

----本文 選取的平安銀行 這隻股票,通過雙均線政策來計算政策收益。

基準收益(Benchmark Returns)

如果一個政策一年賺了50%,而這一年來上證指數上漲了100%,是以要評判一個政策的好壞,不過是要看它的收益率,還需要一個基準來衡量它的優劣性,這個準基就是準基收益率。

對于股票的政策如果高于上證指數,那麼就跑赢了基準收益率,也就是跑赢了大盤;低于上證指數,那麼就是跑輸了基準收益率。是以說一個好的政策至少要高于基準收益。

----本文 選取的滬深三百指數,擷取某段時間的基本收益。

貝塔(Beta)

代表了政策表現對大盤變化的敏感性,也即是政策與大盤的相關性。

例如一個政策的Beta為1.5,則大盤漲1%的時候,政策可能漲1.5%,反之亦然;如果一個政策的Beta為-1.5,說明大盤漲1%的時候,政策可能跌1.5%,反之亦然。

 分别是政策的每日收益和基準的每日收益

阿爾法(Alpha)

alpha是超額收益,它與市場波動無關,也就是說不是靠系統性的上漲而獲得收益。

 分别是政策年化收益率、基準年化收益率和無風險利率(預設0.04)。

通過預測方向或者其他可解釋原因的政策也即是alpha政策;而通過波動率來帶來利潤的政策就是beta政策。

夏普比率(Sharpe)

描述的是政策在機關總風險下所能獲得的超額收益。

是政策收益波動率,也即是政策收益率的年化标準差。

所提諾比率(Sortino)

描述的是政策在機關下行風險下所能獲得的超額收益。

是政策下行波動率。

資訊比率(Information Ratio)

描述的是政策在機關超額風險下的超額收益。

是政策與基準每日收益內插補點的年化标準差。

最大回撤(Max Drawdown)

描述的政策最大的虧損情況。最大回撤通常越小越好。

是政策兩日的累計收益。

三、python代碼

# 導入函數庫
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('美好的一天~')

    # 要操作的股票:平安銀行(g.為全局變量)
    g.security = '000001.XSHE'

## 開盤時運作函數
def market_open(context):
    log.info('函數運作時間(market_open):'+str(context.current_dt.time()))
    security = g.security
    # 擷取股票的收盤價
    close_data = get_bars(security, count=5, unit='1d', fields=['close'])
    # 取得過去五天的平均價格
    MA5 = close_data['close'].mean()
    # 取得上一時間點價格
    current_price = close_data['close'][-1]
    # 取得目前的現金
    cash = context.portfolio.available_cash

    # 如果上一時間點價格高出五天平均價1%, 則全倉買入
    if (current_price > 1.01*MA5) and (cash > 0):
        # 記錄這次買入
        log.info("價格高于均價 1%%, 買入 %s" % (security))
        print("目前可用資金為{0}, position_value為{0}".format(cash, context.portfolio.positions_value))
        # 用所有 cash 買入股票
        order_value(security, cash)
    # 如果上一時間點價格低于五天平均價, 則空倉賣出
    elif current_price < MA5 and context.portfolio.positions[security].closeable_amount > 0:
        # 記錄這次賣出
        log.info("價格低于均價, 賣出 %s" % (security))
        # 賣出所有股票,使這隻股票的最終持有量為0
        order_target(security, 0)

## 收盤後運作函數
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('##############################################################')           

四、最大回撤詳細圖