2.1.2 一个关于y=ax+b的故事

跳转到根目录:知行合一:投资篇

已完成:
1、投资&技术
  1.1.1 投资-编程基础-numpy
  1.1.2 投资-编程基础-pandas
  1.2 金融数据处理
  1.3 金融数据可视化
2、投资方法论
  2.1.1 预期年化收益率
  2.1.2 一个关于y=ax+b的故事
3、投资实证
  [3.1 2023这一年] 被鸽

文章目录

  • 1. 系统自己画!最佳拟合线
    • 1.1. 沪深300的最佳拟合线
    • 1.2. 横向对比:一个个算
    • 1.3. 横向对比:数据标准化
    • 1.4. 看图说话
  • 2. 系统自己算!线性回归
    • 2.1. 沪深300线性回归,斜率0.00099414
    • 2.2. 沪深300线性回归的年化,年化8.5%
    • 2.3. 沪深300首尾点的年化,4.72%
    • 2.4. 中证500线性回归,斜率0.0008
    • 2.5. 中证500线性回归的年化
    • 2.6. 中证500首尾点的年化
  • 3. 总结

当看到一个在k线图上画直线的时候,斜率是可以自动计算的吗?

最佳拟合的直线,计算出来的斜率是多少?最佳拟合直线代表的年化是多少?

1. 系统自己画!最佳拟合线

1.1. 沪深300的最佳拟合线

顾名思义,这就是对于散点图,画一条最佳拟合的直线。那什么又叫最佳拟合线?

最佳拟合直线是指,我们可以找到一条直线,样本点到该直线的[离差平方和]达到最小的直线。这条直线用公式y = ax + b表示。

a表示回归系数,b表示截距。

再简单的说,就是存在一条线,这条线,能让各个点,都比较“满意”地分布在其上下。

我们拿沪深300的历史收盘价作为散点图,来看看其所谓的最佳拟合线是什么样的。

import qstock as qs
import seaborn as sns
import numpy as npsh300=qs.get_data('510300')
# 因为设想中,x轴,可以是一个顺序的数组,比如从0开始往后数,step为1。这其实就是暗合着,随着时间的增加,close是否能拟合一条向上的直线?
sh300['day'] = np.arange(0, sh300.shape[0], 1)sns.set_style("white")
gridobj = sns.lmplot(x="day", y="close", data=sh300, ci=95, scatter_kws={'color': 'orange'}, line_kws={'color': 'green'}, markers='o')

1.2. 横向对比:一个个算

看过了沪深300,肯定会有疑惑啊,总是要横向对比的吧?比如沪深300和中证500、券商ETF、红利ETF、房地产ETF、黄金ETF等标的,能进行横向对比来看谁的斜率(赚钱效应)更好吗?

Of course ,动手!

import qstock as qs
import seaborn as sns
import numpy as npstocks_info = [{'code': '510300', 'name': '沪深300'},{'code': '510500', 'name': '中证500'},{'code': '512010', 'name': '医药ETF'},{'code': '512000', 'name': '券商ETF'},{'code': '516160', 'name': '新能源ETF'},{'code': '510800', 'name': '红利ETF'},{'code': '518880', 'name': '黄金ETF'},{'code': '512200', 'name': '房地产ETF'}
]
for stock in stocks_info:df=qs.get_data(stock['code'])# 因为设想中,x轴,可以是一个顺序的数组,比如从0开始往后数,step为1。这其实就是暗合着,随着时间的增加,close是否能拟合一条向上的直线?df['day'] = np.arange(0, df.shape[0], 1)df['标的'] = stock['name']sns.set_style("white")# 这个是seaborn中文乱码的处理。经过试验,在这里,plt.rcParams['font.sans-serif'] = ['Arial Unicode MS'],这种设置是不行的。sns.set_style(rc= {'font.sans-serif':"Arial Unicode MS"})gridobj = sns.lmplot(x="day", y="close", data=df,  hue="标的", ci=95, scatter_kws={'color': 'orange'}, line_kws={'color': 'green'}, markers='o')

这里要说明一下,上面其实是一个个图生成的,然后我一张张图拼接起来的结果。

