免费个人网站怎么建立:MySQL:日志和数据存储体系
本文摘要: 在互联网公司中,日志体系是一个十分重要的技能底层。在每一次重要的交互行为中,要害信息都会被记载下来存档,以供日后线下分析,或者线上实时分析。这些数据,乃至可以说是硅谷互联网大公司的命根子地点。有了它们,你才干建立



在互联网公司中,日志体系是一个十分重要的技能底层。在每一次重要的交互行为中,要害信息都会被记载下来存档,以供日后线下分析,或者线上实时分析。这些数据,乃至可以说是硅谷互联网大公司的命根子地点。

有了它们,你才干建立机器学习模型来猜测用户的行为,从而可以准确描绘用户画像,然后针对性地使用引荐体系、分类器,将用户进一步留下,并精准推送广告来盈利。

在量化交易中,日志相同有着十分重要的作用。一如前面所讲,我们重要的数据有:行情数据、策略信号、执行状况、仓位信息等等十分多的信息。

关于简略的、小规模的数据,例如 orderbook 信息,我们完全可以把数据存在 txt、csv 文件中,这样做简略高效。不过,缺点是,跟着数据量上升,一个文件将会变得十分大,检索起来也不容易。这时候,一个很直观的方式呈现了,我们可以把每天的数据存在一个文件中,这样就暂时缓解了为难。

可是,跟着数据量的上升,或者是你的算法逐渐来到高频交易领域时,简略地把数据存在文件上,现已不足以满足新的需求,更无法应对散布式量化交易体系的需求。于是,一个清楚明了的主见就是,我们可以把日志存在数据库体系中。

这节课,我们就以 MySQL 这种传统型关系数据库为例,说明一下数据库在日志中的运用。

快速了解 MySQL


忧虑一些同学没稀有据库的基础,我先来简略介绍一下 MySQL 数据库。

MySQL 属于典型的关系型数据库(RDBMS),所谓的关系型数据库,就是指建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法,来处理数据库中的数据。根本上任何学习资料都会通知你,它有着下面这几个特征:
  1. 数据是以表格的形式呈现的;
  2. 每一行是各种记载名称;
  3. 每一列是记载名称所对应的数据域;
  4. 许多的行和列,组成一张表单;
  5. 若干的表单,组成数据库(database)这个全体。

不过,抛开这些笼统的特征不谈,你首要需要把握的,是下面这些术语的概念。
  • 数据库,是一些关联表的集合;而数据表则是数据的矩阵。在一个数据库中,数据表看起来就像是一个简略的电子表格。
  • 在数据表中,每一列包括的是相同类型的数据;每一行则是一组相关的数据。
  • 主键也是数据表中的一个列,只不过,这一列的每行元素都是仅有的,且一个数据表中只能包括一个主键;而外键则用于关联两个表。

除此之外,你还需要了解索引。索引是对数据库表中一列或多列的值进行排序的一种结构。使用索引,我们可以快速拜访数据库表中的特定信息。一般来说,你可以对很多列设置索引,这样在检索指定列的时分,就大大加速了速度,当然,价值是刺进数据会变得更慢。

至于操作 MySQL,一般用的是结构化查询言语 SQL。SQL 是一种典型的领域专用言语(domain-specific language,简称 DSL),这里我就不做过多介绍了,假如你感爱好,可以学习极客时间平台上的“SQL 必知必会”专栏。

接下来,我们就来简略看一下,怎么使用 Python 来操作 MySQL 数据库。

