百度松果菁英班——机器学习实践六:股票行情爬取与分析

这篇具有很好参考价值的文章主要介绍了百度松果菁英班——机器学习实践六:股票行情爬取与分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

飞桨AI Studio星河社区-人工智能学习与实训社区

这篇文章好像有点大,所以上边网页点进去是看不到的,进入环境之后就能看了

🥪必要包的下载导入

!pip install fake_useragent
!pip install bs4
!cp /home/aistudio/simhei.ttf /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/mpl-data/fonts/ttf/
!cp  /home/aistudio/simhei.ttf  .fonts/
!rm -rf .cache/matplotlib

百度松果菁英班——机器学习实践六:股票行情爬取与分析,百度松果菁英班课程学习,百度,机器学习,人工智能,python,笔记,经验分享,pandas

🥪股票信息爬取

#coding=utf-8
'''
Created on 2021年02月20日
​
@author: zhongshan
'''
#http://quote.eastmoney.com/center/gridlist.html
#爬取该页面股票信息
​
import requests
from fake_useragent import UserAgent
from bs4 import BeautifulSoup 
import json
import csv
 
def getHtml(url):
    r = requests.get(url,headers={
        'User-Agent': UserAgent().random,
    })
    r.encoding = r.apparent_encoding
    return r.text
    
#num为爬取多少条记录,可手动设置
num = 20
#该地址为页面实际获取数据的接口地址
stockUrl='http://99.push2.eastmoney.com/api/qt/clist/get?cb=jQuery112408733409809437476_1623137764048&pn=1&pz=20&po=1&np=1&ut=bd1d9ddb04089700cf9c27f6f7426281&fltt=2&invt=2&fid=f3&fs=m:0+t:80&fields=f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f12,f13,f14,f15,f16,f17,f18,f20,f21,f23,f24,f25,f22,f11,f62,f128,f136,f115,f152&_=1623137764167:formatted'
if __name__ == '__main__':
    responseText = getHtml(stockUrl)
    jsonText = responseText.split("(")[1].split(")")[0];
    resJson = json.loads(jsonText)
    datas = resJson["data"]["diff"] 
    datalist = []
    for data in datas:
        # if (str().startswith('6') or str(data["f12"]).startswith('3') or str(data["f12"]).startswith('0')):
        row = [data["f12"],data["f14"]]
        datalist.append(row)
    print(datalist)     
            
    f =open('stock.csv','w+',encoding='utf-8',newline="")
    writer = csv.writer(f)
    writer.writerow(('代码', '名称'))
    for data in datalist:
        writer.writerow((data[0]+"\t",data[1]+"\t"))
    f.close()
  • 定义了一个函数getHtml(url),用于获取指定URL页面的HTML内容。使用requests.get()方法发送GET请求,通过fake_useragent生成随机的User-Agent来伪装请求头,避免被网站封禁IP。然后设置编码为页面的apparent_encoding,确保编码正确

  • 设置要爬取的记录条数num

  • 定义了变量stockUrl,该地址为页面实际获取数据的接口地址。通过该接口地址可以获取股票信息的JSON数据

  • 在主程序中,调用getHtml(stockUrl)方法获取页面的HTML内容

  • 解析HTML内容,提取出JSON数据。首先使用split()方法分割字符串,提取出JSON文本部分。然后使用json.loads()方法将JSON文本解析为Python字典

  • 从解析后的JSON数据中提取股票信息,并存储到列表datalist

  • 打开文件stock.csv,使用CSV模块创建一个写入对象writer,将股票信息写入CSV文件中

  • 遍历datalist列表,将每条股票信息写入CSV文件中

  • 关闭CSV文件

百度松果菁英班——机器学习实践六:股票行情爬取与分析,百度松果菁英班课程学习,百度,机器学习,人工智能,python,笔记,经验分享,pandas

🥪多线程并发下载股票数据文件并存储为CSV格式

import csv
import urllib.request as r
import threading
 
