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. 看图说话
从上面的横向对比图可以看出:
- 沪深300的斜率,是高于中证500的
- 券商ETF,基本是一条横线,说明什么?做T啊,稳赚不赔!
- 新能源ETF、房地产ETF,可能是时间还太短,所处的周期内,就是向下的。
- 其他的,黄金看的是长周期,可能是几十年,还是慎重为好;红利,说不好,不懂的就先不碰了。
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%左右的年化收益率。
相关文章:

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 一个关于yaxb的…...

Rust-解引用
“解引用”(Deref)是“取引用”(Ref)的反操作。取引用,我们有&、&mut等操作符,对应的,解引用,我们有操作符,跟C语言是一样的。示例如下: 比如说,我们有引用类型p:&i32;,那么可以用符…...
记录一下vue项目引入百度地图
公共部分 #allmap { width: 500px; height: 500px; font-family: "微软雅黑"; } 1、 <div id"allmap"> <baidu-map :center"center" :zoom"zoom" ready"handler"></baidu-map> </div> data()…...
基于Docker官方php:7.4.33-fpm镜像构建支持67个常见模组的php7.4.33镜像
实践说明:基于RHEL7(CentOS7.9)部署docker环境(23.0.1、24.0.2),所构建的php7.4.33镜像应用于RHEL7-9(如AlmaLinux9.1),但因为docker的特性,适用场景是不限于此的。 文档形成时期:2017-2023年 因系统或软件版本不同&am…...
opencv通过轮廓点生成闭合图像
前言 有时候需要将某一些点生成闭合的二值图像。记录一下。 // 轮廓点个数 int nrCurvePoints curContour.nr; // 轮廓点 DIM2DL* curvePoints curContour.pts;std::vector<cv::Point> points; // 轮廓点集合 for (int cntPoint 0; cntPoint < nrCurvePoints; cn…...

Python 网络编程之TCP详细讲解
【一】传输层 【1】概念 传输层是OSI五层模型中的第四层,负责在网络中的两个端系统之间提供数据传输服务主要协议包括**TCP(传输控制协议)和UDP(用户数据报协议)** 【2】功能 **端到端通信:**传输层负责…...
直饮水系统服务认证:提升水质与安全的必要举
直饮水系统作为一种便捷、卫生的饮水方式,已经越来越受到人们的欢迎。然而,随着市场的发展,直饮水系统的质量和服务也面临着一些挑战。因此,直饮水系统服务认证应运而生,成为了提升水质与安全的必要举措。 一、直饮水…...

Qt 调试系统输出报警声以及添加资源
文章目录 前言一、方法1 使用 Qsound1.添加都文件 直接报错2.解决这个错误 添加 QT multimedia3. 加入代码又遇到新的错误小结 二、第二种方法1.引入库2.添加资源2.1依次点击Qt--->Qt Resource File--->Choose2.2给资源文件起个名字,如:res&#…...

Linux下文件的创建写入读取编程
在linux下操作一个文件,首先要保证文件的存在(不存在就创建),接着打开文件(打开成功)并得到文件描述符,接着在进行读写操作,最后还需要关闭文件。如果我们对文件进行读写之后不关闭文…...
python 解析
list(pd.DataFrame) # 所有列名切片:print("显式 切片:\n", df.loc[:, "number":"sum"]) 所有行,列是从number 到sum ,前闭后开print("隐式 切片:\n", df.iloc[:, 1:3]) # 结果和上面一样转化成字典…...

谷歌aab包在Android 14闪退而apk没问题(targetsdk 34)
问题原因 Unity应用(target SDK 34)上线到GooglePlay,有用户反馈fold5设备上(Android14系统)疯狂闪退,经测试,在小米手机Android14系统的版本复现成功了,奇怪的是apk直接安装没问题,而打包成aa…...
34.在排序数组中查找元素的第一个和最后一个位置
34.在排序数组中查找元素的第一个和最后一个位置 给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target,返回 [-1, -1]。 你必须设计并实现时间复杂度为…...
js树过滤
// 递归过滤得到每一项的hidden为false的数据 function filterTree(arr) { return arr.filter(item > { if (item.children) { item.children filterTree(item.children) } if (!item.hidden) { return true } }) }...

Java多线程并发篇----第十六篇
系列文章目录 文章目录 系列文章目录前言一、线程等待(wait)二、线程睡眠(sleep)三、线程让步(yield)四、线程中断(interrupt)五、Join 等待其他线程终止前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这…...

