fincore-py 0.1.0.dev4__tar.gz → 0.1.0.dev5__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev5}/.github/workflows/ci.yml +5 -1
  2. {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev5}/MANIFEST.in +1 -0
  3. {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev5}/PKG-INFO +34 -34
  4. {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev5}/README.md +23 -7
  5. fincore_py-0.1.0.dev5/docs/_static/fincore-wordmark.svg +29 -0
  6. {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev5}/docs/conf.py +2 -2
  7. {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev5}/docs/index.rst +5 -3
  8. {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev5}/docs/schemas.rst +1 -1
  9. fincore_py-0.1.0.dev5/examples/01_data_discovery.py +31 -0
  10. fincore_py-0.1.0.dev5/examples/02_batch_analytics.py +31 -0
  11. fincore_py-0.1.0.dev5/examples/03_streaming_metrics.py +27 -0
  12. fincore_py-0.1.0.dev5/examples/04_external_rows.py +37 -0
  13. fincore_py-0.1.0.dev5/examples/05_kafka_publish.py +25 -0
  14. fincore_py-0.1.0.dev5/examples/README.md +31 -0
  15. {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev5}/pyproject.toml +24 -5
  16. {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev5}/python/fincore/_version.py +2 -2
  17. {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev5}/python/fincore_py.egg-info/PKG-INFO +34 -34
  18. {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev5}/python/fincore_py.egg-info/SOURCES.txt +6 -0
  19. fincore_py-0.1.0.dev4/docs/_static/fincore-wordmark.svg +0 -14
  20. {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev5}/.github/workflows/docs.yml +0 -0
  21. {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev5}/.github/workflows/publish.yml +0 -0
  22. {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev5}/.gitignore +0 -0
  23. {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev5}/Cargo.toml +0 -0
  24. {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev5}/LICENSE +0 -0
  25. {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev5}/docs/_static/brand.css +0 -0
  26. {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev5}/docs/analytics_calculations.rst +0 -0
  27. {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev5}/docs/api.rst +0 -0
  28. {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev5}/docs/brand.rst +0 -0
  29. {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev5}/docs/concepts.rst +0 -0
  30. {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev5}/docs/finance_concepts.rst +0 -0
  31. {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev5}/docs/getting_started.rst +0 -0
  32. {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev5}/docs/streaming.rst +0 -0
  33. {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev5}/python/fincore/__init__.py +0 -0
  34. {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev5}/python/fincore/analytics/__init__.py +0 -0
  35. {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev5}/python/fincore/analytics/engine.py +0 -0
  36. {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev5}/python/fincore/analytics/models.py +0 -0
  37. {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev5}/python/fincore/analytics/normalize.py +0 -0
  38. {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev5}/python/fincore/data/__init__.py +0 -0
  39. {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev5}/python/fincore/data/client.py +0 -0
  40. {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev5}/python/fincore/data/events.py +0 -0
  41. {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev5}/python/fincore/data/kafka.py +0 -0
  42. {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev5}/python/fincore/data/sources.py +0 -0
  43. {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev5}/python/fincore/data/utils.py +0 -0
  44. {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev5}/python/fincore_py.egg-info/dependency_links.txt +0 -0
  45. {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev5}/python/fincore_py.egg-info/not-zip-safe +0 -0
  46. {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev5}/python/fincore_py.egg-info/requires.txt +0 -0
  47. {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev5}/python/fincore_py.egg-info/top_level.txt +0 -0
  48. {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev5}/requirements-docs.txt +0 -0
  49. {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev5}/requirements-kafka.txt +0 -0
  50. {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev5}/requirements.txt +0 -0
  51. {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev5}/setup.cfg +0 -0
  52. {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev5}/setup.py +0 -0
  53. {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev5}/src/analytics.rs +0 -0
  54. {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev5}/src/errors.rs +0 -0
  55. {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev5}/src/lib.rs +0 -0
  56. {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev5}/src/models.rs +0 -0
  57. {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev5}/src/pyconvert.rs +0 -0
  58. {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev5}/src/sources.rs +0 -0
  59. {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev5}/tests/conftest.py +0 -0
  60. {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev5}/tests/test_analytics.py +0 -0
  61. {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev5}/tests/test_data_client.py +0 -0
  62. {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev5}/tests/test_events.py +0 -0
  63. {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev5}/tests/test_utils.py +0 -0
  64. {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev5}/tox.ini +0 -0
@@ -9,6 +9,7 @@ on:
9
9
 
10
10
  permissions:
11
11
  contents: read
12
+ id-token: write
12
13
 
13
14
  jobs:
14
15
  test:
@@ -35,9 +36,12 @@ jobs:
35
36
  PYO3_USE_ABI3_FORWARD_COMPATIBILITY: "1"
36
37
 
37
38
  - name: Upload coverage to Codecov
38
- uses: codecov/codecov-action@v5
39
+ uses: codecov/codecov-action@v7
39
40
  with:
40
41
  files: coverage.xml
42
+ flags: python
43
+ name: fincore-python
44
+ token: ${{ secrets.CODECOV_TOKEN }}
41
45
  fail_ci_if_error: false
42
46
 
43
47
  - name: Check Rust formatting
