41 个版本

0.12.0 2022年8月16日
0.11.0 2022年4月6日
0.10.0 2021年7月6日
0.9.3 2021年3月16日
0.2.0 2019年11月27日

#97 in 金融

Download history 20/week @ 2024-03-14 133/week @ 2024-03-28 104/week @ 2024-04-04

每月136 次下载
3 crates 中使用

MIT/Apache

295KB
7.5K SLoC

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构建库。

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

示例

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

添加时间段

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

债券比较

此示例演示了基于某些关键指标(例如到期收益率)比较两个不同债券的现金流滚动。

报价数据库

演示如何检索市场报价价格并将结果持久存储在数据库中。

交易数据库

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

总回报

演示了一种特定策略的模拟。在这里,我们将比较不同投资策略对单一股票的结局。静态投资与将任何现金流重新投资到股票的策略进行比较,无论是否考虑费用和税收支付。结果将被绘制成图像,例如请参阅总回报图像

市场数据

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

数据库设置

从版本0.8.x开始,我们使用支持SQL查询编译时检查的sqlx crate。然而,这要求将环境变量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

依赖项

~27–44MB
~757K SLoC