
关于Securities Masters的MySQL
既然我们已经讨论了Securities Masters数据库背后的思想,现在就应该实际构建一个数据库了。为此,我们将使用两种开源技术:MySQL数据库和Python编程语言。在本章结束时,你将有一个完全成熟的Securities Masters,与此进行进一步的定量交易研究的数据分析。
安装MySQL-在Ubuntu中安装MySQL很简单。只需打开终端并输入以下代码:
sudo apt-get install mysql-server
最终,将提示您输入根密码。这是您的主要管理密码,所以不要忘记它!输入密码,安装将继续并完成。
配置MySQL-现在MySQL已经安装在您的系统上,我们可以创建一个新的数据库和一个与之交互的用户。安装时将提示您输入根密码。要从命令行登录MySQL,请使用以下命令行,然后输入密码:
mysql -u root -p
一旦登录到MySQL,就可以创建一个名为securities_master的新数据库然后选择它:
mysql> CREATE DATABASE securities_master;
mysql> USE securities_master;
创建数据库之后,需要添加一个新用户来与数据库进行交互。
虽然可以使用根用户,但是从安全性的角度来看,这是一种不好的做法,因为它授予了太多的权限,可能会导致系统受到损害。在本地机器上,这几乎无关紧要,但在远程生产环境中,您肯定需要创建权限较低的用户。在这个实例中,我们的用户将被称为sec_user。记得用安全密码替换密码:
mysql> CREATE USER ’sec_user’@’localhost’ IDENTIFIED BY ’password’;
mysql> GRANT ALL PRIVILEGES ON securities_master.* TO ’sec_user’@’localhost’;
mysql> FLUSH PRIVILEGES;
上面的三行代码创建并授权用户使用securities_master并应用这些特权。从现在开始,与数据库发生的任何交互都将使用sec_user user。
EOD股票的模式设计-我们现在已经安装了MySQL,并配置了一个用户来与数据库进行交互。在这个阶段,我们准备构造必要的表来保存我们的财务数据。对于一个简单、直接的securities_master,我们将创建四个表:
Exchange
Exchange表列出了我们希望从哪些交易所获得股票定价信息。在这种情况下,几乎完全是纽约证券交易所(NYSE)和全美证券交易商自动报价协会(NASDAQ)。
DataVendor
此表列出了关于历史定价数据供应商的信息。我们将使用Yahoo Finance来获取我们的最终(EOD)数据。通过引入这个表,我们可以很容易地在必要时添加更多的供应商,比如谷歌Finance。
Symbol
Symbol表存储了股票代码和公司信息的列表。现在,我们将避免不同的共享类和多个符号名称等问题。
daily price
此表存储每种证券的每日价格信息。如果增加许多证券,它会变得非常大。因此,有必要对其进行性能优化。
MySQL是一个非常灵活的数据库,它允许您定制数据在底层存储引擎中的存储方式。MySQL中的两个主要竞争者是MyISAM和InnoDB。MyISAM能够快速阅读(如跨大量的价格信息查询),但是它不支持事务(必要完全回滚一个多步骤操作,但是在中部会失败)。InnoDB虽然是事务安全的,但是读起来比较慢。
InnoDB在写操作时也允许行级锁定,而MyISAM在写操作时锁定整个表。当将大量信息写入表中的任意点(例如使用UPDATE语句)时,可能会出现性能问题。
我们将使用InnoDB,因为它本身是事务安全的,并且提供行级锁。如果我们发现一个表读起来很慢,我们可以创建索引作为第一步,然后如果性能仍然是个问题,就更改底层存储引擎。我们所有的表都将使用UTF-8字符集,因为我们希望支持国际交流。
让我们从模式开始,为exchange表创建表SQL代码。它存储了交易所的缩写和名称(即NYSE - New York Stock exchange)以及地理位置。它还支持从UTC偏移的货币和时区。我们还为自己的内部目的存储一个创建好的和最近更新的日期。最后,我们将主索引键设置为一个自动递增的整数ID(足以处理2的32次方条记录):
CREATE TABLE ‘exchange‘ (
‘id‘ int NOT NULL AUTO_INCREMENT,
‘abbrev‘ varchar(32) NOT NULL,
‘name‘ varchar(255) NOT NULL,
‘city‘ varchar(255) NULL,
‘country‘ varchar(255) NULL,
‘currency‘ varchar(64) NULL,
‘timezone_offset‘ time NULL,
‘created_date‘ datetime NOT NULL,
‘last_updated_date‘ datetime NOT NULL,
PRIMARY KEY (‘id‘)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
下面是模式并为data_vendor表创建表SQL代码。它存储名称、网站和支持电子邮件。随着时间的推移,我们可以为供应商添加更多有用的信息,如API端点URL:
CREATE TABLE ‘data_vendor‘ (
‘id‘ int NOT NULL AUTO_INCREMENT,
‘name‘ varchar(64) NOT NULL,
‘website_url‘ varchar(255) NULL,
‘support_email‘ varchar(255) NULL,
‘created_date‘ datetime NOT NULL,
‘last_updated_date‘ datetime NOT NULL,
PRIMARY KEY (‘id‘)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
下面是模式并为符号表创建表SQL代码。它包含一个与交易所(我们暂时只支持交易所交易工具)、一个股票代码(例如GOOG)、一个工具类型(“股票”或“指数”)、股票或股票市场指数的名称、一个股票部门和一种货币的外国关键链接。
CREATE TABLE ‘symbol‘ (
‘id‘ int NOT NULL AUTO_INCREMENT,
‘exchange_id‘ int NULL,
‘ticker‘ varchar(32) NOT NULL,
‘instrument‘ varchar(64) NOT NULL,
‘name‘ varchar(255) NULL,
‘sector‘ varchar(255) NULL,
‘currency‘ varchar(32) NULL,
‘created_date‘ datetime NOT NULL,
‘last_updated_date‘ datetime NOT NULL,
PRIMARY KEY (‘id‘),
KEY ‘index_exchange_id‘ (‘exchange_id‘)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
下面是模式并为daily_price表创建表SQL代码。该表是实际存储历史定价数据的地方。我们用daily_作为表名的前缀,因为我们可能希望稍后在单独的表中创建分钟或秒的分辨率数据,以便采用更高的频率策略。该表包含两个外键——一个指向数据供应商,另一个指向符号。这唯一地标识了数据点,并允许我们在同一个表中为多个供应商存储相同的价格数据。我们还存储一个价格日期(即OHLC数据有效的每日周期)和为我们自己的目的创建的和最近更新的日期。
其余字段存储开-高-低-关和调整后的收盘价。雅虎金融为我们提供股息和股票分割,其价格最终在adj_close_price列。注意,数据类型是decimal(19,4)。在处理财务数据时,绝对有必要做到精确。如果我们使用了float数据类型,由于float数据在内部存储的性质,最终会出现舍入错误。最后一个字段存储当天的交易量。这使用bigint数据类型,这样我们就不会意外地截断非常高的成交量的日子。
CREATE TABLE ‘daily_price‘ (
‘id‘ int NOT NULL AUTO_INCREMENT,
‘data_vendor_id‘ int NOT NULL,
‘symbol_id‘ int NOT NULL,
‘price_date‘ datetime NOT NULL,
‘created_date‘ datetime NOT NULL,
‘last_updated_date‘ datetime NOT NULL,
‘open_price‘ decimal(19,4) NULL,
‘high_price‘ decimal(19,4) NULL,
‘low_price‘ decimal(19,4) NULL,
‘close_price‘ decimal(19,4) NULL,
‘adj_close_price‘ decimal(19,4) NULL,
‘volume‘ bigint NULL,
PRIMARY KEY (‘id‘),
KEY ‘index_data_vendor_id‘ (‘data_vendor_id‘),
KEY ‘index_symbol_id‘ (‘symbol_id‘)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
通过在MySQL命令行中输入上述所有SQL命令,将创建四个必要的表。
【交易学习】
【交易员洞察】
【基础知识】
【货币交易】
【黄金交易】
风险提示:以上内容仅代表作者或嘉宾的观点,不代表 FOLLOWME 的任何观点及立场,且不代表 FOLLOWME 同意其说法或描述,也不构成任何投资建议。对于访问者根据 FOLLOWME 社区提供的信息所做出的一切行为,除非另有明确的书面承诺文件,否则本社区不承担任何形式的责任。
FOLLOWME 交易社区网址: www.followme.ceo
加载失败()