如果想直接横向着来看,还需要对数据进行标准化处理,如果不进行标准化,那比如不同标的的收盘价,差异很大,有的是十几块,像ETF,可能就是1块,那结果就很难看,就像下面这种:

1.3. 横向对比:数据标准化

所以,下面就是要将不同的标的进行标准化处理,这种标准化,意味着,将价格进行处理变成相对值,才可以进行比较,这里使用的是sklearn模块的StandardScaler,核心方法是fit_transform(df_all)。如果没有安装sklearn,需要先进行安装pip install -U scikit-learn

下面是一个完整的案例:

import qstock as qs
import pandas as pd#默认日频率、前复权所有历史数据
#open:开盘价,high:最高价,low:最低价,close:收盘价 vol:成交量,turnover:成交金额,turnover_rate:换手率
# 沪深300, 中证500, 医药ETF, 券商ETF, 新能源ETF, 红利ETF, 黄金ETF, 房地产ETF
stocks_info = [{'code': '510300', 'name': '沪深300'},{'code': '510500', 'name': '中证500'},{'code': '512010', 'name': '医药ETF'},{'code': '512000', 'name': '券商ETF'},{'code': '516160', 'name': '新能源ETF'},{'code': '510800', 'name': '红利ETF'},{'code': '518880', 'name': '黄金ETF'},{'code': '512200', 'name': '房地产ETF'}
]
for stock in stocks_info:df = qs.get_data(stock['code'])  # 从qstock获取对应的股票历史数据stock['history_df'] = df         # 将其存在 history_df 这个key里面。# 只保留收盘价,合并数据
df_all = pd.DataFrame()
for stock in stocks_info:df = stock['history_df']df = df[['close']]         # 只需要 date 和 close 2列就行了。df.rename(columns={'close': stock['name']}, inplace=True)  # 用股票的名字来重命名close列if df_all.size == 0:df_all = dfelse:df_all = df_all.join(df)  # join是按照index来连接的。# print(df_all)# 对dataframe的数据进行标准化处理
import sklearn
from sklearn import preprocessing
z_scaler = preprocessing.StandardScaler()   # 建立 StandardScaler 对象
z_data = z_scaler.fit_transform(df_all) #数据标准化(从第三列开始)
z_data = pd.DataFrame(z_data)                           #将数据转为Dataframe
z_data.columns = df_all.columns
df_all = z_data
print(df_all)# 只保留收盘价,合并数据
df_new = pd.DataFrame()
for stock in stocks_info:df = df_all[[stock['name']]]df.columns = ['close']df['标的'] = stock['name']if df_new.size == 0:df_new = dfelse:df_new = pd.concat([df_new, df], axis=0)print(df_new)
df_new['day'] = df_new.index# 这个是seaborn中文乱码的处理。经过试验,在这里,plt.rcParams['font.sans-serif'] = ['Arial Unicode MS'],这种设置是不行的。
sns.set_style(rc= {'font.sans-serif':"Arial Unicode MS"})
df = sns.lmplot(x="day", y="close",data=df_new,col="标的")

         close      标的
0    -1.316309   沪深300
1    -1.275999   沪深300
2    -1.284061   沪深300
3    -1.290107   沪深300
4    -1.290107   沪深300
...        ...     ...
2826 -2.711143  房地产ETF
2827 -2.684416  房地产ETF
2828 -2.702234  房地产ETF
2829 -2.666598  房地产ETF
2830 -2.675507  房地产ETF[22648 rows x 2 columns]

1.4. 看图说话

从上面的横向对比图可以看出:

  1. 沪深300的斜率,是高于中证500的
  2. 券商ETF,基本是一条横线,说明什么?做T啊,稳赚不赔!
  3. 新能源ETF、房地产ETF,可能是时间还太短,所处的周期内,就是向下的。
  4. 其他的,黄金看的是长周期,可能是几十年,还是慎重为好;红利,说不好,不懂的就先不碰了。

2. 系统自己算!线性回归

2.1. 沪深300线性回归,斜率0.00099414

