python stock 量化投资和股票分析 mpl_finance 画图

python stock 量化投资和股票分析,python的numpy、pandas包写上几行代码,再用matplotlib画上几张图,用sklearn(scikit-learn)包的模型画个传统机器学习的模型又或用tensorflow或者pytorch等框架套入深度学习,云云如是

python stock 这两个词原本是互不相干的,不知具体从何时起,量化投资股票分析数据模型python数据分析等等各种词汇的联系越来越多,从而使得很多所谓的交易高手股市技术流股票大佬在各个平台来吹嘘自己的交易策略有多么的厉害。
拿着python的numpypandas包写上几行很多小白看不明白的代码,再用matplotlib画上几张图,就说自己的交易策略;稍微知道的多就会在用sklearn(scikit-learn)包的模型画个传统机器学习的模型;再厉害一些的呢就用tensorflow或者pytorch等框架套入数据做个深度学习的模型,云云如是… 基本的教学大纲差不多是下边这样的。
我和我的小伙伴都惊呆了...
呆!股市大狗在此,哪里逃…

python stock 股票数据来源

  • 合法爬虫
  • 现成的python包数据调用,如yfinance
  • 臆想出来的

雅虎的yfinance还是很好用的,如果读者没法使用就可以参考笔者之前的爬虫文章去正规的网站上爬取股票数据,至于怎么做到合法呢?就是看网站域名下的robots.txt文件是什么样的,比如很多人都是知道的东方财富网,我们直接在它的根域名后边跟一个robots.txt,在浏览器地址栏中加载看一下

https://www.eastmoney.com/robots.txt

而浏览器加载的结果如下,我们看到User-agent没有具体的指向,并且Disallow 又没有说不允许谁来爬,所以呢爬TM的没问题。

User-agent: *
Allow: /
Sitemap: http://www.eastmoney.com/sitemap.xml

数据初探和哔哩哔哩

如上文所说我们用yfinance加载数据,用特斯拉(TSLA)的日交易数据来演示一哈。

import yfinance as yf

tsla= yf.Ticker("tsla")
data = tsla.history(start="2020-06-01", end="2022-06-30", interval="1d")
print(data.head(2))
print(data.columns)
                           Date        Open  ...  Dividends  Stock Splits
2020-06-01  2020-06-01 00:00:00  171.600006  ...          0           0.0
2020-06-02  2020-06-02 00:00:00  178.940002  ...          0           0.0

Index(['Date', 'Open', 'High', 'Low', 'Close', 'Volume', 'Dividends',
       'Stock Splits'],
      dtype='object')

到了这里大佬们会比哔哩哔哩一下这些数据都是啥,比如这些数据的含义啊,什么日开盘价、收盘价、交易量等等,然后会在介绍一下,要用什么来计算指标,然后又用这些指标来达到什么样的效果。自己知道且有耐心的老师还会给说一下这些指标具体的数学本质是啥。

matplotlib画个MACD图

先计算上线布林线,整个过程都是pandas dataframe的常规计算,没有什么特殊的,如果非要摆一摆就是把这个MACD的含义啊,pandas的使用啊,数学意义啊,股市指标价值啊,巴拉巴拉讲上几节课。

import pandas as pd
import numpy as np 
import matplotlib.pyplot as plt
plt.style.use('seaborn-colorblind')

# 短线EMA
shortEMA = history.Close.ewm(span=12, adjust=False).mean()
# 长线EMA
longEMA = history.Close.ewm(span=26, adjust=False).mean()
# MACD
MACD = shortEMA - longEMA

single_line = MACD.ewm(span=9, adjust=False).mean()

plt.figure(figsize=(12.2, 4.5))
plt.plot(history.index, MACD, label='TSLA MACD', color='r')
plt.plot(history.index, single_line, label='Single Line', color='b')
plt.xticks(rotation=45)
plt.legend(loc='upper left')
plt.show()
matplotlib画的特斯拉MACD图
MACD线

mplfinance 画个K线图

