提起资本资产定价模型,大家可能都有学习过,那么本篇内容主要向大家讲述资本资产定价模型的实际应用,我们将其构建成量化策略,并在历史行情中回测。 import pandas as pd import numpy as np from scipy import stats
import pandas as pd
import numpy as np
from scipy import stats
# 初始化函数,全局只运行一次
def init(context):
g.n = 20 #设置最大持仓数量为20只股票
g.longday = 60 #设置数据长度
run_monthly(handle_bar,date_rule=1)
#将handle_bar交易函数设置为定时运行:每个月第一个交易日
context.stock = []#储存上期的股票池
g.settock='399006.SZ'
set_benchmark(g.settock)
## 开盘时运行函数
def handle_bar(context, bar_dict):
#执行选股函数:CAPM(),并将结果导入,该股票列表是需要买入的个股。
needstock_list = CAPM()
#获取上期持仓个股
holdstock_list = list(context.stock)
#确定本期需要卖出的个股
sell_list = list(set(holdstock_list)-set(needstock_list))
#执行卖出操作,运用for循环,逐个操作。
for s in sell_list:
order_target(s,0)
#确定本期需要买入的个股,其余即为继续持仓的个股
buy_list=[]
for i in needstock_list:
if i in holdstock_list:
pass
else:
buy_list.append(i)
#确定可用资金,平分分配至需买入的个股
n=len(buy_list)
cash=context.portfolio.available_cash/n
#执行买入操作
for s in range(0,n,1):
stock=list(buy_list)[s]
order_target_percent(stock,0.1)
#操作完毕,将选股结果放到上期股票池储存变量中,以备下次使用。
context.stock = frozenset(needstock_list)
#=========选股函数===========
def CAPM():
date=get_last_datetime().strftime('%Y%m%d')
stock_list=stock(date)
ret=get_price(stock_list, None, date, '1d', ['quote_rate'], False, 'pre', g.longday, is_panel=1)['quote_rate']
ret=(ret/100-0.04/252)*100
ret_jz=get_price('000300.SH', None, date, '1d', ['quote_rate'], False, 'pre', g.longday, is_panel=1)['quote_rate']
ret['ret_jz']=(ret_jz/100-0.04/252)*100
#进行线性回归
y=list(ret['ret_jz'])
df=pd.DataFrame(columns=['alpha'])
for i in ret.columns:
x = list(ret[i])
beta, stockalpha, r_value, p_value, slope_std_error=stats.linregress(y, x)
df.loc[i]=stockalpha
df=pd.DataFrame(df).sort_values(by='alpha',ascending=True)
df['syboml']=df.index
df=df[df['syboml']!='ret_jz']
#获取股票的代码
needstock_list=[]
for s in range(0,g.n,1):
needstock_list.append(df.iloc[s]['syboml'])
return needstock_list
#===============以沪深300为股票池,除去ST和停牌=====
def stock(date):
stk=list(get_index_stocks(g.settock,date))
price=get_price(stk, None, date, '1d', ['is_paused', 'is_st'], False, None, 1, is_panel=1)
stopstk=price['is_paused'].iloc[-1]
ststk=price['is_st'].iloc[-1]
startstk=(stopstk[stopstk==0].index)
okstk=(ststk[ststk==0].index)
tradestk=list(set(startstk)&set(okstk))
return tradestk