主题：金融投资讨论
问题：如何用python实时监控股票，并且持续扫描大盘？
回答：上次我们讲过普罗米修斯(prometheus)这个接近完美的监控系统，有很多读者不了解它到底要如何搭建、应用，今天我们就结合普罗米修斯、Grafana和Python采集脚本，写一个小小的东方财富人气榜 TOP100监控系统。跟着本文的教程耐心往下走，你可能只需要花30分钟便可完成环境的搭建，非常舒服，下面先介绍基本概念。普罗米修斯(prometheus)上次我们已经使用一整篇文章介绍过了，它是一个开源监控报警系统和时序列数据库。如果你没有阅读过这篇文章，请花五分钟读一下：《接近完美的监控系统—普罗米修斯》Grafana 是一个开源的数据可视化网络应用程序平台。用户配置连接的数据源之后，Grafana可以在网络浏览器里显示数据图表和警告。比如说我基于 普罗米修斯(prometheus) + node_exporter 监控主机性能指标，然后由Grafana构建主机实时监控仪表盘，它是长这样的：至于东方财富人气榜，指的是这个：它能将市场目前最活跃的一些股票提取出来，可供我们作为投资的一种参考。而我们今天要做的，就是自己搭建一套监控系统，实时监控某只股票在TOP100上的排名变化。1.搭建 Prometheus创建 Prometheus 安装目录并添加 promethus 用户：PROM_PATH='/data/prometheus'
 mkdir -p ${PROM_PATH}
 mkdir -p ${PROM_PATH}/{data,conf,logs,bin}
 useradd prometheus
 cd /usr/local/src下载解压 prometheus, 这里我们选用2021年5月18日更新的最新版 v2.27.1:wget https://github.com/prometheus/prometheus/releases/download/v2.27.1/prometheus-2.27.1.linux-amd64.tar.gz
 tar -xvf prometheus-2.27.1.linux-amd64.tar.gz
 cd prometheus-2.27.1.linux-amd64/
 cp prometheus promtool ${PROM_PATH}/bin/
 cp prometheus.yml ${PROM_PATH}/conf/
 chown -R prometheus.prometheus /data/prometheus设置环境变量：cat >> /etc/profile <<EOF
 PATH=/data/prometheus/bin:$PATH:$HOME/bin
 EOF将 Promethus 配置为系统服务之一，以便使用 systemctl 命令管控服务：cat >>/etc/systemd/system/prometheus.service <<EOF
 [Unit]
 Description=Prometheus
 Documentation=https://prometheus.io/
 After=network.target
 
 [Service]
 Type=simple
 User=prometheus
 ExecStart=/data/prometheus/bin/prometheus --config.file=/data/prometheus/conf/prometheus.yml --storage.tsdb.path=/data/prometheus/data --storage.tsdb.retention=90d
 Restart=on-failure
 
 [Install]
 WantedBy=multi-user.target
 EOF现在使用下面的systemctl命令重新加载systemd系统，并查看服务是否启动：systemctl daemon-reload
 systemctl enable prometheus
 systemctl start prometheus
 systemctl status prometheus看到 running 状态说明一切正常：记得开放9090端口，这样才可以访问 Prometheus 的 Web 端，访问 http://服务器IP:9090 查看得到 Prometheus Web界面，说明安装成功：2.安装 GrafanaGrafana 我们也使用最新的 8.0.1 版本，安装方式如下：CentOS系列系统使用以下命令安装：cd /usr/local/src
 wget https://dl.grafana.com/oss/release/grafana-8.0.1-1.x86_64.rpm
 sudo yum localinstall grafana-6.5.2-1.x86_64.rpmUbuntu和Debian系列系统使用以下命令安装：cd /usr/local/src
 sudo apt-get install -y adduser libfontconfig1
 wget https://dl.grafana.com/oss/release/grafana_8.0.1_amd64.deb
 sudo dpkg -i grafana_8.0.1_amd64.deb然后启动系统服务即可：systemctl start grafana-server
 systemctl status grafana-server看到 running 状态说明一切正常：记得开放3000端口，这样你才可以访问你的Grafana: http://你的服务器IP:3000 如下所示：输入用户名，密码登录系统。用户名与密码都是"admin"，如果能打开页面则已经安装成功了。3.初尝Grafana+Prometheus为了初步尝试这套系统，我们可以通过简单的采集主机性能数据开始。Node_exporter是一个Prometheus推出的官方主机性能采集工具。通过它我们能很方便地输出主机性能指标到Prometheus.3.1 下载安装Node_Exporter：NODE_PATH='/data/prometheus/node_exporter/'
 cd /usr/local/src/
 mkdir -p ${NODE_PATH}
 wget https://github.com/prometheus/node_exporter/releases/download/v1.1.2/node_exporter-1.1.2.linux-amd64.tar.gz
 tar -xvf node_exporter-1.1.2.linux-amd64.tar.gz
 cp node_exporter-1.1.2.linux-amd64/node_exporter ${NODE_PATH}
 chown -R prometheus.prometheus ${NODE_PATH}配置node_exporter为系统服务：cat > /lib/systemd/system/node_exporter.service <<EOF
 [Unit]
 Description=node_exporter
 Documentation=https://prometheus.io/
 After=network.target
  
 [Service]
 Type=simple
 User=prometheus
 ExecStart=/data/prometheus/node_exporter/node_exporter
 Restart=on-failure
  
 [Install]
 WantedBy=multi-user.target
 EOF现在使用systemctl命令重新加载系统命令，并查看服务是否启动：systemctl daemon-reload
 systemctl enable node_exporter
 systemctl start node_exporter
 systemctl status node_exporter看到如下图的状态说明启动成功。放行9100端口，访问http://你的服务器地址:9100/metrics 看到如下指标页面说明安装成功：配置 prometheus.yaml (ubuntu 下为 prometheus.yml), 让 prometheus 采集 node_exporter 输出的指标数据：vim /data/prometheus/conf/prometheus.yml配置如下：# my global config
 global:
  scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).
 
 # Alertmanager configuration
 alerting:
  alertmanagers:
  - static_configs:
  - targets:
  # - alertmanager:9093
 
 # Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
 rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"
 
 # A scrape configuration containing exactly one endpoint to scrape:
 # Here it's Prometheus itself.
 scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: 'prometheus'
 
  # metrics_path defaults to '/metrics'
  # scheme defaults to 'http'.
 
  static_configs:
  - targets: ['localhost:9090']
 
  # 主要是新增了node_exporter的job，如果有多个node_exporter，在targets数组后面加即可
 
  - job_name: 'node_exporter'
  static_configs:
  - targets: ['localhost:9100']保存后重启prometheus:systemctl restart prometheus最后配置Grafana：然后选择 Prometheus 数据源：输入 Prometheus url 然后点击 save&test 保存：然后导入官方仪表盘，官方提供的模板号为8919：然后你就能看见本机非常漂亮的性能指标数据仪表盘了。不看不知道，一看吓一跳，原来我需要升级这台机器的内存了。4.编写采集脚本为了能够采集东方财富人气榜前100名，我们需要用Python编写一个人气榜采集脚本，并使其像 node_exporter 一样输出指标信息：为了达到这个目的，我们必须安装 prometheus_client 模块：pip3 install prometheus_client获取股票排名的代码如下：# Python实用宝典
 # 2021-06-13
 # 文件名: fetch_stock.py
 import time
 import requests
 from prometheus_client import start_http_server, CollectorRegistry, Gauge
 
 
 reg = CollectorRegistry()
 gauge = Gauge(
  'rank', '人气榜排名',
  ['stock_id'], registry=reg
 )
 
 
 def process_request():
  url = "https://emappdata.eastmoney.com/stockrank/getAllCurrentList"
  kwargs = {
  "appId": "appId01",
  "pageNo": 1,
  "pageSize": "100",
  }
  result = requests.post(url, json=kwargs).json()
  for i in result.get("data", []):
  gauge.labels(stock_id=i["sc"]).set(i["rk"])
  time.sleep(60)
 
 
 if __name__ == '__main__':
  start_http_server(8000, registry=reg)
  while True:
  process_request()这里我们只捕获人气榜前100名，并通过Prometheus客户端的start_http_server开启一个Web服务，这样你通过http服务访问8000端口的时候就能输出这些指标。为了让其能持续输出指标数据，我们要用nohup使其成为一个常驻进程：nohup python3 fetch_stock.py &开放8000端口，访问 http://你的服务器IP:8000 就能查看输出的指标：5.应用采集脚本同配置Node_exporter一样，我们需要将自己编写好的采集脚本落入Prometheus，配置prometheus.yaml:配置 prometheus.yaml, 让 prometheus 采集 node_exporter 输出的指标数据：#(CentOS) vim /data/prometheus/conf/prometheus.yaml
 vim /data/prometheus/conf/prometheus.yml # ubuntu配置如下：# my global config
 global:
  scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).
 
 # Alertmanager configuration
 alerting:
  alertmanagers:
  - static_configs:
  - targets:
  # - alertmanager:9093
 
 # Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
 rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"
 
 # A scrape configuration containing exactly one endpoint to scrape:
 # Here it's Prometheus itself.
 scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: 'prometheus'
 
  # metrics_path defaults to '/metrics'
  # scheme defaults to 'http'.
 
  static_configs:
  - targets: ['localhost:9090']
 
  # 主要是新增了node_exporter的job，如果有多个node_exporter，在targets数组后面加即可
  - job_name: 'node_exporter'
  static_configs:
  - targets: ['localhost:9100']
 
  # 新增我们的Python股票采集脚本
  - job_name: 'hot_list'
  static_configs:
  - targets: ['localhost:8000']保存后重启prometheus:systemctl restart prometheus最后配置Grafana, 选择新建一个dashboard:然后选择rank指标：点击 Use query 就能获取所有股票的排名曲线：6.配置告警为了在某只股票达到某种排名的时候触发通知，我们需要先配置好告警渠道：然后配置邮件告警，点击 Test, 此时 Grafana 会告诉你一个错误：就是我们还没有配置好 SMTP 相关服务，需要配置 SMTP 相关服务才能正常发送邮件，如果你是按照本文按照Grafana的教程走下来的，那么Grafana.ini的文件位于 /etc/grafana/grafana.ini.vim /etc/grafana/grafana.ini然后在 smtp 部分配置你的 host、user、password、from_address、from_name，并打开 enabled 如下图所示：然后重启 Grafana-serversystemctl restart grafana-server再点击Test，你的邮箱里收到这样的邮件说明通知可以正常发送了：然后我们进入正题，监控某只股票的排名变化，比如 SH600070:然后点击 Alert 配置告警，一旦其排名高于65名则发送邮件通知：完成后点击右上角的 save 保存即可：‍然后进入 Alerting 告警中心，你会看到刚刚配置的告警规则在这里可以进行管控：点击Pause可以暂停这个告警，Edit alert可以去更改告警条件。一旦触发告警，这个状态便会更改，你就会收到邮件：邮件效果如下：邮件里的告警图片没显示出来，因为我们没有安装 "grafana image renderer", 需要在你的服务器执行以下命令安装并重启 Grafana：grafana-cli plugins install grafana-image-renderer
 systemctl restart grafana-server新的告警邮件便能看到图片了：怎么样，用Prometheus+Grafana+Python采集搭建一个股票监控系统还是非常简单的吧？创新性地监控东方财富人气榜上某只股票的变化并产生告警，能让你熟悉监控策略的配置，见微知著。跟着本文的教程走，相信你会有不少收获。如果我们延伸一下，结合量化投资系列教程的可转债交易薅羊毛策略 — Python 量化投资实战教程(10)，是否可以构建一些更有意义的策略？答案是肯定的。我们可以监控所有100元以下的可转债对应的股票，如果这些股票进入了人气榜TOP100或者飙升榜（本文没有采集，有兴趣的读者可以自行采集），就购入这些低价可转债，这种买入策略或许也不错。你也可以抛弃东方财富的榜单分类，构建自己的排名环比增长买入策略，环比下跌卖出策略，我相信这会非常有意思。我们的文章到此就结束啦，如果你喜欢今天的Python 实战教程，请持续关注Python实用宝典。原创不易，希望你能在下面点个赞和在看支持我继续创作，谢谢！点击下方阅读原文可获得更好的阅读体验Python实用宝典 (http://pythondict.com)不只是一个宝典欢迎关注公众号：Python实用宝典