基于米筐量化平台的多因子量化选股策略实现
很久没有发布技术性文章,首先致敬B站“跟着迪哥学CV”,这篇文章是结合最新米筐API,对他一课讲解的复现。米筐量化平台新的API和旧版本有很多差异,docs文档中讲的也不够详细,导致一些同学在学习米筐量化平台策略代码开发时出现很多错误。简单写了一个多因子组合打分选股的代码,可以直接复制到米筐策略平台上执行。如果是使用PyCharm进行本地化部署,选股部分核心代码也粘贴出来供大家参考。因为没有优化,代码中难免出现一些啰嗦或不够精简的地方,请大家谅解。
文章后面有一些回测结果图片,只是说明可了代码结果运行顺畅,不是投资依据,没有参考价值。
文章附送了米筐13411个因子的名称,有兴趣并且有好机器的同学,可以继续扩大因子研究,希望能取得比我好的成绩。
一、米筐策略平台代码
# 可以自己import我们平台支持的第三方python模块,比如pandas、numpy等。
import rqdatac
import numpy as np
import pandas as pd
from pandas import DataFrame as df
from rqfactor.utils import rolling_window
from rqfactor.rolling import RollingWindowFactor
from rqdatac import get_factor
from datetime import datetime
from rqdatac import get_fundamentals
# 在这个方法中编写任何的初始化逻辑。context对象将会在你的算法策略的任何方法之间做传递。
def init(context):
# 在context中保存全局变量
#context.s1 = "000001.XSHE"
context.stocks = index_components('000300.XSHG')
scheduler.run_monthly(rebalance,1)
# 实时打印日志
#logger.info("RunInfo: {}".format(context.run_info))
def rebalance(context,bar_dict):
stocks = set(get_stocks(context))
holdings = set(get_holdings(context))
to_buy = stocks - holdings
to_sell = holdings - stocks
for stock in to_sell:
order_target_percent(stock,0)
if len(to_buy) == 0:
return
average_value = context.portfolio.portfolio_value/len(to_buy)
for stock in to_buy:
order_target_value(stock,average_value)
def get_holdings(context): #获取当前账户中有什么股票
positions = context.portfolio.positions
holdings = []
for position in positions:
if positions[position].quantity > 0:
holdings.append(position)
return holdings
def get_stocks(context):
#净资产收益率,越高越好
# df_return_on_equity = get_factor(context.stocks, 'return_on_equity', '20240801', '20241231')
df_return_on_equity = get_factor(context.stocks, 'return_on_equity')
df_return_on_equity = df_return_on_equity.groupby(level = 'order_book_id').sum()
##每股收益EPS越高越好