问题描述
def set_feasible_stocks(stock_list,days,context):
# 得到是否停牌信息的dataframe,停牌的1,未停牌得0
suspened_info_df = get_price(list(stock_list), start_date=context.current_dt, end_date=context.current_dt, frequency='daily', fields='paused')['paused'].T
# 过滤停牌股票 返回dataframe
unsuspened_index = suspened_info_df.iloc[:,0]< 1
# 得到当日未停牌股票的代码list:
unsuspened_stocks = suspened_info_df[unsuspened_index].index
请问这个动量策略的代码,最后一行代码是什么意思呢?suspened_info_df后面接[unsuspened_index],是为什么呢?一个变量后面接一个列表么?是表示啥意思呢?有点看不懂。。。
解决方案
你好!欢迎来到量化交易的世界。你问的这个问题非常经典,它涉及到 Python 数据分析核心库 Pandas 中的一个重要概念:布尔索引(Boolean Indexing)。
简单来说,suspened_info_df[unsuspened_index] 的意思就是:根据条件过滤数据。
下面我们逐行拆解这段代码,帮你彻底弄懂它:
1. 获取停牌信息
suspened_info_df = get_price(list(stock_list), start_date=context.current_dt, end_date=context.current_dt, frequency='daily', fields='paused')['paused'].T
这一行通过 JoinQuant 的 get_price API 获取了股票池中所有股票当天的停牌状态。返回的 suspened_info_df 是一个 Pandas DataFrame(可以理解为一个表格)。
- 行索引(Index):是股票代码(比如 '000001.XSHE')。
- 列数据:是停牌状态(1 表示停牌,0 表示未停牌)。
2. 生成过滤条件(布尔数组)
unsuspened_index = suspened_info_df.iloc[:,0] < 1
这一行是关键。它提取了表格的第一列数据,并判断其是否小于 1(即等于 0,未停牌)。
返回的 unsuspened_index 并不是一个普通的列表,而是一个由 True 和 False 组成的 Pandas Series(布尔数组)。
- 如果某只股票未停牌(值为0),对应位置就是
True。 - 如果某只股票停牌了(值为1),对应位置就是
False。
3. 应用条件并获取股票代码
unsuspened_stocks = suspened_info_df[unsuspened_index].index
这就是你提问的那一行。
suspened_info_df[unsuspened_index]:当把一个由 True/False 组成的数组(unsuspened_index)放入 DataFrame 的中括号[]时,Pandas 会自动执行过滤操作。它只会保留那些对应位置为True的行,剔除为False的行。也就是说,这一步把停牌的股票从表格里删掉了。.index:过滤完之后,我们只需要剩下的股票代码。在 Pandas 中,行标签(这里就是股票代码)被称为index。加上.index就可以把这些未停牌的股票代码提取出来,形成一个列表供后续策略使用。
举个通俗的例子
假设 suspened_info_df 是一个花名册:
- 平安银行:0(未停牌)
- 万科A:1(停牌)
- 格力电器:0(未停牌)
那么 unsuspened_index 就是:
- 平安银行:True
- 万科A:False
- 格力电器:True
执行 suspened_info_df[unsuspened_index] 后,花名册就只剩下:
- 平安银行:0
- 格力电器:0
最后加上 .index,你就得到了:['平安银行', '格力电器']。
希望这个解释能帮你理清思路!在编写量化策略时,熟练掌握 Pandas 的数据筛选技巧是非常重要的。