3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
你好!这段代码的逻辑是完全正确的,大于小于号没有写反。
我们可以详细拆解一下这段列表推导式的逻辑:
[stock for stock in stock_list if stock in context.portfolio.positions.keys()
or last_prices[stock][-1] < current_data[stock].high_limit]
这个列表推导式的目的是保留符合条件的股票。条件有两个(满足其一即可):
stock in context.portfolio.positions.keys():股票已经在持仓中(即使涨停也保留,方便后续可能的卖出或其他处理)。last_prices[stock][-1] < current_data[stock].high_limit:最新价格小于涨停价。如果价格小于涨停价,说明该股票没有涨停,因此需要保留在候选池中。如果价格等于涨停价,这个条件为 False,该股票就会被剔除。[stock for stock in stock_list if stock in context.portfolio.positions.keys()
or last_prices[stock][-1] > current_data[stock].low_limit]
同理,保留的条件是:
last_prices[stock][-1] > current_data[stock].low_limit:最新价格大于跌停价。如果价格大于跌停价,说明该股票没有跌停,因此保留。如果价格等于跌停价,条件为 False,股票被剔除。虽然逻辑没错,但代码在获取最新价格时使用了 history 函数去取上一分钟的收盘价。在 JoinQuant 中,更高效且准确的做法是直接使用 get_current_data() 提供的 last_price 属性,这样可以避免调用 history 带来的额外性能开销,并且获取的是当前时刻的最新价。
优化后的代码如下:
# 过滤涨停的股票
def filter_limitup_stock(context, stock_list):
current_data = get_current_data()
return [stock for stock in stock_list
if stock in context.portfolio.positions.keys()
or current_data[stock].last_price < current_data[stock].high_limit]
# 过滤跌停的股票
def filter_limitdown_stock(context, stock_list):
current_data = get_current_data()
return [stock for stock in stock_list
if stock in context.portfolio.positions.keys()
or current_data[stock].last_price > current_data[stock].low_limit]
总结:你的理解可能把“保留条件”和“剔除条件”弄混了。代码中写的是保留条件(小于涨停价保留,大于跌停价保留),所以符号是正确的!