malfinace 本身以前是matplotlib的一个模块,但是从19年开始独立出来了,所以读者如果用的是较新的python环境必须的从新安装一下,模块也好,包也罢都可能会是另一个知识点,因为小白们是不知道怎么用这些工具的,得学啊。

==================================

   WARNING: `mpl_finance` is deprecated:

    Please use `mplfinance` instead (no hyphen, no underscore).

    To install: `pip install --upgrade mplfinance` 

   For more information, see: https://pypi.org/project/mplfinance/

======================================

BOLLING 计算

data['SMA'] = data['Close'].rolling(window=20).mean()
# 计算 standard deviation
data['STD'] = data['Close'].rolling(window=20).std()
data['UpperLine'] = data['SMA'] + (data['STD'] * 2)
data['LowerLine'] = data['SMA'] - (data['STD'] * 2)
add_plot = mpf.make_addplot(data[['UpperLine', 'LowerLine']],linestyle='dashdot')
mpf.plot(data, addplot=add_plot, type='ohlc', volume=True)
malfinace 实现特斯拉的日K线图
malfinace K线图

机器学习做个模型吧

嘿嘿嘿,笔者不想在此篇文章里写模型的代码了,至此算是骗个炮吧:stuck_out_tongue_winking_eye:,以后空了再来后续骗。

scrapy python 框架爬虫 基础浅析

scrapy python 框架爬虫 这些词初接触者肯定不知所云。所以读者可以直接度娘或者Google这些词条“什么是scrapy python“,“what is scrapy python”,“scrapy 基础入门”,“scrapy python example”,“Scrapy框架模组”,“Scrapy框架流程”等,笔者直接带大家实操一下基于scrapy python的基本网页爬取。

scrapy python 框架爬虫 这些词初接触者肯定不知所云。所以读者可以直接度娘或者Google这些词条“什么是python“,“what is scrapy”,“scrapy 基础入门”,“scrapy example”等等诸如此类的。可以看到各种各样的文章,读者都可以快速的对scrapy python做基本的了解。

故笔者不再做多余的赘述最最基础的简介如什么是爬虫Scrapy框架模组Scrapy框架流程等,笔者直接带大家实操一下基于scrapy的基本网页爬取。

爬虫 就是遥摘星辰

scrapy python 框架爬虫

爬虫 就是遥摘星辰

 

scrapy 基本步骤

创建工程、编写爬虫文件、执行工程

  • scrapy startproject xxxPro — 固定模型创建工程,自动生成items.py, pipeline.py,settings.py等文件。
  • 在项目目录下输入: scrapy genspider spiderName www.XXX.com 创建具体的爬虫文件
  • 修改相应的爬虫文件、items、pipelines、settings、中间件等文件来完善具体的爬取细节
  • 在项目目录下执行: scrapy crawl spiderName

基本命令

  1. scrapy bench: 测试scrapy的基本性能等
  2. scrapy fetch: 通过scrapy下载器下载指定的url
  3. scrapy genspider : 创建爬虫,类似于python XX.py
  4. scrapy runspider: 启动爬虫
  5. scrapy settings: 获取setting值
  6. scrapy shell ‘http://XXX.com‘: 启动一个shell界面,类似于ipthon的效果,可以通过命令行来对指定的url进行单步调试
  7. scrapy startproject: 创建工程项目

