量化投资策略与技术学习PART1.1:量化选股之再谈多因子模型(二)

news/2024/9/19 0:45:52/ 标签: 大数据, 人工智能

在上一个多因子模型中,我手动对各个因子进行了回测,但是数据结果并不是十分理想,难道基本面指标真的和股票走势关系不大么?
这里我还是准备再测试一下,策略如下:
(1)首先我获取了一下掘金量化终端中可以提供成分股的几个指数代码,同时将衍生指标导入表格中,提取了衍生指标的关键字信息;
(2)总体建立了一个dataframe表格,其中纵坐标表示的是衍生指标,横坐标就是各个指数
(3)我们先选择一个指数,之后提取该指数的成分股,计算该指数N天之后的收益率,同时获得该指数第一个衍生指标数据,之后对一个指数内所有成分股的收益率和衍生指标数据做相关系数计算,并存储到表格中,首先对所有的衍生指标进行循环,之后对所有的指数进行循环,代码如下:

# coding=utf-8
from __future__ import print_function, absolute_import
from gm.api import *
import pandas as pd
import numpy as np
import datetime
import warnings
warnings.simplefilter(action='ignore', category=pd.errors.PerformanceWarning)
"""
函数名:get_finance_deriv_list():
输入参数:null
输出参数:null
函数作用:获取衍生指标与指数成分股之间的相关系数矩阵
"""def get_finance_deriv_list():# dfcf_data = pd.read_csv('2024年8月17日东方财富ETF基金列表去重版 -手动增强.csv')dfcf_data = pd.read_csv('掘金投资衍生指标数据CSV.csv')finance_deriv = dfcf_data[['字段名', '中文名称']] # 新建一个dataframe表格用于存储需要用到的数据return finance_deriv
"""
函数名:finance_deriv_symbol_corr():
输入参数:null
输出参数:finance_deriv 数据类型:dataframe
函数作用:获取衍生指标数据
"""
def finance_deriv_symbol_corr():A_share_list = {"SHSE.000010": "SHANG_ZHENG180", "SHSE.000009": "SHANG_ZHENG380", "SHSE.000300": "HU_SHEN300","SHSE.000905": "ZHONG_ZHENG500", "SHSE.000906": "ZHONG_ZHENG800","SHSE.000852": "ZHONG_ZHENG1000","SHSE.000015":"honglizhishu","SHSE.000922":"zhongzhenghongli"}# A_share_list = {"SHSE.000010": "SHANG_ZHENG180","SHSE.000009": "SHANG_ZHENG380"}time = "2021-05-01"  #统计衍生指标的时间time2 = "2021-07-01"  # 统计衍生指标的时间days = 40 # 用于统计数据的天数,用days天后的股票收盘价减去当初的股票收盘价,计算其收益率last_day = get_previous_n_trading_dates(exchange='SHSE', date=time2, n=1)[0]# 计算因子和收益率之间的相关系数,纵坐标应该为衍生指标,建立一个表格导入衍生指标finance_deriv_list = get_finance_deriv_list() #这个一定要在指数轮询之外,要不数据会被覆盖for index in A_share_list.keys():symbol_list = stk_get_index_constituents(index)["symbol"].values  # 获取指数成分股数据index_abs = "%s %s" % (index, "abs")finance_deriv_list.insert(len(finance_deriv_list.columns),index, None)  # 在指定位置添加空白列,存储该衍生指标和指数成分股之间的相关系数finance_deriv_list.insert(len(finance_deriv_list.columns),index_abs, None)  # 在指定位置添加空白列,存储该衍生指标和指数成分股之间的相关系数的绝对值,用于排序print(finance_deriv_list)# 计算各个因子与该指数成分股之间的相关系数for i in finance_deriv_list.index: #每个因子进行轮询finance_deriv_name = finance_deriv_list.loc[i]['字段名']finance_deriv_value = stk_get_finance_deriv_pt(symbols=list(symbol_list), fields=finance_deriv_name,date=time,df=True)  # 获取symbol_list的finance_deriv_name数据,需要转换为list类型finance_deriv_value = finance_deriv_value.dropna() #去除到查询不到的数据return_index = finance_deriv_value[['symbol', finance_deriv_name]]return_index.insert(len(return_index.columns), 'return', None)  # 在指定位置添加空白列,存储该衍生指标和指数成分股之间的相关系数if len(return_index) > 0.5*len(symbol_list): # 至少有一半以上查询到衍生数据指标,做相关分析才有意义,要不数据太少了for j in return_index.index: #指数成分股中每个股票进行轮询,计算各个股票在这个统计期间的收益率return_index_his = history_n(symbol=return_index.loc[j]['symbol'], frequency='1d', count=days + 1, fields='close',fill_missing='Last', adjust=ADJUST_PREV, end_time=last_day, df=True)if not return_index_his.empty: #有部分股票有可能因为停牌等原因无法查询return_index_his = return_index_his['close'].valuesreturn_index.at[j, 'return'] = return_index_his[-1] / return_index_his[0] - 1  # 将最新的衍生指标值存储到dataframe中# else:#     print(symbol_list[j]+"无法查询")return_index = return_index.dropna()  # 去除到查询不到的数据factor_A = list(return_index[finance_deriv_name].values)factor_B = list(return_index["return"].values)coef_matrix_A = np.asarray(np.corrcoef(factor_A,factor_B)) #求factor_A 和 return_matrix 之间的相关系数coef_A = coef_matrix_A[0, 1]  # 提取第0行,第1列的数值,即相关系数finance_deriv_list.at[i, index] = coef_Afinance_deriv_list.at[i, index_abs] = abs(coef_A)else:finance_deriv_list.at[i, index] = 0 # 无法得到足够的衍生指标数据,因此直接置0,该指标没有参考价值finance_deriv_list.at[i, index_abs] = 0print("该因子无有效衍生指标数据参考"+finance_deriv_name)print(finance_deriv_name)# finance_deriv_list = finance_deriv_list.dropna()# finance_deriv_list = finance_deriv_list.sort_values("abs", ascending=False)  # 根据选择的因子对股票进行从小到大排序# finance_deriv_list = finance_deriv_list.reset_index(drop=True)  # 重置索引值print(finance_deriv_list)finance_deriv_list.to_csv("衍生指标相关系数.csv", encoding='utf-8-sig')set_token("自己的token码")
finance_deriv_symbol_corr()

