ricequant / rqalpha

A extendable, replaceable Python algorithmic backtest && trading framework supporting multiple securities
http://rqalpha.io
Other
5.39k stars 1.62k forks source link

在0.3.14版本可用的代码,在2.0.6不可以用了,如何解决? #79

Closed myz8110 closed 7 years ago

myz8110 commented 7 years ago

我原先用的是0.3.14版本,,为了方便重复使用,不必每次都敲一大堆字,我修改了C:\Users\Administrator.rqalpha目录下的config.yml很多参数,cmd命令行下直接cd example,rqalpha run -f XXX.py,这样是不会报错的.但是更新到2.0.6之后,报错了.但是cd example,rqalpha run -f XXX.py -s 2014-01-01 -e 2016-01-01 -o result.pkl --plot --progress --stock-starting-cash 100000 这样又不会了.我尝试了以下几种方法都不行:1.修改C:\Anaconda3目录下的config.yml;2.把C:\Anaconda3目录下的config.yml和C:\Users\Administrator.rqalpha目录下的config.yml都删除掉.以上方法都不起效. 我想问下有什么解决方法??每次运行代码都要在后面敲一大堆参数觉得很麻烦.其中甚至有个name error:name 'logger' is not defined. 报错如下,以前报错是红字,我还会修改自己的代码,而现在报错的是白字.完全看不懂.(抱歉下面显示乱码的都是空格,我在cmd命令行里复制过来的):

