用Python实现股票数据分析

要求

1、文件“600519.csv”可以从网址
“http://quotes.money.163.com/service/chddata.html?code=0600519&start=20010827
&end=20221115&fields=TCLOSE;HIGH;LOW;TOPEN;LCLOSE;CHG;PCHG;TURNOVER;VOT
URNOVER;VATURNOVER;TCAP;MCAP”下载

2、根据上面的网址,编写程序自动下载中证白酒指数中 17 支股票的数据(即下载 17 个 csv 文件),每支股票的数据应该是从上市起至 2022 年 11 月 29 日。具体的股票列表为:

序号股票编号股票名称
1600197伊力特
2600809山西汾酒
3000799酒鬼酒
4600519贵州茅台
5600779水井坊
6600559老白干酒
7000858五粮液
8002304洋河股份
9600199金种子酒
10000860顺鑫农业
11000596古井贡酒
12000568泸州老窖
13002646天佑德酒
14603369今世缘
15603198迎驾贡酒
16603589口子窖
17603919金微酒

3、读取所下载的 17 个 csv 文件中有关股票的数据,将数据保存至一个 sqlite3 的数据 库中(sqlite3 的教程及接口示例可参见 https://www.runoob.com/sqlite/sqlitetutorial.html)。

4、使用 DTW(Dynamic Time Warping)算法计算贵州茅台(600519)与其它 16 支股票的距离,并将这 16 个距离打印在屏幕上。

5、从 sqlite3 数据库中读取数据,设计并实现一组命令行下的选择列表,用户通过此列表可以首先选择一只股票,然后可以完成如下的功能:
i. 显示某个输入的日期的当日数据。(注:当日数据应包括日期、开盘、最高、最低、收盘、成交量、成交额)
ii. 显示收盘价高于某个输入的价格的所有日期。
iii. 显示股价波动高于某个输入的值的所有日期。(注:股价波动即为最高价减去最低价的值)
iv. 显示成交量高于某个输入的值的所有日期。
v. 显示成交额高于某个输入的值的所有日期。
vi. 使用 Matplotlib 库,将所有日期的收盘价格绘制并显示在一张图片上。
vii. 使用 Matplotlib 库,将每周最后一个有效果交易日的收盘价格绘制并显示在一张图片上。
viii. 使用 Matplotlib 库,将每月最后一个有效果交易日的收盘价格绘制并显示在一张图片上。


代码实现

从网上下载需要的csv文件

def download_csv():
    stock_code_list = ['600197', '600809', '000799', '600519', '600779', '600559', '000858', '002304', '600199', '000860', '000596', '000568', '002646', '603369', '603198', '603589', '603919']
    file_path = 'D:\WorkingFile\IoTCloud\csvFile'  # 下载后csv文件的存放路径
    if not os.path.exists(file_path):  # 如果该路径不存在
        os.mkdir(file_path)  # 自动建立一个用于存放csv文件的文件夹
    for stock_code in stock_code_list:
        url1 = "http://quotes.money.163.com/trade/lsjysj_" + stock_code + ".html#01b07"
        req = requests.get(url1)  # 抓取网页信息  构造一个向服务器请求资源的url1对象,返回的是一个包含服务器资源的Response对象,包含了从服务器返回的所有的相关资源
        req.encoding = "utf-8"
        html = req.text
        string = str(html)
        pattern = re.compile(r'(?<=STOCKCODE = \')+\d*')
        a = pattern.findall(string)  # 返回string类型中与pattern相匹配的全部字符串,返回形式为数组
        pattern1 = re.compile(r'(?<=name=\"date\_start\_type\" value=\")+\d*\-\d*\-\d*')  # 股票上市日期
        b = pattern1.findall(string)
        str1 = b[0].strip().replace('-', '')  # 上市时间
        pattern2 = re.compile(r'(?<=name=\"date\_end\_type\" value=\")+\d*\-\d*\-\d*')  # 股票当前日期
        c = pattern2.findall(string)
        str2 = c[0].strip().replace('-', '')  # 直至到当前时间
        url2 = "http://quotes.money.163.com/service/chddata.html?code=" + a[
            0] + "&start=" + str1 + "&end=" + str2 + "&fields=TCLOSE;HIGH;LOW;TOPEN;LCLOSE;CHG;PCHG;TURNOVER;VOTURNOVER;VATURNOVER;TCAP;MCAP"
        wget.download(url2, file_path)  # 自动从网站下载需要的csv文件
    print("CSV文件下载成功!")

创建表

def creat_table():
    file_list = scan_file('D:\WorkingFile\IoTCloud\csvFile')
    cur.execute("""CREATE TABLE IF NOT EXISTS stocks
               (日期   TEXT,
               股票代码   TEXT,
               名称     TEXT,
               收盘价    REAL,
               最高价    REAL,
               最低价    REAL,
               开盘价    REAL,
               前收盘    REAL,
               涨跌额    REAL,
               涨跌幅    REAL,
               换手率    REAL,
               成交量    FLOAT,
               成交金额    FLOAT,
               总市值    FLOAT,
               流通市值    FLOAT);""")
    for csv_file in file_list:
        fr = open(csv_file, mode="r", encoding="gbk")
        reader = csv.reader(fr)
        header = next(reader)
        data = []
        for row in reader:
            a = (row[0], row[1], row[2], row[3], row[4], row[5], row[6], row[7],
                 row[8], row[9], row[10], row[11], row[12], row[13], row[14])
            data.append(a)
        sql1 = """INSERT INTO stocks(日期,股票代码,名称,收盘价,最高价,最低价,开盘价,前收盘,涨跌额,涨跌幅,换手率,成交量,成交金额,总市值,流通市值)
                        values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"""
        cur.executemany(sql1, data)
        fr.close()  # 关闭CSV文件

选择股票

def choose_stock():
    print("-" * 44)
    print("目前有以下股票可以提供选择:")
    print("   a.伊力特     b.山西汾酒     c.酒鬼酒     d.贵州茅台     e.水井坊")
    print("   f.老白干酒    g.五粮液      h.洋河股份    i.金种子酒     j.顺鑫农业")
    print("   k.古井贡酒    l.泸州老窖     m.天佑德酒    n.今世缘      o.迎驾贡酒")
    print("   p.口子窖     q.金徽酒")

    while True:
        options = input("请输入想要选择的股票:")
        if options == "a":
            stock_name = '伊力特'
            print("您目前选择的股票名称为伊力特!")
            return stock_name
            break
        elif options == "b":
            stock_name = '山西汾酒'
            print("您目前选择的股票名称为山西汾酒!")
            return stock_name
            break
        elif options == "c":
            stock_name = '酒鬼酒'
            print("您目前选择的股票名称为酒鬼酒!")
            return stock_name
            break
        elif options == "d":
            stock_name = '贵州茅台'
            print("您目前选择的股票名称为贵州茅台!")
            return stock_name
            break
        elif options == "e":
            stock_name = '水井坊'
            print("您目前选择的股票名称为水井坊!")
            return stock_name
            break
        elif options == "f":
            stock_name = '老白干酒'
            print("您目前选择的股票名称为老白干酒!")
            return stock_name
            break
        elif options == "g":
            stock_name = '五粮液'
            print("您目前选择的股票名称为五粮液!")
            return stock_name
            break
        elif options == "h":
            stock_name = '洋河股份'
            print("您目前选择的股票名称为洋河股份!")
            return stock_name
            break
        elif options == "i":
            stock_name = '金种子酒'
            print("您目前选择的股票名称为金种子酒!")
            return stock_name
            break
        elif options == "j":
            stock_name = '顺鑫农业'
            print("您目前选择的股票名称为顺鑫农业!")
            return stock_name
            break
        elif options == "k":
            stock_name = '古井贡酒'
            print("您目前选择的股票名称为古井贡酒!")
            return stock_name
            break
        elif options == "l":
            stock_name = '泸州老窖'
            print("您目前选择的股票名称为泸州老窖!")
            return stock_name
            break
        elif options == "m":
            stock_name = '天佑德酒'
            print("您目前选择的股票名称为天佑德酒!")
            return stock_name
            break
        elif options == "n":
            stock_name = '今世缘'
            print("您目前选择的股票名称为今世缘!")
            return stock_name
            break
        elif options == "o":
            stock_name = '迎驾贡酒'
            print("您目前选择的股票名称为迎驾贡酒!")
            return stock_name
            break
        elif options == "p":
            stock_name = '口子窖'
            print("您目前选择的股票名称为口子窖!")
            return stock_name
            break
        elif options == "q":
            stock_name = '金徽酒'
            print("您目前选择的股票名称为金徽酒!")
            return stock_name
            break
        else:
            print("您选择的股票不存在!请重新输入!")

菜单

def menu():
    print("-" * 20 + "菜单" + "-" * 20)
    print("1.显示某个输入的日期的当日数据")
    print("2.显示收盘价高于某个输入的价格的所有日期")
    print("3.显示股价波动高于某个输入的值的所有日期")
    print("4.显示成交量高于某个输入的值的所有日期")
    print("5.显示成交额高于某个输入的值的所有日期")
    print("6.所有日期的收盘价格浮动图")
    print("7.每周最后一个有效果交易日的收盘价格浮动图")
    print("8.每月最后一个有效果交易日的收盘价格浮动图")
    print("9.贵州茅台股票与其它16支股票的距离")
    print("10.显示所有数据")
    print("11.重新选择股票进行操作")
    print("0.退出程序")
    print("-" * 44)

显示某个输入的日期的当日数据

def show_someday_data():
    in_date = input("请输入日期(例:2021-09-09):")
    print("{0}的数据为".format(in_date))
    print("股票名为“{0}”在{1}的数据为".format(stock_name, in_date))
    cur.execute('SELECT * FROM stocks WHERE 日期 = ? and 名称 = ?', (in_date, stock_name,))
    print(cur.fetchall())

显示收盘价高于某个输入的价格的所有日期

def show_highprice_date():
    price = input("请输入价格:")
    print("名为{0}的股票有以下日期的收盘价高于{1}:".format(stock_name, price))
    cur.execute('SELECT 日期 FROM stocks WHERE 收盘价 > ? and 名称 = ?', (price, stock_name))
    print(cur.fetchall())

显示股价波动高于某个输入的值的所有日期

def show_highvolatility_date():
    volatility = float(input("请输入波动值:"))
    print("名为{0}的股票有以下日期的波动值高于{1}:".format(stock_name, volatility))
    cur.execute('SELECT 日期 FROM stocks WHERE (最高价-最低价) > ? and 名称 = ?', (volatility, stock_name))
    print(cur.fetchall())

显示成交量高于某个输入的值的所有日期

def show_highvolume_date():
    volume = input("请输入成交量:")
    print("名为{0}的股票有以下日期的成交量高于{1}:".format(stock_name, volume))
    cur.execute('SELECT 日期 FROM stocks WHERE 成交量 > ? and 名称 = ?', (volume, stock_name))
    print(cur.fetchall())

显示成交金额高于某个输入的值的所有日期

def show_highturnover_date():
    turnover = input("请输入成交金额:")
    print("名为{0}的股票有以下日期的成交金额高于{1}:".format(stock_name, turnover))
    cur.execute('SELECT 日期 FROM stocks WHERE 成交金额 > ? and 名称 = ?', (turnover, stock_name))
    print(cur.fetchall())

显示所有数据

def show_all_datas():
    print("名为{0}的股票的所有数据为:".format(stock_name))
    cur.execute('SELECT * FROM stocks WHERE 名称 = ?', (stock_name,))
    print(cur.fetchall())

所有日期的收盘价格浮动图

def show_all_closePrice():
    x1 = []
    y1 = []
    cur.execute("SELECT 日期 FROM stocks WHERE 名称 = ?", (stock_name,))
    x = cur.fetchall()  # 将获取得到的日期结果返回一个二维元组x
    for i in x:
        x1.append(i[0])  # 把得到的日期放入列表 x1
    x1.reverse()  # 对列表x1内的元素(日期)进行反向排序
    cur.execute("SELECT 收盘价 FROM stocks WHERE 名称 = ?", (stock_name,))
    y = cur.fetchall()  # 将获取得到的收盘价结果返回一个二维数组
    for i in y:
        y1.append(i[0])  # 把得到的收盘价放入列表 y1
    y1.reverse()  # 对列表y1内的元素(收盘价)进行反向排序
    plt.figure(figsize=(20, 8), dpi=72)  # 图片的宽为20英寸,高为8英寸,分辨率为72(即每英寸72个像素)
    plt.xticks(rotation=45)  # x轴的刻度下的文本,即日期文本旋转逆时针45度,防止日期过长造成文本间粘连
    aa = range(0, len(x1), 180)  # x轴坐标从0开始,刻度相隔180个元素,直至列表x1最后一个元素;len(x1)求列表x1的元素个数
    plt.xticks(aa)  # 返回x轴刻度值aa
    plt.plot(x1, y1, 'b')  # 用列表x1的元素打印x轴,列表y1的元素打印y轴,曲线颜色为b(蓝色)
    plt.title('{0}所有日期的收盘价格'.format(stock_name), fontsize='xx-large', fontweight='heavy')  # 图像标题大小为xx-large,字体粗细为heavy
    plt.xlabel("所有日期", fontproperties="SimHei")  # 为x轴设置标签文本“所有日期”,字体为黑体
    plt.ylabel("收盘价", fontproperties="SimHei")  # 为y轴设置标签文本“收盘价”,字体为黑体
    plt.show()  # 显示图像

每周最后一个有效交易日的收盘价格浮动图

def show_weeks_closePrice():
    x1 = []
    x2 = []
    y1 = []
    cur.execute("SELECT 日期 FROM stocks WHERE 名称 = ?", (stock_name,))
    x = cur.fetchall()  # 将获取得到的日期结果返回一个二维元组
    for i in x:
        x1.append(i[0])  # 把得到的日期放入列表 x1
    x1.reverse()  # 对列表x1内的元素(日期)进行反向排序
    for i in range(len(x1)):
        if pendulum.parse(x1[i]).day_of_week - pendulum.parse(x1[i - 1]).day_of_week != 1:  # 用 列表x1的日期x1[i] 减 x1[i]的前一个日期x1[i-1],得到结果不为1,则x1[i-1]为每周的最后一个有效交易日
            x2.append(x1[i - 1])  # 把每周最后一个有效交易日的日期放入列表x2
    for i in x2:
        cur.execute("SELECT 收盘价 FROM stocks where 日期 = ? and 名称 = ?", (i, stock_name))
        y = cur.fetchall()  # 将最后获取得到的每周最后一个有效交易日的收盘价结果返回一个二维元组y
        for i in y:
            y1.append(i[0])  # 把得到的收盘价放入列表 y1
    plt.figure(figsize=(20, 8), dpi=72)  # 图片的宽为20英寸,高为8英寸,分辨率为72(即每英寸72个像素)
    plt.xticks(rotation=45)  # x轴的刻度下的文本,即日期文本旋转逆时针45度,防止日期过长造成文本间粘连
    aa = range(0, len(x2), 20)  # x轴坐标从0开始,刻度相隔20个元素,直至列表x2最后一个元素;len(x2)求列表x2的元素个数
    plt.xticks(aa)  # 返回x轴刻度值aa
    plt.plot(x2, y1, 'b')  # 用列表x2的元素打印x轴,列表y1的元素打印y轴,曲线颜色为b(蓝色)
    plt.title('{0}每周最后一个有效交易日的收盘价格'.format(stock_name), fontsize='xx-large', fontweight='heavy')  # 图像标题大小为xx-large,字体粗细为heavy
    plt.xlabel("周最后一个有效交易日期", fontproperties="SimHei")  # 为x轴设置标签文本“周最后一个有效交易日期”,字体为黑体
    plt.ylabel("收盘价", fontproperties="SimHei")  # 为y轴设置标签文本“收盘价”,字体为黑体
    plt.show()  # 显示图像

每月最后一个有效交易日的收盘价格浮动图

def show_month_closePrice():
    x1 = []
    x2 = []
    y1 = []
    cur.execute("SELECT 日期 FROM stocks WHERE 名称 = ?", (stock_name,))
    x = cur.fetchall()  # 将获取得到的日期结果返回一个二维元组
    for i in x:
        x1.append(i[0])  # 把得到的日期放入列表 x1
    x1.reverse()  # 对列表x1内的元素(日期)进行反向排序
    for i in range(len(x1)):
        if pendulum.parse(x1[i]).month != pendulum.parse(x1[i-1]).month:  # 如果 后一个日期x1[i]的月份 和 前一个日期x1[i-1]的月份不相等,则前一个日期x1[i-1]为每月的最后一个有效期
            x2.append(x1[i-1])  # 把每月最后一个有效交易日的日期放入列表x2
    for i in x2:
        cur.execute("SELECT 收盘价 FROM stocks where 日期 = ? and 名称 = ?", (i, stock_name))
        y = cur.fetchall()  # 将最后获取得到的每月最后一个有效交易日的收盘价结果返回一个二维元组y
        for i in y:
            y1.append(i[0])
    plt.figure(figsize=(20, 8), dpi=72)  # 图片的宽为20英寸,高为8英寸,分辨率为72(即每英寸72个像素)
    plt.xticks(rotation=45)  # x轴的刻度下的文本,即日期文本旋转逆时针45度,防止日期过长造成文本间粘连
    aa = range(0, len(x2), 20)  # x轴坐标从0开始,刻度相隔20个元素,直至列表x2最后一个元素;len(x2)求列表x2的元素个数
    plt.xticks(aa)  # 返回x轴刻度值aa
    plt.plot(x2, y1, 'b')  # 用列表x2的元素打印x轴,列表y1的元素打印y轴,曲线颜色为b(蓝色)
    plt.title('{0}每月最后一个有效交易日的收盘价格'.format(stock_name), fontsize='xx-large', fontweight='heavy')  # 图像标题大小为xx-large,字体粗细为heavy
    plt.xlabel("月最后一个有效交易日期", fontproperties="SimHei")  # 为x轴设置标签文本“月最后一个有效交易日期”,字体为黑体
    plt.ylabel("收盘价", fontproperties="SimHei")  # 为y轴设置标签文本“收盘价”,字体为黑体
    plt.show()  # 显示图像

使用DTW算法计算贵州茅台(600519)与其它 16 支股票的距离

def dtw_distance():
    mt1 = []  # 用于存放贵州茅台的数据
    ot1 = []  # 用于存放其它股票的数据
    n = 0
    maotai = '贵州茅台'
    stock_name_list = ('伊力特', '山西汾酒', '酒鬼酒', '水井坊', '老白干酒', '五粮液', '洋河股份', '金种子酒', '顺鑫农业',
                       '古井贡酒', '泸州老窖', '天佑德酒', '今世缘', '迎驾贡酒', '口子窖', '金徽酒')
    for name in stock_name_list:
        cur.execute("SELECT 收盘价 FROM stocks WHERE 名称 = ?", (maotai,))
        mt = cur.fetchall()
        for i in mt:
            mt1.append(i[0])  # 贵州茅台
        cur.execute("SELECT 收盘价 FROM stocks WHERE 名称 = ?", (name,))
        ot = cur.fetchall()
        for i in ot:
            ot1.append(i[0])  # 其它股票
        n = n + 1
        distance, path = fastdtw(mt1, ot1)  # 计算距离
        print("{}、‘贵州茅台’与‘{}’的收盘价距离为:{}".format(n, name, distance))

效果演示

1.自动从网站上下载csv文件
自动从网站上下载csv文件
2.贵州茅台(600519)与其它 16 支股票的距离
贵州茅台(600519)与其它 16 支股票的距离-1
贵州茅台(600519)与其它 16 支股票的距离-2
3.显示某个输入的日期的当日数据
显示某个输入的日期的当日数据
4.显示收盘价高于某个输入价格的所有日期
显示收盘价高于某个输入价格的所有日期
5.显示股价波动高于某个输入的价格的所有日期
显示股价波动高于某个输入的价格的所有日期
6.显示成交量高于某个输入的值的所有日期
显示成交量高于某个输入的值的所有日期
7.显示成交额高于某个输入的值的所有日期
显示成交额高于某个输入的值的所有日期
8.绘制所有日期的收盘价格图
绘制所有日期的收盘价格图
9.绘制每周最后一个有效交易日的收盘价格图
绘制每周最后一个有效交易日的收盘价格图
10.绘制每月最后一个有效交易日的收盘价格图
绘制每月最后一个有效交易日的收盘价格图

  • 完整代码下载:

https://download.csdn.net/download/qq_52353051/87852276



  • 8
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值