本文采用了聚寬平台接口進行量化政策設定:
一、效果圖
雙均線政策:雙均線政策,當五日均線位于十日均線上方則買入,反之賣出。
二、證券知識:
政策收益(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('##############################################################')
四、最大回撤詳細圖