问题描述
这个策略在剔除涨停板和跌停板股票的时候,是不是大于小于写反了?
剔除涨停代码如下:
过滤涨停的股票
def filter_limitup_stock(context, stock_list):
last_prices = history(1, unit='1m', field='close', security_list=stock_list)
current_data = get_current_data()
# 已存在于持仓的股票即使涨停也不过滤,避免此股票再次可买,但因被过滤而导致选择别的股票
return [stock for stock in stock_list if stock in context.portfolio.positions.keys()
or last_prices[stock][-1] **< **current_data[stock].high_limit]
剔除跌停板股票代码如下:
过滤跌停的股票
def filter_limitdown_stock(context, stock_list):
last_prices = history(1, unit='1m', field='close', security_list=stock_list)
current_data = get_current_data()
return [stock for stock in stock_list if stock in context.portfolio.positions.keys()
or last_prices[stock][-1] **> **current_data[stock].low_limit]
作者如果能看到,麻烦也回复一下,谢谢!Bold
解决方案
你好!这段代码的逻辑是完全正确的,大于小于号没有写反。
我们可以详细拆解一下这段列表推导式的逻辑:
1. 过滤涨停股票的逻辑
[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,该股票就会被剔除。
2. 过滤跌停股票的逻辑
[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]
总结:你的理解可能把“保留条件”和“剔除条件”弄混了。代码中写的是保留条件(小于涨停价保留,大于跌停价保留),所以符号是正确的!