Warning: file_exists(): open_basedir restriction in effect. File(/www/wwwroot/com.xiximiao.oa/com.cmstop/public/www/wp-content/db.php) is not within the allowed path(s): (/www/wwwroot/com.xiximiao.oa/com.cmstop/public/www/:/tmp/:/proc/:/var/log/nginx/:/www/wwwroot/com.xiximiao.oa/com.cmstop/public/:/www/wwwroot/com.xiximiao.oa/com.cmstop/vendor/:/www/wwwroot/com.xiximiao.oa/com.cmstop/ppk/) in /www/wwwroot/com.xiximiao.oa/com.cmstop/public/www/wp-includes/load.php on line 707
2080 公募基金抱团策略.py 量化交易源码分享 » 轻知量化 QMT、PTrade、聚宽策略分享交流平台

2080 公募基金抱团策略.py 量化交易源码分享

策略名称:公募基金抱团策略

策略说明:

本策略基于公募基金的持仓数据,通过筛选近期表现优异的股票型基金,并跟踪其重仓股进行投资。策略的核心思想是捕捉公募基金抱团效应,跟随基金的持仓变化进行交易决策。

策略核心逻辑:

1. **基金筛选**:
- 筛选出过去180天内净值增长表现优异的股票型基金。
- 选取净值增长排名前50的基金。

2. **重仓股筛选**:
- 获取筛选出的基金的最新持仓数据,汇总其重仓股。
- 根据持仓比例对重仓股进行排序,选取持仓比例最高的50只股票。

3. **交易决策**:
- 在每个季度的最后一个交易日(1月31日、4月30日、7月31日、10月31日),根据最新的基金持仓数据调整持仓。
- 按照基金持仓比例分配资金,买入重仓股。
- 卖出不再在重仓股列表中的股票。

策略特点:

- **基金抱团效应**:通过跟踪公募基金的重仓股,捕捉基金抱团带来的市场机会。
- **季度调仓**:每季度根据最新的基金持仓数据调整持仓,保持与基金持仓的一致性。
- **动态资金分配**:根据基金的持仓比例动态分配资金,优化资金使用效率。

适用场景:

- 适用于A股市场,能够有效捕捉公募基金抱团带来的市场机会。
- 适合中长期投资者,通过跟随基金持仓获取稳定收益。

提示:
策略依赖于基金持仓数据的及时性和准确性,需定期更新数据。

策略代码结构:

1. **初始化函数(`initialize`)**:
- 设定基准指数(沪深300)。
- 配置交易手续费和滑点。
- 定义每日运行的函数(开盘前、开盘时、收盘后)。

2. **开盘前运行函数(`before_market_open`)**:
- 在每个季度的最后一个交易日,筛选出过去180天内净值增长表现优异的股票型基金。
- 获取筛选出的基金的最新持仓数据,汇总其重仓股,并按持仓比例排序。

3. **开盘时运行函数(`market_open`)**:
- 根据最新的基金持仓数据调整持仓,买入重仓股,卖出不再在重仓股列表中的股票。

4. **收盘后运行函数(`after_market_close`)**:
- 记录当天的成交记录,并输出日志。

策略优化建议:

1. **参数优化**:
- 可对基金筛选的时间窗口(如180天)进行优化,以适应不同的市场周期。
- 调整重仓股的数量(如50只),以平衡风险与收益。

2. **风险控制**:
- 增加止损机制,避免在极端行情中遭受过大损失。
- 设置最大回撤限制,当回撤超过一定比例时暂停交易。

3. **多因子结合**:
- 可结合其他技术指标(如市盈率、市净率等)进行综合筛选,提高策略的稳定性。

总结:

本策略通过跟踪公募基金的重仓股,捕捉基金抱团带来的市场机会,适合中长期投资者在A股市场中获取稳定收益。策略逻辑清晰,适合有一定编程基础的投资者进行进一步优化和实盘测试。

策略源码

# 标题:公募基金抱团 

# 导入函数库
from jqdata import *

# 初始化函数,设定基准等等
def initialize(context):
    # 设定沪深300作为基准
    set_benchmark('000300.XSHG')
    # 开启动态复权模式(真实价格)
    set_option('use_real_price', True)
    # 输出内容到日志 log.info()
    log.info('初始函数开始运行且全局只运行一次')
    # 过滤掉order系列API产生的比error级别低的log
    # log.set_level('order', 'error')

    ### 股票相关设定 ###
    # 股票类每笔交易时的手续费是:买入时佣金万分之三,卖出时佣金万分之三加千分之一印花税, 每笔交易佣金最低扣5块钱
    set_order_cost(OrderCost(close_tax=0.001, open_commission=0.0003, close_commission=0.0003, min_commission=5), type='stock')

    ## 运行函数(reference_security为运行时间的参考标的;传入的标的只做种类区分,因此传入'000300.XSHG'或'510300.XSHG'是一样的)
#   开盘前运行
    run_daily(before_market_open, time='before_open', reference_security='000300.XSHG')
#   开盘时运行
    run_daily(market_open, time='open', reference_security='000300.XSHG')
#   收盘后运行
    run_daily(after_market_close, time='after_close', reference_security='000300.XSHG')


## 开盘时运行函数
def market_open(context):
    # log.info('函数运行时间(market_open):'+str(context.current_dt.time()))
    if g.judge_date not in g.trade_day_list:
        return
    buy_list = g.buy_list
    for future in context.portfolio.long_positions.keys():
        order_target(future, 0)
    security_all = []    
    for i in range(50):
        security = buy_list['symbol'][i]
        if len(security) == 5:
            continue
        if security[:2] == '30':
            security = security + '.XSHE'
        elif security[:2] == '60':
            security = security + '.XSHG'
        elif security[:2] == '00':
            security = security + '.XSHE'
        elif security[:2] == '68':
            security = security + '.XSHG'
        security_all.append(security)
    
    for i in range(len(security_all)):
        security = security_all[i]
        cash = buy_list['buy'][i]
        if security in context.portfolio.long_positions.keys():
            continue
        else:
            order_value(security, cash)
    for stock in context.portfolio.long_positions.keys():
        if stock not in security_all:
            order_target_value(stock, 0)


## 收盘后运行函数
def after_market_close(context):
    # log.info(str('函数运行时间(after_market_close):'+str(context.current_dt.time())))
    if g.judge_date not in g.trade_day_list:
        return
    #得到当天所有成交记录
    trades = get_trades()
    for _trade in trades.values():
        log.info('成交记录:'+str(_trade))
    log.info('一天结束')
    log.info('##############################################################')

2025-02-21
⚠️
本站资源大多来自网络,仅供网友学习交流,未经作者或上传书面授权,请勿作他用。
站长 vx: xiangyin615 或者 留言反馈 ,我们将尽快处理。
Notice: When you of the legal rights be violate, please stir to vx: xiangyin615
个人中心
购物车
优惠劵
搜索