AttributeError: 'set' object has no attribute 'order'怎么解决
时间: 2023-09-22 18:12:04 浏览: 102
这个错误通常是因为你在使用 `order` 方法时,将一个集合对象传递给了它,而集合对象并不支持 `order` 方法。
如果你需要对集合进行排序,可以将其转换为列表对象,然后再对列表进行排序。例如:
```
my_set = {'a', 'c', 'b'}
my_list = list(my_set)
my_list.sort()
```
这样就可以将集合中的元素按照字母顺序排序了。
相关问题
AttributeError: type object 'StockValuation' has no attribute 'is_st'
非常抱歉,最新版的聚宽 SDK 中,`StockValuation` 没有 `is_st` 这一属性了。你可以使用 `get_extras` 函数来获取是否是 ST 股票的信息,具体代码如下:
```python
# 导入所需库
import jqdata
# 初始化函数,设定基准等等
def initialize(context):
# 设定股票池
g.stocks = get_stock_pool()
# 设置手续费与滑点
set_commission(slippage=Slippage(), commission=Commission())
# 定义股票池函数
def get_stock_pool():
# 获取所有A股股票
stocks = list(get_all_securities(['stock']).index)
# 过滤掉ST股票和上市时间不足一年的股票
q = query(
valuation.code
).filter(
valuation.code.in_(stocks),
# 上市时间超过一年
valuation.list_date < (context.current_dt - datetime.timedelta(days=365))
)
df = get_fundamentals(q)
# 获取是否是ST股票的信息
is_st = get_extras('is_st', df.index, count=1, start_date=context.current_dt)
is_st = is_st.iloc[0]
# 过滤掉ST股票
stocks = [s for s in df.index if not is_st[s]]
# 返回剩余股票
return stocks
# 定义选择股票函数
def select_stocks(context):
# 获取当日集合竞价涨跌幅前50%的股票
q = query(
valuation.code
).filter(
valuation.code.in_(g.stocks),
# 当日集合竞价涨跌幅前50%
valuation.change_pct > 0
).order_by(
valuation.change_pct.desc()
).limit(
len(g.stocks) // 2
)
stocks = [s for s in get_fundamentals(q).iloc[:,0]]
# 返回选出的股票
return stocks
# 定义调仓函数
def rebalance(context):
# 清空现有持仓
for stock in context.portfolio.positions:
order_target(stock, 0)
# 选择新的股票
stocks = select_stocks(context)
# 平均分配资金买入选中的股票
if stocks:
weight = 1.0 / len(stocks)
for stock in stocks:
order_target_percent(stock, weight)
```
这个示例代码中,我们使用了 `get_extras` 函数来获取是否是 ST 股票的信息,过滤掉了 ST 股票。然后,在 `initialize()` 函数中,我们调用了 `get_stock_pool()` 函数来设定股票池。接着,在 `select_stocks()` 函数中,我们获取当日集合竞价涨跌幅前50%的股票,作为选股结果。最后,在 `rebalance()` 函数中,我们清空现有持仓,然后买入选中的股票,让资金平均分配到每个股票的头寸上。
# 获取平安银行股票代码security = jqdatasdk.normalize_code('000001.XSHE')# 获取平安银行 2015 年至 2019 年的 ROE 数据roe_data = jqdatasdk.get_fundamentals(jqdatasdk.query( jqdatasdk.indicator.code, jqdatasdk.indicator.roe).filter( jqdatasdk.indicator.code == security,).order_by( # 使用 period_date 表示 ROE 数据的公布日期 jqdatasdk.indicator.period_date.desc()).limit( None), start_date='2015-01-01', end_date='2019-12-31')# 将 ROE 数据转换为 DataFrame 格式roe_data = pd.DataFrame(roe_data).set_index('pub_date')['roe']# 输出 ROE 数据print(roe_data)报错AttributeError Traceback (most recent call last)C:\Users\THUNDE~1\AppData\Local\Temp/ipykernel_13868/815225579.py in <module> 10 ).order_by( 11 # 使用 period_date 表示 ROE 数据的公布日期---> 12 jqdatasdk.indicator.period_date.desc() 13 ).limit( 14 NoneAttributeError: type object 'FinancialIndicatorDay' has no attribute 'period_date'
这个错误是由于聚宽 SDK 中的 `jqdatasdk.indicator` 模块下没有 `period_date` 这个属性所导致的。你可以将 `period_date` 改为 `day` 或者 `statDate`,这两个属性可以用来表示 ROE 数据的公布日期。修改后的代码如下:
```
import jqdatasdk
import pandas as pd
# 获取平安银行股票代码
security = jqdatasdk.normalize_code('000001.XSHE')
# 获取平安银行 2015 年至 2019 年的 ROE 数据
roe_data = jqdatasdk.get_fundamentals(jqdatasdk.query(
jqdatasdk.indicator.code,
jqdatasdk.indicator.roe).filter(
jqdatasdk.indicator.code == security,).order_by(
# 使用 day 或者 statDate 表示 ROE 数据的公布日期
jqdatasdk.indicator.day.desc()).limit(
None), start_date='2015-01-01', end_date='2019-12-31')
# 将 ROE 数据转换为 DataFrame 格式
roe_data = pd.DataFrame(roe_data).set_index('pub_date')['roe']
# 输出 ROE 数据
print(roe_data)
```
阅读全文