策略名称:微盘股轮动策略
策略说明:
本策略专注于微盘股的投资机会,通过筛选市值最小的股票,并结合动态仓位管理进行交易。策略的核心思想是捕捉微盘股的短期波动,利用其高波动性获取超额收益。
策略核心逻辑:
-
股票池筛选:
-
筛选上市时间较长的股票,排除ST股。
-
筛选市值最小的120只股票,作为候选股票池。
-
-
交易决策:
-
每日开盘前更新股票池,选择市值最小的120只股票。
-
每日开盘后,根据股票池调整持仓,买入不在持仓中的股票,卖出不再符合条件的股票。
-
动态调整持仓,确保每只股票的仓位在预设范围内。
-
-
风险控制:
-
排除停牌、涨停或跌停的股票,避免无法交易的情况。
-
设置每只股票的仓位上限,避免过度集中风险。
-
策略特点:
-
微盘股捕捉:通过筛选市值最小的股票,捕捉微盘股的短期波动机会。
-
动态仓位管理:根据股票市值动态调整仓位,优化资金使用效率。
-
风险控制:排除高风险股票,设置仓位上限,控制风险。
适用场景:
-
适用于A股市场,能够有效捕捉微盘股的短期波动机会。
-
适合短线交易者,通过快速交易获取收益。
风险提示:
-
微盘股波动性较大,可能导致较高的回撤。
-
策略依赖于历史数据的有效性,需定期优化参数以适应市场变化。
策略代码结构:
-
初始化函数(
initialize):-
设定日志级别,使用真实价格交易,打开防未来函数。
-
初始化全局变量,用于跟踪策略运行的天数。
-
-
代码更新后运行函数(
after_code_changed):-
取消所有已设置的定时任务,重新设置每日开盘前、开盘时和收盘后的运行任务。
-
-
开盘前运行函数(
iUpdate):-
筛选市值最小的120只股票,作为候选股票池。
-
计算每只股票的仓位大小,确保总仓位不超过预设上限。
-
-
开盘时运行函数(
iTrader):-
根据股票池调整持仓,买入不在持仓中的股票,卖出不再符合条件的股票。
-
动态调整持仓,确保每只股票的仓位在预设范围内。
-
-
收盘后运行函数(
iReport):-
记录当前持仓数量、累计收益率、可用现金余额、投资组合总价值和策略运行天数。
-
策略优化建议:
-
参数优化:
-
可对股票池的数量(如120只)进行优化,以适应不同的市场周期。
-
调整每只股票的仓位上限,以平衡风险与收益。
-
-
风险控制:
-
增加最大回撤限制,当回撤超过一定比例时暂停交易。
-
设置单笔交易的最大亏损比例,避免单笔交易亏损过大。
-
-
多因子结合:
-
可结合其他技术指标(如成交量、MACD等)进行综合筛选,提高策略的稳定性。
-
总结:
本策略通过捕捉微盘股的短期波动机会,结合动态仓位管理,适合短线交易者在A股市场中获取收益。策略逻辑清晰,适合有一定编程基础的投资者进行进一步优化和实盘测试。
策略源码
# 风险及免责提示:该策略由聚宽用户在聚宽社区分享,仅供学习交流使用。
# 标题:微盘股研究
# 回测资金选择 1234567
import pandas as pd # 导入pandas库并设置别名pd
def initialize(context):
log.set_level('order', 'error') # 设置日志级别,只记录order模块中error级别及以上的日志
set_option('use_real_price', True) # 使用真实价格进行交易,即考虑股票的复权信息
set_option('avoid_future_data', True) # 打开防未来函数
g.days = 0 # 初始化一个全局变量g.days,可能用于跟踪策略运行的天数
# 更换代码后运行的单元,每次策略代码更新并启动时都会执行这个函数
def after_code_changed(context):
unschedule_all() # 取消所有已经设置的定时运行任务
run_daily(iUpdate, time='before_open') # 重新设置定时运行任务,每天开盘前运行iUpdate函数
run_daily(iTrader, time='9:35') # 每天9:35运行iTrader函数
run_daily(iReport, time='after_close') # 收盘后运行iReport函数,可能用于生成报告或进行日终处理
# iUpdate 函数,用于更新策略的股票选择和仓位大小
def iUpdate(context):
nchoice = 120 # 定义选择股票的数量上限
nposition = 100 # 定义持有股票的数量上限
# 全部A股
dt_last = context.previous_date # 获取策略运行前一天的日期
all_stock = get_all_securities('stock', dt_last) # 获取全部A股的股票列表
cdata = get_current_data() # 获取当前所有股票的数据
stocks = [s for s in all_stock.index if not cdata[s].is_st] # 过滤掉ST股票,只保留非ST股票
# 获取小盘股的股票列表,查询股票代码和市值
df = get_fundamentals(query(
valuation.code,
valuation.market_cap,
).filter(
valuation.code.in_(stocks), # 只查询非ST股票的市值
valuation.pb_ratio > 0, # 过滤掉市净率小于等于0的股票
).order_by(valuation.market_cap.asc() # 按市值升序排序
).limit(nchoice) # 限制查询结果数量为nchoice
).dropna().set_index('code') # 去除缺失值,并将股票代码设置为索引
# 结果
g.choice = df.index.tolist() # 将查询结果的股票列表保存到全局变量g.choice中
# 计算每只股票的仓位大小,这里使用了倒数法来分配仓位,即总资金除以持有股票的数量
g.position_size = 1.0/nposition * context.portfolio.total_value
# iReport 函数,用于在策略运行结束后生成报告
def iReport(context):
g.days = g.days + 1 # 增加全局变量 g.days 的值,用于跟踪策略运行的天数
log.info(' positions', len(context.portfolio.positions)) # 记录当前持仓的股票数量
log.info(' return %.2f', 100*context.portfolio.returns) # 记录策略的累计收益率
log.info(' cash %.2f', context.portfolio.available_cash/10000) # 记录当前可用的现金余额
log.info(' value %.2f', context.portfolio.total_value/10000) # 记录当前投资组合的总价值
log.info('running days', g.days) # 记录策略运行的天数
关键iTrader 函数,用于执行策略的买卖逻辑,解锁后查看:
