量化策略——准备4 python量化因子测算&绘图

2023-11-09


量化因子的测算通常都是模拟交易,计算各种指标,其中:

  • 测算需要用到的第三方库:numpy,pandas,talib
  • 绘图需要用到的第三方库:matplotlib,seaborn

其他库随策略的需要额外添加

因子测算框架

这里博主分享自己测算时常使用的流程,希望与大家共同进步!

测算时从因子到收益的整个流程如下:策略(因子组合) -> 买卖信号 -> 买点与卖点 -> 收益

因此我们在测算时,针对每一个个股:

1. 预处理股票数据

首先这里是常用的一个工具导入,包括测算用的库与绘图用的库(含图片中文显示空白解决方案)

# 测算用
import numpy as np
import pandas as pd
from copy import deepcopy
from tqdm import tqdm
from datetime import datetime
import talib
# 绘图用
import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns

%matplotlib inline

# 绘图现实中文
sns.set()
plt.rcParams["figure.figsize"] = (20,10)
plt.rcParams['font.sans-serif'] = ['Arial Unicode MS']  # 当前字体支持中文
plt.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号'-'显示为方块的问题


# 其他
import warnings
warnings.filterwarnings("ignore")

然后是循环读取股票的代码:

import os

def readfile(path, limit=None):
    files = os.listdir(path)
    file_list = []
    for file in files:  # 遍历文件夹
        if not os.path.isdir(file):
            file_list.append(path + '/' + file)
    if limit:
        return file_list[:limit]
    return file_list


stock_dict = {}
for _file in tqdm(readfile("../data/stock_data")):
    if not _file.endswith(".pkl"):
        continue
    # TODO 这里可以添加筛选,是否需要将当前的股票添加到测算的股票池中
    file_df = pd.read_pickle(_file)
    file_df.set_index(["日期"], inplace=True)
    file_df.index.name = ""
    file_df.index = pd.to_datetime(file_df.index)
    file_df.rename(columns={'开盘':'open',"收盘":"close","最高":"high","最低":"low","成交量":"volume"},inplace=True)
    stock_code = _file.split("/")[-1].replace(".pkl", '')
    # TODO 这里可以添加日期,用来截取一部分数据
    stock_dict[stock_code] = file_df

上面一部分是处理股票数据,处理后的数据都会保存在 stock_dict 这个变量中,键是股票的代码,值是股票数据

2. 指标测算

测算指标时,我们以一只股票为例:

for _index,_stock_df in tqdm(stock_dict.items()):
    measure_df = deepcopy(_stock_df)

代码中的:

  • 这里的measure_df即要测算的dataframe数据
  • 使用deepcopy是防止测算的过程影响到原始数据

然后我们就可以循环这一个股票的每一行(代表每一天),测算的交易规则如下:

  1. 买入规则:买入信号发出&当前没有持仓,则买入
  2. 卖出规则:卖出信号发出&当前有持仓,则卖出
# 开始测算
trade_record_list = []
this_trade:dict = None

for _mea_i, _mea_series in measure_df.iterrows(): # 循环每一天
    if 发出买入信号:
        if this_trade is None:  # 当前没有持仓,则买入
            this_trade = {
                "buy_date": _mea_i,
                "close_record": [_mea_series['close']],
            }
    elif 发出卖出信号:
        if this_trade is not None:  # 要执行卖出
            this_trade['sell_date'] = _mea_i
            this_trade['close_record'].append(_mea_series['close'])
            trade_record_list.append(this_trade)
            this_trade = None
    else:
        if this_trade is not None:  # 当前有持仓
            this_trade['close_record'].append(_mea_series['close'])

上述代码中,我们将每一个完整的交易(买->持有->卖),都保存在了trade_record_list变量中,每一个完整的交易都会记录:

{
    'buy_date': Timestamp('2015-08-31 00:00:00'), # 买入时间
    'close_record': [41.1,42.0,40.15,40.65,36.6,32.97], # 收盘价的记录
    'sell_date': Timestamp('2015-10-12 00:00:00')} # 卖出时间
    # TODO 也可以添加自定义记录的指标
}

3. 测算结果整理

直接使用 pd.DataFrame(trade_record_list),就可以看到总的交易结果:

在这里插入图片描述