#读取之前获取的个股csv丢入到一个列表中
def getStockList():
    stockList = []
    f = open('stock.csv','r',encoding='utf-8')
    f.seek(0)
    reader = csv.reader(f)
    for item in reader:
        stockList.append(item)
    f.close()
    return stockList
 
def downloadFile(url,filepath):
    # print(filepath)
    try:
        r.urlretrieve(url,filepath)
    except Exception as e:
        print(e)
    print(filepath,"is downloaded")
    pass
 
#设置信号量,控制线程并发数
sem = threading.Semaphore(1)
def downloadFileSem(url,filepath):
    with sem:
        downloadFile(url,filepath)
 
urlStart = 'http://quotes.money.163.com/service/chddata.html?code='
urlEnd = '&end=20210221&fields=TCLOSE;HIGH;LOW;TOPEN;LCLOSE;CHG;PCHG;VOTURNOVER;VATURNOVER'
 
if __name__ == '__main__':
    stockList = getStockList()
    stockList.pop(0)
    print(stockList)
    for s in stockList:
        scode = str(s[0].split("\t")[0])
        #0:沪市;1:深市
        url = urlStart + ("0" if scode.startswith('6') else "1") + scode + urlEnd
        print(url)
        filepath = (str(s[1].split("\t")[0])+"_"+scode) + ".csv"
        threading.Thread(target=downloadFileSem,args=(url,filepath)).start()
  • 定义了一个新的函数getStockList(),用于从之前获取的个股CSV文件中读取数据,并将其存储到一个列表中。通过csv.reader()方法逐行读取CSV文件,并将每一行数据存储为一个列表,最后将所有列表存储到stockList

  • 定义了一个新的函数downloadFile(url, filepath),用于下载文件。通过urllib.request.urlretrieve()方法下载指定URL的文件,并保存到指定的路径

  • 引入了threading模块,用于创建线程实现多线程下载

  • 定义了一个信号量sem,用于控制线程并发数。在多线程环境下,为了避免资源竞争和死锁,可以使用信号量来限制同时执行的线程数量

  • 定义了一个新的函数downloadFileSem(url, filepath),在该函数中使用了信号量sem来限制并发数,然后调用downloadFile()函数下载文件

  • 修改了urlStarturlEnd变量,用于构造下载文件的URL。根据个股代码的首位数字(0表示沪市,1表示深市),选择对应的交易所代码

  • 在主程序中,获取之前获取的个股列表stockList,然后依次遍历每个股票信息

  • 对于每个股票信息,提取股票代码和名称,并构造对应的下载URL和文件路径

  • 创建一个新的线程,通过threading.Thread()方法传入目标函数downloadFileSem和参数,启动线程并进行下载

百度松果菁英班——机器学习实践六:股票行情爬取与分析,百度松果菁英班课程学习,百度,机器学习,人工智能,python,笔记,经验分享,pandas

🥪股票信息分析

import pandas as pd
import matplotlib.pyplot as plt
import csv
# 设置显示中文
plt.rcParams['font.sans-serif'] = ['simhei'] # 指定默认字体 
plt.rcParams['axes.unicode_minus']=False # 用来显示负号 
plt.rcParams['figure.dpi'] = 100 # 每英寸点数 
​
files = []
# ['日期' '股票代码' '名称' '收盘价' '最高价' '最低价' '开盘价' '前收盘' '涨跌额' '涨跌幅' '成交量' '成交金额']
def read_file(file_name):
    data = pd.read_csv(file_name,encoding='gbk')  
    col_name = data.columns.values 
    return data, col_name
​
def get_files_path():
    stock_list=getStockList()
    paths = []
    for stock in stock_list[1:]:
        p = stock[1].strip()+"_"+stock[0].strip()+".csv" 
        print(p) 
        data,_ = read_file(p)
        if len(data)>1:
            files.append(p) 
            print(p)
get_files_path()
print(files)
            
​
​
​
# 获取股票的涨跌额及涨跌幅度变化曲线
# ['日期' '股票代码' '名称' '收盘价' '最高价' '最低价' '开盘价' '前收盘' '涨跌额' '涨跌幅' '成交量' '成交金额']
def get_diff(file_name):
    data, col_name = read_file(file_name)
    index = len(data['日期'])-1
    sep = index//15
    plt.figure(figsize=(15,17))  
