线性回归和量化交易基础(下)
使用回归法选股, 和之前选取的因子是一样的
def regression_select(context,bar_dict): # 查询因子数据 q=query(fundamentals.eod_derivative_indicator.pe_ratio, fundamentals.eod_derivative_indicator.market_cap, fundamentals.eod_derivative_indicator.pb_ratio, fundamentals.financial_indicator.return_on_equity, fundamentals.financial_indicator.cost_to_sales, fundamentals.income_statement.operating_revenue, fundamentals.income_statement.net_profit, fundamentals.income_statement.total_expense ).filter( fundamentals.stockcode.in_(context.hs300)) fund=get_fundamentals(q) context.factors_data=fund.T # 特征值数据进行处理 # 根据预测收益率大小来调仓 # 根据股票池来调仓 deal_with_data(context)
在deal_with_data中 我们去对数据进行预处理
def deal_with_data(context): # 去除空缺值 context.factors_data=context.factors_data.dropna() # 每一项都去极值 # 都标准化 market_cap_factor=context.factors_data["market_cap"] print(context.factors_data.head()) for name in context.factors_data.columns: if name == "market_cap": continue else: lr=LinearRegression() lr.fit(market_cap_factor.to_frame().values.reshape(-1,1),context.factors_data[name]) y_predict=lr.predict(market_cap_factor.to_frame().values.reshape(-1,1)) context.factors_data[name]=context.factors_data[name]-y_predict # 市值中性化 # market_cap 本身不需要中性化 for name in context.factors_data.columns: context.factors_data[name]=mad(context.factors_data[name]) context.factors_data[name]=stand(context.factors_data[name]) stock_select(context)
在stock_select中直接调仓:
我们调仓的方法很简单,每个月做一次判断,如果不在股票池里面,就卖出,
卖出后,我们对其他的股票做一个仓位的平均, 当然包括新进来的股票,就可以了
def purchase(context): for stock in context.portfolio.positions.keys(): if context.portfolio.positions[stock].quantity>0: if stock not in context.stock_list: order_target_percent(stock,0) for stock in context.stock_list: order_target_percent(stock,1.0 / 20)
进阶知识:
在使用基本面,即多因子分析的时候,我们可以进行股票和股指期货对冲的操作,来减少行情对我们的影响
因为A股是有期货的,股指期货和股票基本是反着来的,我们可以考虑在熊市的时候,不进行股票的交易,但进行股指期货的交易
整理完毕