scrapy 框架爬虫 入门实例介绍

  1. scrapy startproject feixiaohao: 生成如下结构的文件夹及文件
    # windows 可以需要通过命令 tree /f , 来看到结构
    └─feixiaohao
    │  scrapy.cfg
    │
    └─feixiaohao
        │  items.py
        │  middlewares.py
        │  pipelines.py
        │  settings.py
        │  __init__.py
        │
        └─spiders
                __init__.py

    项目中自动生成文件说明

    • scrapy.cfg: 项目的配置文件,会包含项目的基本信息和一些基础设置,每个版本的scrpay可能会有些许的差异
    • items.py 项目目标文件,结构化的数据字段,提供一些数据校验的防护,减少错误;类似orm映射
    • pipelines.py 项目管道文件
    • middlewares.py 项目中间件文件
    • settings.py 项目设置文件,默认启动项,公共资源配置等
  2. scrapy genspider -l : 指定
     scrapy genspider -l
     Available templates:
        basic  : 基础爬虫类型的文件
        crawl  :定义一些rules,适合深度爬取一些有规律网站
        csvfeed :按行遍历解析csv源文件
        xmlfeed :按各节点迭代解析xml源文件
  3. cd 到feixiaohao文件夹里, 输入命令: scrapy genspider feixh “https://www.feixiaohao.co/” 来只做具体的爬虫文件,在spiders文件中会初始化一个新的具体爬虫文件
    │  scrapy.cfg
    │
    └─feixiaohao
        │  items.py
        │  middlewares.py
        │  pipelines.py
        │  settings.py
        │  __init__.py
        │
        └─spiders
                feixh.py
                __init__.py
  4. feixh.py文件的核心内容
    class FeixhSpider(scrapy.Spider):
        name = 'feixh'
        allowed_domains = ['https://www.feixiaohao.co/']
        start_urls = ['https://www.feixiaohao.co/news?tab=0']
        ##start_urls = ['https://www.feixiaohao.co']
        def parse(self, response):
            pass

    正常情况feixh.py文件的start_urls是咱们在构建爬虫文件时指定的地址, 因为笔者要爬虫咨询相关的内容,所有手动换到的具体的地址。
    接下来我们要做的就是要对爬取的网页进行页面分析,如何分析呢? 之前笔者在爬虫入门的文章中介绍过在浏览器中查看元素xpath的方法,或者直接对页面做正则解析,但是不管哪种方式都需要我们在浏览器中查看页面源码来看一下页面是如何加载的。

  5. 利用Chrome 的Xpath Helper插件辅助解析页面内容
    我们定义需要爬取的item.py

     

    class FeixiaohaoItem(scrapy.Item):
        # define the fields for your item here like:
        # name = scrapy.Field()
        title = scrapy.Field()  # 咨讯标题
        href = scrapy.Field()   # 咨讯地址 
        date = scrapy.Field()   # 咨讯发布日期
        source_name = scrapy.Field()    # 资讯来源
        spider_time = scrapy.Field()    # 资讯爬取时间

    feixh.py的parse方法具体如下,里边涉及到的xpath解析就是先在页面找到元素再复制过来修正得到的,但是有一个问题就是页面的xpath路径是绝对路径定位到元素本身,一般我们到代码中时需要往上一层。
    这里涉及到一些细节的调试,这个调试我们可以通过scrapy shell来达到具体的效果

    def parse(self, response):
        html = etree.HTML(response.body.decode('utf-8'))
        datas = html.xpath('//*[@id="__layout"]/section/div[1]/div/div[1]/div/div[2]/div[2]')[0]
        for data in datas.xpath('./article'):
            item = FeixiaohaoItem()
            title = data.xpath('.//div[@class="info"]/a[1]/text()')[0]
            href = data.xpath('.//div[@class="info"]/a[1]/@href')[0]
            source = data.xpath('.//div[@class="info"]//a[@class="name"]/text()')[0]
            date = data.xpath('.//div[@class="info"]/div[@class="time"]/span/text()')[0]
            item['title'] = title
            item['href'] = href
            item['date'] = date
            item['source_name'] = source
            item['spider_time'] = time.time()
            yield item
  6. scrapy shell “https://www.feixiaohao.co/news?tab=0
    scrapy shell 这个命令我们可以dos窗口或者pycharm的 Terminal里来执行,这个就类似于ipython的运行环境,这样我们就可以逐步的对response进行解析,因为当scrapy shell运行出来后就已经可以解析到response了,读者可以自行print(response)看到相关的内容
    有一点需要主要,这个环境中所有用到的包都需要自行import,就跟运行ipython是一样的效果。
  7. 正常的逻辑就是继续找到翻页的连接地址或者翻页按钮跳转的地址,做循环解析。
    但是如果页面是翻页按钮或者后续加载按钮是用js触发的接口,那么我们就需要调整start_url列表的内容。,需要我们在浏览器中找到翻页按钮对应的接口地址。

     

        start_url= ['https://***/news/hot?page={}&per_page=20&webp=1'.format(i) for i in range(1, 29)]

    这样做的话我们的parse方法就要从新写逻辑,就不能用xpath来做解析了,而是直接接口对应的返回值做json处理。

