Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions openbb_platform/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ These packages are not installed when `pip install openbb` is run. They are ava
| openbb-alpha-vantage | [Alpha Vantage](https://www.alphavantage.co/) data connector | pip install openbb-alpha-vantage | Free |
| openbb-biztoc | [Biztoc](https://api.biztoc.com/#biztoc-default) News data connector | pip install openbb-biztoc | Free |
| openbb-cboe | [Cboe](https://www.cboe.com/delayed_quotes/) data connector | pip install openbb-cboe | None |
| openbb-chartlibrary | [ChartLibrary](https://chartlibrary.io/) pattern similarity connector | pip install openbb-chartlibrary | Free |
| openbb-deribit | [Deribit](https://docs.deribit.com/) data connector | pip install openbb-deribit | None | - |
| openbb-ecb | [ECB](https://data.ecb.europa.eu/) data connector | pip install openbb-ecb | None |
| openbb-famafrench | [Ken French Data Library](https://mba.tuck.dartmouth.edu/pages/faculty/ken.french/data_library.html) connector | pip install openbb-famafrench | None | - |
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
"""Chart Pattern Similarity Standard Model."""

from datetime import (
date as dateType,
datetime,
)
from typing import Literal

from openbb_core.provider.abstract.data import Data
from openbb_core.provider.abstract.query_params import QueryParams
from openbb_core.provider.utils.descriptions import (
DATA_DESCRIPTIONS,
QUERY_DESCRIPTIONS,
)
from pydantic import Field, PositiveInt, field_validator


class ChartPatternSimilarityQueryParams(QueryParams):
"""Chart Pattern Similarity Query."""

symbol: str = Field(description=QUERY_DESCRIPTIONS.get("symbol", ""))
date: dateType = Field(description="Reference date for the source chart pattern.")
timeframe: (
Literal["rth", "premarket", "rth_3d", "rth_5d", "rth_10d", "auto"] | str
) = Field(
default="rth",
description="Timeframe to use for the pattern search.",
)
limit: PositiveInt | None = Field(
default=None,
le=50,
description="Maximum number of similar historical patterns to return.",
)

@field_validator("symbol", mode="before", check_fields=False)
@classmethod
def to_upper(cls, v: str) -> str:
"""Convert field to uppercase."""
return v.upper()

@field_validator("timeframe", mode="before", check_fields=False)
@classmethod
def normalize_timeframe(cls, v: str) -> str:
"""Normalize timeframe values."""
return str(v).lower()


class ChartPatternSimilarityData(Data):
"""Chart Pattern Similarity Data."""

symbol: str = Field(description=DATA_DESCRIPTIONS.get("symbol", ""))
date: dateType | datetime = Field(
description="Date of the matched historical chart pattern."
)
rank: int | None = Field(
default=None,
description="Similarity rank of the matched pattern.",
)
distance: float | None = Field(
default=None,
description="Embedding distance or provider-supplied distance score.",
)
similarity_score: float | None = Field(
default=None,
description="Provider-supplied similarity score, when available.",
)
timeframe: str | None = Field(
default=None,
description="Timeframe used for the pattern match.",
)
forward_return_1d: float | None = Field(
default=None,
description="Forward return one trading day after the matched pattern.",
)
forward_return_3d: float | None = Field(
default=None,
description="Forward return three trading days after the matched pattern.",
)
forward_return_5d: float | None = Field(
default=None,
description="Forward return five trading days after the matched pattern.",
)
forward_return_10d: float | None = Field(
default=None,
description="Forward return ten trading days after the matched pattern.",
)

@field_validator("symbol", mode="before", check_fields=False)
@classmethod
def data_to_upper(cls, v: str) -> str:
"""Convert field to uppercase."""
return v.upper()

@field_validator("date", mode="before", check_fields=False)
@classmethod
def date_validate(cls, v):
"""Return formatted date."""
# pylint: disable=import-outside-toplevel
from dateutil import parser

if ":" in str(v):
return parser.isoparse(str(v))
return parser.parse(str(v)).date()
1 change: 1 addition & 0 deletions openbb_platform/dev_install.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@
openbb-alpha-vantage = { path = "./providers/alpha_vantage", optional = true, develop = true }
openbb-biztoc = { path = "./providers/biztoc", optional = true, develop = true }
openbb-cboe = { path = "./providers/cboe", optional = true, develop = true }
openbb-chartlibrary = { path = "./providers/chartlibrary", optional = true, develop = true }
openbb-deribit = { path = "./providers/deribit", optional = true, develop = true }
openbb-ecb = { path = "./providers/ecb", optional = true, develop = true }
openbb-famafrench = { path = "./providers/famafrench", optional = true, develop = true }
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,18 @@
"""Technical Analysis Router."""

# pylint: disable=too-many-lines,unused-import,too-many-arguments,too-many-positional-arguments
# pylint: disable=too-many-lines,unused-import,unused-argument,too-many-arguments,too-many-positional-arguments

from typing import Any, Literal

from openbb_core.app.model.command_context import CommandContext
from openbb_core.app.model.example import APIEx, PythonEx
from openbb_core.app.model.obbject import OBBject
from openbb_core.app.provider_interface import (
ExtraParams,
ProviderChoices,
StandardParams,
)
from openbb_core.app.query import Query
from openbb_core.app.router import Router
from openbb_core.app.utils import (
basemodel_to_df,
Expand All @@ -32,6 +39,36 @@
router = Router(prefix="", description="Technical Analysis tools.")


@router.command(
model="ChartPatternSimilarity",
examples=[
APIEx(
parameters={
"symbol": "NVDA",
"date": "2025-01-15",
"timeframe": "rth",
"provider": "chartlibrary",
}
),
PythonEx(
description="Find historical chart patterns similar to a ticker and date.",
code=[
"obb.technical.pattern_similarity("
+ "symbol='NVDA', date='2025-01-15', provider='chartlibrary')",
],
),
],
)
async def pattern_similarity(
cc: CommandContext,
provider_choices: ProviderChoices,
standard_params: StandardParams,
extra_params: ExtraParams,
) -> OBBject:
"""Find historical chart patterns similar to a ticker on a given date."""
return await OBBject.from_query(Query(**locals()))


@router.command(
methods=["POST"],
examples=[
Expand Down
28 changes: 28 additions & 0 deletions openbb_platform/providers/chartlibrary/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# OpenBB ChartLibrary Provider

This extension integrates ChartLibrary pattern similarity search into the
OpenBB Platform.

The provider calls ChartLibrary's documented `POST /api/v1/search/text` endpoint
with bearer-token authentication and exposes the results through:

```python
obb.technical.pattern_similarity(
symbol="NVDA",
date="2025-01-15",
timeframe="rth",
provider="chartlibrary",
)
```

Set the credential as `chartlibrary_api_key` in OpenBB user settings.

## Installation

To install the extension, run the following command in this folder:

```bash
pip install openbb-chartlibrary
```

Documentation available [here](https://docs.openbb.co/platform/developer_guide/contributing).
1 change: 1 addition & 0 deletions openbb_platform/providers/chartlibrary/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
"""ChartLibrary provider."""
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
"""ChartLibrary provider module."""

from openbb_chartlibrary.models.pattern_similarity import (
ChartLibraryPatternSimilarityFetcher,
)
from openbb_core.provider.abstract.provider import Provider

chartlibrary_provider = Provider(
name="chartlibrary",
website="https://chartlibrary.io",
description="""ChartLibrary provides historical chart pattern similarity search
using embedding-based matches across US equities.""",
credentials=["api_key"],
fetcher_dict={
"ChartPatternSimilarity": ChartLibraryPatternSimilarityFetcher,
},
repr_name="ChartLibrary",
)
Comment on lines +8 to +18
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
"""ChartLibrary models."""
Loading