游戏网站风控怎么做,全国工商登记网,三五互联做的网站怎么样,wordpress侧边栏提示跳转到根目录#xff1a;知行合一#xff1a;投资篇
已完成#xff1a; 1、投资技术 1.1.1 投资-编程基础-numpy 1.1.2 投资-编程基础-pandas 1.2 金融数据处理 1.3 金融数据可视化 2、投资方法论 2.1.1 预期年化收益率 2.1.2 一个关于yaxb的…跳转到根目录知行合一投资篇
已完成 1、投资技术 1.1.1 投资-编程基础-numpy 1.1.2 投资-编程基础-pandas 1.2 金融数据处理 1.3 金融数据可视化 2、投资方法论 2.1.1 预期年化收益率 2.1.2 一个关于yaxb的故事 3、投资实证 [3.1 2023这一年] 被鸽 文章目录 1. 系统自己画最佳拟合线1.1. 沪深300的最佳拟合线1.2. 横向对比一个个算1.3. 横向对比数据标准化1.4. 看图说话 2. 系统自己算线性回归2.1. 沪深300线性回归斜率0.000994142.2. 沪深300线性回归的年化年化8.5%2.3. 沪深300首尾点的年化4.72%2.4. 中证500线性回归斜率0.00082.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 npsh300qs.get_data(510300)
# 因为设想中x轴可以是一个顺序的数组比如从0开始往后数step为1。这其实就是暗合着随着时间的增加close是否能拟合一条向上的直线
sh300[day] np.arange(0, sh300.shape[0], 1)sns.set_style(white)
gridobj sns.lmplot(xday, yclose, datash300, ci95, scatter_kws{color: orange}, line_kws{color: green}, markerso)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:dfqs.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(xday, yclose, datadf, hue标的, ci95, scatter_kws{color: orange}, line_kws{color: green}, markerso)这里要说明一下上面其实是一个个图生成的然后我一张张图拼接起来的结果。
如果想直接横向着来看还需要对数据进行标准化处理如果不进行标准化那比如不同标的的收盘价差异很大有的是十几块像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]}, inplaceTrue) # 用股票的名字来重命名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], axis0)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(xday, yclose,datadf_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此时反而要去掉normalizeTrue这个参数。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegressiondfqs.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就是yaxb的a
print( model.intercept_ ) # 截距 1.9就是yaxb的b# 根据上面计算的结果我们绘制一个收盘价走势图和一条yaxb的直线
plt.plot( x, y, linestyle-, colorgreen )
plt.plot(x, 0.00099414*x 1.9, linestyle--, colorr) # 这个是根据最后计算的“斜率”和“截距”再叠加绘制的斜线 2.2. 沪深300线性回归的年化年化8.5%
之前计算的沪深300最佳拟合的直线斜率和截距
plt.plot(x, 0.00099414*x 1.9, linestyle--, colorr) # 这个是根据最后计算的“斜率”和“截距”再叠加绘制的斜线沪深300如果按照上面的直线来看那
起始点1.9
终点yaxb即y0.00099414*x 1.9最后的x其实是x轴的个数是df.shape[0]也就是行数x2832那么计算的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, year11.105882352941176年化收益率0.08528951903544792.3. 沪深300首尾点的年化4.72%
如果不考虑中间的波动那沪深300的年化收益率计算
import pandas as pd
import mathdfqs.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, year11.105882352941176年化收益率0.0472112143753093962.4. 中证500线性回归斜率0.0008
对比看下中证500斜率如何
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegressiondfqs.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就是yaxb的a
print( model.intercept_ ) # 截距 4.353948387096773就是yaxb的b# 根据上面计算的结果我们绘制一个收盘价走势图和一条yaxb的直线
plt.plot( x, y, linestyle-, colorgreen )
plt.plot(x, 0.00080245*x 4.353948387096773, linestyle--, colorr) # 这个是根据最后计算的“斜率”和“截距”再叠加绘制的斜线 2.5. 中证500线性回归的年化
计算中证500最佳拟合的直线斜率和截距
plt.plot(x, 0.00080245*x 4.353948387096773, linestyle--, colorr) # 这个是根据最后计算的“斜率”和“截距”再叠加绘制的斜线起始点4.353948387096773
终点yaxb即y0.00080245*x 4.353948387096773最后的x其实是x轴的个数是df.shape[0]也就是行数x2635那么计算的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, year10.333333333333334年化收益率0.0390509077382028562.6. 中证500首尾点的年化
中证500年化收益率
import pandas as pd
import mathdfqs.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, year10.333333333333334年化收益率0.0554997995509485253. 总结
如果用最佳拟合直线那么沪深300的年化是8.5%中证500的年化是3.9%
如果是按照收盘价的首尾点来计算那么沪深300的年化是4.72%中证500的年化是5.55%
为什么最佳拟合直线和首尾点计算的年化差异这么大还是因为今天2024年1月15日收盘价跟最佳拟合直线的差距很大自然会有很大的偏差如果哪天能所谓的“价值回归”或是就应该是这个价那2者会慢慢合理起来。
波动很大但是最终的结果还是能达到5%左右的年化收益率。