中证指数有限公司由上海证券交易所和深圳证券交易所共同出资成立,是一家从事指数编制、运营和服务的专业性公司。依托沪深证券交易所的信息和技术资源优势,管理和发展中证系列指数、交易所系列指数以及客户定制类指数,正逐步成为国内规模最大、产品最多、服务最全、最具市场影响力的专业指数服务公司。

最常听说的沪深300指数就是这个公司编制的。公司网站会每天更新指数信息,包括现在点位涨跌,指数成分与权重以及一些指数指标数据(PB,PE等)。

CSINDWEB

思路

从中证指数网站可以发现所需要的数据都以Excel形式提供下载。所以可以从Excel中解析数据,并转存到系统中,再由展示端形成监控图。

系统基于AWS云计算服务构建,分为收集,存储,转换,展示四个部分。
所有计算的部分都由AWS Lambda形式托管部署,源文件存储到AWS S3上,数据库采用InfluxDB,用Grafana做监控仪表。INfluxDb与Grafana部署到具备公网IP的AWS EC2 Instance上。

InfluxDB是时间序列数据库,对按天存储的金融数据有天然优势,缺点就是太吃内存了。Grafana有强大的图形展示功能,可添加Influxdb作为数据源。

具体结构如下:

CSIND

  1. Lambda FetchCS INDEX 站点获取包含指数指标的Excel文件,然后存储到S3
  2. Lambda Fetch 由 CloudWatch的定时任务触发,每日一次
  3. S3 Bucket配置了触发器,一旦有文件更新则继续触发Lamda Parse
  4. Lamda Parse的工作就是解析S3上的新文件,并以时序数据的形式存储到InfluxDB上。
  5. 在Grafana前台配置图形界面

部署AWS Lambda时使用的是Serverless,配置文件如下:

service: fetch-csindex-loop

provider:
  name: aws
  runtime: python3.6
  stage: dev
  region: us-east-1
  memorySize: 128
  timeout: 300
  environment:
    DYNAMODB_TS: market-repo-${opt:stage, self:provider.stage}
    INFLUXDB: XXX
    URL_PERF: http://www.csindex.com.cn/uploads/file/autofile/perf/{{INDEX}}perf.xls
    URL_CONS: http://www.csindex.com.cn/uploads/file/autofile/cons/{{INDEX}}cons.xls
    BUCKET_DATA: csindex-data-files-${opt:stage, self:provider.stage}
    CODES: 000300|000016|000922|000905|000925|000015|000808|000806|000807|000918|000919|000913|000912|H30269|399975
  iamRoleStatements:
    - Effect: Allow
      Action:
        - dynamodb:Query
        - dynamodb:Scan
        - dynamodb:GetItem
        - dynamodb:PutItem
        - dynamodb:UpdateItem
        - dynamodb:DeleteItem
        - dynamodb:DescribeTable
      Resource:
        - arn:aws:dynamodb:us-east-1:*:table/${self:provider.environment.DYNAMODB_TS}
    - Effect: Allow
      Action:
        - s3:GetObject
        - s3:DeleteObject
        - s3:PutObject
      Resource:
        - arn:aws:s3:::csindex-data-files-${opt:stage, self:provider.stage}/*

functions:
  fetch-perf:
    handler: handler.fetch_perf_file
    events:
      - schedule: cron(0 0-1/1 ? * MON-FRI *)

  parse-perf:
    handler: handler.parse_perf_file
    events:
      - s3:
          bucket: csindex-data-files-${opt:stage, self:provider.stage}
          event: s3:ObjectCreated:*
          rules:
            - prefix: 'csindex_pref'

resources:
 Resources:
    FetchDashperfLogGroup:
      Type: AWS::Logs::LogGroup
      Properties:
        RetentionInDays: "90"
    ParseDashperfLogGroup:
      Type: AWS::Logs::LogGroup
      Properties:
        RetentionInDays: "90"

成果

以下是Grafana的监控图表,可以自己配置出数据涨跌的热力图,指数价格的变动,指数PE的变化等。

IND1

IND2