Python 连接数据库的方式有好多种,这里我简略介绍其间两种。我们以 Ubuntu 为例,假设你的体系中现已装置过 MySQL Server。(装置 MySQL 可以参考这篇文章 https://www.jianshu.com/p/3111290b87f4,或者你可以自行查找解决)

mysqlclient


事实上, Python 连接 MySQL 最盛行的一个驱动是 MySQL-python,又叫 MySQLdb,很多框架都也是基于此库进行开发。不过,遗憾的是,它只支撑 Python2.x,并且装置的时分有很多前置条件。因为它是基于 C 开发的库,在 Windows 平台装置十分不友爱,常常呈现失败的状况。所以,现在我们根本不再引荐使用,取代者是它的衍生版本——mysqlclient。

mysqlclient 完全兼容 MySQLdb,同时支撑 Python3.x,是 Django ORM 的依赖东西。假如你想使用原生 SQL 来操作数据库,那么我优先引荐使用这个框架。

它的装置方式很简略:
sudo apt-get install python3-devpip install mysqlclient复制代码

我们来看一个样例代码:
import MySQLdb  def test_pymysql():    conn = MySQLdb.connect(        host='localhost',        port=3306,        user='your_username',        passwd=your_password’,        db='mysql'    )     cur = conn.cursor()    cur.execute('''            CREATE TABLE price (                timestamp TIMESTAMP NOT NULL,                BTCUSD FLOAT(8,2),                PRIMARY KEY (timestamp)            );        ''')    cur.execute('''            INSERT INTO price VALUES(                "2019-07-14 14:12:17",                11234.56            );        ''')     conn.commit()    conn.close()  test_pymy复制代码

代码的思路很明晰明了,首要是通过 connect 命令连接数据库,来创建一个连接;之后,通过 conn.cursor() 函数创建一个游标。这里你可能会问,为何要使用游标呢?

一个主要的原因就是,这样可以把集合操作转换成单个记载处理的方式。假如用 SQL 言语从数据库中检索数据,成果会放在内存的一块区域中,并且这个成果往往是一个含有多个记载的集合。而游标机制,则允许用户在 MySQL 内逐行地拜访这些记载,这样你就能够依照自己的意愿,来显示和处理这些记载。

继续回到代码中,再往下走,我们创建了一个 price table,同时向里边刺进一条 orderbook 数据。这里为了简化代码突出重点,我只保留了 timestamp 和 price。

终究,我们使用 conn.commit() 来提交更改,然后 close() 掉连接就能够了。

peewee


不过,我们逐渐发现,写原生的 SQL 命令很麻烦。因为你需要依据特定的事务逻辑,来构造特定的刺进和查询语句,这样可以说就完全扔掉了面向对象的思维。因此,又诞生了很多封装 wrapper 包和 ORM 框架。

这里所说的 ORM(Object Relational Mapping,简称 ORM) ,是 Python 对象与数据库关系表的一种映射关系,有了 ORM 后,我们就不再需要写 SQL 语句,而可以直接使用 Python 的数据结构了。

ORM 框架的利益,是提高了写代码的速度,同时兼容多种数据库体系,如 SQLite、MySQL、PostgreSQL 等这些数据库;而支付的价值,可能就是性能上的一些损失。

接下来要讲的 peewee,正是其间一种基于 Python 的 ORM 框架,它的学习本钱十分低,可以说是 Python 中最盛行的 ORM 框架。

它的装置方式也很简略:
pip install peewee复制代码

我们来看一个样例代码:
import peeweefrom peewee import * db = MySQLDatabase('mysql', user='your_username', passwd=your_password’)  class Price(peewee.Model):    timestamp = peewee.DateTimeField(primary_key=True)    BTCUSD = peewee.FloatField()     class Meta:        database = db  def test_peewee():    Price.create_table()    price = Price(timestamp='2019-06-07 13:17:18', BTCUSD='12345.67')    price.save()  test_p复制代码

假如你写过 Django,你会发现,这个写法和 Django 简直一摸一样。我们通过一个 Python class ,映射了 MySQL 中的一张数据表;只需对其间每一列数据格局进行界说,便可依照 Python 的方式进行操作。

清楚明了,peewee 的最大利益,就是让 SQL 言语瞬间变成强类型言语,这样不只极大地增强了可读性,也能有用减少出 bug 的概率。

不过,事实上,作为一名数据科学家,或者作为一名量化从业者(quant ),你要处理的数据远比这些杂乱很多。互联网工业界有很多的脏数据,金融行业的信噪比更对错常之低,数据处理只能算是根本功。

假如你对数据分析有爱好和志向,在学生时期就应该先打牢数学和统计的基础,之后在实习和工作中快速把握数据处理的方法。当然,假如你现已错过学生时期的话,现在开始也是个不错的选择,毕竟,逐渐构成自己的核心竞争力,才是我们每一个人的正路。

量化数据分析体系


数据库有了量化数据存入后,接下来,我们便可以开始进行一些量化分析了。这一起也是一个很大的学术领域,叫做时间序列分析,不过就今天这节课的主题来说,我们仅做举一反三,罗列一个十分简略的例子,即求以前一个小时 BTC/USD 的最高价和最低价。

我们来看下面这段代码:
import MySQLdbimport numpy as np  def test_pymysql():    conn = MySQLdb.connect(        host='localhost',        port=3306,        user='your_username',        passwd='your_password',        db='mysql'    )     cur = conn.cursor()    cur.execute('''            SELECT              BTCUSD            FROM              price            WHERE              timestamp > now() - interval 60 minute    ''')     BTCUSD = np.array(cur.fetchall())    print(BTCUSD.max(), BTCUSD.min())     conn.close()  test_pym复制代码

代码看起来很简略吧!显然,通过 SQL 语句,我们可以抓取到以前一小时的时间序列片段,拿到我们想要的 BTC/USD 价格向量,然后通过 numpy 处理一下即可。不过这里需要留意一点,我们其实不需要调用 conn.commit(),因为我们的操作是只读的,对数据库没有任何影响。

散布式日志体系


理解了上面的内容后,我们现在来看一下散布式日志体系。

对量化交易而言,我们需要的模块主要稀有据体系、策略体系、交易执行体系、线下模型训练、线优势控体系以及实时监控体系。它们之间的对应关系,我画了一张图,你可以参考来了解。


这里的每一个子体系都是独立运转的,并且还有许多模块需要迭代更新,所以我们简略保存本地日志显然不是一个明智之举。于是,我们可以专门开一台效劳器来运转 MySQL server,并且开放指定端口和其他体系进行交互。

另外,图中的收集体系,其实类似于上一节我们所讲的音讯行列体系,在各个上游体系中运转代理东西,负责将各个模块的 log 收集起来,然后发送到收集体系中。收集体系整理往后,再将信息存到日志体系。当然,除了简略的音讯行列,我们还能用很多东西,比如阿里云的 Logtail、 Apache 的 Flume Agent 等等。

而到了后期,关于日志体系来说,愈来愈需要留意的就是存储功率和分析功率。跟着使用的添加,数据会愈来愈多,因此我们可以考虑对一些数据进行紧缩和保存。而越是久远的数据,越是粗粒度的数据,被调用的概率也就越低,所以它们也就首当其冲,成了我们紧缩、保存的方针。

日志分析


终究,我再来补充讲一讲日志的分析。前面提到过,分析一般分为两种,离线分析和在线分析。

在离线分析中,比较常见的是生成陈述。

比如,总结某天某月或某季度内的,收益亏本状况(PnL)、最大回撤、夏普比率等数据。这种基于时间窗口的统计,在关系型数据库中也能得到很便利的支撑。

而另外一类常见的离线使用方式,则是回测体系。在一个新策略研发的周期中,我们需要对前史数据进行回测,这样就能够得到前史数据中交易的收益率等数据。回测体系关于评价一个新的策略十分重要,然而,回测往往需要很多的资源,所以选取好数据库、数据存储方式,优化数据连接和核算,就显得至关重要。

在线分析,则更多应用于风控和警报体系。这种方式,对数据的实时性要求更高一些,于是,一种方法就是,从音讯行列中直接拿最快的数据进行操作。当然,这个条件是时间窗口较小,这样你就不需要风控体系来维护很多的本地数据。

至于实时警报,最要害的仍然是数据。
  • 比如,数据体系异常停止,被监督的表没有更新;
  • 或者,交易体系的连接出了故障,委托订单的某些状态超过了一定的阈值;
  • 再或者,仓位信息呈现了较大的、预计之外的改动。

这些状况都需要进行报警,也就是硅谷大公司所说的“oncall”。一旦发生意外,负责人会迅速收到手机、短信和邮件,然后通过监控平台来确认,是真的出了事故仍是监控误报。

当然,现在现已有了不少开源的东西可以在云端使用,其间 AWS 属于全球抢先的云核算平台。假如你的效劳器架设在美国,那就能够考虑选择它家的各式各样的云效劳。这样做的优点是,关于小型量化交易团队而言,防止自己搭建杂乱的日志体系,而是把主要精力放在策略的开发迭代之上,提高了不少功率。

总结


这一节课,我从工程的角度,为你介绍了量化体系中的存储体系。我们从基础的 MySQL 的使用方法讲起,再讲到后边的量化体系框架。数据库和数据在绝大部分互联网行业都是核心,对量化从业者来说也是重要的出产资料。而搭建一套负载合理、数据可靠的数据体系,也需要一个量化团队长时间打磨,并依据需求进行迭代。

考虑题


终究给你留一道考虑题。量化交易需要的数据量不是很大,可是有可能呈现调用频率极高的状况,例如回测体系。那么,你能想到哪些优化手法,来下降调用价值吗?欢迎留言和我评论,也欢迎你把这篇文章分享出去。

【免责声明】本文仅代表作者或发布者个人观念,不代表(www.lmnkf.cn)及其所属公司官方发声,对文章观念有疑义请先联络作者或发布者自己修正,若内容触及侵权或违法信息,请先联络发布者或作者删除,若需我们协助请联络平台管理员,Emailcxb5918(本平台不支撑其他投诉反馈渠道,谢谢合作)。若需要学习以上相关常识请到巨推学院观看视频教程,网站地址www.tsllg.cn。