​
    x = data['日期'].values.tolist()
    x.reverse()
    # x = x[-index:]
​
    xticks=list(range(0,len(x),sep))
    xlabels=[x[i] for i in xticks]
    xticks.append(len(x))
    # xlabels.append(x[-1])
    
    y1 = [float(c) if c!='None' else 0 for c in data['涨跌额'].values.tolist()]
    y2=[float(c) if c!='None' else 0 for c in data['涨跌幅'].values.tolist()]
    y1.reverse()
    y2.reverse()
    # y1 = y1[-index:]
    # y2 = y2[-index:]
​
    ax1 = plt.subplot(211)
    plt.plot(range(1,len(x)+1),y1,c='r')
    plt.title('{}-涨跌额/涨跌幅'.format(file_name.split('_')[0]),fontsize=20)
    ax1.set_xticks(xticks)
    ax1.set_xticklabels(xlabels, rotation=40)
    # plt.xlabel('日期')
    plt.ylabel('涨跌额',fontsize=20)
​
    ax2 = plt.subplot(212)
    plt.plot(range(1,len(x)+1),y2,c='g')
    # plt.title('{}-涨跌幅'.format(file_name.split('_')[0]))
    ax2.set_xticks(xticks)
    ax2.set_xticklabels(xlabels, rotation=40)
    plt.xlabel('日期',fontsize=20)
    plt.ylabel('涨跌幅',fontsize=20) 
​
    plt.savefig('work/'+file_name.split('.')[0]+'_diff.png')
    plt.show()
​
​
def get_max_min(file_name):
    data, col_name = read_file(file_name)
    index = len(data['日期'])-1
    sep = index//15
    plt.figure(figsize=(15,10))  
​
    x = data['日期'].values.tolist()
    x.reverse()
    x = x[-index:]
​
    xticks=list(range(0,len(x),sep))
    xlabels=[x[i] for i in xticks]
    xticks.append(len(x))
    # xlabels.append(x[-1])
    
    y1 = [float(c) if c!='None' else 0 for c in data['最高价'].values.tolist()]
    y2=[float(c) if c!='None' else 0 for c in data['最低价'].values.tolist()]
    y1.reverse()
    y2.reverse()
    y1 = y1[-index:]
    y2 = y2[-index:]
​
    ax = plt.subplot(111)
    plt.plot(range(1,len(x)+1),y1,c='r',linestyle="-")
    plt.plot(range(1,len(x)+1),y2,c='g',linestyle="--")
​
    plt.title('{}-最高价/最低价'.format(file_name.split('_')[0]),fontsize=20)
    ax.set_xticks(xticks)
    ax.set_xticklabels(xlabels, rotation=40)
    plt.xlabel('日期',fontsize=20)
    plt.ylabel('价格',fontsize=20) 
    plt.legend(['最高价','最低价'],fontsize=20)
    plt.savefig('work/'+file_name.split('.')[0]+'_minmax.png')
    plt.show() 
​
def get_deal(file_name):
    data, col_name = read_file(file_name)
    index = len(data['日期'])-1
    sep = index//15
    plt.figure(figsize=(15,10))  
​
    x = data['日期'].values.tolist()
    x.reverse()
    x = x[-index:]
​
    xticks=list(range(0,len(x),sep))
    xlabels=[x[i] for i in xticks]
    xticks.append(len(x))
    # xlabels.append(x[-1])
    
    y1 = [float(c) if c!='None' else 0 for c in data['成交量'].values.tolist()]
    y2=[float(c) if c!='None' else 0 for c in data['成交金额'].values.tolist()] 
    y1.reverse()
    y2.reverse()
    y1 = y1[-index:]
    y2 = y2[-index:]
​
    ax = plt.subplot(111)
    plt.plot(range(1,len(x)+1),y1,c='b',linestyle="-")
    plt.plot(range(1,len(x)+1),y2,c='r',linestyle="--")
