问题描述
我想在盘中选股,根据每分钟high,low、open、volume、money等分时数据来选择股票,请问该如何实现?
解决方案
在JoinQuant(聚宽)平台上,想要在盘中获取股票的分钟级分时详细数据(如 open, high, low, close, volume, money)来进行动态选股,最推荐的方法是使用 get_bars 或 get_price 函数。这两个函数都支持获取分钟级别的数据。
以下是具体的实现方法和代码示例:
方法一:使用 get_bars 函数(推荐)
get_bars 函数获取速度快,且支持 include_now=True 参数,这意味着你可以获取到当前正在交易、尚未结束的这一分钟的快照数据,非常适合盘中实时选股。
核心参数说明:
security: 标的代码或代码列表(如['000001.XSHE', '000002.XSHE'])。count: 获取的分钟Bar数量。unit: 时间单位,设为'1m'表示1分钟线。fields: 需要获取的字段,如['date', 'open', 'high', 'low', 'close', 'volume', 'money']。include_now: 设为True,包含当前时刻所在的分钟Bar。
方法二:使用 get_price 函数
get_price 是最常用的历史数据获取函数,将 frequency 设置为 '1m' 即可获取分钟数据。
完整策略示例代码
下面是一个完整的策略框架示例,演示如何在盘中每分钟获取指定股票池的分时数据,并根据自定义的逻辑进行选股:
# 导入聚宽函数库
import jqdata
def initialize(context):
# 设定沪深300作为基准
set_benchmark('000300.XSHG')
# 开启动态复权模式(真实价格)
set_option('use_real_price', True)
# 设定我们要监控的股票池(例如:平安银行、万科A)
g.watch_list = ['000001.XSHE', '000002.XSHE', '000004.XSHE']
# 盘中每分钟运行一次选股逻辑
run_daily(intraday_stock_selection, time='every_bar')
def intraday_stock_selection(context):
# 获取当前时间
current_time = context.current_dt
# 使用 get_bars 获取股票池中所有股票最近 1 分钟的数据
# include_now=True 表示包含当前这一分钟的实时快照数据
bars_dict = get_bars(g.watch_list, count=1, unit='1m',
fields=['date', 'open', 'high', 'low', 'close', 'volume', 'money'],
include_now=True, df=True)
# 遍历股票池,进行选股逻辑判断
for stock in g.watch_list:
# 获取该股票的 DataFrame 数据
df = bars_dict[stock]
if df.empty:
continue
# 提取最新一分钟的数据
latest_bar = df.iloc[-1]
minute_open = latest_bar['open']
minute_high = latest_bar['high']
minute_low = latest_bar['low']
minute_close = latest_bar['close']
minute_volume = latest_bar['volume']
minute_money = latest_bar['money']
# ==========================================
# 在这里编写你的盘中选股逻辑
# 例如:如果这一分钟内,最低价小于开盘价,且成交额大于100万,则打印并考虑买入
# ==========================================
if minute_low < minute_open and minute_money > 1000000:
log.info(f"[{current_time}] 选中股票 {stock}!当前分钟开盘:{minute_open}, 最低:{minute_low}, 成交额:{minute_money}")
# 如果账户中没有该股票,则买入100股作为示例
if context.portfolio.positions[stock].closeable_amount == 0:
order(stock, 100)
log.info(f"买入 {stock} 100股")
注意事项
- 性能优化:如果你监控的股票池非常大(例如全市场3000多只股票),每分钟调用一次
get_bars可能会导致运行超时(模拟盘限制每个函数运行不超过1800秒)。建议在before_trading_start中先通过基本面或日线技术指标筛选出一个较小的候选池(如50-100只),然后在盘中仅对这个小候选池请求分钟数据。 - 数据对齐:
get_bars返回多只股票数据且df=True时,返回的是一个以股票代码为 key,DataFrame 为 value 的字典(或者 MultiIndex DataFrame,取决于具体版本和参数),请注意正确解析。 - 未来函数规避:在回测中,
get_bars的include_now=True获取的是当前分钟结束时的状态。如果在实盘/模拟盘中,它获取的是当前秒的快照。请确保你的逻辑不会因为这种微小差异产生严重的“未来函数”偏差。