《掘金量化实战系列》果仁网策略复现第一篇

今天,公众号将为全网读者带来掘金量化复现果仁策略系列!

公众号将为大家多维度、多策略、多场景来讲述掘金量化平台的实践应用。同时,我们对每段代码都做了解读说明,愿你在Quant的道路上学有所获!

此系列将由浅入深,每月1~2期,大家敬请期待!

今日复现策略:《小市值择时策略,模型Ⅰ--定期轮动》

果仁网策略定义


投资域:
股票池:全部股票
系统股票池:全部股票
指数:全部
板块:全部
行业标准:申万 2014
行业:全部
二级行业:全部
交易所:全部
地区省份:全部
企业性质:全部
融资融券:全部
ST:排除ST
科创板:排除科创板
过滤停牌股票:是
筛选条件:
去14月后半月10天大于0
排名条件:
总市值从小到大全部1
交易模型:
模型:I
调仓周期:1
调仓价格:收盘价
空闲资金配置:无
实时选股:未勾选
最大持仓股票数:5
备选买入股票数:5
个股最大买入仓位:100%
个股仓位权重:平权
大盘择时:
无

掘金复现过程

step 1:筛选条件

  • 排除ST

  • 排除科创板

  • 过滤停牌股票

  • 去14月后半月10天

    定义:and(   not(  and ( MonthY()=4,dayM(0)   >10) ),   not(  and ( MonthY()=1,dayM(0)   >10) )    )

date = pd.Timestamp(date).replace(tzinfo=None)
    # A股,剔除停牌和ST股票  https://www.myquant.cn/docs2/sdk/python/API 介绍/通用数据函数(免费).html#get-symbols-查询指定交易日多标的交易信息
    stocks_info = get_symbols(sec_type1=1010, sec_type2=101001, skip_suspended=skip_suspended, skip_st=skip_st, trade_date=date.strftime('%Y-%m-%d'), df=True)
    # 剔除次新股和退市股
    stocks_info['listed_date'] = stocks_info['listed_date'].apply(lambda x:x.replace(tzinfo=None))
    stocks_info['delisted_date'] = stocks_info['delisted_date'].apply(lambda x:x.replace(tzinfo=None))
    stocks_info = stocks_info[(stocks_info['listed_date']<=date-datetime.timedelta(days=new_days))&(stocks_info['delisted_date']>date)]
    # 排除科创板股票(代码以 SHSE.688 开头)
    stocks_info = stocks_info[~stocks_info['symbol'].str.startswith('SHSE.688')]
    # 一四月择时
    stocks_info =  pd.DataFrame(columns=['symbol']) if not (not ((context.current_month == 4 and context.current_day > 10) or (context.current_month == 1 and context.current_day > 10))) else stocks_info
step 2:排序条件
  • 总市值从小到大全部1
 # 配置排序条件(示例:A股总市值+A股流通市值)
    indicators = [
        {'field': 'tot_mv', 'direction': 'asc', 'weight': 1},  # A股总市值
        #  {'field': 'a_mv_ex_ltd', 'direction': 'asc', 'weight': 1}  # A股流通市值
    ]
    # 获取所有字段数据
    fields = [ind['field'] for ind in indicators]
    df = stk_get_daily_mktvalue_pt(symbols=stocks, trade_date=date,
                                   fields=','.join(fields), df=True)
    # 空值处理(空值排最后)
    for ind in indicators:
        field = ind['field']
        if ind['direction'] == 'asc':
            df[field] = df[field].fillna(float('inf'))  # 升序时空值用极大值填充
        else:
            df[field] = df[field].fillna(float('-inf'))  # 降序时用极小值填充
    # 计算综合得分
    total_score = pd.Series(0, index=df.index)
    for ind in indicators:
        field = ind['field']
        weight = ind['weight']
        # 计算排名(升序时直接排序,降序时取负数)
        if ind['direction'] == 'asc':
            sorted_col = df[field]
        else:
            sorted_col = -df[field]
        # 计算排名分
        ranks = sorted_col.rank(method='min', ascending=True)
        score = ((len(df) - ranks + 1) / len(df) * 100).round(2)
        df[f'{field}_score'] = score
        total_score += score * weight
    # 按综合得分排序
    df['total_score'] = total_score
    ranked = df.sort_values(by='total_score', ascending=False)
step 2:交易模型I
在每个调仓日,卖出不满足选股条件的股票,买进满足选股条件的股票, 所有仓内股票在调仓日重新平衡为等权重
 # 筛选
    all_stock,all_stock_str =  filter_stocks(context,last_date)
    # 排序
    target_position = [] if not all_stock else rank_stocks(context, last_date, all_stock)
    # 获取当前持仓
    positions = get_position()
    # 平不在标的池的股票(注:本策略交易以收盘价为交易价格,当调整定时任务时间时,需调整对应价格)
    for position in positions:
        symbol = position['symbol']
        if symbol not in target_position:
            new_price = \
            history_n(symbol=symbol, frequency='1d', count=1, end_time=now_str, fields='close', adjust=ADJUST_PREV,
                      adjust_end_time=context.backtest_end_time, df=False)[0]['close']
            order_target_percent(symbol=symbol, percent=0, order_type=OrderType_Limit, position_side=PositionSide_Long,
                                 price=new_price)
    # 获取股票的权重(预留出1%资金,防止剩余资金不够手续费抵扣)
    if len(target_position)>0:
        percent = 0.99 / len(target_position)
        # 买在标的池中的股票(注:本策略交易以收盘价为交易价格,当调整定时任务时间时,需调整对应价格)
        for symbol in target_position:
            # 收盘价(日频数据)
            new_price = \
            history_n(symbol=symbol, frequency='1d', count=1, end_time=now_str, fields='close', adjust=ADJUST_PREV,
                      adjust_end_time=context.backtest_end_time, df=False)[0]['close']
            order_target_percent(symbol=symbol, percent=percent, order_type=OrderType_Limit,
                                 position_side=PositionSide_Long, price=new_price)

复现结果验证

完整代码获取

<think>嗯,用户明确想了解掘金量化平台的使用指南和接口文档,还特别标注了“掘金量化”这个关键词。从引用[3]和[4]来看,用户应该是在解决具体编程问题时遇到了API变更的困扰——比如get_history_constituents函数弃用这种实际开发中的痛点。用户可能是个刚开始接触掘金平台的量化交易开发者,手头正在调试某个策略(引用[3]提到的程序6-1修改就是佐证)。ta的深层需求其实不仅是文档,更希望获得能直接解决当前开发卡点的实用资源,尤其关注API版本兼容性问题。不过奇怪的是用户同时引用了其他平台内容(如Backtrader),可能需要确认专注度。重点应该放在掘金官方文档的获取路径和典型问题解决方案上。引用[3]提到的新旧API替换案例(如stk_get_index_constituents)值得展开,这可能是大多数开发者都会遇到的迁移难题。同时要注意提醒用户警惕版本差异——从引用[3]的时间戳看,平台在2025年仍有更新,文档时效性很关键。用户能提供具体函数名说明有一定开发基础,所以回复可以包含代码示例级别的内容。但避免堆砌术语,比如引用[4]里的证券类型筛选逻辑可以直接转化成可运行的代码块。需要强调几个关键作:官账号注册、SDK安装注意事项、调试技巧,这些在引用[2]的VeighNa安装经验里得到验证。突然想到个风险点:用户没说明用掘金的具体场景(回测/实盘/研究),不同场景的文档模块差异很大。不过从ta引用[1]的《Python量化交易实战》来看,大概率是策略开发全流程都需要。所以回复要覆盖从环境搭建到实盘部署的完整链路,尤其强调官方教程的顺序性学习价值(比如先学基础API再学风控模块)。</think> 以下是针对掘金量化交易平台的使用指南和接口文档的核心信息整理,结合官方资源和实践注意事项: ### 一、官方文档入口 1. **主文档中心** 访问官 [www.myquant.cn](https://www.myquant.cn/docs) 获取最新API文档、教程和SDK下载,包含: - 策略编写规范 - 实时行情接口(如`stk_get_index_constituents`) - 历史数据接口(已弃用`get_history_constituents`,改用`stk_get_index_constituents`) - 财务数据获取(`stk_get_finance_deriv_pt`替代旧版`get_fundamentals_n`) 2. **GitHub资源库** 代码示例和更新日志见 [掘金量化开源社区](https://github.com/myquant),注意接口变更(如引用[3]指出旧函数弃用问题)。 --- ### 二、关键功能使用指南 #### 1. **环境配置** ```python # 安装SDK(Python 3.7+) pip install git+https://github.com/myquant/quantlib-name.git # 替换为实际库名 ``` - 推荐使用**Python 3.10**(引用[2]环境要求) - Windows/Linux均支持 #### 2. **数据获取** ```python from gm.api import * # 获取上证50成分股(引用[3]修改) symbols = stk_get_index_constituents(index="SHSE.000016", trade_date="2025-02-16") # 筛选未退市股票(引用[4]方法) active_stocks = [s for s in symbols if s['delisted_date'] > context.now and not s.symbol.startswith(('SHSE.9', 'SZSE.2'))] ``` #### 3. **财务指标调用** ```python # 查询营业利润增长率(引用[3]字段变更) df_finance = stk_get_finance_deriv_pt(symbol='SHSE.600519', fields='oper_prof_yoy') ``` > 📌 **注意**:增长率字段由`NPGRT`更新为`oper_prof_yoy` --- ### 三、实战要点 1. **策略回测流程** 官方提供Jupyter Notebook模板: - 初始化配置(设置token、回测时间段) - 编写`on_tick`或`on_bar`事件驱 - 使用`stk_get_finance_deriv_pt`获取基本面数据 2. **常见问题解决** - **函数弃用**:旧版`get_history_constituents`替换为`stk_get_index_constituents`(引用[3]) - **日期参数**:`trade_date`需转为`YYYY-MM-DD`格式 - **数据延迟**:实盘数据需订阅实时行情服务 --- ### 四、学习资源推荐 1. **官方教程** - [《掘金量化入门手册》](https://www.myquant.cn/doc/quickstart) - API调试工具:Web版策略编辑器 2. **参考书籍** - 《Python量化交易实战:使用掘金构建交易系统》(引用[1]同类书适用) - 配套GitHub代码库:[掘金量化示例](https://github.com/myquant-examples) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值