给自己搭个量化投资系统之一——一次装饰器的应用
搭一个量化投资系统是一个庞大的工程,现在已经有一些量化框架,比如Qlib、Backtrader。不过作为一个野路子的算法工程师,一个伪python全栈工程师,我更喜欢自力更生。目前,我也算是搭起了一个量化投资系统的雏形。事实上金融数据库也是量化投资系统中的重要组成部分。就现阶段来说,要像给自己搭一个金融数据库(一)(二)(三)(四)(五)(六)一样重头开始记录实在太过费时费力,所以我基本上就记录现在雏形的完善和优化。
很久以前,我曾给自己搭过一个金融数据库,但随着日线数据越积越多,mysql数据库的效率不断下降,最后居然远远不如直接从tushare获取数据,进而最终被放弃了。为了避免重蹈覆辙,我决定先给数据库操作API里加上数据库操作的所用时间日志。python也有一些好用的日志框架,在我这个不成熟的系统里还不是很有必要,所以我先来个野路子的时间日志打印——用装饰器。
今年年初,我曾记录过一次装饰器,基于它应该很容易做一个实际应用。
1. 新建时间打印文件
先新建一个文件,不妨叫print_spend_time.py。
2. 导入需要的包
然后导入需要的包,装饰器需要functools,时间的计算需要time。
import functools, time
3. 创建外部函数
创建一个函数,不妨也叫print_spend_time。
def print_spend_time(func):
4. 创建内部函数进行打印
创建一个内部函数进行打印,它需要用@functools.wraps来进行装饰。
@functools.wraps(func)
def func_(*args, **kwargs):
tic = time.time()
func(*args, **kwargs)
print(time.time() - tic)
5. 设置函数print_spend_time的返回值
函数print_spend_time的返回值也很明确了。
return func_
6. 时间打印装饰器的使用
首先导出函数。
from print_spend_time import print_spend_time
然后在函数前加上装饰器,比如:
@print_spend_time
def sql2pd(sql):
7. 存在的问题与装饰后的返回值
用上时间打印装饰器后,发现用时能打印了,但返回值变成了None。原因是装饰器没有把原函数的结果返回回来,需要把上面的装饰器做一点点修改。
result = func(*args, **kwargs)
print(time.time() - tic, args[0])
return result
- 点赞
- 收藏
- 关注作者
评论(0)