整理的过程也相对简单且独立,就是循环这个交易,然后计算想要的指标,比如单次交易的年化收益可以使用:

trade_record_df = pd.DataFrame(trade_record_list)
for _,_trade_series in trade_record_df.iterrows():
    trade_record_df.loc[_i,'年化收益率'] = (_trade_series['close_record'][-1] - _trade_series['close_record'][0])/_trade_series['close_record'][0]/(_trade_series['sell_date'] - _trade_series['buy_date']).days * 365 # 年化收益
    # TODO 这里根据自己想要的结果添加更多的测算指标

4. 结果绘图

绘图的代码通常比较固定,比如胜率图:

# 清理绘图缓存
plt.cla()
plt.clf()
# 开始绘图
plt.figure(figsize=(10, 14), dpi=100)
# 使用seaborn绘制胜率图
fig = sns.heatmap(pd.DataFrame(total_measure_record).T.round(2), annot=True, cmap="RdBu_r",center=0.5)
plt.title("胜率图")
scatter_fig = fig.get_figure()
# 保存到本地
scatter_fig.savefig("胜率图")
scatter_fig.show() # 最后显示

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

量化策略——准备4 python量化因子测算&绘图 的相关文章

  • uwsgi + Django REST框架:空闲时间后很少有缓慢的请求

    我正在运行 Django REST 框架 白天每分钟的请求率相当低 我注意到一个我无法解释或重现的问题 每天 在夜间或清晨 当我的 RPM 接近于零时 我会收到 1 10 个超慢的请求 我的平均响应时间100 到 200 毫秒之间 但是这个
  • pygraphviz,导入错误:未定义的符号:Agundirected

    import pygraphviz Traceback most recent call last File
  • Windows 中的信号处理

    在Windows中 我试图创建一个等待SIGINT信号的python进程 当它收到SIGINT时 我希望它只打印一条消息并等待SIGINT的另一次出现 所以我使用了信号处理程序 这是我的 signal receiver py 代码 impo
  • @monthly cron 作业不可靠

    我们的客户希望我们每月创建一份报告 过去 我们使用 monthly cron 作业来完成此任务 但这并不可靠 服务器可能会在这一分钟内宕机 Cron 不会重新运行这些作业 如果服务器已启动 此时数据库可能无法访问 如果服务器已启动且数据库已
  • 解析器生成

    我正在做一个项目软件抄袭检测 我打算用C语言来做这件事 因为我应该创建一个令牌生成器和一个解析器 但我不知道从哪里开始 任何人都可以帮助我解决这个问题 我创建了一个令牌数据库 并将令牌与我的程序分开 接下来我想做的就是比较两个程序以查明它是
  • Python ttk.combobox 强制发布/打开

    我正在尝试扩展 ttk 组合框类以允许自动建议 我到目前为止的代码运行良好 但我想让它在输入一些文本后显示下拉列表 而不从小部件的输入部分移除焦点 我正在努力解决的部分是找到一种强制下拉的方法 在 python 文档中我找不到任何提及这一点
  • set() 可以在 Python 进程之间共享吗?

    我正在 Python 2 7 中使用多重处理来处理非常大的数据集 当每个进程运行时 它会将整数添加到共享的 mp Manager Queue 中 但前提是其他进程尚未添加相同的整数 由于您无法对队列进行 in 式成员资格测试 因此我这样做的
  • 使用 string.whitespace 删除 Python 中的空格

    Python 的 string whitespace 很棒 gt gt gt string whitespace t n x0b x0c r 如何在不手动输入 t n 等正则表达式的情况下将其与字符串一起使用 例如 它应该能够转动 请不要伤
  • UTF-8 在 Python 日志记录中,如何?

    我正在尝试使用 Python 的日志记录包将 UTF 8 编码的字符串记录到文件中 作为一个玩具示例 import logging def logging test handler logging FileHandler home ted
  • Django:通过外键将两个表连接到第三个表?

    我有三个型号 class A Model class B Model id IntegerField a ForeignKey A class C Model id IntegerField a ForeignKey A 我想要得到 B i
  • 来自异常导入 PendingDeprecationWarning ModuleNotFoundError:没有名为“异常”的模块

    我正在尝试使用Python 创建一个word 文档 我在终端中 pip install python docx 我的代码如下所示 from docx import Document document Document document sa
  • 如何检查两个数据集的匹配列之间的相关性?

    如果我们有数据集 import pandas as pd a pd DataFrame A 34 12 78 84 26 B 54 87 35 25 82 C 56 78 0 14 13 D 0 23 72 56 14 E 78 12 31
  • 无法运行bjam编译boost python教程

    我正在尝试跟随本教程 http www boost org doc libs 1 55 0 libs python doc tutorial doc html python hello html关于为 Windows 的 python 包装
  • 在Python中使用Counter()来构建直方图?

    我在另一个问题上看到我可以使用Counter 计算一组字符串中出现的次数 所以如果我有 A B A C A A I get Counter A 3 B 1 C 1 但现在 我如何使用该信息来构建直方图 对于您的数据 最好使用条形图而不是直方
  • 将 numpy 记录数组转换为字典列表的有效方法

    如何转换下面的 numpy 记录数组 recs Bill 31 260 0 Fred 15 145 0 r rec fromrecords recs names name age weight formats S30 i2 f4 到字典列表
  • 使用 PyQt5 拖放 QLabels

    我正在尝试使用 PyQt5 将 Qlabel 拖放到另一个 Qlabel 上 from PyQt5 QtWidgets import QApplication QWidget QToolTip QPushButton QMessageBox
  • 按工作日分组的熊猫 (M/T/W/T/F/S/S)

    我有一个 pandas 数据框 其中包含 YYYY MM DD arrival date 形式的时间序列 作为索引 我想按每个工作日 周一到周日 进行分组 以便计算其他日期列是平均值 中位数 标准差等 我最终应该只有七行 到目前为止我只知道
  • Pygame 文本不渲染

    好的 我正在用 python 和 pygame 制作一个多项选择测验游戏 不过 我已经完成了开始屏幕并尝试制作问题屏幕 我根本不明白为什么文本不呈现 这是我的代码 enter pressed False random question ra
  • 如何从 Python 脚本捕获 Curl 的输出

    我想使用curl查找有关网页的信息 但在Python中 到目前为止我有这个 os system curl head www google com 如果我运行它 它会打印出 HTTP 1 1 200 OK Date Sun 15 Apr 20
  • 仅在满足条件时添加到字典

    我在用urllib urlencode构建 Web POST 参数 但是有一些值我只想在除None为他们而存在 apple green orange orange params urllib urlencode apple apple or

