fincore-py 0.1.0.dev4__tar.gz → 0.1.0.dev6__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.
- {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev6}/.github/workflows/ci.yml +5 -1
- {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev6}/MANIFEST.in +1 -0
- {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev6}/PKG-INFO +52 -65
- {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev6}/README.md +39 -36
- fincore_py-0.1.0.dev6/docs/_static/fincore-wordmark.svg +29 -0
- {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev6}/docs/conf.py +2 -2
- {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev6}/docs/index.rst +5 -3
- {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev6}/docs/schemas.rst +1 -1
- fincore_py-0.1.0.dev6/examples/01_data_discovery.py +31 -0
- fincore_py-0.1.0.dev6/examples/02_batch_analytics.py +31 -0
- fincore_py-0.1.0.dev6/examples/03_streaming_metrics.py +27 -0
- fincore_py-0.1.0.dev6/examples/04_external_rows.py +37 -0
- fincore_py-0.1.0.dev6/examples/05_kafka_publish.py +25 -0
- fincore_py-0.1.0.dev6/examples/README.md +31 -0
- {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev6}/pyproject.toml +26 -7
- {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev6}/python/fincore/_version.py +2 -2
- {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev6}/python/fincore_py.egg-info/PKG-INFO +52 -65
- {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev6}/python/fincore_py.egg-info/SOURCES.txt +6 -0
- {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev6}/tox.ini +2 -2
- fincore_py-0.1.0.dev4/docs/_static/fincore-wordmark.svg +0 -14
- {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev6}/.github/workflows/docs.yml +0 -0
- {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev6}/.github/workflows/publish.yml +0 -0
- {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev6}/.gitignore +0 -0
- {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev6}/Cargo.toml +0 -0
- {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev6}/LICENSE +0 -0
- {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev6}/docs/_static/brand.css +0 -0
- {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev6}/docs/analytics_calculations.rst +0 -0
- {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev6}/docs/api.rst +0 -0
- {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev6}/docs/brand.rst +0 -0
- {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev6}/docs/concepts.rst +0 -0
- {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev6}/docs/finance_concepts.rst +0 -0
- {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev6}/docs/getting_started.rst +0 -0
- {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev6}/docs/streaming.rst +0 -0
- {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev6}/python/fincore/__init__.py +0 -0
- {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev6}/python/fincore/analytics/__init__.py +0 -0
- {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev6}/python/fincore/analytics/engine.py +0 -0
- {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev6}/python/fincore/analytics/models.py +0 -0
- {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev6}/python/fincore/analytics/normalize.py +0 -0
- {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev6}/python/fincore/data/__init__.py +0 -0
- {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev6}/python/fincore/data/client.py +0 -0
- {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev6}/python/fincore/data/events.py +0 -0
- {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev6}/python/fincore/data/kafka.py +0 -0
- {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev6}/python/fincore/data/sources.py +0 -0
- {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev6}/python/fincore/data/utils.py +0 -0
- {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev6}/python/fincore_py.egg-info/dependency_links.txt +0 -0
- {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev6}/python/fincore_py.egg-info/not-zip-safe +0 -0
- {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev6}/python/fincore_py.egg-info/requires.txt +0 -0
- {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev6}/python/fincore_py.egg-info/top_level.txt +0 -0
- {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev6}/requirements-docs.txt +0 -0
- {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev6}/requirements-kafka.txt +0 -0
- {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev6}/requirements.txt +0 -0
- {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev6}/setup.cfg +0 -0
- {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev6}/setup.py +0 -0
- {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev6}/src/analytics.rs +0 -0
- {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev6}/src/errors.rs +0 -0
- {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev6}/src/lib.rs +0 -0
- {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev6}/src/models.rs +0 -0
- {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev6}/src/pyconvert.rs +0 -0
- {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev6}/src/sources.rs +0 -0
- {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev6}/tests/conftest.py +0 -0
- {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev6}/tests/test_analytics.py +0 -0
- {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev6}/tests/test_data_client.py +0 -0
- {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev6}/tests/test_events.py +0 -0
- {fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev6}/tests/test_utils.py +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@
|
|
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
|
|
@@ -1,38 +1,22 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: fincore-py
|
|
3
|
-
Version: 0.1.0.
|
|
4
|
-
Summary:
|
|
5
|
-
Author:
|
|
6
|
-
License: MIT
|
|
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.dev6
|
|
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
|
-
|
|
31
|
-
|
|
32
|
-
Classifier:
|
|
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
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
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
|
-
Requires-Python:
|
|
19
|
+
Requires-Python: <3.15,>=3.14
|
|
36
20
|
Description-Content-Type: text/markdown
|
|
37
21
|
License-File: LICENSE
|
|
38
22
|
Provides-Extra: kafka
|
|
@@ -47,33 +31,38 @@ 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="
|
|
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
|
-
<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
|
-
<a href="https://pypi.org/project/fincore-py
|
|
38
|
+
<a href="https://pypi.org/project/fincore-py/"><img src="https://img.shields.io/pypi/v/fincore-py.svg?color=111111&label=PyPI&logo=pypi&logoColor=white" alt="PyPI version"></a>
|
|
39
|
+
<a href="https://pypi.org/project/fincore-py/"><img src="https://img.shields.io/pypi/dm/fincore-py.svg?color=7A1E1E&label=downloads&logo=pypi&logoColor=white" alt="PyPI downloads"></a>
|
|
40
|
+
<a href="https://pypi.org/project/fincore-py/#history"><img src="https://img.shields.io/badge/PyPI-dev%20builds-7A1E1E?logo=pypi&logoColor=white" alt="PyPI dev builds"></a>
|
|
41
|
+
<a href="https://www.python.org/"><img src="https://img.shields.io/badge/python-3.14-111111?logo=python&logoColor=white" alt="Python 3.14"></a>
|
|
42
|
+
<a href="https://www.rust-lang.org/"><img src="https://img.shields.io/badge/rust-core-7A1E1E?logo=rust&logoColor=white" alt="Rust core"></a>
|
|
43
|
+
<a href="https://kafka.apache.org/"><img src="https://img.shields.io/badge/kafka-optional-111111?logo=apachekafka&logoColor=white" alt="Optional Kafka support"></a>
|
|
44
|
+
<a href="https://pypi.org/project/fincore-py/"><img src="https://img.shields.io/badge/status-beta-111111?logo=semanticrelease&logoColor=white" alt="Beta status"></a>
|
|
56
45
|
<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
46
|
<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
|
-
<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>
|
|
59
47
|
<a href="https://github.com/avi2413/fincore/actions/workflows/docs.yml"><img src="https://github.com/avi2413/fincore/actions/workflows/docs.yml/badge.svg" alt="Docs workflow"></a>
|
|
60
|
-
<a href="https://avi2413.github.io/fincore/"><img src="https://img.shields.io/badge/docs-GitHub%20Pages-111111" alt="Documentation"></a>
|
|
61
|
-
<a href="https://github.com/avi2413/fincore/
|
|
48
|
+
<a href="https://avi2413.github.io/fincore/"><img src="https://img.shields.io/badge/docs-GitHub%20Pages-111111?logo=githubpages&logoColor=white" alt="Documentation"></a>
|
|
49
|
+
<a href="https://github.com/avi2413/fincore/issues"><img src="https://img.shields.io/github/issues/avi2413/fincore.svg?color=7A1E1E&logo=github&logoColor=white" alt="GitHub issues"></a>
|
|
50
|
+
<a href="https://github.com/avi2413/fincore/blob/main/LICENSE"><img src="https://img.shields.io/github/license/avi2413/fincore.svg?color=111111&logo=opensourceinitiative&logoColor=white" alt="License"></a>
|
|
62
51
|
</p>
|
|
63
52
|
|
|
64
53
|
# fincore
|
|
65
54
|
|
|
66
|
-
`fincore` is
|
|
55
|
+
`fincore` is an event-driven financial data and analytics framework for building real-time market infrastructure.
|
|
67
56
|
|
|
68
|
-
The package is designed for software and data engineers who
|
|
57
|
+
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
58
|
|
|
70
|
-
This is a personal research project and
|
|
59
|
+
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
60
|
|
|
72
61
|
The Python import name is `fincore`. The PyPI distribution name is `fincore-py`.
|
|
73
62
|
|
|
74
63
|
## Current Scope
|
|
75
64
|
|
|
76
|
-
`fincore-py` currently focuses on data access, not trading
|
|
65
|
+
`fincore-py` currently focuses on data access, event streams, and metrics. It does not do trading, order execution, portfolio construction, or investment recommendations.
|
|
77
66
|
|
|
78
67
|
Implemented today:
|
|
79
68
|
|
|
@@ -117,20 +106,35 @@ Rust extension
|
|
|
117
106
|
Yahoo Finance bar fetching
|
|
118
107
|
Nasdaq Trader, ASX, and NSE directory parsing
|
|
119
108
|
FRED yield fetching
|
|
109
|
+
metric calculations
|
|
120
110
|
normalized Python dict conversion
|
|
121
111
|
```
|
|
122
112
|
|
|
123
113
|
## Installation
|
|
124
114
|
|
|
125
|
-
|
|
115
|
+
Install from PyPI:
|
|
126
116
|
|
|
127
117
|
```bash
|
|
118
|
+
python --version # requires Python 3.14
|
|
119
|
+
python -m pip install fincore-py
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
Kafka support:
|
|
123
|
+
|
|
124
|
+
```bash
|
|
125
|
+
python -m pip install "fincore-py[kafka]"
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
For local development, create and activate a Python environment, then install build dependencies:
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
python --version # requires Python 3.14
|
|
128
132
|
python -m pip install --upgrade pip
|
|
129
133
|
python -m pip install -r requirements.txt
|
|
130
134
|
python -m pip install -e .
|
|
131
135
|
```
|
|
132
136
|
|
|
133
|
-
Kafka
|
|
137
|
+
Local Kafka development:
|
|
134
138
|
|
|
135
139
|
```bash
|
|
136
140
|
python -m pip install -r requirements-kafka.txt
|
|
@@ -176,6 +180,8 @@ client.search_instruments("apple", limit=5)
|
|
|
176
180
|
client.resolve_symbol("Apple")
|
|
177
181
|
```
|
|
178
182
|
|
|
183
|
+
More complete examples live in [`examples/`](examples/).
|
|
184
|
+
|
|
179
185
|
Choose a market context:
|
|
180
186
|
|
|
181
187
|
```python
|
|
@@ -497,7 +503,7 @@ The docs explain:
|
|
|
497
503
|
- market data concepts for non-finance developers
|
|
498
504
|
- streaming and Kafka concepts
|
|
499
505
|
- the current API surface
|
|
500
|
-
-
|
|
506
|
+
- analytics calculations and metric events
|
|
501
507
|
|
|
502
508
|
Docs are deployed to GitHub Pages from `.github/workflows/docs.yml` on pushes to `main`, version tags, and manual dispatch.
|
|
503
509
|
|
|
@@ -582,31 +588,12 @@ async for metric_event in engine.run(client.stream_bars(["Apple"], interval="1m"
|
|
|
582
588
|
...
|
|
583
589
|
```
|
|
584
590
|
|
|
585
|
-
##
|
|
586
|
-
|
|
587
|
-
Python package versions are derived from git tags through `setuptools-scm`.
|
|
588
|
-
|
|
589
|
-
For a beta pre-release:
|
|
590
|
-
|
|
591
|
-
```bash
|
|
592
|
-
git tag v0.1.0b0
|
|
593
|
-
git push origin v0.1.0b0
|
|
594
|
-
```
|
|
595
|
-
|
|
596
|
-
The publish workflow at `.github/workflows/publish.yml` builds distributions for both main pushes and version tags.
|
|
597
|
-
|
|
598
|
-
- Pushes to `main` publish source-distribution development builds to PyPI, using versions like `0.1.0.dev123`.
|
|
599
|
-
- Tags like `v0.1.0b0` build beta wheels plus a source distribution and publish them to PyPI.
|
|
600
|
-
- Later stable tags like `v0.1.0` can use the same tagged release path.
|
|
591
|
+
## Contributions And Issues
|
|
601
592
|
|
|
602
|
-
|
|
593
|
+
Issues, bug reports, documentation fixes, and focused feature suggestions are welcome through [GitHub Issues](https://github.com/avi2413/fincore/issues).
|
|
603
594
|
|
|
604
|
-
|
|
605
|
-
Repository: <owner>/fincore
|
|
606
|
-
Workflow: publish.yml
|
|
607
|
-
Environment: pypi
|
|
608
|
-
```
|
|
595
|
+
This is still a personal research project, so contributions should stay aligned with the current scope: event-driven market data access, normalized schemas, streaming events, Kafka integration, and analytics metrics. Production trading, order execution, and investment advice are intentionally out of scope.
|
|
609
596
|
|
|
610
597
|
## Status
|
|
611
598
|
|
|
612
|
-
|
|
599
|
+
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,31 +1,36 @@
|
|
|
1
1
|
<p align="center">
|
|
2
|
-
<img src="https://raw.githubusercontent.com/avi2413/fincore/main/docs/_static/fincore-wordmark.svg" alt="fincore wordmark" width="
|
|
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
|
-
<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
|
-
<a href="https://pypi.org/project/fincore-py
|
|
6
|
+
<a href="https://pypi.org/project/fincore-py/"><img src="https://img.shields.io/pypi/v/fincore-py.svg?color=111111&label=PyPI&logo=pypi&logoColor=white" alt="PyPI version"></a>
|
|
7
|
+
<a href="https://pypi.org/project/fincore-py/"><img src="https://img.shields.io/pypi/dm/fincore-py.svg?color=7A1E1E&label=downloads&logo=pypi&logoColor=white" alt="PyPI downloads"></a>
|
|
8
|
+
<a href="https://pypi.org/project/fincore-py/#history"><img src="https://img.shields.io/badge/PyPI-dev%20builds-7A1E1E?logo=pypi&logoColor=white" alt="PyPI dev builds"></a>
|
|
9
|
+
<a href="https://www.python.org/"><img src="https://img.shields.io/badge/python-3.14-111111?logo=python&logoColor=white" alt="Python 3.14"></a>
|
|
10
|
+
<a href="https://www.rust-lang.org/"><img src="https://img.shields.io/badge/rust-core-7A1E1E?logo=rust&logoColor=white" alt="Rust core"></a>
|
|
11
|
+
<a href="https://kafka.apache.org/"><img src="https://img.shields.io/badge/kafka-optional-111111?logo=apachekafka&logoColor=white" alt="Optional Kafka support"></a>
|
|
12
|
+
<a href="https://pypi.org/project/fincore-py/"><img src="https://img.shields.io/badge/status-beta-111111?logo=semanticrelease&logoColor=white" alt="Beta status"></a>
|
|
8
13
|
<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
14
|
<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
|
-
<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>
|
|
11
15
|
<a href="https://github.com/avi2413/fincore/actions/workflows/docs.yml"><img src="https://github.com/avi2413/fincore/actions/workflows/docs.yml/badge.svg" alt="Docs workflow"></a>
|
|
12
|
-
<a href="https://avi2413.github.io/fincore/"><img src="https://img.shields.io/badge/docs-GitHub%20Pages-111111" alt="Documentation"></a>
|
|
13
|
-
<a href="https://github.com/avi2413/fincore/
|
|
16
|
+
<a href="https://avi2413.github.io/fincore/"><img src="https://img.shields.io/badge/docs-GitHub%20Pages-111111?logo=githubpages&logoColor=white" alt="Documentation"></a>
|
|
17
|
+
<a href="https://github.com/avi2413/fincore/issues"><img src="https://img.shields.io/github/issues/avi2413/fincore.svg?color=7A1E1E&logo=github&logoColor=white" alt="GitHub issues"></a>
|
|
18
|
+
<a href="https://github.com/avi2413/fincore/blob/main/LICENSE"><img src="https://img.shields.io/github/license/avi2413/fincore.svg?color=111111&logo=opensourceinitiative&logoColor=white" alt="License"></a>
|
|
14
19
|
</p>
|
|
15
20
|
|
|
16
21
|
# fincore
|
|
17
22
|
|
|
18
|
-
`fincore` is
|
|
23
|
+
`fincore` is an event-driven financial data and analytics framework for building real-time market infrastructure.
|
|
19
24
|
|
|
20
|
-
The package is designed for software and data engineers who
|
|
25
|
+
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
26
|
|
|
22
|
-
This is a personal research project and
|
|
27
|
+
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
28
|
|
|
24
29
|
The Python import name is `fincore`. The PyPI distribution name is `fincore-py`.
|
|
25
30
|
|
|
26
31
|
## Current Scope
|
|
27
32
|
|
|
28
|
-
`fincore-py` currently focuses on data access, not trading
|
|
33
|
+
`fincore-py` currently focuses on data access, event streams, and metrics. It does not do trading, order execution, portfolio construction, or investment recommendations.
|
|
29
34
|
|
|
30
35
|
Implemented today:
|
|
31
36
|
|
|
@@ -69,20 +74,35 @@ Rust extension
|
|
|
69
74
|
Yahoo Finance bar fetching
|
|
70
75
|
Nasdaq Trader, ASX, and NSE directory parsing
|
|
71
76
|
FRED yield fetching
|
|
77
|
+
metric calculations
|
|
72
78
|
normalized Python dict conversion
|
|
73
79
|
```
|
|
74
80
|
|
|
75
81
|
## Installation
|
|
76
82
|
|
|
77
|
-
|
|
83
|
+
Install from PyPI:
|
|
78
84
|
|
|
79
85
|
```bash
|
|
86
|
+
python --version # requires Python 3.14
|
|
87
|
+
python -m pip install fincore-py
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Kafka support:
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
python -m pip install "fincore-py[kafka]"
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
For local development, create and activate a Python environment, then install build dependencies:
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
python --version # requires Python 3.14
|
|
80
100
|
python -m pip install --upgrade pip
|
|
81
101
|
python -m pip install -r requirements.txt
|
|
82
102
|
python -m pip install -e .
|
|
83
103
|
```
|
|
84
104
|
|
|
85
|
-
Kafka
|
|
105
|
+
Local Kafka development:
|
|
86
106
|
|
|
87
107
|
```bash
|
|
88
108
|
python -m pip install -r requirements-kafka.txt
|
|
@@ -128,6 +148,8 @@ client.search_instruments("apple", limit=5)
|
|
|
128
148
|
client.resolve_symbol("Apple")
|
|
129
149
|
```
|
|
130
150
|
|
|
151
|
+
More complete examples live in [`examples/`](examples/).
|
|
152
|
+
|
|
131
153
|
Choose a market context:
|
|
132
154
|
|
|
133
155
|
```python
|
|
@@ -449,7 +471,7 @@ The docs explain:
|
|
|
449
471
|
- market data concepts for non-finance developers
|
|
450
472
|
- streaming and Kafka concepts
|
|
451
473
|
- the current API surface
|
|
452
|
-
-
|
|
474
|
+
- analytics calculations and metric events
|
|
453
475
|
|
|
454
476
|
Docs are deployed to GitHub Pages from `.github/workflows/docs.yml` on pushes to `main`, version tags, and manual dispatch.
|
|
455
477
|
|
|
@@ -534,31 +556,12 @@ async for metric_event in engine.run(client.stream_bars(["Apple"], interval="1m"
|
|
|
534
556
|
...
|
|
535
557
|
```
|
|
536
558
|
|
|
537
|
-
##
|
|
538
|
-
|
|
539
|
-
Python package versions are derived from git tags through `setuptools-scm`.
|
|
540
|
-
|
|
541
|
-
For a beta pre-release:
|
|
542
|
-
|
|
543
|
-
```bash
|
|
544
|
-
git tag v0.1.0b0
|
|
545
|
-
git push origin v0.1.0b0
|
|
546
|
-
```
|
|
547
|
-
|
|
548
|
-
The publish workflow at `.github/workflows/publish.yml` builds distributions for both main pushes and version tags.
|
|
549
|
-
|
|
550
|
-
- Pushes to `main` publish source-distribution development builds to PyPI, using versions like `0.1.0.dev123`.
|
|
551
|
-
- Tags like `v0.1.0b0` build beta wheels plus a source distribution and publish them to PyPI.
|
|
552
|
-
- Later stable tags like `v0.1.0` can use the same tagged release path.
|
|
559
|
+
## Contributions And Issues
|
|
553
560
|
|
|
554
|
-
|
|
561
|
+
Issues, bug reports, documentation fixes, and focused feature suggestions are welcome through [GitHub Issues](https://github.com/avi2413/fincore/issues).
|
|
555
562
|
|
|
556
|
-
|
|
557
|
-
Repository: <owner>/fincore
|
|
558
|
-
Workflow: publish.yml
|
|
559
|
-
Environment: pypi
|
|
560
|
-
```
|
|
563
|
+
This is still a personal research project, so contributions should stay aligned with the current scope: event-driven market data access, normalized schemas, streaming events, Kafka integration, and analytics metrics. Production trading, order execution, and investment advice are intentionally out of scope.
|
|
561
564
|
|
|
562
565
|
## Status
|
|
563
566
|
|
|
564
|
-
|
|
567
|
+
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,9 +1,10 @@
|
|
|
1
1
|
fincore-py documentation
|
|
2
2
|
========================
|
|
3
3
|
|
|
4
|
-
``fincore-py`` is
|
|
5
|
-
|
|
6
|
-
|
|
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
|
|
@@ -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 = "
|
|
13
|
+
description = "Event-driven financial data and analytics framework for real-time market infrastructure."
|
|
14
14
|
readme = "README.md"
|
|
15
|
-
requires-python = ">=3.
|
|
16
|
-
license =
|
|
15
|
+
requires-python = ">=3.14,<3.15"
|
|
16
|
+
license = "MIT"
|
|
17
|
+
license-files = ["LICENSE"]
|
|
17
18
|
authors = [
|
|
18
|
-
{ name = "
|
|
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 ::
|
|
23
|
-
"
|
|
36
|
+
"Development Status :: 4 - Beta",
|
|
37
|
+
"Intended Audience :: Developers",
|
|
38
|
+
"Intended Audience :: Financial and Insurance Industry",
|
|
39
|
+
"Programming Language :: Python :: 3.14",
|
|
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.
|
|
22
|
-
__version_tuple__ = version_tuple = (0, 1, 0, '
|
|
21
|
+
__version__ = version = '0.1.0.dev6'
|
|
22
|
+
__version_tuple__ = version_tuple = (0, 1, 0, 'dev6')
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -1,38 +1,22 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: fincore-py
|
|
3
|
-
Version: 0.1.0.
|
|
4
|
-
Summary:
|
|
5
|
-
Author:
|
|
6
|
-
License: MIT
|
|
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.dev6
|
|
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
|
-
|
|
31
|
-
|
|
32
|
-
Classifier:
|
|
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
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
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
|
-
Requires-Python:
|
|
19
|
+
Requires-Python: <3.15,>=3.14
|
|
36
20
|
Description-Content-Type: text/markdown
|
|
37
21
|
License-File: LICENSE
|
|
38
22
|
Provides-Extra: kafka
|
|
@@ -47,33 +31,38 @@ 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="
|
|
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
|
-
<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
|
-
<a href="https://pypi.org/project/fincore-py
|
|
38
|
+
<a href="https://pypi.org/project/fincore-py/"><img src="https://img.shields.io/pypi/v/fincore-py.svg?color=111111&label=PyPI&logo=pypi&logoColor=white" alt="PyPI version"></a>
|
|
39
|
+
<a href="https://pypi.org/project/fincore-py/"><img src="https://img.shields.io/pypi/dm/fincore-py.svg?color=7A1E1E&label=downloads&logo=pypi&logoColor=white" alt="PyPI downloads"></a>
|
|
40
|
+
<a href="https://pypi.org/project/fincore-py/#history"><img src="https://img.shields.io/badge/PyPI-dev%20builds-7A1E1E?logo=pypi&logoColor=white" alt="PyPI dev builds"></a>
|
|
41
|
+
<a href="https://www.python.org/"><img src="https://img.shields.io/badge/python-3.14-111111?logo=python&logoColor=white" alt="Python 3.14"></a>
|
|
42
|
+
<a href="https://www.rust-lang.org/"><img src="https://img.shields.io/badge/rust-core-7A1E1E?logo=rust&logoColor=white" alt="Rust core"></a>
|
|
43
|
+
<a href="https://kafka.apache.org/"><img src="https://img.shields.io/badge/kafka-optional-111111?logo=apachekafka&logoColor=white" alt="Optional Kafka support"></a>
|
|
44
|
+
<a href="https://pypi.org/project/fincore-py/"><img src="https://img.shields.io/badge/status-beta-111111?logo=semanticrelease&logoColor=white" alt="Beta status"></a>
|
|
56
45
|
<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
46
|
<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
|
-
<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>
|
|
59
47
|
<a href="https://github.com/avi2413/fincore/actions/workflows/docs.yml"><img src="https://github.com/avi2413/fincore/actions/workflows/docs.yml/badge.svg" alt="Docs workflow"></a>
|
|
60
|
-
<a href="https://avi2413.github.io/fincore/"><img src="https://img.shields.io/badge/docs-GitHub%20Pages-111111" alt="Documentation"></a>
|
|
61
|
-
<a href="https://github.com/avi2413/fincore/
|
|
48
|
+
<a href="https://avi2413.github.io/fincore/"><img src="https://img.shields.io/badge/docs-GitHub%20Pages-111111?logo=githubpages&logoColor=white" alt="Documentation"></a>
|
|
49
|
+
<a href="https://github.com/avi2413/fincore/issues"><img src="https://img.shields.io/github/issues/avi2413/fincore.svg?color=7A1E1E&logo=github&logoColor=white" alt="GitHub issues"></a>
|
|
50
|
+
<a href="https://github.com/avi2413/fincore/blob/main/LICENSE"><img src="https://img.shields.io/github/license/avi2413/fincore.svg?color=111111&logo=opensourceinitiative&logoColor=white" alt="License"></a>
|
|
62
51
|
</p>
|
|
63
52
|
|
|
64
53
|
# fincore
|
|
65
54
|
|
|
66
|
-
`fincore` is
|
|
55
|
+
`fincore` is an event-driven financial data and analytics framework for building real-time market infrastructure.
|
|
67
56
|
|
|
68
|
-
The package is designed for software and data engineers who
|
|
57
|
+
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
58
|
|
|
70
|
-
This is a personal research project and
|
|
59
|
+
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
60
|
|
|
72
61
|
The Python import name is `fincore`. The PyPI distribution name is `fincore-py`.
|
|
73
62
|
|
|
74
63
|
## Current Scope
|
|
75
64
|
|
|
76
|
-
`fincore-py` currently focuses on data access, not trading
|
|
65
|
+
`fincore-py` currently focuses on data access, event streams, and metrics. It does not do trading, order execution, portfolio construction, or investment recommendations.
|
|
77
66
|
|
|
78
67
|
Implemented today:
|
|
79
68
|
|
|
@@ -117,20 +106,35 @@ Rust extension
|
|
|
117
106
|
Yahoo Finance bar fetching
|
|
118
107
|
Nasdaq Trader, ASX, and NSE directory parsing
|
|
119
108
|
FRED yield fetching
|
|
109
|
+
metric calculations
|
|
120
110
|
normalized Python dict conversion
|
|
121
111
|
```
|
|
122
112
|
|
|
123
113
|
## Installation
|
|
124
114
|
|
|
125
|
-
|
|
115
|
+
Install from PyPI:
|
|
126
116
|
|
|
127
117
|
```bash
|
|
118
|
+
python --version # requires Python 3.14
|
|
119
|
+
python -m pip install fincore-py
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
Kafka support:
|
|
123
|
+
|
|
124
|
+
```bash
|
|
125
|
+
python -m pip install "fincore-py[kafka]"
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
For local development, create and activate a Python environment, then install build dependencies:
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
python --version # requires Python 3.14
|
|
128
132
|
python -m pip install --upgrade pip
|
|
129
133
|
python -m pip install -r requirements.txt
|
|
130
134
|
python -m pip install -e .
|
|
131
135
|
```
|
|
132
136
|
|
|
133
|
-
Kafka
|
|
137
|
+
Local Kafka development:
|
|
134
138
|
|
|
135
139
|
```bash
|
|
136
140
|
python -m pip install -r requirements-kafka.txt
|
|
@@ -176,6 +180,8 @@ client.search_instruments("apple", limit=5)
|
|
|
176
180
|
client.resolve_symbol("Apple")
|
|
177
181
|
```
|
|
178
182
|
|
|
183
|
+
More complete examples live in [`examples/`](examples/).
|
|
184
|
+
|
|
179
185
|
Choose a market context:
|
|
180
186
|
|
|
181
187
|
```python
|
|
@@ -497,7 +503,7 @@ The docs explain:
|
|
|
497
503
|
- market data concepts for non-finance developers
|
|
498
504
|
- streaming and Kafka concepts
|
|
499
505
|
- the current API surface
|
|
500
|
-
-
|
|
506
|
+
- analytics calculations and metric events
|
|
501
507
|
|
|
502
508
|
Docs are deployed to GitHub Pages from `.github/workflows/docs.yml` on pushes to `main`, version tags, and manual dispatch.
|
|
503
509
|
|
|
@@ -582,31 +588,12 @@ async for metric_event in engine.run(client.stream_bars(["Apple"], interval="1m"
|
|
|
582
588
|
...
|
|
583
589
|
```
|
|
584
590
|
|
|
585
|
-
##
|
|
586
|
-
|
|
587
|
-
Python package versions are derived from git tags through `setuptools-scm`.
|
|
588
|
-
|
|
589
|
-
For a beta pre-release:
|
|
590
|
-
|
|
591
|
-
```bash
|
|
592
|
-
git tag v0.1.0b0
|
|
593
|
-
git push origin v0.1.0b0
|
|
594
|
-
```
|
|
595
|
-
|
|
596
|
-
The publish workflow at `.github/workflows/publish.yml` builds distributions for both main pushes and version tags.
|
|
597
|
-
|
|
598
|
-
- Pushes to `main` publish source-distribution development builds to PyPI, using versions like `0.1.0.dev123`.
|
|
599
|
-
- Tags like `v0.1.0b0` build beta wheels plus a source distribution and publish them to PyPI.
|
|
600
|
-
- Later stable tags like `v0.1.0` can use the same tagged release path.
|
|
591
|
+
## Contributions And Issues
|
|
601
592
|
|
|
602
|
-
|
|
593
|
+
Issues, bug reports, documentation fixes, and focused feature suggestions are welcome through [GitHub Issues](https://github.com/avi2413/fincore/issues).
|
|
603
594
|
|
|
604
|
-
|
|
605
|
-
Repository: <owner>/fincore
|
|
606
|
-
Workflow: publish.yml
|
|
607
|
-
Environment: pypi
|
|
608
|
-
```
|
|
595
|
+
This is still a personal research project, so contributions should stay aligned with the current scope: event-driven market data access, normalized schemas, streaming events, Kafka integration, and analytics metrics. Production trading, order execution, and investment advice are intentionally out of scope.
|
|
609
596
|
|
|
610
597
|
## Status
|
|
611
598
|
|
|
612
|
-
|
|
599
|
+
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fincore_py-0.1.0.dev4 → fincore_py-0.1.0.dev6}/python/fincore_py.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|