3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
您好!您并没有做错,这是由于 Python 3 的字典视图特性以及 JoinQuant 底层对象的打印格式(__repr__)共同导致的。
在 JoinQuant 平台中,context.portfolio.positions 是一个类似字典(dict)的对象,键(key)是股票代码,值(value)是 Position 对象。
.keys() 方法返回的不再是一个简单的列表(list),而是一个 动态视图对象(dict_keys 或 KeysView)。print 这个视图对象时,Python 会尝试打印它的内部表示。由于 JoinQuant 对底层字典类进行了封装,打印这个视图时,连带着把字典里的值(即 UserPosition 对象)也一并显示出来了,所以您看到的结果非常长,感觉和 .values() 差不多。如果您想要得到一个纯粹的、只包含股票代码的列表,只需要使用 list() 函数将这个视图对象强制转换为列表即可。
正确的代码写法:
# 将 KeysView 转换为 list
stock_list = list(context.portfolio.positions.keys())
print(stock_list)
这样输出的结果就会是您期望的:
['000651.XSHE', '002415.XSHE', '600999.XSHG']
在实际编写策略时,如果您只是想遍历当前持仓的股票代码,可以直接遍历 context.portfolio.positions(在 Python 中遍历字典默认就是遍历它的 keys),不需要显式调用 .keys():
# 遍历当前持仓的所有股票代码
for stock in context.portfolio.positions:
print("当前持仓股票代码:", stock)
# 获取该股票的持仓对象
position = context.portfolio.positions[stock]
print("该股票持仓数量:", position.total_amount)
总结来说,直接 print(keys()) 只是显示形式的问题,数据结构本身是正确的,套一层 list() 就可以解决您的疑惑了。