给自己搭个量化投资系统之一——一次装饰器的应用

举报
darkpard 发表于 2022/05/09 22:08:56 2022/05/09
【摘要】 搭一个量化投资系统是一个庞大的工程,现在已经有一些量化框架,比如Qlib、Backtrader。不过作为一个野路子的算法工程师,一个伪python全栈工程师,我更喜欢自力更生。目前,我也算是搭起了一个量化投资系统的雏形。事实上金融数据库也是量化投资系统中的重要组成部分。就现阶段来说,要像给自己搭一个金融数据库(一)(二)(三)(四)(五)(六)一样重头开始记录实在太过费时费力,所以我基本上就...

搭一个量化投资系统是一个庞大的工程,现在已经有一些量化框架,比如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
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。