得到的结果如下:
原始数据如下图所示:
在这里插入图片描述
从上述数据中我们可以看出,有部分数据无效,而且大部分相关系数都小于0.2,因此我们先去除掉无效数据,再以相关系数大于0.2为界限,超过的标红,同时对于一些相似的衍生指标(比如ROE加权不加权等)进行了去重,得到的结果如下:
在这里插入图片描述
相关系数超过0.2的衍生指标缩减到了35条,而且从上述数据我们也可以看出,SHSE.000009/SHSE.000905/SHSE.000906/SHSE.000852这四个指数与衍生指标的关系都不大,其中三个都是中小盘股票,这说明大盘股相较于中小盘股和衍生指标的关系较大。因为我们把这三个也剔除掉,之后对各个指数相同的衍生指标进行求和排序,选择求和结果绝对值大于0.4的作为标的衍生指标,结果如下:

指数代码指数名
SHSE.000010上证180
SHSE.000009上证380
SHSE.000300沪深300
SHSE.000905中证500
SHSE.000906中证800
SHSE.000852中证1000
SHSE.000015红利指数
SHSE.000922中证红利

在这里插入图片描述
换了不同时间段试了一下,效果不是很好,这个策略有时间还需要再研究一下,应该是看一下各个衍生指标变化率和收益之间的关系,而不是看衍生指标绝对值与股票之间的关系。

time = “2022-05-01” #统计衍生指标的时间
time2 = “2022-07-01” # 统计衍生指标的时间
在这里插入图片描述


http://www.ppmy.cn/news/1519011.html

相关文章

计算机学习

不要只盯着计算机语言学习,你现在已经学习了C语言和Java,暑假又规划学习Python,最后你掌握的就是计算机语言包而已。 2. 建议你找一门想要深挖的语言,沿着这个方向继续往后学习知识就行。计算机语言是学不完的,而未来就…

【C++20】携程库基础知识

文章目录 参考 参考 协程革命

如何识别视频里的声音转化为文字?视频转文字方法

如何识别视频里的声音转化为文字?识别视频声音转文字技术,不仅极大地提升了信息处理的效率,还促进了跨语言沟通和文化交流。在全球化背景下,它成为了连接不同语言群体的桥梁。此外,随着人工智能技术的不断进步&#xf…

【Python】标准库的使用

Python 通过模块来体现“库” 降低了程序猿的学习成本提高了程序的开发效率 库 就是是别人已经写好了的代码,可以让我们直接拿来用 荀子曰: “君子性非异也,善假于物也” 一个编程语言能不能流行起来,一方面取决于语法是否简单方便容易学习…

【2024】Datawhale AI夏令营-从零上手Mobile Agent-Task2笔记

【2024】Datawhale AI夏令营-从零上手Mobile Agent-Task2笔记 本文介绍通义实验室最新的多模态手机智能体工作——Mobile-Agent。 一、大模型智能体背景 1.1 大模型智能体的优势 随着大模型的高速发展,大模型智能体成为热门研究方向,受到工业界和学术…

手把手教你从开发进度划分测试

一.单元测试(Unit Testing) 单元测试:软件单元测试的对象是可独立编译或汇编的程序模块。测试的对象是软件测试中的最小单位:模块。 测试阶段:编码后或者编码前(TDD:测试驱动开发)…

2024.9.1 刷题总结

