量化策略系列教程:04阿爾法策略
Alpha、Alpha,天天就知道Alpha,今天就給你們上阿爾法嘍~
此處,添加一個掘金的論壇證經社量化社區 - 證經社地址,貌似更新的還蠻快的~
1. 策略原理:
阿爾法策略:投資者在市場交易中面臨著系統性風險(即貝塔或Beta、β風險)和非系統性風險(即阿爾法或Alpha、α風險),通過對系統性風險進行度量並將其分離,從而獲取超額絕對收益(即阿爾法收益)的策略組合,即為阿爾法策略。從廣義上講,獲取阿爾法收益的投資策略有很多種,其中既包括傳統的基本面分析選股策略、估值策略、固定收益策略等等,也包括利用衍生工具對衝掉貝塔風險、獲取阿爾法收益的可轉移阿爾法策略。後者在國內通常被稱為阿爾法對沖策略,並在近年A股市場上得到廣泛應用。本策略只是展示了選股策略,並沒有將貝塔風險對沖。
始終買入滬深300中市值最小的5隻
先訂閱000300分鐘行情(也可訂閱其他symbol,只是用來作行情觸發) 第一個bar行情到來時在md_init中選股選出股票池與持倉作對比
無持倉時直接按照股票池等權買入 有持倉時,不在股票池中的股票賣出 在成交回報on_order_filled中判斷是否都已賣出,賣出倉位都成交以後再買入。2. 代碼解讀: 2.1 Alpha.py# !/usr/bin/env pythonn# -*- coding: utf-8 -*-nfrom gmsdk.api import StrategyBasennnclass Alpha(StrategyBase):nn def __init__(self, *args, **kwargs):n super(Alpha, self).__init__(*args, **kwargs)n self.buy_dict = {}n self.sell_dict = {}n self.is_traded = Falsenn def initialize(self):n passnn # 收到第一根Bar後交易n def on_bar(self, bar):n print(bar.strtime)n if self.is_traded:n returnn self.is_traded = Truen self.initialize()n self.handle_data()nn def handle_data(self):n passnn def on_order_filled(self, order):n if order.sec_id in self.sell_dict and order.strategy_id == self.strategy_id:n self.sell_dict.pop(order.sec_id)n if len(self.sell_dict) == 0: # 由於資金每次都開滿,等賣盤全部成交資金迴流時再買入n cash = self.get_cash()n for bar in self.buy_dict.values():n vol = int(cash.available * 0.95 / len(self.buy_dict) / bar.close / 100) * 100n self.open_long(bar.exchange, bar.sec_id, 0, vol)n
2.2 small_market_value.py
# !/usr/bin/env pythonn# -*- coding: utf-8 -*-nfrom Alpha import Alphannn請在Strategy中修改個人賬號密碼和策略IDnnnclass Strategy(Alpha):n def __init__(self, *args, **kwargs):n super(Strategy, self).__init__(*args, **kwargs)n self.md.subscribe(SHSE.000300.bar.60) # 訂閱一個symbol,在交易時間觸發下單nn def initialize(self):n # region 獲取滬深300中當天可交易的股票n instruments1 = self.get_instruments(SHSE, 1, 1)n instruments2 = self.get_instruments(SZSE, 1, 1)n symbol_list1 = set(instrument.symbol for instrument in instruments2 + instruments1) # 獲取當日可交易的股票,剔除B股n constituents = self.get_constituents(SHSE.000300)n symbol_list2 = set(constituent.symbol for constituent in constituents) # 獲取滬深300成分股(剔除ST、*ST股票,以及上市時間不足3個月等股票後剩餘的股票)n symbol_list = symbol_list1 & symbol_list2n symbol_list = ,.join(symbol for symbol in symbol_list)n # endregionnn # region 選出市值最小的5隻n market_index = self.get_last_market_index(symbol_list)n data = [mi for mi in market_index]n data = sorted(data, key=lambda mi: mi.market_value)[:5] # 市值最小的5隻n # endregionnn # region 為了計算倉位,獲取昨日dailybar,存入buy_dictn buy_list = ,.join(d.symbol for d in data)n dailybars = self.get_last_dailybars(buy_list)n self.buy_dict = {dailybar.sec_id: dailybar for dailybar in dailybars}n # endregionnnn def handle_data(self):n # region 沒有持倉時直接open_longn print(self.buy_dict.keys())n positions = self.get_positions()n if len(positions) == 0:n cash = self.get_cash()n for b in self.buy_dict.values():n vol = int(cash.available * 0.95 / len(self.buy_dict) / b.close / 100) * 100n self.open_long(b.exchange, b.sec_id, 0, vol)n returnn # endregionnn # region 有持倉時結合持倉獲取buy_dict,sell_dictn for p in positions:n if p.sec_id in self.buy_dict:n self.buy_dict.pop(p.sec_id)n else:n self.sell_dict[p.sec_id] = pn # endregionnn for p in self.sell_dict.values(): # 先賣出,賣盤成交時再買入,若資金足夠也可以直接買入n self.close_long(p.exchange, p.sec_id, 0, p.volume)nn def on_order_status(self, order):n passnnif __name__ == __main__:n my_strategy = Strategy(n username=username, # 請修改賬號n password=password, # 請修改密碼n strategy_id=strategy_id, # 請修改策略IDn mode=2,n td_addr=localhost:8001)n ret = my_strategy.run()n print(exit code: , ret)n
如果想了解相關的python函數和掘金介面函數,走下方通道:
http://zjshe.cn/q/forum.php?mod=viewthread&tid=51&extra=page%3D1
有不了解的可以給小編留言哦,小編會細心為大家解答~
推薦閱讀:
※Python · 元類(Meta Class)及其應用
※Python 與 機器學習 · 簡介
※Python書單
※Python之websocket web模擬tail -F。
※mac os x如何安裝python科學計算庫numpy?