货币供应量M1M2与上证综合指数之间的相关性图示

标签: baostock  证券宝  免费财经数据  免费证券数据  货币供应量

通过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()

 

原文链接:加载失败,请重新获取