《聚宽新手指南》系列教程从平台简介、获取数据、投资研究使用和常见问题处理四个方面介绍了聚宽平台,使初入平台的用户从整体上熟悉聚宽平台的使用。
之前的教程都是分一个一个知识点展开的,本教程将整体串起来。
本篇是《聚宽新手指南》系列教程中的第二篇 。
(1) 初识聚宽量化交易平台
(2) 获取数据教程
(3) 常见报错及警告解决方法(本篇)
(4) 投资研究使用教程(链接待续)
参考文档
明确是不是问题
问题是什么
善用搜索技术
简单准确的表述问题是什么,提供相关证据
对应的截图及测试代码
本地环境
自己安装的Python环境,例如使用Anaconda安装
聚宽官网回测、模拟交易、期货实盘
聚宽官网研究(Python2/3)
客户端(客户端版本)
一创聚宽(主要是股票实盘)
2019-01-04 00:00:00 - WARNING - /opt/conda/lib/python3.6/site-packages/joblib/_multiprocessing_helpers.py:38: UserWarning: [Errno 30] Read-only file system. joblib will operate in serial mode
warnings.warn('%s. joblib will operate in serial mode' % (e,))
不影响策略的正常影响,可以忽略
不过一般建议还是根据警告处理下
忽略警告的方法
import warnings
warnings.filterwarnings("ignore")
2019-01-04 00:00:00 - ERROR - Traceback (most recent call last):
File "/tmp/jqcore/jqboson/jqboson/core/entry.py", line 368, in _run
engine.start()
File "/tmp/jqcore/jqboson/jqboson/core/engine.py", line 220, in start
self._load()
File "/tmp/jqcore/jqboson/jqboson/core/engine.py", line 208, in _load
self._strategy.setup(self._context)
File "/tmp/jqcore/jqboson/jqboson/core/strategy.py", line 652, in setup
self._load(context)
File "/tmp/jqcore/jqboson/jqboson/core/strategy.py", line 250, in _load
self._module = self._loader.load(context)
File "/tmp/jqcore/jqboson/jqboson/core/loader.py", line 111, in load
exec(code, module.__dict__)
File "/tmp/strategy/user_code.py", line 2, in < module>
sns.plot()
AttributeError: module 'seaborn' has no attribute 'plot'
在报错提示中找user_code.py、code\xx.py等
下面简单说下常见的问题,点击查看更多Python标准异常
忘记加 :
# 测试代码
if count > 13
count = 1
# 报错
File "/tmp/strategy/user_code.py", line 2
if count > 13
^
SyntaxError: invalid syntax
缺少括号的后半部分
# 测试代码
if (count > 13:
count = 1
# 报错
File "/tmp/strategy/user_code.py", line 2
if (count > 13:
^
SyntaxError: invalid syntax
字符串首尾忘记加引号
# 测试代码
print("JoinQuant)
# 报错
File "/tmp/strategy/user_code.py", line 1
print("JoinQuant)
^
SyntaxError: EOL while scanning string literal
缩进有问题
# 测试代码
if count > 13:
count = 1
# 报错
File "/tmp/strategy/user_code.py", line 3
count = 1
^
IndentationError: expected an indented block
变量名拼写错误
# 测试代码
count = 13
print(conut)
# 报错
File "/tmp/strategy/user_code.py", line 2, in < module>
print(conut)
NameError: name 'conut' is not defined
对象没有此方法(全局对象没有定义,直接调用)
# 测试代码
print(g.count)
# 报错
File "/tmp/strategy/user_code.py", line 5, in handle_data
print(g.count)
AttributeError: 'StrategyGlobals' object has no attribute 'count'
模块没有对应的方法
# 测试代码
import seaborn as sns
sns.plot()
# 报错
File "/tmp/strategy/user_code.py", line 2, in < module>
sns.plot()
AttributeError: module 'seaborn' has no attribute 'plot'
被除数为0
# 测试代码
print(1/0)
# 报错
File "/tmp/strategy/user_code.py", line 1, in < module>
print(1/0)
ZeroDivisionError: division by zero
序列中没有此索引(解决方法:打印下具体的数据,求数据长度)
# 测试代码
list1 = [1, 2, 4]
print(list1[3])
# 报错
File "/tmp/strategy/user_code.py", line 2, in < module>
print(list1[3])
IndexError: list index out of range
原因
获取List中不存在的索引的值
解决方法
首先找到user_code.py中错误所在位置,检查下代码;打印下具体的数据;在程序中加入判断list的长度。
原因
不同版本Pandas的排序方法不同,dataframe类型没有sort_value这个方法。一般的,早期版本的排序方法是sort,新版本的排序方法为sort_values。
解决方法:
您可以查看下您使用环境中Pandas的版本,并使用对应的排序方法。具体使用方法请参考Pandas的教程。
sort的使用方法
sort_values的使用方法
# 早期版本的排序
year_pct_sum_sort = years_pct_sum[year].order(ascending=False)
data.sort('change_pct', ascending=False)
# 新版本的排序
year_pct_sum_sort = years_pct_sum[year].sort_values(ascending=False)
data.sort_values(by='date')
# ascending=False为降序排列,即最大值在最前面;默认为升序排列
一般报错内容如下
from pandas.stats.api import ols
ModuleNotFoundError: No module named 'pandas.stats'
产生的原因:在pandas0.18前的版本有stats方法,之后版本取消了这个方法。
解决方法:
(1)使用statsmodels的ols方法,具体使用方法请查询statsmodels模块的使用方法;
(2)聚宽官网的python2回测环境中pandas目前是0.16版的,可以正常使用;
(3)自定义客户端pandas的版本,不过不推荐,pandas是个很重要的Python库,如果降低了pandas的版本,客户端可能打不开。
原因
输入的股票代码不对,或者后缀不对
解决方法
检查下输入的标的是否正确
原因:
(1)局部变量写错了;(2)未在初始化中定义全局变量(g.*);
解决方法
查看报错user_code.py中报错信息的行数,有没有写错或者在全局变量中定义
原因
这是因为当我们使用context.portfolio.positions(字典类型) 时查询了一个并不存在于于这个字典的标的持仓信息,为了兼容不报错才出现的警告。比如,我们的仓位中没有000001这只股票,当我们调用 context.portfolio.positions['000001.XSHE'] 时,就会提示 :
Security(code=000001.XSHE) 在 positions 中不存在, 为了保持兼容, 我们返回空的 Position 对象, amount/price/avg_cost 都是 0
(当然其他查询仓位信息的方法也会导致上边的问题,这里只举了一个最简单的例子)
这些警告对策略本身运行并没有影响,但如果策略中有用到上述数据的有可能会引发逻辑上的问题(很小的可能性哦,和策略有关,一般可选择忽略)。
解决方法
在调用上述方法前 ,先判断标的是否存在于上述对象中
了解更多详情
客户端和官网使用方法基本相同,官网常见报错解决方法在客户端也适用
PermissionError:[Error 13]Permission denied: '...\\JoinQuant-Desktop-Py3\\USERDATA\\.joinquant-py3\bundle\\stock1m\01\000001.XSHE\\__attrs__'
或
FileNotFoundError: [Errno 2] No such file or directory: '...\JoinQuant-Desktop-Py3\USERDATA\.joinquant-py3\bundle\stock1d\65\000765.XSHE\meta.json'
原因
这个是由于windows的权限引起的
解决方法
本社区仅针对特定人员开放
查看需注册登录并通过风险意识测评
5秒后跳转登录页面...