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,一经查实,立即删除!

相关文章

动态规划Day07

70. 爬楼梯&#xff08;进阶版&#xff09; 卡码网&#xff1a;57. 爬楼梯(opens new window) 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬至多m (1 < m < n)个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 注意&#xff1a;给定 n 是一个正…

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

本文由睡觉待开机原创&#xff0c;转载请注明出处。 本内容在csdn网站首发 欢迎各位点赞—评论—收藏 如果存在不足之处请评论留言&#xff0c;共同进步&#xff01; 这里写目录标题 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对接的几种接口方式

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

SpringBoot源码分析

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

傅里叶级数到傅里叶变换

傅里叶级数 定义形式 f ( t ) 1 2 α 0 ∑ n 1 ∞ [ α n c o s ( n ω t ) β n s i n ( n ω t ) ] f(t)\frac{1}{2}\alpha_0 \sum_{n1}^{\infty}[\alpha_ncos(n\omega t)\beta_n sin(n \omega t)] f(t)21​α0​n1∑∞​[αn​cos(nωt)βn​sin(nωt)] 其中 ω 2 π…

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

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

算法训练营Day45(完全背包)

70. 爬楼梯 &#xff08;进阶&#xff09; 题目页面 (kamacoder.com) 完全背包的排列问题 import java.util.Scanner; class Main{public static void main(String [] args){Scanner sc new Scanner(System.in);int m,n;while(sc.hasNextInt()){n sc.nextInt();m sc.nextInt…

C++ 类构造函数 析构函数

类的构造函数 类的构造函数是类的一种特殊的成员函数&#xff0c;它会在每次创建类的新对象时执行。 构造函数的名称与类的名称是完全相同的&#xff0c;并且不会返回任何类型&#xff0c;也不会返回 void。构造函数可用于为某些成员变量设置初始值。 下面的实例有助于更好地…

C#学习教程

目录 版本:VS2022 一、C#简介 程序定义: 程序的的作用:

阿里云如何完全卸载阿里云盾(安骑士)并屏蔽阿里云盾IP

事情说明 为什么买了服务器之后明明什么都没有配置&#xff0c;阿里云却会给你推送服务器的危险消息&#xff1f;如何解决这个问题&#xff1f; 原因 阿里云盾&#xff08;AliYunDun&#xff09;&#xff0c;又名阿里云安骑士&#xff0c;是阿里云自带的云监控软件&#xff…

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

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

Python 对象属性和类属性

本篇为Python 面向对象之对象和类属性及动态添加属性和方法的概念、示例的学习笔记。 目录 对象属性与类属性 类属性 对象属性 属性优先级 动态对象属性只针对当前对象 动态添加属性和方法 动态添加属性 动态添加方法 引入方法参数处理库 添加方法 限制动态添加属性…

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

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

如何写好年终总结?

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

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

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

MetaGPT-打卡day01

MetaGPT是一个基于大型语言模型&#xff08;LLMs&#xff09;的多智能体协作框架。它利用SOP&#xff08;Standard Operating Procedures&#xff0c;标准作业程序&#xff09;来协调基于大语言模型的多智能体系统&#xff0c;从而实现元编程技术。该框架使用智能体模拟了一个虚…

程序员必备的面试技巧:从忍者到铁金刚的华丽转变

在科技世界的江湖中&#xff0c;程序员作为武林高手&#xff0c;面试是他们闯荡江湖的一场重要考验。在这场考验中&#xff0c;我们需要像忍者一样灵活&#xff0c;像侦探一样聪明&#xff0c;还要像无敌铁金刚一样坚定。本文将带你探索程序员必备的面试技巧&#xff0c;助你书…

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

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

最新版Navicat的安装与激活

最新版Navicat的安装与激活 图文教程链接&#xff1a;图文教程视频教程链接&#xff1a;视频教程此教程适用于Navicat161之后版本的激活&#xff0c;Navicat161之后的版本暂时无法通过注册机的方式进行激活&#xff0c;如需通过注册机激活Navicat161及之前的版本&#xff0c;请…