|
|
|
|
移动端

2.5 代码调试

《量化交易之路:用Python做股票量化分析》第2章量化语言——Python,第2部分(第2~6章)主要讲解了量化交易需要的基础知识及相关工具,如Python语言、NumPy、pandas、数据可视化及量化数学等知识,适合完全没有任何编程经验的读者从头开始阅读。本节为大家介绍代码调试。

作者:阿布来源:机械工业出版社|2017-10-20 15:58

【新品产上线啦】51CTO播客,随时随地,碎片化学习

2.5  代码调试

写完一段代码后,一定要对代码进行自测,特别是与数据量化相关的代码。例如,下面的代码将之前计算买入阀值集合buy_change_list = [buy_change/100.0 for buy_change in range(-5, -16, -1)]的代码改写成如下形式:

  1. def gen_buy_change_list():  
  2.     buy_change_list = []  
  3.     # 下跌买入阀值从-0.05到-0.15,即从5%下跌到15%  
  4.     for buy_change in range(-5, -16, -1):  
  5.         buy_changebuy_change = buy_change/100  
  6.         buy_change_list.append(buy_change)  
  7.     return buy_change_list 

调用gen_buy_change_list()函数发现生成的结果集合内全是-1,显然不符合预期。

  1. gen_buy_change_list() 

输出如下:

  1. [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1] 

在这种情况下,最常用的方式就是使用print()函数。使用该函数在可以找到问题线索的地方一步一步打印出问题线索,最后找到问题。对于这个简单的示例,通过以下代码就可以发现问题:

  1. def gen_buy_change_list():  
  2.     buy_change_list = []  
  3.     for buy_change in range(-5, -16, -1):  
  4.         # 1. 原始buy_change  
  5.         print buy_change  
  6.         buy_changebuy_change = buy_change/100  
  7.         # 2. buy_change/100  
  8.         print buy_change  
  9.         buy_change_list.append(buy_change)  
  10.     return buy_change_list 

buy_change/100的本意是取到小数,但是Python 2中的整数除法永远是整数,所以修改方式有以下两种。

除数或者被除数其中一个是float类型;

导入future库的divisionfrom __future__ import division。

  1. # 2. 导入future库的division`from __future__ import division`  
  2. from __future__ import division  
  3. def gen_buy_change_list():  
  4.     buy_change_list = []  
  5.     for buy_change in range(-5, -16, -1):  
  6.         # 1. 除数或者被除数中有一个是float类型  
  7.         buy_changebuy_change = buy_change/100.0  
  8.         buy_change_list.append(buy_change)  
  9.     return buy_change_list  
  10. gen_buy_change_list() 

输出如下:

  1. [-0.05, -0.06, -0.07, -0.08, -0.09, -0.1, -0.11, -0.12, -0.13, -0.14, -0.15] 

除了使用print()函数打印输出外,还可以使用logging模块打印日志。它的优点就是可以指定每一条打印语句的输出级别,logging级别为如下几种。

debug:调试信息;

info:输出信息;

warning:警告信息;

error:错误信息;

critical:严重错误。

通过logging.basicConfig()统一设置运行环境日志的输出级别,只有大于等于设置级别的日志才能打印输出,低于此级别的日志消息都会被忽略,代码如下:

  1. import logging  
  2. # 设置日志级别为info  
  3. logging.basicConfig(level=logging.INFO)  
  4. def gen_buy_change_list():  
  5.     # 会打印出来,因为info >level=logging.INFO  
  6.     logging.info("gen_buy_change_list begin")  
  7.     buy_change_list = []  
  8.     for buy_change in range(-5, -16, -1):  
  9.         # 不会打印出来,debug < levellevel=logging.INFO  
  10.         logging.debug(buy_change)  
  11.         buy_changebuy_change = buy_change / 100  
  12.         # 不会打印出来,debug < levellevel=logging.INFO  
  13.         logging.debug(buy_change)  
  14.         buy_change_list.append(buy_change)  
  15.     # 会打印出来,因为info >level=logging.INFO  
  16.     logging.info("gen_buy_change_list end")  
  17.     return buy_change_list  
  18. _ = gen_buy_change_list() 

输出如下:

  1. INFO:root:gen_buy_change_list begin  
  2. INFO:root:gen_buy_change_list end 

上面的调试问题非常简单,但很多实际的调试问题非常棘手,不是打印一些信息就能轻易发现的。这时候就要启动Python的调试器pdb,让程序以单步方式运行,随时查看运行状态,示例代码如下。

备注:IDE中对断点调试支持最好的就是PyCharm。

  1. import pdb  
  2. def gen_buy_change_list():  
  3.     buy_change_list = []  
  4.     for buy_change in range(-5, -16, -1):  
  5.         # 只针对循环执行到buy_change == -10,中断开始调试  
  6.         if buy_change == -10:  
  7.             # 打断点,通过set_trace()  
  8.             pdb.set_trace()  
  9.         buy_changebuy_change = buy_change / 100  
  10.         buy_change_list.append(buy_change)  
  11.     # 故意向外抛出异常  
  12.     raise RuntimeError('debug for pdb')  
  13.     return buy_change_list  
  14. try:  
  15.     _ = gen_buy_change_list()  
  16. except Exception, e:  
  17.     # 从捕获异常的地方开始调试,是经常使用的调试技巧  
  18.     pdb.set_trace() 

pdb调试中经常用到的指令,如图2-6所示。

l:堆栈信息;

n:下一步next;

s:进入函数step into;

c:继续执行continue。


喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:365934973

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

网络技术应试辅导(三级)

本书根据教育部考试中心2004年最新发布的《全国计算机等级考试大纲》编写,针对计算机等级考试三级网络技术各方面的考点进行讲解和训练。本...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