#cash #database #finql #price #assets #flow #period

finql-data

finql内部使用的crate,实现了异步数据库抽象层

7个版本

0.2.0 2021年7月6日
0.1.5 2021年3月15日
0.1.1 2021年2月18日

#280 in 财务

每月 30次下载
用于 2 crate

MIT/Apache

26KB
615

finql

该库的目的是随着时间的推移,为Rust中金融资产的定量分析提供全面的工具箱。该项目采用Apache 2.0或MIT许可证(参见文件LICENSE-Apache2.0和LICENSE-MIT),由用户选择。

目标是提供一个工具箱,用于定价各种金融产品,如债券期权或更复杂的产品。在短期内,重点是计算债券的折现现金流价值,基于标准招股说明书中提供的信息。实现这一目标的构建块包括时间段(例如“3M”或“10Y”)、银行假日日历、工作日调整规则、根据典型的计息天数计算方法计算年份数、现金流的滚动以及计算内部收益率或久期等对投资者有用的估值和风险指标。

计算如公允价值等主要在完全对冲场景下感兴趣的数值的功能不在初始关注范围内,因为投资者按定义不是完全对冲的。尽管如此,它们可能稍后添加以供比较和估计市场价格。

结构

库分为几个子crate。

数据类型

该crate包含基本数据类型的定义,如货币、股票、交易、报价、现金流等,以及一些处理货币或日期的基本辅助工具。

此crate还支持存储数据,如市场数据(例如市场报价信息)、与投资组合和交易管理相关的数据,以便能够支持投资组合分析(例如计算风险指标),以及通用的产品详情存储(例如债券规范)。这是通过定义各种数据类别的数据处理者特质来实现的,具体实现支持在单独的crate中存储数据库。

Postgres设置

PostgreSQL用于数据类型的持久化存储。其实现基于sqlx,使用宏在编译时实现查询检查。为了实现这一点,必须指定一个有效的数据库,否则构建将失败。

因此,请按照以下步骤构建库

  1. 设置PostgreSQL服务器,例如,按照https://postgresql.ac.cn上的文档进行操作
  2. 设置一个名为finqltester的PostgreSQL用户
  3. 可以通过将文件database/finqlpg.sql上传到您选择的数据库来创建一个小型示例数据库,例如
psql <databasename> < data/finqlpg.sql

例如,使用具有创建新数据库权限的某些用户,例如PostgreSQL的默认用户postgres

  1. 使用以下命令在命令行上导出数据库连接字符串
export DATABASE_URL="postgresql://127.0.0.1/<databasename>?user=finqltester&password=<password>&ssl=false"

对于http连接或

export DATABASE_URL="postgresql:///<databasename>?user=finqltester&password=<password>&ssl=false"

根据您的设置,通过UNIX套接字连接

  1. 使用以下命令构建库cargo build

请注意,此数据库仅用于构建库和执行所有编译时检查。一旦构建完成,数据库处理程序就可以设置一个新的空数据库。

示例

以下示例将演示库的不同用法。

adding_period

这是一个简单的演示程序,允许您添加时间段,例如3M表示三个月或-5Y表示五年前。

bond_comparison

此示例通过比较两个基于某些关键数字(例如到期收益率)的不同债券来演示固定利率投资的现金流摊销。

quotes_db

这是一个演示如何检索市场报价价格并将其持久化存储在数据库中的示例。

transaction_db

探讨了如何处理事务以及如何在数据库中存储它们。事务主要定义了投资生命周期中发生的现金流。在finql中,(变量)交易是任何分析的构建块。最终,现金流的流动是区分成功和失败的区别。

total_return

这是一个特定策略模拟的演示。在这里,我们将比较不同投资策略对单一股票的结果。静态投资与将任何现金流重新投资于股票的策略进行比较,考虑或不考虑费用和税费。结果将绘制到图像中,例如总回报图像

市场数据

可以从各种供应商自动获取市场数据报价并将其存储到数据库中。实现了针对供应商yahoo! financealpha vantagegurufocuseodhistoricaldata的报价或报价历史记录的获取。请注意,除yahoo! finance外,所有其他供应商都需要注册服务后提供的用户令牌。对于gurufocus,这需要付费许可证。

数据库设置

从版本0.8.x开始,我们使用sqlx crate,它支持SQL查询的编译时检查。然而,这要求环境变量DATABASE_URL设置为适当的连接字符串。对于Postgres,使用UNIX套接字连接,该变量可以设置为类似以下内容

export DATABASE_URL="postgresql:///<dbname>?user=<user>&password=<password>&ssl=false"

或者,您也可以遵循https://docs.rs/sqlx/0.5.1/sqlx/macro.query.html#offline-mode-requires-the-offline-feature上的说明。这需要一些准备,但不需要有实时数据库连接。

自版本0.11起不再支持sqlite3。

单元测试

部分单元测试需要访问一个适当(但可能为空)的测试数据库。访问数据库的字符串从环境变量 FINQL_TEST_DATABASE_URL 中读取。如果此变量未设置,这些测试将因错误信息 '环境变量 $FINQL_TEST_DATABASE_URL 未设置' 而失败。

注意:在运行测试之前,数据库将被清理,销毁所有数据.

因此,请确保不要将此变量设置为生产数据库的连接字符串。出于同样的原因,测试无法安全地并发运行。要同步运行测试,请使用

cargo test -- --test-threads=1

依赖项

~1.3–2.2MB
~41K SLoC