• #[量化投资-学习笔记018]Python+TDengine从零开始搭建量化分析平台-正态分布与收益率


    正态分布(Normal Distribution)又叫高斯分布、常态分布。通常用来描述随机变量的概率分布。

    自然界的数据分布通常是符合正态分布规律的,比如说人的身高、体重。但是非自然界数据就不一定了。尤其是经过人为加工过的数据。

    金融领域大量使用正态分布来计算收益率和风险,虽然因为金融数据厚尾性而不断被人诟病,但是确实也没啥其他的统计方法。

    在上一章节《MACD金死叉策略回测》,已经将回测的结果存入了数据库。本章节将对回测结果进行进一步分析。

    获取历史回测数据

    通过查询 TDengine 数据库,我们可以轻松的获取到历史回测数据。

    数据结构请参考上一章节,本次不再赘述。

    查询回测记录:

    taos> select last(*) from records;
               ts            |             record             |
    ===========================================================
     2023-11-12 19:17:39.339 | MACD-13_21                     |
    Query OK, 1 row(s) in set (0.001534s)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    查询对应的回测记录

    taos> select count(*) from btdata where ts='2023-11-12 19:17:39.339';
           count(*)        |
    ========================
                      9037 |
    Query OK, 1 row(s) in set (0.010254s)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    通过 Restful 查询获取数据

        rt = request_post(url, sql, username, password)
        ec = check_return(rt)
        log_write.handler_control.setLevel('INFO')
        if ec == 'error':
            log_write.logger.error(rt)
        else:
            returns = request_get(rt)
    # 计算正态分布
        log_write.logger.debug(returns)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    计算正态分布

    直接使用 numpyscipy 中函数进行计算。

        mean = np.mean(returns)
        log_write.logger.debug(f"均值:{mean}")
        std = np.std(returns)
        log_write.logger.debug(f"标准差: {std}")
        x = np.linspace(min(returns), max(returns), 200)
        y = norm.pdf(x, mean, std)
        log_write.logger.debug(f"x={x}, y={y}")
        return x, y
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    绘制图形

    def plot_normal_distribution(x, y):
        matplotlib.rcParams['font.sans-serif'] = ['SimHei']
        matplotlib.rcParams['font.family'] = 'sans-serif'
        matplotlib.rcParams['axes.unicode_minus'] = False
        plt.plot(x, y)
        plt.xlabel("Profit")
        plt.ylabel("Probability density")
        plt.title("收益率正态分布曲线")
        plt.grid()
        plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    进阶

    为了方便对比,我们可以将不同类型的股票的收益率正态分布曲线放到1个图形里面。
    相关绘图功能接受见 Python知识点汇总

        plt.figure(figsize=(12, 8))
        plt.subplot(3, 1, 1)
        plt.plot(x1, y1)
        plt.xlabel("Profit")
        plt.ylabel("Probability density")
        plt.title("上证")
        plt.grid()
    
        plt.subplot(3, 1, 2)
        plt.plot(x2, y2)
        plt.xlabel("Profit")
        plt.ylabel("Probability density")
        plt.title("深证")
        plt.grid()
    
        plt.subplot(3, 1, 3)
        plt.plot(x3, y3)
        plt.xlabel("Profit")
        plt.ylabel("Probability density")
        plt.title("创业")
        plt.grid()
    
        plt.tight_layout()
        plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    在这里插入图片描述

    TIPs

    有两个非常使用的包可以帮助规范代码: pycodestyleautopep8,前者会检查程序是否符合 PEP8 规范,
    后者可以直接进行修改。

    安装包

    pip install pycodestyle
    pip install autopep8
    
    • 1
    • 2

    检查并修改程序

    pycodestyle normal.py
    
    autopep8 -in-place normal.py
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    非题外话

    从上图可以明显的看出,正态曲线存在明显的偏离,这并不是坏现象。如果真是标准的正态分布图形,那就真的有问题了。

    上图说明了使用 MACD 金死叉策略在所有的股票池中收益率众数和均值均在正数区间。

    而且上证和创业板的表现均好于深证。

    题外话

    有个小段子:
    几个人做电梯上楼,有人在电梯里做俯卧撑,有人在电梯里扇自己嘴巴,有人大瞌睡,有人在唱歌。

    到了登楼,记者采访问这几个是怎么上楼的。

    有人说靠自己不断的锻炼,有人说靠自虐,有人说靠躺平,有人说靠多才多艺。

    大家都忽略了电梯。听起来很可笑,但实际情况确实如此。很多时候不错的收益率并不是因为出色的策略,还有可能是整个大盘都涨了。

  • 相关阅读:
    Android Studio javadoc 编译的时候一直报错 java.lang.IllegalArgumentException
    Github 2FA绑定中国+86手机号码实现两步验证
    [附源码]计算机毕业设计springboot疫情期间小学生作业线上管理系统
    为了让女儿学打字,开发了个免费的打字网站
    完美解决api-ms-win-crt-runtime-l1-1-0.dll详细步骤
    easycode生成代码模板配置
    docker学习2-基本指令
    C#使用TcpListener进行聊天通信
    硬件基础 - MOS管
    5 年 Python ,总结的 10 条 Python 使用技巧
  • 原文地址:https://blog.csdn.net/weixin_43700866/article/details/134415583