@@ -3,3 +3,4 @@ include LICENSE
3
3
  include README.md
4
4
  recursive-include src *.rs
5
5
  recursive-include python *.py
6
+ recursive-include examples *.md *.py
@@ -1,36 +1,20 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fincore-py
3
- Version: 0.1.0.dev4
4
- Summary: Python-facing financial market data access library powered by Rust.
5
- Author: fincore contributors
6
- License: MIT License
7
-
8
- Copyright (c) 2026 Avinash
9
-
10
- Permission is hereby granted, free of charge, to any person obtaining a copy
11
- of this software and associated documentation files (the "Software"), to deal
12
- in the Software without restriction, including without limitation the rights
13
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14
- copies of the Software, and to permit persons to whom the Software is
15
- furnished to do so, subject to the following conditions:
16
-
17
- The above copyright notice and this permission notice shall be included in all
18
- copies or substantial portions of the Software.
19
-
20
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26
- SOFTWARE.
27
-
3
+ Version: 0.1.0.dev5
4
+ Summary: Event-driven financial data and analytics framework for real-time market infrastructure.
5
+ Author: Avinash Chandra
6
+ License-Expression: MIT
28
7
  Project-URL: Documentation, https://avi2413.github.io/fincore/
29
8
  Project-URL: Repository, https://github.com/avi2413/fincore
30
- Keywords: finance,market-data,rust,python
31
- Classifier: Development Status :: 3 - Alpha
9
+ Project-URL: Issues, https://github.com/avi2413/fincore/issues
10
+ Keywords: analytics,event-driven,finance,financial-data,kafka,market-data,metrics,python,quant,real-time,rust,streaming
11
+ Classifier: Development Status :: 4 - Beta
12
+ Classifier: Intended Audience :: Developers
13
+ Classifier: Intended Audience :: Financial and Insurance Industry
32
14
  Classifier: Programming Language :: Python :: 3
33
15
  Classifier: Programming Language :: Rust
16
+ Classifier: Topic :: Database
17
+ Classifier: Topic :: Scientific/Engineering :: Information Analysis
34
18
  Classifier: Topic :: Office/Business :: Financial
35
19
  Requires-Python: >=3.10
36
20
  Description-Content-Type: text/markdown
@@ -47,12 +31,13 @@ Requires-Dist: tox>=4; extra == "test"
47
31
  Dynamic: license-file
48
32
 
49
33
  <p align="center">
50
- <img src="https://raw.githubusercontent.com/avi2413/fincore/main/docs/_static/fincore-wordmark.svg" alt="fincore wordmark" width="520">
34
+ <img src="https://raw.githubusercontent.com/avi2413/fincore/main/docs/_static/fincore-wordmark.svg" alt="fincore wordmark" width="100%">
51
35
  </p>
52
36
 
53
37
  <p align="center">
54
38
  <a href="https://pypi.org/project/fincore-py/"><img src="https://img.shields.io/pypi/v/fincore-py.svg?color=111111&label=PyPI" alt="PyPI version"></a>
55
39
  <a href="https://pypi.org/project/fincore-py/#history"><img src="https://img.shields.io/badge/PyPI-dev%20builds-7A1E1E" alt="PyPI dev builds"></a>
40
+ <a href="https://pypi.org/project/fincore-py/"><img src="https://img.shields.io/pypi/pyversions/fincore-py.svg?color=111111" alt="Python versions"></a>
56
41
  <a href="https://github.com/avi2413/fincore/actions/workflows/ci.yml"><img src="https://github.com/avi2413/fincore/actions/workflows/ci.yml/badge.svg" alt="CI workflow"></a>
57
42
  <a href="https://codecov.io/gh/avi2413/fincore"><img src="https://codecov.io/gh/avi2413/fincore/branch/main/graph/badge.svg" alt="Codecov coverage"></a>
58
43
  <a href="https://github.com/avi2413/fincore/actions/workflows/publish.yml"><img src="https://github.com/avi2413/fincore/actions/workflows/publish.yml/badge.svg" alt="Publish workflow"></a>
@@ -63,17 +48,17 @@ Dynamic: license-file
63
48
 
64
49
  # fincore
65
50
 
66
- `fincore` is a developer-first financial data library.
51
+ `fincore` is an event-driven financial data and analytics framework for building real-time market infrastructure.
67
52
 
68
- The package is designed for software and data engineers who understand systems, streams, schemas, and downstream storage, but may not yet know finance. The motive is to create a financial data product with a very low barrier of use and understanding: ask for `"Apple"`, get `AAPL`; ask for `"10 year treasury"`, get a usable yield series; ask for a recent minute range, get normalized market events that can flow into Kafka, TimescaleDB, notebooks, or future analytics.
53
+ The package is designed for software and data engineers who think in streams, schemas, event envelopes, metrics, and downstream storage. It provides a low-barrier way to build market-data pipelines: resolve `"Apple"` to `AAPL`, fetch or replay bars, emit Kafka-ready events, derive normalized analytics events, and feed those events into notebooks, databases, stream processors, or future inference systems.
69
54
 
70
- This is a personal research project and an early alpha package. It is not a production-grade market data client, trading system, investment tool, or source of financial advice. Free public data sources can be delayed, incomplete, rate limited, schema-changing, or unavailable.
55
+ This is a personal research project by Avinash Chandra and a beta-stage package. It is not a production-grade market data client, trading system, investment tool, or source of financial advice. Free public data sources can be delayed, incomplete, rate limited, schema-changing, or unavailable.
71
56
 
