15.8 风险控制建模-CAPM模型的应用

用户头像Reflecti0N
2023-08-07 发布

提起资本资产定价模型,大家可能都有学习过,那么本篇内容主要向大家讲述资本资产定价模型的实际应用,我们将其构建成量化策略,并在历史行情中回测。 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
收益&风险
源码

评论