随机推荐

  • 在matlab中如何使用SVM工具箱

    一 SVM下载 http see xidian edu cn faculty chzheng bishe indexfiles indexl htm 二 在MATLAB中添加svm工具箱 参考 http jingyan baidu com
  • 银行业法律法规与综合能力 第五章 银行监管与自律 10%

    第五章 银行监管与自律 考点1 银行监管体制 考点2 银行自律与市场约束 考点3 职业操守与行为准则 考点4 清廉金融 考点5 银行业消费者杈益保护 考点1 银行监管体制 一 银行监管起源与演变 1 英国颁布的 反泡沫公司法 标志着世界金融
  • 小程序---云函数npm install报错

    问题 云函数右键菜单 在外部终端窗口中打开 npm install报错 解决方法 使用cnpm install 安装依赖
  • error:03000086:digital envelope routines::initialization error

    项目背景 前端vue项目启动突然报错error 03000086 digital envelope routines initialization error 我用的开发工具是vscode node版本是v18 17 0 前端项目版本如下
  • redis安装、配置、启动

    一 redis默认安装位置 usr local bin redis benchmark 性能测试工具 可以在自己本子运行 看看自己本子性能如何 服务启动起来后执行redis check aof 修复有问题的AOF文件redis check
  • mac安装VMware Fusion及虚拟Windows注意事项

    mac安装VMware Fusion及虚拟Windows注意事项 文章目录 mac安装VMware Fusion及虚拟Windows注意事项 1 前言及注意事项 2 VMWare Fusion下载及安装 3 安装虚拟Windows 4 Vi
  • 代码覆盖率

    在做单元测试时 代码覆盖率常常被拿来作为衡量测试好坏的指标 甚至 用代码覆盖率来考核测试任务完成情况 比如 代码覆盖率必须达到80 或 90 于是乎 测试人员费尽心思设计案例覆盖代码 用代码覆盖率来衡量 有利也有有弊 本文我们就代码覆盖率展
  • viewPager + ConstraintLayout 自适应高度

    在 ConstraintLayout 约束布局 中 我们发现viewPager除了设置固定的尺寸外 要不就是全屏 这很不符合我们的需求 改造下 layout中
  • Pandas常用统计数据方法

    import pandas as pd 1 准备数据 假设有 5 个人 分别参加了 4 门课程 获得了对应的分数 同时这个 5 个人分别负责的项目个数 在 Project num 列中显示 data name pd Series Alice
  • Linux 用户管理与文件权限

    Linux 是一个多用户系统 它允许多个用户同时登陆主机 并为他们分配不同的资源和工作环境进行使用 当然 不同的用户都有文件的私有需求 所以设置不同用户文件的权限管理十分重要 01 用户与用户组 Linux 中一般将文件访问权限的身份分为三
  • 深度神经网络(使用CNN,NN,RNN,与KNN,SVM)

    深度神经网络 实验目的 了解神经网络结构 NN CNN RNN 使用框架运行神经网络 查看并对比神经网络学习的效果 不断调整神经网络的参数 逐步提升学习效果 以CNN为例 对比神经网络与一般机器算法的区别 目录 pytorch的安装 数据预
  • 李宏毅 机器学习 2016 秋:5、Classification:Probabilistic Generative Model

    文章目录 五 Classification Probabilistic Generative Model 五 Classification Probabilistic Generative Model 接下来我们要来进入新的主题 我们要来讲
  • gprmax3.0安装与三维建模

    最近在学习gprmax的使用 国内网上有关gprmax的经验帖子有些陈旧 分享一些自己最新的软件安装配置以及实际三维建模的经验 希望能帮助到需要使用这款软件的朋友 目录 一 gprmax3 0下载与安装 1 Anaconda Minicon
  • 机器学习毕业设计 Python新闻算法研究与实现

    文章目录 0 前言 简介 本文章博主将介绍 参与及比较算法 先说结论 实现过程 数据爬取 数据预处理 CNN文本分类 其他分类方法更新中 0 前言 这两年开始毕业设计和毕业答辩的要求和难度不断提升 传统的毕设题目缺少创新和亮点 往往达不到毕
  • windows server 2016下FTP服务搭建教程图文详解

    一 什么是FTP FTP File Transfer Protocol 是TCP IP网络上两台计算机传送文件的协议 使得主机间可以共享文件 接下来我给大家分享快速搭建FTP服务器的方法 二 安装FTP服务器 1 进入服务器系统打开 服务器
  • MyBatis Generator在eclipse中的应用

    mybatis generator这个插件不知道用过的人有多少 这个插件是用来为数据库的表逆向生成pojo类和dao文件以及sql语句的mapper文件的 之前的公司使用IDEA做开发 用的就是这个 现在使用eclipse还是做个记录吧 免
  • 微软服务器2016认证的考试方式,微软认证考试的几种形式

    就目前的情况来看 微软认证考试共有三种考试形式即最早的固定 道试题方式 以下简称 变长度的自适应考试 以下简称 以及其固定 道试题方式 以下简称 这几种方式的发展顺序为从 到 再到 其中不排除今后有可能直接从 到 但至少到现在为止还没看到这
  • casiafaceV5数据集的人脸识别

    1 Casia FaceV5数据集描述 包含500个人的照片 每个人5张 共2500张照片 照片size height 480 width 640 需要自行划分训练集测试集 数据集下载 2 做识别训练中存在的问题 由于每一类的样本只有5张照
  • 2.3CUDA矩阵乘法

    CPU 矩阵乘法 能相乘的两个矩阵 必须满足一个矩阵的行数和第二个矩阵的列数相同 A N P B P M C N M 其中P是行数 N是列数 从宽高的角度来说 即 A的宽度和B的高度是相同的 C矩阵 ha wb 其中C i j A矩阵中的i
  • 量化策略——准备4 python量化因子测算&绘图

    文章目录 因子测算框架 1 预处理股票数据 2 指标测算 3 测算结果整理 4 结果绘图 量化因子的测算通常都是模拟交易 计算各种指标 其中 测算需要用到的第三方库 numpy pandas talib 绘图需要用到的第三方库 matplo