72
57
  The Python import name is `fincore`. The PyPI distribution name is `fincore-py`.
73
58
 
74
59
  ## Current Scope
75
60
 
76
- `fincore-py` currently focuses on data access, not trading or portfolio analytics.
61
+ `fincore-py` currently focuses on data access, event streams, and metrics. It does not do trading, order execution, portfolio construction, or investment recommendations.
77
62
 
78
63
  Implemented today:
79
64
 
@@ -117,6 +102,7 @@ Rust extension
117
102
  Yahoo Finance bar fetching
118
103
  Nasdaq Trader, ASX, and NSE directory parsing
119
104
  FRED yield fetching
105
+ metric calculations
120
106
  normalized Python dict conversion
121
107
  ```
122
108
 
@@ -176,6 +162,8 @@ client.search_instruments("apple", limit=5)
176
162
  client.resolve_symbol("Apple")
177
163
  ```
178
164
 
165
+ More complete examples live in [`examples/`](examples/).
166
+
179
167
  Choose a market context:
180
168
 
181
169
  ```python
@@ -497,7 +485,7 @@ The docs explain:
497
485
  - market data concepts for non-finance developers
498
486
  - streaming and Kafka concepts
499
487
  - the current API surface
500
- - future analytics direction
488
+ - analytics calculations and metric events
501
489
 
502
490
  Docs are deployed to GitHub Pages from `.github/workflows/docs.yml` on pushes to `main`, version tags, and manual dispatch.
503
491
 
@@ -586,6 +574,18 @@ async for metric_event in engine.run(client.stream_bars(["Apple"], interval="1m"
586
574
 
587
575
  Python package versions are derived from git tags through `setuptools-scm`.
588
576
 
577
+ Install the latest beta/dev package from PyPI:
578
+
579
+ ```bash
580
+ python -m pip install fincore-py
581
+ ```
582
+
583
+ Kafka extras:
584
+
585
+ ```bash
586
+ python -m pip install "fincore-py[kafka]"
587
+ ```
588
+
589
589
  For a beta pre-release:
590
590
 
591
591
  ```bash
@@ -609,4 +609,4 @@ Environment: pypi
609
609
 
610
610
  ## Status
611
611
 
612
- Early alpha implementation stage. The data client is usable for discovery, historical bars, yield series, replay streams, polling streams, and Kafka publishing for personal research and prototyping. The analytics layer now emits normalized metric events for batch and streaming workflows.
612
+ Beta implementation stage. The data client is usable for discovery, historical bars, yield series, replay streams, polling streams, and Kafka publishing for personal research and prototyping. The analytics layer emits normalized metric events for batch and streaming workflows.
@@ -1,10 +1,11 @@
1
1
  <p align="center">
2
- <img src="https://raw.githubusercontent.com/avi2413/fincore/main/docs/_static/fincore-wordmark.svg" alt="fincore wordmark" width="520">
2
+ <img src="https://raw.githubusercontent.com/avi2413/fincore/main/docs/_static/fincore-wordmark.svg" alt="fincore wordmark" width="100%">
3
3
  </p>
4
4
 
5
5
  <p align="center">
6
6
  <a href="https://pypi.org/project/fincore-py/"><img src="https://img.shields.io/pypi/v/fincore-py.svg?color=111111&label=PyPI" alt="PyPI version"></a>
7
7
  <a href="https://pypi.org/project/fincore-py/#history"><img src="https://img.shields.io/badge/PyPI-dev%20builds-7A1E1E" alt="PyPI dev builds"></a>
8
+ <a href="https://pypi.org/project/fincore-py/"><img src="https://img.shields.io/pypi/pyversions/fincore-py.svg?color=111111" alt="Python versions"></a>
8
9
  <a href="https://github.com/avi2413/fincore/actions/workflows/ci.yml"><img src="https://github.com/avi2413/fincore/actions/workflows/ci.yml/badge.svg" alt="CI workflow"></a>
9
10
  <a href="https://codecov.io/gh/avi2413/fincore"><img src="https://codecov.io/gh/avi2413/fincore/branch/main/graph/badge.svg" alt="Codecov coverage"></a>
10
11
  <a href="https://github.com/avi2413/fincore/actions/workflows/publish.yml"><img src="https://github.com/avi2413/fincore/actions/workflows/publish.yml/badge.svg" alt="Publish workflow"></a>
@@ -15,17 +16,17 @@
15
16
 
16
17
  # fincore
17
18
 
18
- `fincore` is a developer-first financial data library.
19
+ `fincore` is an event-driven financial data and analytics framework for building real-time market infrastructure.
19
20
 
20
- The package is designed for software and data engineers who understand systems, streams, schemas, and downstream storage, but may not yet know finance. The motive is to create a financial data product with a very low barrier of use and understanding: ask for `"Apple"`, get `AAPL`; ask for `"10 year treasury"`, get a usable yield series; ask for a recent minute range, get normalized market events that can flow into Kafka, TimescaleDB, notebooks, or future analytics.
21
+ The package is designed for software and data engineers who think in streams, schemas, event envelopes, metrics, and downstream storage. It provides a low-barrier way to build market-data pipelines: resolve `"Apple"` to `AAPL`, fetch or replay bars, emit Kafka-ready events, derive normalized analytics events, and feed those events into notebooks, databases, stream processors, or future inference systems.
21
22
 