首先从 sklearn 下的 linear_model 中引入 LinearRegression,再创建估计器起名 model,设置超参数 normalize 为 True,指的在每个特征值上做标准化,这样会加速数值运算。(可能是版本不同,有时候会报错LinearRegression got an unexpected keyword argument 'normalize',此时反而要去掉normalize=True这个参数。)

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegressiondf=qs.get_data('510300')model = LinearRegression()
model
x = np.arange(df.shape[0])
y = df['close']X = x[:, np.newaxis]
model.fit( X, y )print( model.coef_ )  # 斜率 0.00099414,就是y=ax+b的a
print( model.intercept_ )  # 截距 1.9,就是y=ax+b的b# 根据上面计算的结果,我们绘制一个收盘价走势图和一条y=ax=b的直线
plt.plot( x, y,  linestyle='-', color='green' )
plt.plot(x, 0.00099414*x + 1.9, linestyle='--', color='r')  # 这个是根据最后计算的“斜率”和“截距”,再叠加绘制的斜线

2.2. 沪深300线性回归的年化,年化8.5%

之前计算的沪深300最佳拟合的直线,斜率和截距:

plt.plot(x, 0.00099414*x + 1.9, linestyle='--', color='r')  # 这个是根据最后计算的“斜率”和“截距”,再叠加绘制的斜线

沪深300,如果按照上面的直线来看,那:

起始点:1.9

终点:y=ax+b,即y=0.00099414*x + 1.9,最后的x,其实是x轴的个数,是:df.shape[0],也就是行数:x=2832;那么计算的y = 0.00099414 * 2832 + 1.9 = 4.71540448

按照上面的计算:

import mathbegin = 1.9
end = 4.71540448
year = 2832/255.0# 年化收益率计算
rate = math.pow(end / begin, 1.0 / year) - 1
print('开始价=%s, 最终价=%s, year=%s,年化收益率=%s' % (str(begin), str(end), str(year), str(rate)))开始价=1.9, 最终价=4.71540448, year=11.105882352941176,年化收益率=0.0852895190354479

2.3. 沪深300首尾点的年化,4.72%

如果不考虑中间的波动,那沪深300的年化收益率计算:

import pandas as pd
import mathdf=qs.get_data('510300')begin = df['close'][0]
end = df['close'][-1]
year = df.shape[0]/255.0# 年化收益率计算
rate = math.pow(end / begin, 1.0 / year) - 1
print('开始价=%s, 最终价=%s, year=%s,年化收益率=%s' % (str(begin), str(end), str(year), str(rate)))开始价=2.004, 最终价=3.345, year=11.105882352941176,年化收益率=0.047211214375309396

2.4. 中证500线性回归,斜率0.0008

对比看下中证500斜率如何

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegressiondf=qs.get_data('510500')model = LinearRegression()
model
x = np.arange(df.shape[0])
y = df['close']X = x[:, np.newaxis]
model.fit( X, y )print( model.coef_ )  # 斜率 0.00080245,就是y=ax+b的a
print( model.intercept_ )  # 截距 4.353948387096773,就是y=ax+b的b# 根据上面计算的结果,我们绘制一个收盘价走势图和一条y=ax=b的直线
plt.plot( x, y,  linestyle='-', color='green' )
plt.plot(x, 0.00080245*x + 4.353948387096773, linestyle='--', color='r')  # 这个是根据最后计算的“斜率”和“截距”,再叠加绘制的斜线

2.5. 中证500线性回归的年化

计算中证500最佳拟合的直线,斜率和截距:

plt.plot(x, 0.00080245*x + 4.353948387096773, linestyle='--', color='r')  # 这个是根据最后计算的“斜率”和“截距”,再叠加绘制的斜线

起始点:4.353948387096773

终点:y=ax+b,即y=0.00080245*x + 4.353948387096773,最后的x,其实是x轴的个数,是:df.shape[0],也就是行数:x=2635;那么计算的y = 0.00080245 * 2635 + 4.353948387096773 = 6.468404137096773

按照上面的计算:

import mathbegin = 4.353948387096773
end = 6.468404137096773
year = 2635/255.0# 年化收益率计算
rate = math.pow(end / begin, 1.0 / year) - 1
print('开始价=%s, 最终价=%s, year=%s,年化收益率=%s' % (str(begin), str(end), str(year), str(rate)))开始价=4.353948387096773, 最终价=6.468404137096773, year=10.333333333333334,年化收益率=0.039050907738202856