python 爬虫 闲话 基础入门

说在前面的话

  • python在自身历史版本中主要是python2和python3。我们不去表述各种的python实现,用C(CPython)\C++(Pyston)\Java(Jython)\C#(IronPython)\Ruby\JS都有, 我们只去说一下基于python3的最基础的使用和应用。当然很多的教程是以python2来写的,如果我们遇到其实并不影响我们去学习。
  • 浏览器主要是Chrome

一钱思路

  1. 拿到http://**.com/path/to/page 的地址, 将地址在浏览器(Chrome)中打开
  2. 在浏览器加载完地址且能看到你想看到的页面后,按F12 或者 直接在页面 右键=> 点击检查 ,页面会在某一个侧(默认是页面的右侧或者下侧)弹出如下图的 开发者工具, 图中的标红的箭头、 Elements、Network很关键,几乎是囊括了web爬虫所需的所有前置条件。
Chrome开发者工具
  1. 一般是箭头和Elements组合来使用,使用的目的是什么?就是确定你要爬取的数据在页面的什么地方。 步骤是:先点击Elements,它的紧下侧会有强调横线出现,同时整体下方出现的是html源码页面,看到<!DOCTYPE html> 就是了; 然后点击最左侧的箭头,箭头的颜色会变成蓝色或者颜色加重,随后把鼠标慢慢挪到真正的页面内容上,就会发现不一样了,这个时候html 源码页面的光标会随着你的鼠标在实际的可见页面移动而移动。而且点击一下实际可见页面的随意内容,html源码的光标就会立刻停在源码的位置, 实际页面不会发生变化。
  2. Elements + 箭头的 页面定位操作, 每一次定位 箭头都要从新点击一次。
  3. 对于Network点击后看到的是页面加载时的所有页面接口,如果说Elements + 箭头对应的静态页面内容的话,Network对应的就是动态加载的数据;明确哪些数据是有哪个接口提供的以及这个接口需要什么参数、cookie等关键性的请求依据都是从Network获取的
  4. 如果在浏览器中输入的地址没有得到具体的页面,而是一个登陆页面,此时就需要箭头+Elements+Network一起上了, 先用箭头+Elements明确登陆页面的需要输入的元素在哪里,在葱Network中确定登陆接口;如果登陆需要验证码还要从第三方的接口或者验证码的破解来辅助登陆。
  5. 以上都是基于浏览器可以直接看到数据的情况,如果页面是纯粹的动态加载,那么就要涉及到对页面js的逆向工程及更深层次的技术,此处不做深入谈论; 而如何确定页面是不是动态加载的呢?这个可以在Elements中找到答案, 去Elements的html页面查询真实页面的数据项,如果查不到基本上可以确定数据项是动态加载的, 这个时候需要去Network中找跟我们地址url对应到接口来确定页面数据是由哪个接口来动态提供的。如果只是简单需求可以用Selenium解决这个问题

二两概念

  1. request 和 response是什么?

request :可以通俗理解成对页面发起网络请求response: 可以通俗理解成对网页请求后,响应返回的数据request和response在很多类或者方法定义的主要关键字,又或者是约定成俗的写法; 在爬虫任务进行时的信息数据的两个不同的流向代表。

  1. 能抓取怎样的数据?

网页文本、图片、视频、二进制流

  1. 解析方式有哪些?

