前言
折腾量化交易的第二周,尝试按照价值投资的思想实现一个量化策略,底层运用模型为线性回归。文章的不足之处,望多多指正。
价值投资的思想原理
价值投资的底层逻辑是对处于低估期指标表现优良的资产进行买入,对已经处于高估期的优良资产进行卖出,低买高卖,实现套利。一个优秀价值投资者大多坚持:面向过去,背对未来,不做预测的投资思想。其中代表的投资者有巴菲特、芒格等,其投资策略可以分为如下几个步骤:
- 选股:①基于基本面(如净资产、研发投入、负债、PE、PB等)选股优良发展的投资标的;②基于自身的评估方法选出其中市值被低估的公司(评估市值>平均市值)
- 设立安全边际:即设立买点(如实际价值低于评估价值的30%时买入)、卖点(如实际价值高于于评估价值的10%时卖出)
- 设立交易频率,执行设定的交易策略进行买卖,定期复盘策略适当优化改进
价值投资策略实现
这里,笔者选股上证50指数的公司股票作为优良的投资标的,基于简单的线性模型完成对上市公司的评估,并买入其中低估的投资标的,卖出相对而言高估实现一个基于线性模型实现低估值股票抓取的简单价投策略。
step1:获取上证50指数股票
# 上证50作为股票池
stocks = get_index_stocks('000016.XSHG',date = None)
step2:根据股票各项指标对其市值进行评估
# 获取股票代码和对应的因子数据q = query(valuation.code# 市值,valuation.market_cap# 净资产 = 总-负债,balance.total_assets-balance.total_liability# 资产负债率 取倒数,balance.total_assets/balance.total_liability# 净利润,income.net_profit# 年度收入增长,indicator.inc_revenue_year_on_year# 研发费用,balance.development_expenditure).filter(valuation.code.in_(stocks))# 数据表格化df = get_fundamentals(q,date = None)# 加表头df.columns = ['code','market_cap','na','1/DA_ratio','net_profit','growth','RD']# 模型训练df.index = df['code'].values# print(df.index)# 删除首行 df = df.drop('code',axis=1)df = df.fillna(0)X = df.drop('market_cap',axis = 1)y = df['market_cap']# 0填充表中的空值X = X.fillna(0)y = y.fillna(0)# 线性拟合reg = LinearRegression().fit(X,y)# 模型预测值输入预测表内
step3:找出被低估的最多的10只股票
# 模型预测值输入预测表内predict = pd.DataFrame(reg.predict(X),index = y.index,columns = ['predict_mcap'])#predict.head()predict['mcap'] = df['market_cap']diff = predict['mcap']-predict['predict_mcap']diff = pd.DataFrame(diff,index = y.index,columns=['diff'])diff = diff.sort_values(by = 'diff',ascending = True)stockset = list(diff.index[:10])
step4:执行交易
# 执行交易 sell_list = list(context.portfolio.positions.keys())#print(sell_list)# 卖for stock in sell_list:if stock not in stockset[:g.stocknum]:stock_sell = stock# 清仓order_target_value(stock_sell,0)if len(context.portfolio.positions) <g.stocknum:num = g.stocknum - len(context.portfolio.positions)cash = context.portfolio.cash/num else:cash = 0num =0 # 买for stock in stockset[:g.stocknum]:#均仓购入if stock in sell_list:passelse:stock_buy = stockorder_target_value(stock_buy,cash)num = num -1if num == 0:break # 天数+1g.days +=1else:g.days = g.days+1
step5:模拟交易回测
选用2017年5-12月时期进行模拟交易,策略的年化收益率16.09%,最大回撤11.15%,该段时期的收益率为9.95%较大盘(基准收益8.02%)高出1.79%,不难看出,在17年时,利用简单的线性模型进行量化交易,也是可以跑赢大盘实现套利的