​
    plt.title('{}-成交量/成交金额'.format(file_name.split('_')[0]),fontsize=20)
    ax.set_xticks(xticks)
    ax.set_xticklabels(xlabels, rotation=40)
    plt.xlabel('日期',fontsize=20)
    # plt.ylabel('') 
    plt.legend(['成交量','成交金额'],fontsize=20)
    plt.savefig('work/'+file_name.split('.')[0]+'_deal.png')
    plt.show() 
​
def get_rel(file_name):
    data, col_name = read_file(file_name)
    index = len(data['日期'])-1
    sep = index//15
    plt.figure(figsize=(15,10))  
​
    x = data['日期'].values.tolist()
    x.reverse()
    x = x[-index:]
​
    xticks=list(range(0,len(x),sep))
    xlabels=[x[i] for i in xticks]
    xticks.append(len(x))
    # xlabels.append(x[-1])
    
    y1 = [float(c) if c!='None' else 0 for c in data['成交量'].values.tolist()]
    y2=[float(c) if c!='None' else 0 for c in data['涨跌幅'].values.tolist()] 
    y1.reverse()
    y2.reverse()
    y1 = y1[-index:]
    y2 = y2[-index:]
    y2 = [0] + y2[:-1]
​
    ax = plt.subplot(111)
    plt.scatter(y2,y1)
​
    plt.title('{}-成交量与前一天涨跌幅的关系'.format(file_name.split('_')[0]),fontsize=20)
    # ax.set_xticks(xticks)
    # ax.set_xticklabels(xlabels, rotation=40)
    plt.xlabel('前一天涨跌幅',fontsize=20)
    plt.ylabel('成交量',fontsize=20) 
    # plt.legend(['成交量','成交金额'],fontsize=20)
    plt.savefig('work/'+file_name.split('.')[0]+'_rel.png')
    plt.show() 
# for file in files:
#     get_diff(file)
​
# for file in files:
#     get_max_min(file)
print(len(files))
for file in files:
    get_max_min(file)
    get_deal(file)
    get_diff(file)
    get_rel(file)
​
​
# read_file('润和软件_300339.csv')
# read_file('N迈拓_301006.csv')
# read_file('N崧盛_301002.csv')
  • read_file(file_name)函数:读取CSV文件并返回数据以及列名

  • get_files_path()函数:获取文件路径,并将文件名添加到列表files中。首先调用了getStockList()函数获取个股列表,然后遍历每个个股,在文件名中提取股票代码和名称,并根据文件名读取数据。如果数据长度大于1,则将文件名添加到files列表中

  • get_diff(file_name)函数:根据给定的文件名绘制股票的涨跌额和涨跌幅变化曲线。首先读取指定文件的数据,然后提取日期、涨跌额和涨跌幅数据。根据数据量确定x轴刻度的间隔,然后绘制两个子图,分别表示涨跌额和涨跌幅。在子图中,横轴表示日期,纵轴分别表示涨跌额和涨跌幅。最后保存图片并展示

  • get_max_min 函数绘制了最高价和最低价的折线图

  • get_deal 函数绘制了成交量和成交金额的折线图

  • get_rel 函数绘制了成交量与前一天涨跌幅的散点图

百度松果菁英班——机器学习实践六:股票行情爬取与分析,百度松果菁英班课程学习,百度,机器学习,人工智能,python,笔记,经验分享,pandas

百度松果菁英班——机器学习实践六:股票行情爬取与分析,百度松果菁英班课程学习,百度,机器学习,人工智能,python,笔记,经验分享,pandas

文件里面画了很多图,但是都太大了,截不全,感兴趣的朋友可以进链接里看一下。

🥗有什么问题我们随时评论区见~

⭐点赞收藏不迷路~文章来源地址https://www.toymoban.com/news/detail-850598.html