22
- This is a personal research project and an early alpha package. It is not a production-grade market data client, trading system, investment tool, or source of financial advice. Free public data sources can be delayed, incomplete, rate limited, schema-changing, or unavailable.
23
+ This is a personal research project by Avinash Chandra and a beta-stage package. It is not a production-grade market data client, trading system, investment tool, or source of financial advice. Free public data sources can be delayed, incomplete, rate limited, schema-changing, or unavailable.
23
24
 
24
25
  The Python import name is `fincore`. The PyPI distribution name is `fincore-py`.
25
26
 
26
27
  ## Current Scope
27
28
 
28
- `fincore-py` currently focuses on data access, not trading or portfolio analytics.
29
+ `fincore-py` currently focuses on data access, event streams, and metrics. It does not do trading, order execution, portfolio construction, or investment recommendations.
29
30
 
30
31
  Implemented today:
31
32
 
@@ -69,6 +70,7 @@ Rust extension
69
70
  Yahoo Finance bar fetching
70
71
  Nasdaq Trader, ASX, and NSE directory parsing
71
72
  FRED yield fetching
73
+ metric calculations
72
74
  normalized Python dict conversion
73
75
  ```
74
76
 
@@ -128,6 +130,8 @@ client.search_instruments("apple", limit=5)
128
130
  client.resolve_symbol("Apple")
129
131
  ```
130
132
 
133
+ More complete examples live in [`examples/`](examples/).
134
+
131
135
  Choose a market context:
132
136
 
133
137
  ```python
@@ -449,7 +453,7 @@ The docs explain:
449
453
  - market data concepts for non-finance developers
450
454
  - streaming and Kafka concepts
451
455
  - the current API surface
452
- - future analytics direction
456
+ - analytics calculations and metric events
453
457
 
454
458
  Docs are deployed to GitHub Pages from `.github/workflows/docs.yml` on pushes to `main`, version tags, and manual dispatch.
455
459
 
@@ -538,6 +542,18 @@ async for metric_event in engine.run(client.stream_bars(["Apple"], interval="1m"
538
542
 
539
543
  Python package versions are derived from git tags through `setuptools-scm`.
540
544
 
545
+ Install the latest beta/dev package from PyPI:
546
+
547
+ ```bash
548
+ python -m pip install fincore-py
549
+ ```
550
+
551
+ Kafka extras:
552
+
553
+ ```bash
554
+ python -m pip install "fincore-py[kafka]"
555
+ ```
556
+
541
557
  For a beta pre-release:
542
558
 
543
559
  ```bash
@@ -561,4 +577,4 @@ Environment: pypi
561
577
 
562
578
  ## Status
563
579
 
564
- Early alpha implementation stage. The data client is usable for discovery, historical bars, yield series, replay streams, polling streams, and Kafka publishing for personal research and prototyping. The analytics layer now emits normalized metric events for batch and streaming workflows.
580
+ Beta implementation stage. The data client is usable for discovery, historical bars, yield series, replay streams, polling streams, and Kafka publishing for personal research and prototyping. The analytics layer emits normalized metric events for batch and streaming workflows.
@@ -0,0 +1,29 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="1440" height="300" viewBox="0 0 1440 300" role="img" aria-labelledby="title desc">
2
+ <title id="title">fincore wordmark</title>
3
+ <desc id="desc">Noir brutalist fincore wordmark showing event streams, normalized data, and analytics signals.</desc>
4
+ <rect width="1440" height="300" fill="#0B0B0B"/>
5
+ <path d="M0 246H1440" stroke="#191919" stroke-width="2"/>
6
+ <path d="M0 68H1440" stroke="#151515" stroke-width="2"/>
7
+ <g transform="translate(82 70)">
8
+ <rect x="0" y="0" width="160" height="160" fill="none" stroke="#D9D2C3" stroke-width="3"/>
9
+ <path d="M24 40H66M94 40H136M24 80H52M80 80H136M24 120H70M98 120H136" stroke="#6F6A61" stroke-width="5" stroke-linecap="square"/>
10
+ <circle cx="76" cy="40" r="8" fill="#8F1D1D"/>
11
+ <circle cx="66" cy="80" r="8" fill="#D9D2C3"/>
12
+ <circle cx="84" cy="120" r="8" fill="#8F1D1D"/>
13
+ <path d="M32 136L58 108L82 116L112 72L132 88" fill="none" stroke="#D9D2C3" stroke-width="4" stroke-linecap="square" stroke-linejoin="miter"/>
14
+ <path d="M32 136L58 108L82 116L112 72L132 88" fill="none" stroke="#8F1D1D" stroke-width="2" stroke-linecap="square" stroke-linejoin="miter"/>
15
+ </g>
16
+ <text x="282" y="144" fill="#EFE8D8" font-family="'Arial Narrow', 'Helvetica Neue Condensed Bold', 'Roboto Condensed', Arial, sans-serif" font-size="102" font-weight="800" letter-spacing="10">FINCORE</text>
17
+ <path d="M286 166H934" stroke="#8F1D1D" stroke-width="5"/>
18
+ <text x="288" y="212" fill="#A8A096" font-family="'Arial Narrow', 'Roboto Condensed', Arial, sans-serif" font-size="28" font-weight="700" letter-spacing="5">EVENT-DRIVEN DATA + ANALYTICS INFRASTRUCTURE</text>
19
+ <g transform="translate(1058 86)" stroke-linecap="square">
20
+ <path d="M0 32H245" stroke="#2A2A2A" stroke-width="3"/>
21
+ <path d="M0 76H245" stroke="#2A2A2A" stroke-width="3"/>
22
+ <path d="M0 120H245" stroke="#2A2A2A" stroke-width="3"/>
23
+ <path d="M22 32H66L94 76H146L174 120H226" stroke="#8F1D1D" stroke-width="5" fill="none"/>
24
+ <path d="M22 120H70L102 76H150L182 32H226" stroke="#D9D2C3" stroke-width="4" fill="none"/>
25
+ <circle cx="94" cy="76" r="7" fill="#D9D2C3"/>
26
+ <circle cx="174" cy="120" r="7" fill="#8F1D1D"/>
27
+ <circle cx="182" cy="32" r="7" fill="#D9D2C3"/>
28
+ </g>
29
+ </svg>
@@ -1,6 +1,6 @@
1
1
  project = "fincore-py"
