股票回歸分析


數據源:使用Pandas中的DataReader調用金融數據的API

場景:選取上證綜指(000001.ss)和貴州茅台(600519.ss)股票進行分析,計算兩者每日收益率,並且對兩者的收益率進行線性回歸分析。

注1:嚴格說上證綜指是綜合指數,不是單一的股票。

注2:股票代碼參考https://cn.investing.com/indices/shanghai-composite-components

 完整代碼:

# 回歸分析(這里用到的statsmodels是統計學里面的包)
# statsmodels用於擬合多種統計模型,執行統計測試以及數據探索和可視化
# statsmodels.api共有6個方法/函數/屬性
import statsmodels.api as sm
# Pandas庫提供了專門從財經網站獲取金融數據的API接口
from pandas_datareader.data import DataReader
import pandas as pd
import datetime
# OS模塊簡單的來說它是一個Python的系統編程的操作模塊,可以處理文件和目錄這些我們日常手動需要做的操作
import os
# matplotlib是Python 的繪圖庫  matplotlib.pyplot是一個有命令風格的函數集合
import matplotlib.pyplot as plt

# 設置起止時間(獲取此時間范圍內的股市信息)
start = datetime.datetime(2019, 1, 1)
end = datetime.datetime(2019, 12, 31)


# 讀取上證綜指 及 貴州茅台
def load_data():
    # 判斷目錄或文件是否存在
    if os.path.exists('000001.csv'):
        data_ss = pd.read_csv('000001.csv')
        data_tlz = pd.read_csv('600519.csv')
    else:
        # 000001 上證綜指(綜合指數)
        data_ss = DataReader("000001.ss", "yahoo", start, end)
        # 600519 貴州茅台股票 上證
        data_mt = DataReader("600519.ss", "yahoo", start, end)
        data_ss.to_csv('000001.csv')
        data_mt.to_csv('600519.csv')
    return data_ss, data_tlz


data_ss, data_tlz = load_data()
print(data_ss.head())
print(data_tlz.head())
# 兩個DataFrame對象連接到一起
stock = pd.merge(data_ss, data_tlz, left_index=True, right_index=True)

print(stock.head())
# 把Close_x和Close_y兩列的數據取出來,重新賦值給stock
stock = stock[['Close_x', 'Close_y']]

print(stock.head())
# 給stock列名改一下名字
stock.columns = ['上證綜指', '貴州茅台']
print(stock.head())
print(type(stock))
# 計算每日收益率(.dropna()表示刪除缺失值,即NaN)
# 每日收益率=(今日股價-上日股價)/上日股價
daily_return = (stock.diff() / stock.shift(periods=1)).dropna()
# 默認periods=1,axis=0;  periods=1表示移動一個距離,axis=0表示按縱軸方向移動
# stock.shift(periods=1,axis=0)
print(daily_return.head())
# 收益率生成csv文件
daily_return.to_csv('shouYiLv.csv')
print('每日收益>10%')
# 國內股市,每日漲跌不會突破10%,所以>0.1的返回值為空
print(daily_return[daily_return['貴州茅台'] > 0.1])

# 圖示漲跌幅
# plt.subplots可以將父圖像分解為兩個子圖像
# fig: matplotlib.figure.Figure 對象
# ax:子圖對象( matplotlib.axes.Axes)或者是他的數組
# nrows=1, ncols=2表示分解為一行兩列的兩個圖像
# figsize設置圖像大小
fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(15, 6))
# 將上證綜指這一列在matplotlib上繪圖,繪制在ax[0]上
daily_return['上證綜指'].plot(ax=ax[0])
# 設置ax[0]的圖像標題
ax[0].set_title('shangzheng')

# 將貴州茅台這一列在matplotlib上繪圖,繪制在ax[1]上
daily_return['貴州茅台'].plot(ax=ax[1])
# 設置ax[1]的圖像標題
ax[1].set_title('maotai')
# 圖像展示出來
plt.show()
# print(stock)

# 在線百性回歸以及廣義線性回歸中,R-squared誤差的大小意味着模型的擬合度的好壞,
# R-squared誤差取值范圍為0到1,這個值越接度近1說明模型的擬合回度越好。
# R-squared越大,線性回歸的價值越高,相關性越高

# 加入截距項(系數1.0表示帶截距的意思)
daily_return["intercept"] = 1.0
# print(daily_return.head())

# OLS:Ordinary Least Squares 普通最小二乘法
# 截距b的系數為1
# y:貴州茅台(每日收益率),kx 上證綜指(每日收益率) + b*1
model = sm.OLS(daily_return["貴州茅台"], daily_return[["上證綜指", "intercept"]])
# 擬合數據,目的是學習得到參數
results = model.fit()

# 結果摘要信息輸出
print(results.summary())

上證綜指數據:000001.csv

貴州茅台數據:600519.csv

2019.1.1-2019.10.31上證指數、貴州茅台,每日收益率曲線圖:

線性回歸結果:

總結:

1. load_data()方法用於判斷上證綜指和貴州茅台的數據是否存在,因為是從yahoo拿數據,每次都從yahoo拿會有點慢,所以建議保存到本地。

2. R-squared越大,線性回歸的價值越高,相關性越高,由結果圖可知R-squared只有0.329,說明兩者相關性不是很大,可能影響因素比較多導致的。

 

如有不對的地方,歡迎批評指正


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM