策略名称:公募基金抱团策略
策略说明:
本策略基于公募基金的持仓数据,通过筛选近期表现优异的股票型基金,并跟踪其重仓股进行投资。策略的核心思想是捕捉公募基金抱团效应,跟随基金的持仓变化进行交易决策。
策略核心逻辑:
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('##############################################################')