到了这里,关于百度松果菁英班——机器学习实践六:股票行情爬取与分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 百度松果菁英班--oj赛(第一次)

    **题目:**小码哥的上司是一个爱吃甜品的人,他给了小码哥v的经费,去购买m个甜品,这些甜品有bi的价格,和 ai的甜度,上司希望甜度越高越好,但是他比较忙,没有时间来确定所有甜品的甜度,只会去看M个甜品的中位数的甜度,于是小码哥决定在买M个甜品,总价格不超过

    2024年04月14日
    浏览(30)
  • 新浪股票行情数据接口有什么作用?

    通过 新浪股票行情数据接口 可以让投资者在实际交易当中能够更加精准的洞悉盘口变化。该接口可以说是目前最好用的免费股票行情数据接口了,虽然一直并未公开,但暂时使用良好。大家用浏览器访问新浪的股票行情数据接口就能查看最新行情数据了。那么今天小编简单

    2024年02月01日
    浏览(47)
  • 市面上那里有稳定L2股票行情数据接口?

                       随着市场的发展和技术的进步,level2股票行情数据接口已经成为股票交易软件的标准配置之一。虽然这些券商软件的功能在很大程度上相似,但它们仍然有自己的特点和优势。 例如:通过股票交易所以其专业的研究报告和丰富的信息服务而受到广

    2024年02月12日
    浏览(38)
  • 简单的股票行情演示(一) - 实时标的数据

    一、概述 二、效果展示 三、实现代码 1、行情数据中心 2、数据拉取模块 3、基础服务模块 4、UI展示 四、相关文章 原文链接: 简单的股票行情演示(一) - 实时标的数据 很长一段时间都有一个想法,使用QCP去做一个行情展示小事例,一直没有着手开发的原因主要是行情数据

    2024年02月11日
    浏览(36)
  • 通过股票数据接口如何看懂Level-2行情?

    交易用户在进行投资的时候,通过股票数据接口来实现自己的盈利目标,今天来聊聊如何看懂Level-2行情? 在交易开盘之后某股快速杀跌,但杀跌后盘面缺不跌反涨,甚至一度差点翻红,如果是五档行情,我们并不知道发生了什么。 如果通过十档行情功能,我们就能发现买

    2024年02月12日
    浏览(39)
  • 打通选股环节和行情显示链路!股票量化分析工具QTYX-V2.5.1

    目前股票量化分析工具QTYX已经打通了形态驱动选股和数据驱动选股之间的链路。比如双底选股、RPS选股、盘整平台突破选股得到的数据,可以叠加上财务数据、基本面数据、基金持仓数据,然后用条件表达式进行多因子综合排序,从而筛选出优质股票。 如果要更进一步提高

    2024年02月11日
    浏览(35)
  • python爬虫进阶篇:Scrapy中使用Selenium+Firefox浏览器爬取沪深A股股票行情

    上篇记录了Scrapy搭配selenium的使用方法,有了基本的了解后我们可以将这项技术落实到实际需求中。目前很多股票网站的行情信息都是动态数据,我们可以用Scrapy+selenium对股票进行实时采集并持久化,再进行数据分析、邮件通知等操作。 详情请看上篇笔记 items middlewares setti

    2024年02月04日
    浏览(62)
  • Python基于机器学习实现的股票价格预测、股票预测源码+数据集,机器学习大作业

    选择的feature: 开盘价 最高成交价 最低成交价 成交量 选择的预测目标: 收盘价 因为股票价格的影响因素太多,通过k线数据预测未来的价格变化基本不可行,只有当天之内的数据还有一定的关联,故feature与target都选择的是当天的数据。 为了加快数据的处理速度,提前将maria

    2023年04月19日
    浏览(56)
  • 机器学习实战 | 股票价格预测项目(深度学习初级)

    准备写个系列博客介绍机器学习实战中的部分公开项目。首先从初级项目开始。 本文为初级项目第三篇:利用NSE-TATA数据集预测股票价格。 项目原网址为:Stock Price Prediction – Machine Learning Project in Python。 第一篇为:机器学习实战 | emojify 使用Python创建自己的表情符号(深度

    2024年02月16日
    浏览(40)
  • 毕业设计-基于机器学习的股票预测

    目录 前言 课题背景和意义 实现技术思路 一、传统股票预测模型  二、新型股票预测方法 实现效果图样例  最后     📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项

    2023年04月08日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包