🚀 AI 一键生成 joinquant 策略代码
立即体验
👉 AI 生成代码 👈

JoinQuant量化代码解析:check_stocks(context) 是什么意思?

joinquant | 发布时间: 2026/6/24
以下内容由 EasyQuant 生成。

问题描述

请教大神们,下面代码中check_stock是什么意思?

请教大神们,下面代码中check_stock是什么意思?不太懂check_stock(context)是什么意思?

'''
筛选出市值介于20-30亿的股票,选取其中市值最小的三只股票,
每天开盘买入,持有五个交易日,然后调仓。
'''

初始化函数,设定要操作的股票、基准等等
def initialize(context):

# 设定沪深300作为基准
set_benchmark('000300.XSHG')
# True为开启动态复权模式,使用真实价格交易
set_option('use_real_price', True)
# 设定成交量比例
set_option('order_volume_ratio', 1)
# 股票类交易手续费是:买入时佣金万分之三,卖出时佣金万分之三加千分之一印花税, 每笔交易佣金最低扣5块钱
set_order_cost(OrderCost(open_tax=0, close_tax=0.001, \
open_commission=0.0003, close_commission=0.0003,\
close_today_commission=0, min_commission=5), type='stock')
# 持仓数量
g.stocknum = 3
# 交易日计时器
g.days = 0
# 调仓频率
g.refresh_rate = 5
# 运行函数
run_daily(trade, 'every_bar')
选出小市值股票
def check_stocks(context):

# 设定查询条件
q = query(
valuation.code,
valuation.market_cap
).filter(
valuation.market_cap.between(20,30)
).order_by(
valuation.market_cap.asc()
)

# 选出低市值的股票,构成buylist
df = get_fundamentals(q)
buylist =list(df['code'])

# 过滤停牌股票
buylist = filter_paused_stock(buylist)

return buylist[:g.stocknum]
交易函数
def trade(context):
if g.days%g.refresh_rate == 0:

## 获取持仓列表
sell_list = list(context.portfolio.positions.keys())
# 如果有持仓,则卖出
if len(sell_list) > 0 :
for stock in sell_list:
order_target_value(stock, 0)

## 分配资金
if len(context.portfolio.positions) < g.stocknum :
Num = g.stocknum - len(context.portfolio.positions)
Cash = context.portfolio.cash/Num
else:
Cash = 0

## 选股
stock_list =** check_stocks(context)**

## 买入股票
for stock in stock_list:
if len(context.portfolio.positions.keys()) < g.stocknum:
order_value(stock, Cash)

# 天计数加一
g.days = 1
else:
g.days += 1
过滤停牌股票
def filter_paused_stock(stock_list):
current_data = get_current_data()
return [stock for stock in stock_list if not current_data[stock].paused]

解决方案

在您提供的这段 JoinQuant(聚宽)量化交易策略代码中,check_stocks(context) 是一个自定义的选股函数。它的核心作用是:根据特定的条件(市值在20-30亿之间、非停牌)筛选出符合要求的股票列表,供后续的交易函数买入。

下面为您详细拆解这个函数的作用以及 context 参数的含义。

1. check_stocks 函数逐行解析

这个函数的名字 check_stocks 是策略编写者自己起的(你也可以叫它 get_my_stocks 等),它的具体逻辑如下:

def check_stocks(context):
    # 1. 设定查询条件
    q = query(
            valuation.code,          # 查询股票代码
            valuation.market_cap     # 查询总市值
        ).filter(
            valuation.market_cap.between(20,30) # 过滤条件:市值介于20亿到30亿之间
        ).order_by(
            valuation.market_cap.asc()          # 排序条件:按市值从小到大升序排列 (asc)
        )

    # 2. 获取财务数据
    df = get_fundamentals(q) # 根据上面的查询条件 q,向聚宽数据库请求数据,返回一个 DataFrame
    buylist = list(df['code']) # 将 DataFrame 中的股票代码列提取出来,转换成 Python 列表

    # 3. 过滤停牌股票
    buylist = filter_paused_stock(buylist) # 调用另一个自定义函数,剔除当前正在停牌的股票

    # 4. 返回最终结果
    return buylist[:g.stocknum] # 截取列表的前 g.stocknum 只股票(在 initialize 中设定了 g.stocknum = 3),并返回

总结来说,check_stocks 的工作流程是:
找市值20-30亿的股票 -> 按市值从小到大排队 -> 剔除停牌买不进去的 -> 拿出排在最前面的3只 -> 交给 trade 函数去买。

2. context 是什么意思?

check_stocks(context) 中,context 是 JoinQuant 平台中非常重要的一个全局上下文对象

  • 它的作用context 就像是一个“大管家”,里面实时保存了你策略运行时的所有状态信息。比如:
    • context.current_dt:当前策略运行到了哪年哪月哪日几分几秒。
    • context.portfolio.cash:你账户里现在还有多少可用现金。
    • context.portfolio.positions:你当前持有哪些股票,盈亏是多少。
  • 为什么这里要传 context
    虽然在您这段 check_stocks 函数的内部代码中,并没有直接使用到 context 的属性,但把它作为参数传进去是一个非常好的编程习惯。因为在更复杂的选股逻辑中,你很可能需要用到当前时间(比如:if context.current_dt.month == 5: 五月份换一种选股逻辑),这时候如果函数没有接收 context 参数,就会报错。

3. 结合 trade 函数看整体逻辑

在您的 trade 函数中,有这样一行代码:

stock_list = check_stocks(context)

这句话的意思就是:在满足调仓条件(每5天一次)时,呼叫 check_stocks 这个“选股专员”,让他把选好的3只股票名单交上来存到 stock_list 变量里。随后,下面的 for stock in stock_list: 循环就会拿着这个名单,把资金平分,挨个买入这3只股票。

希望这个解释能帮您理清代码的逻辑!在量化编程中,将“选股”和“交易”写成独立的函数,是非常清晰且易于维护的代码结构。