通过baostock数据平台获取了货币供应量M1和M2的历史数据,并且获取了相同时间内上证综合指数的数据,来分析两者是不是存在关联。
绘制出图像如下,可以看出两者几乎没有什么相关性,货币供应量一直稳定地在增长,从80万亿一直增长到160万亿。几乎是一条直线,而上证指数的波动就比较大,时常有图上的暴涨暴跌。
代码如下:
import baostock as bs
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import datetime
def get_szzs_his_data(startDate, endDate):
"""获取历史上证指数数据"""
# 登陆系统
lg = bs.login()
# 显示登陆返回信息
print('login respond error_code:' + lg.error_code)
print('login respond error_msg:' + lg.error_msg)
# 获取上增指数
rs = bs.query_history_k_data("sh.000001",
"date,close",
start_date=startDate, end_date=endDate,
frequency="d", adjustflag="3")
print('query_history_k_data respond error_code:' + rs.error_code)
print('query_history_k_data respond error_msg:' + rs.error_msg)
# 打印结果集
data_list = []
while (rs.error_code == '0') & rs.next():
# 获取一条记录,将记录合并在一起
data_list.append(rs.get_row_data())
result = pd.DataFrame(data_list, columns=rs.fields)
# 登出系统
bs.logout()
return result
def get_money_supply(startDate, endDate):
# 获取货币供应量
# 登陆系统
lg = bs.login()
# 显示登陆返回信息
print('login respond error_code:'+lg.error_code)
print('login respond error_msg:'+lg.error_msg)
# 获取货币供应量
rs = bs.query_money_supply_data_month(
start_date=startDate, end_date=endDate)
print('query_money_supply_data_month respond error_code:'+rs.error_code)
print('query_money_supply_data_month respond error_msg:'+rs.error_msg)
# 打印结果集
data_list = []
while (rs.error_code == '0') & rs.next():
# 获取一条记录,将记录合并在一起
data_list.append(rs.get_row_data())
result = pd.DataFrame(data_list, columns=rs.fields)
# 登出系统
bs.logout()
return result
def plot_two_curve_line(tradingDateList, y1, y2, titletext='pic', y1name=u'y1', y2name=u'y2'):
"""根据日期,画出相同时间序列的两个值的曲线"""
# 将不同量纲的两个值转化为相似的数量级
multi_num = y1[-1] / y2[-1]
y2 = [y * multi_num for y in y2]
x1 = range(len(tradingDateList))
datelable = []
for i_days in range(len(tradingDateList)):
tradingdate = tradingDateList[i_days]
date = int(tradingdate[8:])
# print date
# if date %10 == 0:
if date == 1:
datelable.append(tradingdate)
else:
datelable.append("")
x1 = np.array(x1)
y1 = np.array(y1)
y2 = np.array(y2)
fig, ax = plt.subplots()
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
plt.xticks(x1, datelable, rotation=30)
ax.plot(x1, y1, color='r', label=y1name)
ax.plot(x1, y2, color='y', label=y2name)
plt.title(titletext)
# plt.legend((y1name, y2name))
# 显示在右上角
ax.legend(loc=1)
plt.show()
def plot_money_supply_and_szzs():
""" 画出szzs和货币供应量之间的相关指数 """
startdate = "2012-01-05"
endate = "2018-07-02"
szzsData = get_szzs_his_data(startdate, endate)
datelist = szzsData.loc[:, 'date']
close = szzsData.loc[:, 'close']
money_suppy_data = get_money_supply("2012-01", "2018-08")
money_supply_yearlist = money_suppy_data.loc[:, 'statYear'].astype('int')
money_supply_monthlist = money_suppy_data.loc[:, 'statMonth'].astype('int')
money_supply_data = money_suppy_data.loc[:, 'm2Month']
print(len(datelist), len(money_supply_yearlist), len(money_supply_data))
modified_datelist = []
modified_szzslist = []
modified_money_supply_hisdata = []
i = 0
j = 0
# 对其日期 将不同时间序列的数据 转化为同一时间序列的数据。
while True:
if i == len(datelist) and j == len(money_supply_yearlist):
break
szzs_stat_year = datetime.datetime.strptime(datelist[i], "%Y-%m-%d").year
szzs_stat_month = datetime.datetime.strptime(datelist[i], "%Y-%m-%d").month
# 如果szzs的日期和货币供应的年,月相等,则提取该值。
if szzs_stat_year == money_supply_yearlist[j] and szzs_stat_month == money_supply_monthlist[j]:
print(szzs_stat_year, money_supply_yearlist[j], szzs_stat_month, money_supply_monthlist[j])
modified_datelist.append(datelist[i])
modified_szzslist.append(float(close[i]))
modified_money_supply_hisdata.append(float(money_supply_data[j]))
i += 1
j += 1
elif szzs_stat_year < money_supply_yearlist[j] or (szzs_stat_year == money_supply_yearlist[j] and szzs_stat_month < money_supply_monthlist[j]):
i += 1
elif szzs_stat_year > money_supply_yearlist[j] or (szzs_stat_year == money_supply_yearlist[j] and szzs_stat_month > money_supply_monthlist[j]):
j += 1
else:
print(szzs_stat_year, money_supply_yearlist[j], szzs_stat_month, money_supply_monthlist[j])
print("error")
print(len(modified_datelist), len(
modified_money_supply_hisdata), len(modified_szzslist))
plot_two_curve_line(modified_datelist, modified_money_supply_hisdata, modified_szzslist, titletext=u'货币供应量和上证指数历史走势图', y1name=u'货币供应量M2(单位:亿元)',
y2name=u'上证指数')
if __name__ == '__main__':
plot_money_supply_and_szzs()