【量化投资】策略九(聚宽)
生活随笔
收集整理的這篇文章主要介紹了
【量化投资】策略九(聚宽)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
簡述
策略九,其實是策略八的一個不加購買指數股票來對沖beta的策略。
效果圖
代碼
# 導入函數庫 import statsmodels.api as sm from statsmodels import regression import numpy as np import pandas as pd import time from datetime import date import scipy.stats as stats# 一鍵回測說明: # 百度聚寬-》注冊賬號-》我的策略里面創建策略-》復制代碼到里面 # 右邊回測 開始時間:2017-1-1 終止時間:今天 資金:10000000# 初始化函數,設定基準等等 def initialize(context):g.tc = 2 # 調倉頻率# 下面是框架固定部分,不需要修改 g.N = 20 # 持倉數目g.t = 0 # 記錄運行的天數g.weight_list = [1] # 因子的權重參數log.set_level('order', 'error')set_option('use_real_price', True) # 用真實價格交易set_slippage(FixedSlippage(0)) # 將滑點設置為0set_commission(PerTrade(buy_cost=0.0000, sell_cost=0.000, min_cost=0)) # 手續費設置為0# set_benchmark('000905.XSHG') #中證500為業績基準set_benchmark('000300.XSHG') # 滬深300為業績基準# 選股范圍為全市場選股:上證+深證股票# g.stockrange= get_index_stocks('000001.XSHG')+get_index_stocks('399106.XSHE')g.stockrange = get_index_stocks('000300.XSHG')init_cash = context.portfolio.starting_cashg.stoppedStockName = []g.stoppedStockTime = []run_daily(mktopen, time='every_bar')# 操作期貨set_subportfolios([SubPortfolioConfig(cash=init_cash, type='stock'),])## 每根日線運行一次 def handle_data(context, data):if g.t == 0:# 設置可行股票池:用set_feasible_stocks函數剔除當前或者計算樣本期間停牌的股票g.all_stocks = pickStock(context, g.stockrange)previousStr = str(context.previous_date)# adjustedBeta# adjustedBeta(context)stock_sort = get_all_cleaned_factor_ranked(g.all_stocks, g.weight_list, previousStr)# 調倉rebalance_position(context, stock_sort)g.t = (g.t + 1) % g.tcdef get_all_cleaned_factor_ranked(stocks, weight_list, previousStr):value = my_alpha3(stocks)value = (-value).argsort()[:g.N]return list(map(lambda x: stocks[x], value))''' factor1 '''def single_alpha1(stock):df = get_price(stock, count=26, fields=['close'])returns = (df[1:] - df[:-2]) / df[:-2] # 25 linesvalue = [0] * 5for i in range(5):if np.array(returns).tolist()[-1 - i] < 0:value[i] = returns.ix[-20 - i:-1 - i].std() ** 2else:value[i] = df['close'][-1 - i] ** 2return 5 - np.array(value).argmax()def my_alpha1(stocks):value = list(map(single_alpha1, stocks))MAX = max(value)MIN = min(value)value = (np.array(value) - MIN) / (MAX - MIN)return value''' END factor1 '''''' 初步篩選股票 '''# pick stocks def pickStock(context, stocks):# universe = set_feasible_stocks(stocks)universe = filter_specials(stocks, context)# 過濾上市時間小于60天的股票for stock in universe:days_public = (context.current_dt.date() - get_security_info(stock).start_date).daysif days_public < 60:universe.remove(stock)g.lenth = len(universe)return universe# 過濾停牌的股票 def set_feasible_stocks(stock_list):current_data = get_current_data()stock_list = [stock for stock in stock_list if not current_data[stock].paused] # 不考慮停盤的股票return stock_list# 將多因子的dataframe進行排序,并且將有空值的行去掉 def rank_stock(all_factor, weight_list):C = len(all_factor.columns)ranked = all_factor.iloc[:, 0].rank() * weight_list[0]if C > 1:for j in range(1, C):ranked = all_factor.iloc[:, j].rank() * weight_list[j] + rankedranked = pd.DataFrame(ranked)ranked.columns = ['rank']one_sort = ranked.sort('rank', ascending=g.ascending)stock_sort = one_sort.index[:g.N]return stock_sort#過濾退市,停牌,STdef filter_specials(stock_list,context):curr_data = get_current_data()stock_list = [stock for stock in stock_list if \(not curr_data[stock].paused) # 未停牌and (not curr_data[stock].is_st) # 非STand ('ST' not in curr_data[stock].name)and ('*' not in curr_data[stock].name)and ('退' not in curr_data[stock].name)and (curr_data[stock].low_limit < curr_data[stock].day_open < curr_data[stock].high_limit) ]return stock_list''' END 初步篩選股票 '''''' 調倉 ''' def mktopen(context):# 每分鐘止損stop(context)def rebalance_position(context, stocks_list):current_holding = context.subportfolios[0].positions.keys()stocks_to_sell = list(set(current_holding) - set(stocks_list))total_value = context.subportfolios[0].total_valuestocks_list = checkNoStopped(stocks_list)# 賣出bulk_orders(stocks_to_sell, 0)# 買入 bulk_orders(stocks_list, total_value / len(stocks_list))if len(g.stoppedStockName) != 0:for i in range(len(g.stoppedStockName)):g.stoppedStockTime[i] -= 1Name = []Time = []for i in range(len(g.stoppedStockName)):if g.stoppedStockTime[i] != 0:Name.append(g.stoppedStockName[i])Time.append(g.stoppedStockTime[i])g.stoppedStockName = Nameg.stoppedStockTime = Time# 檢查一定天數內是否被叫停過 def checkNoStopped(stocks_list):temp = set(stocks_list)temp -= (temp & set(g.stoppedStockName))return temp# 止損 def stop(context):# 循環查看持倉的每個股票for stock in context.subportfolios[0].positions:# 如果股票最新價格除以平均成本小于0.8,即虧損超過20%if context.subportfolios[0].positions[stock].price / context.subportfolios[0].positions[stock].avg_cost < 0.95:# 調整stock的持倉為0,即賣出order_target(stock, 0)g.stoppedStockName.append(stock)g.stoppedStockTime.append(30)# 批量買賣股票 def bulk_orders(stocks_list, target_value):for i in stocks_list:order_target_value(i, target_value, pindex=0)''' END 調倉 '''''' factor1 '''def single_alpha1(stock):df = get_price(stock, count=26, fields=['close'])returns = (df[1:] - df[:-2]) / df[:-2] # 25 linesvalue = [0] * 5for i in range(5):if np.array(returns).tolist()[-1 - i] < 0:value[i] = returns.ix[-20 - i:-1 - i].std() ** 2else:value[i] = df['close'][-1 - i] ** 2return 5 - np.array(value).argmax()def my_apha1(stocks):value = list(map(single_alpha1, stocks))MAX = max(value)MIN = min(value)value = (np.array(value) - MIN) / (MAX - MIN)return value''' END factor1 '''''' factor2 '''def single_alpha2(stock):df = get_price(stock, count=8, fields=['open', 'close', 'volume'])volume = np.log(df['volume'].tolist())delta_volume = volume[2:] - volume[:-2]close = df['close']open_ = df['open']rate = (close - open_) / open_rate = np.array(rate)[2:]return delta_volume, ratedef my_alpha2(stocks):values = list(map(single_alpha2, stocks))T_values = list(zip(*values))T_values = list(map(doubleListRank, T_values))T_values = list(map(list, zip(*T_values)))values = np.array(map(Neg_correlation, T_values))return valuesdef Neg_correlation(adlist):return -stats.pearsonr(np.array(adlist[0]), np.array(adlist[1]))[0]def doubleListRank(ddlist):ddlist6 = list(zip(*ddlist))ddlist6 = list(map(rank, ddlist6))return list(map(list, zip(*ddlist6)))def rank(alist):MAX = max(alist)MIN = min(alist)return (np.array(alist) - MIN) / (MAX - MIN)# (-1 * correlation(rank(delta(log(volume), 2)), rank(((close - open)/ open)), 6)) # 6天以來的相關系數() 兩個數值分別是 # rank(delta(log(volume), 2))''' END factor2 '''''' factor3 '''def single_alpha3(stock):df = get_price(stock, count=10, fields=['open', 'volume'])return np.array(df['open']), np.array(df['volume'])def my_alpha3(stocks):values = list(map(single_alpha3, stocks))T_values = list(zip(*values))T_values = list(map(doubleListRank, T_values))T_values = list(map(list, zip(*T_values)))values = np.array(map(Neg_correlation, T_values))return values''' END factor3 '''總結
以上是生活随笔為你收集整理的【量化投资】策略九(聚宽)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【量化投资】策略八(聚宽)
- 下一篇: asyncio简单入门(二)