2024.9.1 **每日一题** 1450.在既定时间做作业的学生人数,这是一道简单的模拟题,我们只需要判断每个学生的作业时间是否包含询问时间即可,具体判断方法为开始时间小于等于访问时间,结束时间大于等于访问时间。 class Solution { …

SparkShop开源商城 uploadFile 任意文件上传漏洞复现

1 产品简介 SparkShop开源商城(也被称为星火商城)是一款基于ThinkPHP6和Element UI的开源免费可商用的高性能商城系统。适用于各类电商场景,包括但不限于B2C商城、新零售、分销商城等。无论是初创企业还是成熟品牌,都可以通过Spar…

Ubuntu下安装NVIDIA-SMI

环境 显卡:gt1030 系统:Ubuntu22.04 安装 1、查询显卡GeForce GT 1030 rootapq-K07-C236:/home# lspci 00:00.0 Host bridge: Intel Corporation 8th/9th Gen Core 8-core Desktop Processor Host Bridge/DRAM Registers [Coffee Lake S] (rev 0d) 0…

深入理解Java序列化:从入门到实践

在前面的学习中我们简单的学习到了对象流的使用,我们先来回顾一下 对象流 在Java中,对象流是一种特殊的输入输出流,用于处理对象的序列化和反序列化操作。对象流主要包括ObjectOutputStream和ObjectInputStream两个类。 ObjectOutputStrea…

10分钟了解OPPO中间件容器化实践

背景 OPPO是一家全球化的科技公司,随着公司的快速发展,业务方向越来越多,对中间件的依赖也越来越紧密,中间件的集群的数量成倍数增长,在中间件的部署,使用,以及运维出现各种问题。 1.中间件与业…

华为2024年秋招-结构与材料工程师-结构方向-机试题(四套)(每套四十题)

华为2024年招聘-结构与材料工程师-结构方向-机试题(四套)(每套四十题) 岗位——结构与材料工程师 岗位意向——结构 真题题目分享,完整版带答案(有答案和解析,答案非官方,未仔细校正&#xff…

【hot100篇-python刷题记录】【跳跃游戏】

R6-贪心算法 符合贪心的原因是: 我们要走到最后可以每次都选择尽可能远的来走,其次,能走到该步意味着该步以前都能到达。因此,局部最优解可以代表全局最优解。 class Solution:def canJump(self, nums: List[int]) -> bool:#最…

uniapp 封装uni.login 实现全局调用

封装utils app.vue中 使用globalData 注册 utils 页面中使用方法 定义app 调用方法

Linux 数据结构 哈希表 排序

哈希表: 哈希: 将数据通过哈希算法映射称为一个键值 存时在键值对应的位置存储 取时通过键值对应的位置查找 哈希冲突(哈希碰撞):多个数据通过哈希算法映射成同一个键值 存储数字: 排序算法: 1.冒泡排…

TeamTalk消息服务器(群组相关)

具体的流程如下介绍,后续需要着重研究数据库相关表的结构设计。 群组信令和协议设计 enum GroupCmdID {CID_GROUP_NORMAL_LIST_REQUEST 1025,CID_GROUP_NORMAL_LIST_RESPONSE 1026,CID_GROUP_INFO_REQUEST 1027,CID_GROUP_INFO_RESPONSE 1028,// ...... 暂时省…

AWS api数据信息获取(boto3)

GitHub - starsliao/TenSunS: 🦄后羿 - TenSunS(原ConsulManager):基于Consul的运维平台:更优雅的Consul管理UI&多云与自建ECS/MySQL/Redis同步Prometheus/JumpServer&ECS/MySQL/Redis云监控指标采集&Blackbox站点监控维护&漏…

亚马逊aws的弹性与可扩展性解析

欢迎来到雲闪世界。可以使用各种服务和工具在 AWS 上实现可扩展性和弹性。例如,AWS Application Auto Scaling 是一种可以自动调整容量以低成本实现出色应用程序性能的服务。这允许轻松设置跨多个服务的多个资源的应用程序扩展。让我们来谈谈弹性和可扩展性之间的区…

Magisto——AI分析视频素材,自动生成剪辑、拼接和添加音乐的成品视频

一、Magisto介绍 Magisto 是一个基于人工智能的视频编辑应用程序,旨在帮助用户快速创建专业水准的视频。它通过自动化处理,简化了视频剪辑、效果添加和音频同步等复杂步骤,使用户能够轻松地将视频、图片和音乐整合成一个完整的短片。 Magis…

81、k8s网络配置以及k8s拉取私有仓库

一、k8s架构安装部署 k8s架构master 192.168.168.81 docker、kubeadm、kubelet、kubectl、flannel node01 192.168.168.82 docker kubeadm kubelet kubectl flannel node02 192.168.168.83 docker、kubeadm、kubelet、kubectl、flannel#关闭防火墙 [rootk8s1 ~]# sys…