2
- author = "fincore contributors"
3
- copyright = "2026, fincore contributors"
2
+ author = "Avinash Chandra"
3
+ copyright = "2026, Avinash Chandra"
4
4
  extensions = [
5
5
  "sphinx.ext.autodoc",
6
6
  "sphinx.ext.napoleon",
@@ -1,9 +1,10 @@
1
1
  fincore-py documentation
2
2
  ========================
3
3
 
4
- ``fincore-py`` is a developer-first financial data library. It is designed for
5
- engineers who understand data systems, streams, schemas, and downstream storage,
6
- but may not yet know market conventions or financial terminology.
4
+ ``fincore-py`` is an event-driven financial data and analytics framework for
5
+ building real-time market infrastructure. It is designed for engineers who
6
+ understand data systems, streams, schemas, and downstream storage, but may not
7
+ yet know market conventions or financial terminology.
7
8
 
8
9
  The package imports as ``fincore`` and currently focuses on:
9
10
 
@@ -14,6 +15,7 @@ The package imports as ``fincore`` and currently focuses on:
14
15
  * historical replay streams
15
16
  * delayed polling streams for latest bars
16
17
  * Kafka-ready event envelopes
18
+ * normalized analytics metric events
17
19
 
18
20
  .. toctree::
19
21
  :maxdepth: 2
@@ -2,7 +2,7 @@ Output schemas
2
2
  ==============
3
3
 
4
4
  ``fincore-py`` returns plain Python dictionaries. The shapes below are the
5
- public contract for the current alpha data layer.
5
+ public contract for the current beta data and analytics layers.
6
6
 
7
7
  Instrument
8
8
  ----------
@@ -0,0 +1,31 @@
1
+ """Discover instruments and fetch normalized data."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from fincore.data import DataClient
6
+
7
+
8
+ def main() -> None:
9
+ client = DataClient(market="US")
10
+ print("US matches for Apple:")
11
+ print(client.search_instruments("apple", limit=3))
12
+
13
+ au = DataClient(market="AU")
14
+ print("Australia matches for BHP:")
15
+ print(au.search_instruments("bhp", limit=3))
16
+
17
+ india = DataClient(market="IN")
18
+ print("India matches for Reliance:")
19
+ print(india.search_instruments("reliance", limit=3))
20
+
21
+ print("Daily Apple bars:")
22
+ bars = client.fetch_bars("Apple", "2024-01-01", "2024-01-10", interval="1d")
23
+ print(bars[:2])
24
+
25
+ print("US 10Y Treasury yield observations:")
26
+ yields = client.fetch_bond_yields("10 year treasury", start="2024-01-01", end="2024-01-10")
27
+ print(yields[:2])
28
+
29
+
30
+ if __name__ == "__main__":
31
+ main()
@@ -0,0 +1,31 @@
1
+ """Compute batch analytics from historical bars."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from fincore.analytics import MetricEngine, MetricSpec
6
+ from fincore.data import DataClient
7
+
8
+
9
+ def main() -> None:
10
+ client = DataClient()
11
+ bars = client.fetch_bars("Apple", "2024-01-01", "2024-02-15", interval="1d")
12
+
13
+ engine = MetricEngine()
14
+ metric_events = engine.compute(
15
+ bars,
16
+ metrics=[
17
+ "return.simple",
18
+ "return.log",
19
+ MetricSpec("momentum.roc", window=3),
20
+ MetricSpec("volatility.rolling", window=5),
21
+ MetricSpec("drawdown.current"),
22
+ MetricSpec("auc.window", window=5),
23
+ ],
24
+ )
25
+
26
+ for event in metric_events[:10]:
27
+ print(event)
28
+
29
+
30
+ if __name__ == "__main__":
31
+ main()
@@ -0,0 +1,27 @@
1
+ """Replay historical bars and derive metrics on the fly."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import asyncio
6
+
7
+ from fincore.analytics import MetricEngine, MetricSpec
8
+ from fincore.data import DataClient
9
+
10
+
11
+ async def main() -> None:
12
+ client = DataClient()
13
+ engine = MetricEngine(
14
+ metrics=[
15
+ "return.simple",
16
+ MetricSpec("momentum.roc", window=3),
17
+ MetricSpec("volatility.rolling", window=5),
18
+ ]
19
+ )
20
+
21
+ async for event in client.replay_bars("Apple", "2024-01-01", "2024-01-31", interval="1d"):
22
+ for metric_event in engine.update(event):
23
+ print(metric_event)
24
+
25
+
26
+ if __name__ == "__main__":
27
+ asyncio.run(main())
@@ -0,0 +1,37 @@
1
+ """Compute metrics from external database-style rows."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from fincore.analytics import MetricEngine, MetricSpec
6
+
7
+
8
+ def main() -> None:
9
+ db_rows = [
10
+ {"ticker": "aapl", "ts": "2024-01-01T00:00:00+00:00", "close_price": 100.0, "share_volume": 1000},
11
+ {"ticker": "aapl", "ts": "2024-01-02T00:00:00+00:00", "close_price": 104.0, "share_volume": 1100},
12
+ {"ticker": "aapl", "ts": "2024-01-03T00:00:00+00:00", "close_price": 102.0, "share_volume": 1200},
13
+ {"ticker": "aapl", "ts": "2024-01-04T00:00:00+00:00", "close_price": 108.0, "share_volume": 1300},
14
+ ]
15
+
16
+ engine = MetricEngine()
17
+ events = engine.compute(
18
+ db_rows,
19
+ metrics=[
20
+ "return.simple",
21
+ MetricSpec("momentum.acceleration"),
22
+ MetricSpec("auc.window", window=3),
23
+ ],
24
+ field_map={
25
+ "symbol": "ticker",
26
+ "event_time": "ts",
27
+ "close": "close_price",
28
+ "volume": "share_volume",
29
+ },
30
+ )
31
+
32
+ for event in events:
33
+ print(event)
34
+
35
+
36
+ if __name__ == "__main__":
37
+ main()
@@ -0,0 +1,25 @@
1
+ """Publish fincore stream events to Kafka."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import asyncio
6
+
7
+ from fincore.data import DataClient
8
+ from fincore.data.kafka import KafkaSink
9
+
10
+
11
+ async def main() -> None:
12
+ client = DataClient()
13
+ sink = KafkaSink(
14
+ bootstrap_servers="localhost:9092",
15
+ topic="fincore.market.bars",
16
+ )
17
+
18
+ count = await sink.publish_stream(
19
+ client.replay_bars("Apple", "2024-01-01", "2024-01-05", interval="1d")
20
+ )
21
+ print(f"published {count} events")
22
+
23
+
24
+ if __name__ == "__main__":
25
+ asyncio.run(main())
@@ -0,0 +1,31 @@
1
+ # fincore examples
2
+
3
+ These examples are small scripts showing the current beta surface.
4
+
5
+ Run them after installing the package:
6
+
7
+ ```bash
8
+ python -m pip install fincore-py
9
+ ```
10
+
11
+ For local development:
12
+
13
+ ```bash
14
+ python -m pip install -e .
15
+ ```
16
+
17
+ Kafka examples require the optional extra:
18
+
19
+ ```bash
20
+ python -m pip install "fincore-py[kafka]"
21
+ ```
22
+
23
+ Examples:
24
+
25
+ - `01_data_discovery.py`: market contexts, fuzzy symbol resolution, bars, and bond yields
26
+ - `02_batch_analytics.py`: batch metric events from historical bars
27
+ - `03_streaming_metrics.py`: historical replay plus on-the-fly metrics
28
+ - `04_external_rows.py`: analytics from database-style rows with a field map
29
+ - `05_kafka_publish.py`: publishing replay events to Kafka
30
+
31
+ The examples use free public sources, so live fetches can fail or return empty results when an upstream source is unavailable, rate-limited, or outside its retention window.
@@ -10,18 +10,36 @@ build-backend = "setuptools.build_meta"
10
10
  [project]
11
11
  name = "fincore-py"
12
12
  dynamic = ["version"]
13
- description = "Python-facing financial market data access library powered by Rust."
13
+ description = "Event-driven financial data and analytics framework for real-time market infrastructure."
14
14
  readme = "README.md"
15
15
  requires-python = ">=3.10"
16
- license = { file = "LICENSE" }
16
+ license = "MIT"
17
+ license-files = ["LICENSE"]
17
18
  authors = [
18
- { name = "fincore contributors" }
19
+ { name = "Avinash Chandra" }
20
+ ]
21
+ keywords = [
22
+ "analytics",
23
+ "event-driven",
24
+ "finance",
25
+ "financial-data",
26
+ "kafka",
27
+ "market-data",
28
+ "metrics",
29
+ "python",
30
+ "quant",
31
+ "real-time",
32
+ "rust",
33
+ "streaming",
19
34
  ]
20
- keywords = ["finance", "market-data", "rust", "python"]
21
35
  classifiers = [
22
- "Development Status :: 3 - Alpha",
36
+ "Development Status :: 4 - Beta",
37
+ "Intended Audience :: Developers",
38
+ "Intended Audience :: Financial and Insurance Industry",
23
39
  "Programming Language :: Python :: 3",
24
40
  "Programming Language :: Rust",
41
+ "Topic :: Database",
42
+ "Topic :: Scientific/Engineering :: Information Analysis",
25
43
  "Topic :: Office/Business :: Financial",
26
44
  ]
27
45
 
@@ -42,6 +60,7 @@ test = [
42
60
  [project.urls]
43
61
  Documentation = "https://avi2413.github.io/fincore/"
44
62
  Repository = "https://github.com/avi2413/fincore"
63
+ Issues = "https://github.com/avi2413/fincore/issues"
45
64
 
46
65
  [tool.setuptools]
47
66
  package-dir = { "" = "python" }
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '0.1.0.dev4'
22
- __version_tuple__ = version_tuple = (0, 1, 0, 'dev4')
21
+ __version__ = version = '0.1.0.dev5'
22
+ __version_tuple__ = version_tuple = (0, 1, 0, 'dev5')
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -1,36 +1,20 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fincore-py
3
- Version: 0.1.0.dev4
4
- Summary: Python-facing financial market data access library powered by Rust.
5
- Author: fincore contributors
6
- License: MIT License
7
-
8
- Copyright (c) 2026 Avinash
9
-
10
- Permission is hereby granted, free of charge, to any person obtaining a copy
11
- of this software and associated documentation files (the "Software"), to deal
12
- in the Software without restriction, including without limitation the rights
13
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14
- copies of the Software, and to permit persons to whom the Software is
15
- furnished to do so, subject to the following conditions:
16
-
17
- The above copyright notice and this permission notice shall be included in all
18
- copies or substantial portions of the Software.
19
-
20
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26
- SOFTWARE.
27
-
3
+ Version: 0.1.0.dev5
4
+ Summary: Event-driven financial data and analytics framework for real-time market infrastructure.
5
+ Author: Avinash Chandra
6
+ License-Expression: MIT
28
7
  Project-URL: Documentation, https://avi2413.github.io/fincore/
29
8
  Project-URL: Repository, https://github.com/avi2413/fincore
30
- Keywords: finance,market-data,rust,python
31
- Classifier: Development Status :: 3 - Alpha
9
+ Project-URL: Issues, https://github.com/avi2413/fincore/issues
10
+ Keywords: analytics,event-driven,finance,financial-data,kafka,market-data,metrics,python,quant,real-time,rust,streaming
11
+ Classifier: Development Status :: 4 - Beta
12
+ Classifier: Intended Audience :: Developers
13
+ Classifier: Intended Audience :: Financial and Insurance Industry
32
14
  Classifier: Programming Language :: Python :: 3
33
15
  Classifier: Programming Language :: Rust
16
+ Classifier: Topic :: Database
17
+ Classifier: Topic :: Scientific/Engineering :: Information Analysis
34
18
  Classifier: Topic :: Office/Business :: Financial
35
19
  Requires-Python: >=3.10
36
20
  Description-Content-Type: text/markdown
@@ -47,12 +31,13 @@ Requires-Dist: tox>=4; extra == "test"
47
31
  Dynamic: license-file
48
32
 
49
33
  <p align="center">
50
- <img src="https://raw.githubusercontent.com/avi2413/fincore/main/docs/_static/fincore-wordmark.svg" alt="fincore wordmark" width="520">
34
+ <img src="https://raw.githubusercontent.com/avi2413/fincore/main/docs/_static/fincore-wordmark.svg" alt="fincore wordmark" width="100%">
51
35
  </p>
52
36
 
53
37
  <p align="center">
54
38
  <a href="https://pypi.org/project/fincore-py/"><img src="https://img.shields.io/pypi/v/fincore-py.svg?color=111111&label=PyPI" alt="PyPI version"></a>
55
39
  <a href="https://pypi.org/project/fincore-py/#history"><img src="https://img.shields.io/badge/PyPI-dev%20builds-7A1E1E" alt="PyPI dev builds"></a>
40
+ <a href="https://pypi.org/project/fincore-py/"><img src="https://img.shields.io/pypi/pyversions/fincore-py.svg?color=111111" alt="Python versions"></a>
56
41
  <a href="https://github.com/avi2413/fincore/actions/workflows/ci.yml"><img src="https://github.com/avi2413/fincore/actions/workflows/ci.yml/badge.svg" alt="CI workflow"></a>
57
42
  <a href="https://codecov.io/gh/avi2413/fincore"><img src="https://codecov.io/gh/avi2413/fincore/branch/main/graph/badge.svg" alt="Codecov coverage"></a>
58
43
  <a href="https://github.com/avi2413/fincore/actions/workflows/publish.yml"><img src="https://github.com/avi2413/fincore/actions/workflows/publish.yml/badge.svg" alt="Publish workflow"></a>
@@ -63,17 +48,17 @@ Dynamic: license-file
63
48
 
64
49
  # fincore
65
50
 
66
- `fincore` is a developer-first financial data library.
51
+ `fincore` is an event-driven financial data and analytics framework for building real-time market infrastructure.
67
52
 
68
- The package is designed for software and data engineers who understand systems, streams, schemas, and downstream storage, but may not yet know finance. The motive is to create a financial data product with a very low barrier of use and understanding: ask for `"Apple"`, get `AAPL`; ask for `"10 year treasury"`, get a usable yield series; ask for a recent minute range, get normalized market events that can flow into Kafka, TimescaleDB, notebooks, or future analytics.
53
+ The package is designed for software and data engineers who think in streams, schemas, event envelopes, metrics, and downstream storage. It provides a low-barrier way to build market-data pipelines: resolve `"Apple"` to `AAPL`, fetch or replay bars, emit Kafka-ready events, derive normalized analytics events, and feed those events into notebooks, databases, stream processors, or future inference systems.
69
54
 
70
- This is a personal research project and an early alpha package. It is not a production-grade market data client, trading system, investment tool, or source of financial advice. Free public data sources can be delayed, incomplete, rate limited, schema-changing, or unavailable.
55
+ This is a personal research project by Avinash Chandra and a beta-stage package. It is not a production-grade market data client, trading system, investment tool, or source of financial advice. Free public data sources can be delayed, incomplete, rate limited, schema-changing, or unavailable.
71
56
 
72
57
  The Python import name is `fincore`. The PyPI distribution name is `fincore-py`.
73
58
 
74
59
  ## Current Scope
75
60
 
76
- `fincore-py` currently focuses on data access, not trading or portfolio analytics.
61
+ `fincore-py` currently focuses on data access, event streams, and metrics. It does not do trading, order execution, portfolio construction, or investment recommendations.
77
62
 
78
63
  Implemented today:
79
64
 
@@ -117,6 +102,7 @@ Rust extension
117
102
  Yahoo Finance bar fetching
118
103
  Nasdaq Trader, ASX, and NSE directory parsing
119
104
  FRED yield fetching
105
+ metric calculations
120
106
  normalized Python dict conversion
121
107
  ```
122
108
 
@@ -176,6 +162,8 @@ client.search_instruments("apple", limit=5)
176
162
  client.resolve_symbol("Apple")
177
163
  ```
178
164
 
165
+ More complete examples live in [`examples/`](examples/).
166
+
179
167
  Choose a market context:
180
168
 
181
169
  ```python
@@ -497,7 +485,7 @@ The docs explain:
497
485
  - market data concepts for non-finance developers
498
486
  - streaming and Kafka concepts
499
487
  - the current API surface
500
- - future analytics direction
488
+ - analytics calculations and metric events
501
489
 
502
490
  Docs are deployed to GitHub Pages from `.github/workflows/docs.yml` on pushes to `main`, version tags, and manual dispatch.
503
491
 
@@ -586,6 +574,18 @@ async for metric_event in engine.run(client.stream_bars(["Apple"], interval="1m"
586
574
 
587
575
  Python package versions are derived from git tags through `setuptools-scm`.
588
576
 
577
+ Install the latest beta/dev package from PyPI:
578
+
579
+ ```bash
580
+ python -m pip install fincore-py
581
+ ```
582
+
583
+ Kafka extras:
584
+
585
+ ```bash
586
+ python -m pip install "fincore-py[kafka]"
587
+ ```
588
+
589
589
  For a beta pre-release:
590
590
 
591
591
  ```bash
@@ -609,4 +609,4 @@ Environment: pypi
609
609
 
610
610
  ## Status
611
611
 
612
- Early alpha implementation stage. The data client is usable for discovery, historical bars, yield series, replay streams, polling streams, and Kafka publishing for personal research and prototyping. The analytics layer now emits normalized metric events for batch and streaming workflows.
612
+ Beta implementation stage. The data client is usable for discovery, historical bars, yield series, replay streams, polling streams, and Kafka publishing for personal research and prototyping. The analytics layer emits normalized metric events for batch and streaming workflows.
@@ -24,6 +24,12 @@ docs/schemas.rst
24
24
  docs/streaming.rst
25
25
  docs/_static/brand.css
26
26
  docs/_static/fincore-wordmark.svg
27
+ examples/01_data_discovery.py
28
+ examples/02_batch_analytics.py
29
+ examples/03_streaming_metrics.py
30
+ examples/04_external_rows.py
31
+ examples/05_kafka_publish.py
32
+ examples/README.md
27
33
  python/fincore/__init__.py
28
34
  python/fincore/_version.py
29
35
  python/fincore/analytics/__init__.py
@@ -1,14 +0,0 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" width="820" height="180" viewBox="0 0 820 180" role="img" aria-labelledby="title desc">
2
- <title id="title">fincore wordmark</title>
3
- <desc id="desc">Lean noir brutalist fincore wordmark with a restrained market signal mark.</desc>
4
- <rect width="820" height="180" fill="#0D0D0D"/>
5
- <g transform="translate(52 48)">
6
- <rect x="0" y="0" width="84" height="84" fill="none" stroke="#B8B2A4" stroke-width="2"/>
7
- <path d="M16 56 H31 L42 42 L53 48 L68 25" fill="none" stroke="#7A1E1E" stroke-width="4" stroke-linecap="square" stroke-linejoin="miter"/>
8
- <path d="M16 68 H68" stroke="#2A2A2A" stroke-width="2"/>
9
- <path d="M16 16 V68" stroke="#2A2A2A" stroke-width="2"/>
10
- </g>
11
- <text x="164" y="96" fill="#E7E0D0" font-family="'Arial Narrow', 'Helvetica Neue Condensed Bold', 'Roboto Condensed', Arial, sans-serif" font-size="58" font-weight="700" letter-spacing="6">FINCORE</text>
12
- <path d="M166 111 H474" stroke="#7A1E1E" stroke-width="3"/>
13
- <text x="166" y="139" fill="#8F8A80" font-family="'Arial Narrow', 'Roboto Condensed', Arial, sans-serif" font-size="17" letter-spacing="4">MARKET DATA INFRASTRUCTURE</text>
14
- </svg>
File without changes
File without changes