2.6. 中证500首尾点的年化

中证500年化收益率:

import pandas as pd
import mathdf=qs.get_data('510500')begin = df['close'][0]
end = df['close'][-1]
year = df.shape[0]/255.0# 年化收益率计算
rate = math.pow(end / begin, 1.0 / year) - 1
print('开始价=%s, 最终价=%s, year=%s,年化收益率=%s' % (str(begin), str(end), str(year), str(rate)))开始价=3.021, 最终价=5.279, year=10.333333333333334,年化收益率=0.055499799550948525

3. 总结

如果用最佳拟合直线,那么沪深300的年化是8.5%,中证500的年化是3.9%

如果是按照收盘价的首尾点来计算,那么沪深300的年化是4.72%,中证500的年化是5.55%

为什么最佳拟合直线和首尾点计算的年化差异这么大?还是因为今天2024年1月15日,收盘价跟最佳拟合直线的差距很大,自然会有很大的偏差,如果哪天能所谓的“价值回归”或是就应该是这个价,那2者会慢慢合理起来。

波动很大,但是最终的结果,还是能达到5%左右的年化收益率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/625110.shtml

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

相关文章

【C初阶——内存函数】鹏哥C语言系列文章,基本语法知识全面讲解

本文由睡觉待开机原创,转载请注明出处。 本内容在csdn网站首发 欢迎各位点赞—评论—收藏 如果存在不足之处请评论留言,共同进步! 这里写目录标题 1.memcpy使用和模拟实现2.memmove的使用和模拟实现3.memset函数的使用4.memcpy函数的使用 1.m…

linux安装MySQL5.7(安装、开机自启、定时备份)

一、安装步骤 我喜欢安装在/usr/local/mysql目录下 #切换目录 cd /usr/local/ #下载文件 wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.38-linux-glibc2.12-x86_64.tar.gz #解压文件 tar -zxvf mysql-5.7.38-linux-glibc2.12-x86_64.tar.gz -C /usr/local …

ERP和MES对接的几种接口方式

在数字化工厂的规划建设中,信息化系统的集成,既是重点,但同时也是难点。ERP和MES对接时,ERP主要负责下达生产计划,MES是执行生产计划,二套系统在数据交互时,需要确保基础数据的一致性&#xff0…

SpringBoot源码分析

一:简介 由Pivotal团队提供的全新框架其设计目的是用来简化新Spring应用的初始搭建以及开发过程使用了特定的方式来进行配置快速应用开发领域 二:运行原理以及特点 运行原理: SpringBoot为我们做的自动配置,确实方便快捷&#…

STC8H8K蓝牙智能巡线小车——2. 点亮左右转弯灯与危险报警灯

任务调用示例 RTX 51 TNY 可做多任务调度,API较为简单。 /* 接口API */// 创建任务 extern unsigned char os_create_task (unsigned char task_id); // 结束任务 extern unsigned char os_delete_task (unsigned char task_id);// 等待 extern unsig…

RTKlib操作手册--使用样例数据演示

简介 RTKLIB(Real-Time Kinematic Library)是一款开源的实时差分全球导航卫星系统(GNSS)软件库。它旨在提供高精度的位置解算,特别是在实时应用中,如精密农业、测绘、无人机导航等领域。 RTKLIB支持多种G…

目标检测数据集 - 人脸检测数据集下载「包含VOC、COCO、YOLO三种格式」

数据集介绍:行人检测数据集,真实场景高质量图片数据,涉及场景丰富,比如校园行人、街景行人、道路行人、遮挡行人、严重遮挡行人数据;适用实际项目应用:公共场所监控场景下行人检测项目,以及作为…

如何写好年终总结?

前面有读者留言问年终总结要怎么写,我一听你要聊这个我可不困了,这活我熟啊,谁不知道我厂是 PPT 之王。先来一套打法闭环方法论,再来一套赋能抓手组合拳,如此这般,便可笑傲于江湖。 玩笑归玩笑&#xff0c…

常用界面设计组件 —— 字符串与输入输出组件(QT)