直接处理、json解析、正则表达式、beautifulsoup、pyquery 、 Xpath

  1. 怎样解决js渲染的问题?

分析Ajax请求、用selenium / webdriver、Splash、Pyv8

三分技术

  1. requests (请求页面)
  1. xpath (解析页面)
  • xpath是一门在 XML 文档中查找信息的语言,说的通俗点就是我们爬取的网页是一种有着基本款式和样式的本文信息, xpath就可以解析这些信息,从而取到我们想要的内容。
  • xpath是一种技术,在python中常用的库是 lxml
  • 为啥要用xpath先在页面搞一下? 因为我们不知道页面是什么样的,那么爬取到数据后我们也没有办法知道取哪里的信息为我所用,所有要运行所有的爬取程序之前先用浏览器目测一下具体哪些内容可以怎么接下下来。
  • xpath入门连接: https://www.runoob.com/xpath/xpath-tutorial.html
  • 实际使用中, 以chrome浏览器为例,chrome浏览器是有自己的插件的,这个插件叫做XPath Helper, 它的作用是直接从页面可以快速的获取页面中我们想要的内容的xpath路径。如果是其它浏览器的基本操作前边也都是一样的,只是需要人工来找到想要内容的xpath路径,这样就需要爬虫代码的编写者非常熟悉xpath语法了。
  • 无论是否是chrome浏览器,在看一个页面的元素xpath路径时都是有一个基本的步骤的
1、用浏览器(IE 和 chrome为例)打开想要爬取的页面地址
2、页面上任何位置 右键 --> 检查 (检查元素)  或者直接按 F12 (不同浏览器说辞可能不一样,但是含义是相同的),会看到浏览器的下方或者右侧弹出如下两张图的界面,最左侧的箭头+方块的图标选中后就可以在页面选择元素了,也可以直接在弹出的界面中的页面源码中选择元素
import requests
from lxml import etree
if __name__ == __main__:
    headers = {
        User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36
    }
    url = https://anqiu.58.com/ershoufang/
    page_text = requests.get(url = url,headers = headers).text
    tree = etree.HTML(page_text)
    li_List = tree.xpath(//section【@class = list】/div)
    fp = open(58.txt,w,encoding=utf-8)
    for li in li_List:
        title = li.xpath(./a/div【2】//div/h3/text())【0】
        print(title)
        fp.write(title+\n)
  1. 正则表达式 (解析页面)
    1. 通过网页请求requests返回的数据取得text文本内容
    2. 通过python的re 正则库,可以对文本内容进行正则匹配从而解析到想要的数据内容
  1. BeautifulSoup4 (解析页面)
  • BeautifulSoup也是python的一个库,类似于xpath同样是对页面进行解析,实现原理有所不同,它是基于DOM的,解析后可以按照DOM树对页面进行提取数据,懂得css等前端技术的人用起来会更顺手,且相对于xpath要API非常人性化,支持css选择器
  • 灵活性和性能来说bs4没有xpath好用
  • 文档传送门: https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/
  1. Selenium: 它本身是Web应用程序测试的工具,直接在浏览器中运行, 所以它可以做到像浏览器一样把数据全部都加载出来,这样一来哪怕是动态加载也是可以拿到加载后的数据的。它本身是专门针对测试的工具 ,所有还是测重测试方向,官网传送门: https://www.selenium.dev/;而python调用selenium的API文档可以在这里看到 https://selenium-python.readthedocs.io/ 网站中有详细的说明以及对Drivers的下载链接地址。
  2. Scrapy 分布式爬虫框架,

主要步骤: 创建工程、爬虫文件、执行

  • scrapy startproject xxxPro
  • 在项目目录下输入: scrapy genspider spiderName www.XXX.com 创建爬虫文件
  • 框架会自动创建所有需要的items pipline settings.py 中间件等默认文件,而开发者只需要去根据需求去修改对应的文件来完成整个爬虫任务的构建即可
  • 在项目目录下执行: scrapy crawl spiderName