测评结果:免费的“文心一言3.5”香,但是付费的产品质量更高
文章目录 前言一、文心一言3.5生成的图片和文章1.文心一言生成的图片在文心一言3.5中输入以下内容:我的测评结果: 2.文心一言生成的文章在文心一言3.5中输入以下内容:我的测评结果: 二、ChatGPT生成的图片和文章1.ChatGPT4.0 生成…...

Matlab GUI设计基础范例(可以一步一步跟着做)
我们要做一个GUI界面,可以选择peaks、membrane和sinc三种三维图数据,选择画出surf、mesh和contour三种图像。 打开GUI 每个版本打开方式可能都不一样,但有一个是相同的,就是在命令行输入guide回车。 绘制控件 大概就绘制成这样…...
@Transactional(rollbackFor = {Exception.class})与 @Transactional区别
在Spring框架中,Transactional 注解用于标记方法或类,以表明该方法或类内包含的数据库操作应当在一个事务中执行。事务的基本原则是“原子性”,即所有操作要么全部成功,要么全部失败。 1. Transactional(不指定 rollb…...

数据结构——二叉树(先序、中序、后序及层次四种遍历(C语言版))超详细~ (✧∇✧) Q_Q
目录 二叉树的定义: *特殊的二叉树: 二叉树的性质: 二叉树的声明: 二叉树的先序遍历: 二叉树的中序遍历: 二叉树的后序遍历: 二叉树的层序遍历: 二叉树的节点个数: 二叉…...

如何快速打造属于自己的接口自动化测试框架
1 接口测试 接口测试是对系统或组件之间的接口进行测试,主要是校验数据的交换,传递和控制管理过程,以及相互逻辑依赖关系。 接口自动化相对于UI自动化来说,属于更底层的测试,这样带来的好处就是测试收益更大ÿ…...

人工智能在数据安全中的应用场景
场景一:数据资产梳理 数据资产梳理是数据安全的基础。知道企业究竟有多少数据,这些数据在哪里?有哪些类型的数据?其中哪些是敏感数据?这些数据的敏感等级分别是什么?只有明确了保护的目标,才能…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

给网站添加live2d看板娘
给网站添加live2d看板娘 参考文献: stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下,文章也主…...

【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...
2025年低延迟业务DDoS防护全攻略:高可用架构与实战方案
一、延迟敏感行业面临的DDoS攻击新挑战 2025年,金融交易、实时竞技游戏、工业物联网等低延迟业务成为DDoS攻击的首要目标。攻击呈现三大特征: AI驱动的自适应攻击:攻击流量模拟真实用户行为,差异率低至0.5%,传统规则引…...

CTF show 数学不及格
拿到题目先查一下壳,看一下信息 发现是一个ELF文件,64位的 用IDA Pro 64 打开这个文件 然后点击F5进行伪代码转换 可以看到有五个if判断,第一个argc ! 5这个判断并没有起太大作用,主要是下面四个if判断 根据题目…...
学习 Hooks【Plan - June - Week 2】
一、React API React 提供了丰富的核心 API,用于创建组件、管理状态、处理副作用、优化性能等。本文档总结 React 常用的 API 方法和组件。 1. React 核心 API React.createElement(type, props, …children) 用于创建 React 元素,JSX 会被编译成该函数…...
【系统架构设计师-2025上半年真题】综合知识-参考答案及部分详解(回忆版)
更多内容请见: 备考系统架构设计师-专栏介绍和目录 文章目录 【第1题】【第2题】【第3题】【第4题】【第5题】【第6题】【第7题】【第8题】【第9题】【第10题】【第11题】【第12题】【第13题】【第14题】【第15题】【第16题】【第17题】【第18题】【第19题】【第20~21题】【第…...

联邦学习带宽资源分配
带宽资源分配是指在网络中如何合理分配有限的带宽资源,以满足各个通信任务和用户的需求,尤其是在多用户共享带宽的情况下,如何确保各个设备或用户的通信需求得到高效且公平的满足。带宽是网络中的一个重要资源,通常指的是单位时间…...

数据库管理与高可用-MySQL故障排查与生产环境优化
目录 #1.1MySQL单案例故障排查 1.1.1MySQL常见的故障排查 1.1.2MySQL主从故障排查 #2.1MySQL优化 2.1.1硬件方面的优化 2.1.2进程方面的优化 #3.1MySQL存储引擎 3.1.1 MyISAM存储引擎 3.1.2 InnoDB存储引擎 1.1MySQL单案例故障排查 1.1.1MySQL常见的故障排查 (1&…...