2.2 字符串与输入输出组件2.2.1 字符串与数值之间的转换2.2.2 QString的常用功能 2.2 字符串与输入输出组件 2.2.1 字符串与数值之间的转换 界面设计时使用最多的组件恐怕就是QLabel和 QLineEdit了,QLabel用于显示字符串,QLineEdit用于 显示和输入字符…

ioDraw在线图表工具 - 轻松制作专业图表,只需3步!

还在花大量时间手动画图表?还在为图表样式而烦恼?ioDraw为你提供一站式解决方案!ioDraw在线图表工具实现了AI自动生成图表,让你轻松制作专业图表,只需3步! 1. 录入数据 只需将你的数据告诉ioDraw AI助手&…

[Docker] Dockerfile

文章目录 什么是 Dockerfile?使用 Dockerfile 定制镜像开始构建镜像上下文路径 指令详解COPYADDCMDENTRYPOINTENVARGVOLUMEEXPOSEWORKDIRUSERHEALTHCHECKONBUILD 什么是 Dockerfile? Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了…

Spring Boot异常处理!!!

SpringBoot默认的处理异常的机制:SpringBoot 默认的已经提供了一套处理异常的机制。一旦程序中出现了异常 SpringBoot 会向/error 的 url 发送请求。在 springBoot 中提供了一个叫 BasicErrorController 来处理/error 请求,然后跳转到默认显示异常的页面…

用Pytorch实现线性回归模型

目录 回顾Pytorch实现步骤1. 准备数据2. 设计模型class LinearModel代码 3. 构造损失函数和优化器4. 训练过程5. 输出和测试完整代码 练习 回顾 前面已经学习过线性模型相关的内容,实现线性模型的过程并没有使用到Pytorch。 这节课主要是利用Pytorch实现线性模型。…

(1)(1.13) SiK无线电高级配置(六)

文章目录 前言 15 使用FTDI转USB调试线配置SiK无线电设备 16 强制启动加载程序模式 17 名词解释 前言 本文提供 SiK 遥测无线电(SiK Telemetry Radio)的高级配置信息。它面向"高级用户"和希望更好地了解无线电如何运行的用户。 15 使用FTDI转USB调试线配置SiK无线…

vue3 锚点定位 点击滚动高亮

功能描述 点击导航跳到对应模块的起始位置,并且高亮点击的导航; 滚动到相应的模块时,对应的导航也自动高亮; 效果展示 注意事项 一定要明确哪个是要滚动的盒子;滚动的高度要减去导航栏的高度;当前在导航1…

【发票识别】支持pdf、ofd、图片格式(orc、信息提取)的发票

背景 为了能够满足识别各种发票的功能,特地开发了当前发票识别的功能,当前的功能支持pdf、ofd、图片格式的发票识别,使用到的技术包括文本提取匹配、ocr识别和信息提取等相关的技术,用到机器学习和深度学习的相关技术。 体验 体…

vue知识-06

es6导入导出语法 # 做项目:肯定要写模块--导入使用 # 如果包下有个 index.js 直接导到index.js上一次即可 默认导出和导入 : export default name // 只导出变量 export default add // 只导出函数 export default {name,add} // 导出对象 export defau…

【Linux】Git - 新手入门

文章目录 1. git 版本控制器 - 该如何理解?2. git / gitee / github 区别?3. Linux 中 git 的使用3.1 安装 git3.2 使用 github 新建远端仓库3.2.1 账号注册3.2.2 创建代码仓库3.2.3 克隆仓库到本地3.2.4 .gitignore 文件 3.3 使用 git 提交代码到 githu…

LeetCode 0082.删除排序链表中的重复元素 II:模拟

【LetMeFly】82.删除排序链表中的重复元素 II:模拟 力扣题目链接:https://leetcode.cn/problems/remove-duplicates-from-sorted-list-ii/ 给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字…

数据结构学习 jz30 包含 min 函数的栈

关键词:排序 题目:最小栈 方法一:在记录这个数的同时,记录目前的最小值。看了提示才写出来的。 方法二:辅助栈。辅助栈保持非严格递减。看了k神的答案。 方法一: 一开始没想到怎么存最小,看…