C:\Anaconda3\examples>rqalpha run -f rqrun.py
Traceback (most recent call last):
  File "c:\anaconda3\lib\runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "c:\anaconda3\lib\runpy.py", line 85, in _run_code
    [35;1mexec[m(code, run_globals)
    [36m {'__name__': '__main__', '__doc__': None, '__package__':
 '', '__loader__': <zipimporter object "C:\Anaconda3\Scripts\rqalpha.exe...[m
    [36m <code object <module> at 0x000000000236E030, file "C:\Anaconda3
\Scripts\rqalpha.exe\__main__.py", line 2>[m
  File "C:\Anaconda3\Scripts\rqalpha.exe\__main__.py", line 9, in <module>
    sys.exit(entry_point())
    [36m    <function entry_point at 0x00000000023A8598>[m
    [36m <module 'sys' (built-in)>[m
  File "c:\anaconda3\lib\site-packages\rqalpha\__main__.py", line 67, in entry_p
oint
    cli(obj={})
    [36m <click.core.Group object at 0x0000000006DF8C88>[m
  File "c:\anaconda3\lib\site-packages\click\core.py", line 722, in __call__
    [33;1mreturn[m self.main(*args, **kwargs)
    [36m          {'obj': {'VERBOSE': 0}}[m
    [36m        ()[m
    [36m   <click.core.Group object at 0x0000000006DF8C88>[m
  File "c:\anaconda3\lib\site-packages\click\core.py", line 697, in main
    rv = self.invoke(ctx)
    [36m       <click.core.Context object at 0x0000000006E18278>
[m
    [36m <click.core.Group object at 0x0000000006DF8C88>[m
  File "c:\anaconda3\lib\site-packages\click\core.py", line 1066, in invoke
    [33;1mreturn[m _process_result(sub_ctx.command.invoke(sub_ctx))
    [36m                              <click.core.Context
object at 0x0000000006E18320>[m
    [36m             <click.core.Context object at 0x0000000006E1
8320>[m
    [36m   <function MultiCommand.invoke.<locals>._process_result at 0x0
000000001DF67B8>[m
  File "c:\anaconda3\lib\site-packages\click\core.py", line 895, in invoke
    [33;1mreturn[m ctx.invoke(self.callback, **ctx.params)
    [36m                   <click.core.Context object at 0
x0000000006E18320>[m
    [36m        <click.core.Command object at 0x0000000006E09D30>
[m
    [36m   <click.core.Context object at 0x0000000006E18320>[m
  File "c:\anaconda3\lib\site-packages\click\core.py", line 535, in invoke
    [33;1mreturn[m callback(*args, **kwargs)
    [36m         {'base__strategy_file': 'rqrun.py', 'base
__data_bundle_path': None, 'base__start_date': None, 'base__end_date': None, 'ba
se__sto...[m
    [36m       ()[m
    [36m   <function run at 0x0000000006E13488>[m
  File "c:\anaconda3\lib\site-packages\rqalpha\__main__.py", line 119, in run
    main.run(parse_config(kwargs, config_path))
    [36m             None[m
    [36m           {'base__strategy_file': 'rqrun.py', 'base__d
ata_bundle_path': None, 'base__start_date': None, 'base__end_date': None, 'base_
_sto...[m
    [36m    <function parse_config at 0x0000000006E0E268>[m
    [36m <module 'rqalpha.main' from 'c:\\anaconda3\\lib\\site-packages\\rqal
pha\\main.py'>[m
  File "c:\anaconda3\lib\site-packages\rqalpha\utils\config.py", line 208, in pa
rse_config
    [33;1mraise[m patch_user_exc([35;1mValueError[m(_([31m'stock starting c
ash and future starting cash can not be both 0.'[m)))
    [36m                      <function gettext at 0x0000000002F3
E378>[m
    [36m  <function patch_user_exc at 0x0000000002F27488>
wh1100717 commented 7 years ago

配置文件有比较大的改动,包括系统Mod的配置。

请参考 http://rqalpha.readthedocs.io/zh_CN/stable/api/config.html#rqalpha

或者您把你的配置信息贴出来 我帮您看一下哪里出错了也OK

myz8110 commented 7 years ago

我今天再试了一次,C:\Users\Administrator.rqalpha目录下的config.yml和C:\Anaconda3目录下的config.yml配置相同,我仅修改了

股票起始资金,默认为0

stock_starting_cash: 100000

期货起始资金,默认为0

future_starting_cash: 100000

cmd:rqalpha run -f rsi.py -s 2014-01-01 -e 2016-01-01 -o result.pkl --plot --progress --stock-starting-cash 100000 这样是不会报错的. cmd:rqalpha run -f rsi.py 这样就会报错.您可以试一下,用的就是example的原生代码rsi.py,没做任何修改.

而在rqalpha2.0文档中说到: 通过配置 config.yml 的方式 除了在启动策略的时候传入参数,还可以通过指定配置文件的方式来进行参数的配置, 配置文件的配置信息优先级低于启动参数,也就是说启动参数会覆盖配置文件的配置项,配置文件的格式如下:

注1: 如果没有指定 config.yml, RQAlpha 在运行时会自动在当前目录下寻找 config.yml 文件作为用户配置文件,如果没有寻找到,则按照默认配置运行。 注2: 您只需要指定需要修改的配置信息,您没有指定的部分,会按照默认配置项来运行。

优先级 RQAlpha 在启动时会读取 ~/.rqalpha/config.yml 作为用户配置文件,用于覆盖默认配置信息,您也可以通过 –config 来指定用户配置文件路径。

策略代码中配置优先级 > 启动策略命令行传参 > 用户配置文件 > 系统配置文件

我认为出错的原因可能是系统配置文件> 用户配置文件,导致用户配置文件不起作用.因为报错的代码,我发现有stock starting cash and future starting cash can not be both 0的字眼,而我已经在config.yml 指定了相关配置.

myz8110 commented 7 years ago

你可以直接用example的原生代码buy_and_hold.py和rsi.py,在cmd里rqalpha run -f buy_and_hold.py或者rqalpha run -f rsi.py都会报错,报错代码是一样的.而在0.3.14版本中,我配置好了C:\Users\Administrator.rqalpha目录下的config.yml,我直接cmd运行rqalpha run -f xxx.py不会报错的.

myz8110 commented 7 years ago

注:我现在的config.yml是2.0.6版本的,不是0.3.14版本的.

wh1100717 commented 7 years ago

@myz8110 http://rqalpha.readthedocs.io/zh_CN/latest/history.html#id4

image

RQAlpha不再默认选择 ~/.rqalpha/config.yml 作为用户配置文件了。这种默认的方式不太好。取而代之的是RQAlpha 会根据用户 通过 --config 指定的配置文件来读取自定义配置。或者会寻找 当前执行命令的目录下是否包含 config.yml

wh1100717 commented 7 years ago

image

http://rqalpha.readthedocs.io/zh_CN/latest/api/config.html#config-yml

myz8110 commented 7 years ago

寻找 当前执行命令的目录下是否包含 config.yml,我把config.yml放到example下,确实可以了.但是报错name error:name 'logger' is not defined,把我代码中的logger.info改成print就没有报错了.logger是改了吗?

wh1100717 commented 7 years ago

@myz8110 这个很奇怪哎 logger 我这里运行没有问题呀

logger 是在 main.py 中的 create_base_scope 函数中 注入的,没理由无法使用啊... 你能帮忙调试一下 看看问题出在哪里吗?

myz8110 commented 7 years ago

是这样,我有个testpp.py,代码如下:

#coding=utf-8
from rqalpha.api import *
#------判断类--------
class judge(object):
    min={}
        #储存指数最高点
    max={}
        #储存指数涨幅
    rate={}
    quotation={}
    net_point={}
    cash={}
#---------判断牛熊-------------  
    def cow_bear(self,context,bar_dict,index,date,x=1.5,y=1.5):
        dt=context.now
        logger.info(dt)

在另一个test.py,代码如下:
import testpp as mc

def initialize(context):
    mc.judge()
def before_trading(context):
    pass
def after_trading(context):
    pass
def handle_bar(context, bar_dict):
    index='000300.XSHG'
    date='date2'
    mc.judge().cow_bear(context,bar_dict,index,date)

然后我在cmd运行rqalpha run -f test.py时就会报错:name 'logger' is not defined

myz8110 commented 7 years ago

而在之前的版本并没有这个问题.

wh1100717 commented 7 years ago

@myz8110 我怀疑是有别的报错 导致初始化没有完成,从而产生了logger没有初始化的问题。您看一下是否是错误日志您只看了最后的报错,但是没有看完整。

您直接执行 rqalpha run -f test.py 但是没有指定策略类型,起始资金之类的,除非你当前目录下有相应的配置文件。 你再仔细看看,或者把完整的配置信息 以及 错误堆栈贴出来,才能比较明确的找到问题。

myz8110 commented 7 years ago

我已经把C:\Users\Administrator.rqalpha目录下的的config,C:\Anaconda3目录下的config删除掉,仅保留C:\Anaconda3\examples目录下的config. testpp.py放在C:\Anaconda3目录下,test.py和唯一的config放在C:\Anaconda3\examples目录下,直接执行 rqalpha run -f test.py报错. 同样的条件下,运行C:\Anaconda3\examples目录下原生的rsi.py,直接执行 rqalpha run -f rsi.py,可以正常运行.rsi.py代码就有logger.info("target available cash caled: " + str(target_available_cash)).

myz8110 commented 7 years ago

config全配置如下:

# see more config
# http://rqalpha.readthedocs.io/zh_CN/stable/api/config.html
version: 0.1.5

# 白名单,设置可以直接在策略代码中指定哪些模块的配置项目
whitelist: [base, extra, validator, mod]

base:
  # 数据源所存储的文件路径
  data_bundle_path: ~
  # 启动的策略文件路径
  strategy_file: strategy.py
  # 回测起始日期
  start_date: 2015-06-01
  # 回测结束日期(如果是实盘,则忽略该配置)
  end_date: 2050-01-01
  # 股票起始资金,默认为0
  stock_starting_cash: 100000
  # 期货起始资金,默认为0
  future_starting_cash: 100000
  # 设置策略可交易品种,目前支持 `stock` (股票策略)、`future` (期货策略)tst
  securities: [stock]
  # 设置保证金乘数,默认为1
  margin_multiplier: 1
  # 运行类型,`b` 为回测,`p` 为模拟交易, `r` 为实盘交易。
  run_type: b
  # 目前支持 `1d` (日线回测) 和 `1m` (分钟线回测),如果要进行分钟线,请注意是否拥有对应的数据源,目前开源版本是不提供对应的数据源的。
  frequency: 1d
  # Benchmark,如果不设置,默认没有基准参照。
  benchmark: ~
  # 在模拟交易和实盘交易中,RQAlpha支持策略的pause && resume,该选项表示开启 resume 功能
  resume_mode: false
  # 在模拟交易和实盘交易中,RQAlpha支持策略的pause && resume,该选项表示开启 persist 功能呢,
  # 其会在每个bar结束对进行策略的持仓、账户信息,用户的代码上线文等内容进行持久化
  persist: false
  persist_mode: real_time
  # 选择是否开启自动处理, 默认不开启
  handle_split: false

extra:
  # 选择日期的输出等级,有 `verbose` | `info` | `warning` | `error` 等选项,您可以通过设置 `verbose` 来查看最详细的日志,
  # 或者设置 `error` 只查看错误级别的日志输出
  log_level: info
  user_system_log_disabled: false
  # 通过该参数可以将预定义变量传入 `context` 内。
  context_vars: ~
  # force_run_init_when_pt_resume: 在PT的resume模式时,是否强制执行用户init。主要用于用户改代码。
  force_run_init_when_pt_resume: false
  # enable_profiler: 是否启动性能分析
  enable_profiler: false
  is_hold: false
  locale: zh_Hans_CN

validator:
  # cash_return_by_stock_delisted: 开启该项,当持仓股票退市时,按照退市价格返还现金
  cash_return_by_stock_delisted: false
  # close_amount: 在执行order_value操作时,进行实际下单数量的校验和scale,默认开启
  close_amount: true
myz8110 commented 7 years ago

运行test.py报错如下: Microsoft Windows [版本 6.1.7601] 版权所有 (c) 2009 Microsoft Corporation。保留所有权利。

C:\Anaconda3\examples>rqalpha run -f test.py 2015-06-01 ERROR Traceback (most recent call last): File test.py, line 13 in handle_bar mc.judge().cow_bear(context,bar_dict,index,date) --> date = 'date2' --> index = '000300.XSHG' --> bar_dict = BarMap() --> context = Context({})

NameError: name 'logger' is not defined Traceback (most recent call last): File "c:\anaconda3\lib\site-packages\rqalpha\core\strategy.py", line 84, in ha ndle_bar self._handle_bar(self._user_context, bar_dict) �� �� �� BarMap() �� �� <rqalpha.core.strategy.Strategy object at 0x000000 0015881780> �� <rqalpha.core.strategy.Strategy object at 0x0000000015881780> File "test.py", line 13, in handle_bar mc.judge().cow_bear(context,bar_dict,index,date) �� �� �� �� �� 'date2' �� �� �� �� '000300.XSHG' �� �� �� BarMap() �� �� Context({}) �� <module 'testpp' from 'c:\anaconda3\testpp.py'> File "c:\anaconda3\testpp.py", line 16, in cow_bear logger.info(dt)  �� datetime.datetime(2015, 6, 1, 15, 0) NameError: name 'logger' is not defined

C:\Anaconda3\examples>

myz8110 commented 7 years ago

我觉得如果是config设置有问题,那rsi.py也应该报错才对,但是并没有.

wh1100717 commented 7 years ago

@myz8110 原因是这样的,logger API并没有直接在 from rqalpha.api import * 中暴露。

是通过如下方式注入进去的:

def create_base_scope():
    import copy

    from . import user_module
    scope = copy.copy(user_module.__dict__)
    scope.update({
        "logger": user_log,
        "print": user_print,
    })

    return scope

之所以这么做的原因是不想覆盖用户 print 函数,我们重写了print函数,但仅限于用户的"策略代码" 中。 而如果直接通过API 暴露的话,会引起Python 2兼容性,以及一些由于上下文而产生的问题。 而 loggerprint 作为类似的输出函数,所以以同样的方式注入了。

也就是说,您额外写的文件通过 from rqalpha.api import * 的方式是无法直接使用logger的。

在下一个版本中,我们将 logger 通过API 暴露出去了,下一个小版本更新后您就可以使用这种方式来输出日志信息了。

如果您现在就想使用的话,也可以通过如下方式引入 logger

from rqalpha.utils.logger import user_log as logger