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

news2024/12/23 5:48:08

在上一个多因子模型中,我手动对各个因子进行了回测,但是数据结果并不是十分理想,难道基本面指标真的和股票走势关系不大么?
这里我还是准备再测试一下,策略如下:
(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'].values
                        return_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_A
                finance_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] = 0
                print("该因子无有效衍生指标数据参考"+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.coloradmin.cn/o/2091761.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Doped code 介绍

doped是一款Python软件,用于缺陷超单元计算的生成、前/后处理和分析,以高效、可重复、用户友好、功能强大且完全可定制的方式实施缺陷模拟工作流程。 https://doped.readthedocs.io/en/latest/ 教程页面提供了演示代码功能和用法, 该软件包的…

考试评分系统设计与实现/基于django的在线考试系统

摘要 随着互联网技术的不断发展,各行各业的工作学习的模式都发生了不小的变化,们通过互联网技术不仅能够提高工作效率还能够降低出错的几率。而对于考试评分,一个专业的系统可以帮助管理者更加有效管理在考试评分,可以帮助提高克服…

vaspup2.0介绍

实时软件库:https://github.com/kavanase/vaspup2.0 vaspup是一个bash脚本集合,可以有效地生成和分析VASP收敛测试计算。 最初的vaspup是由Alex Ganose开发,用于基态能量收敛测试和POTCAR生成。 vaspup2.0的功能包括: 基态能量相对于ENCUT和k点密度的收敛…

Linux 配置wireshark 分析thread 使用nRF-Sniffer dongle

Linux 配置wireshark nRF-Sniffer-for-802.15.4 1.下载固件和配置文件 https://github.com/NordicSemiconductor/nRF-Sniffer-for-802.15.4 2.烧写固件 使用nRF Connect for Desktop 中的 programmer 4.3烧写 https://www.nordicsemi.com/Products/Development-tools/nrf-conne…

python07-单元测试框架unittest1-1

前言 单元测试是软件开发中不可或缺的一部分,可以帮助开发人员确保代码的正确性、可靠性和稳定性,python是一种广泛使用的程序语言,提供了多种单元测试工具,最常用的是unittest。本文将介绍unittest package, 包括如何编写测试Tes…

干货分享|分享一款高效的文件搜索工具 Everything

介绍:Everything软件是一款高效的文件搜索工具,主要用于快速定位计算机中的文件和文件夹。 官网地址:voidtools 下载方法:只需依据电脑配置与个人需求选择合适的版本下载,安装过程中一路默认即可轻松完成设置。 注&…

C语言刷题日记(附详解)(3)

一、选填部分 第一题: 以下的变量定义语句中,合法的是( ) A. byte a 128; B. boolean b null; C. long c 123L; D. float d 0.9239; 思路提示:观察选项时不要马虎,思考一下各种类型变量的取值范围,以及其初始化的形式是…

基于yolov8的课堂行为检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv8的课堂行为检测系统是现代教育技术的创新应用,该系统利用YOLOv8这一先进的深度学习算法,实现了对学生课堂行为的自动、高效和精准监测。YOLOv8在目标检测领域以其卓越的性能和速度著称,通过对学生上课视频或实时摄像…

深入学习AI大模型服务平台的选型应用相关技术和问诊咨询

AI大模型服务平台的选择和应用涉及到多个技术层面和业务需求的考量。下面我会详细介绍几个关键的技术点和应用场景,帮助您更好地理解和选择AI大模型服务平台。 技术选型 1.1 大模型种类 语言模型:如BERT、GPT-3、文心一言等,适用于自然语言…

自动驾驶---什么是Frenet坐标系?

1 背景 为什么提出Frenet坐标系?Frenet坐标系的提出主要是为了解决自动驾驶系统在路径规划的问题,它基于以下几个原因: 符合人类的驾驶习惯: 人类驾驶员在驾驶过程中,通常不会关心自己距离起点的横向和纵向距离&#x…

C++学习笔记——约瑟夫问题

一、题目描述 二、代码 #include<iostream>using namespace std;int main() {int n;//新建变量n int m;//新建变量m cin >>n;//键盘输入n cin >>m;//键盘输入m int a[n];//初始化数组 for(int i0;i<n;i){a[i] i1;}int* p &a[0];//指针指向数组的第一…

AIGC大师秘籍:六步法打造精准文字提示词

&#x1f31f; 引言&#xff1a; 在AIGC&#xff08;人工智能生成内容&#xff09;的奇幻世界里&#xff0c;编写优质的文字提示词&#xff08;Prompt&#xff09;就像是掌握了一门魔法&#xff0c;能够召唤出高质量的内容。今天&#xff0c;我将向你揭露一个六步法的秘密&…

【LeetCode】918. 环形子数组的最大和

1. 题目 2. 分析 单调队列的经典应用。 3. 代码 class Solution:def maxSubarraySumCircular(self, nums: List[int]) -> int:# 使用单调队列的解法# 转换为求区间长度不超过len(nums)内的最大和k len(nums)nums nums nums# 求出前缀和prefixSum [0] * len(nums) pre…

打印单据时每次都弹出对话框,如何取消对话框,实现快速打印?

打印管家婆单据时&#xff0c;每次都打印单据时都弹出一个打印对话框&#xff0c;可不可以跳过一步&#xff0c;实现快速打印呢&#xff1f;答案是可以的&#xff0c;具体操作步骤如下&#xff1a; 1、随意打开一张单据&#xff0c;点击打印按钮旁边的小三角&#xff0c;在菜单…

二刷代码随想录训练营Day 46|647. 回文子串、516.最长回文子序列、动态规划总结篇

1.回文子串 代码随想录 (programmercarl.com) 视频&#xff1a;动态规划&#xff0c;字符串性质决定了DP数组的定义 | LeetCode&#xff1a;647.回文子串_哔哩哔哩_bilibili 代码&#xff1a; class Solution { public:int countSubstrings(string s) {vector<vector<bo…

Unet改进12:添加PCONV||减少冗余计算和同时存储访问

本文内容:添加PCONV 目录 论文简介 1.步骤一 2.步骤二 3.步骤三 4.步骤四 论文简介 为了设计快速的神经网络,许多工作都集中在减少浮点运算(FLOPs)的数量上。然而,我们观察到FLOPs的这种减少并不一定会导致类似程度的延迟减少。这主要源于低效率的每秒浮点操作数(FLOP…

[数据集][目标检测]课堂行行为检测数据集VOC+YOLO格式4065张12类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;4065 标注数量(xml文件个数)&#xff1a;4065 标注数量(txt文件个数)&#xff1a;4065 标注…

华为云征文|基于Flexus云服务器X实例体验大模型部署体验测评

&#x1f534;大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂 先看这里 前言部署千问大模型 前言 当下&#xff0c;各种大模型层出不穷&#xff0c;先有openai的chatgpt&#xff0c;后有百度文心一言&#xff0c;再就是国内大模型齐头并进…

Java:Period和During

文章目录 Period常用方法代码 During常用方法代码 Period 用于计算两个LocalDate对象 相差的年数&#xff0c;月数&#xff0c;天数 常用方法 代码 package NewTime;import java.time.LocalDate; import java.time.Period;/*** Author: ggdpzhk* CreateTime: 2024-08-31*/ p…

新的打包工具 Rsbuild 尝鲜:Vue2-cli 项目迁移 Rsbuild

当前时间 2024-08-31 看到一个新的打包工具&#xff0c;于是想试一试&#xff0c;这里是官网 测试 用过 vue-cli 的同志们应该有所感受&#xff0c;启动项目挺慢的&#xff0c;我这个项目不太大&#xff0c;第一次启动是最慢的&#xff0c;之后启动快了一些些&#xff0c;而且…