-
Notifications
You must be signed in to change notification settings - Fork 202
feat: Add auction data handling to stock historical data client #576
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 4 commits
1712bdd
0d688ad
356bc67
4b14fd2
fd114da
767823f
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
@@ -0,0 +1,95 @@ | ||||||
from datetime import datetime | ||||||
from typing import Dict, List | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. to use Optional
Suggested change
|
||||||
|
||||||
from alpaca.common.models import ValidateBaseModel as BaseModel | ||||||
from alpaca.common.types import RawData | ||||||
from alpaca.data.mappings import AUCTION_MAPPING | ||||||
from alpaca.data.models.base import BaseDataSet, TimeSeriesMixin | ||||||
|
||||||
|
||||||
class Auction(BaseModel): | ||||||
"""Represents one auction of aggregated trade data over a specified interval. | ||||||
|
||||||
Attributes: | ||||||
symbol (str): The ticker identifier for the security whose data forms the bar. | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. could you please add other attribuites to docstring? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. all done |
||||||
timestamp (datetime): The timestamp of the auction. | ||||||
condition (str): The condition of the auction. | ||||||
price (float): The price of the auction. | ||||||
size (float): The size of the auction. | ||||||
exchange (str): The exchange of the auction. | ||||||
auction_type (str): The type of auction. OPEN or CLOSE. | ||||||
|
||||||
""" | ||||||
|
||||||
symbol: str | ||||||
timestamp: datetime | ||||||
condition: str | ||||||
price: float | ||||||
size: float | ||||||
exchange: str | ||||||
auction_type: str | ||||||
|
||||||
def __init__(self, symbol: str, raw_data: RawData) -> None: | ||||||
"""Instantiates an auction | ||||||
|
||||||
Args: | ||||||
raw_data (RawData): Raw unparsed auction data from API, contains ohlc and other fields. | ||||||
""" | ||||||
mapped_auction = {} | ||||||
|
||||||
if raw_data is not None: | ||||||
mapped_auction = { | ||||||
AUCTION_MAPPING[key]: val | ||||||
for key, val in raw_data.items() | ||||||
if key in AUCTION_MAPPING | ||||||
} | ||||||
|
||||||
super().__init__(symbol=symbol, **mapped_auction) | ||||||
|
||||||
|
||||||
class AuctionSet(BaseDataSet, TimeSeriesMixin): | ||||||
"""A collection of Auctions. | ||||||
|
||||||
Attributes: | ||||||
data (Dict[str, List[Auction]]): The collection of Auctions keyed by symbol. | ||||||
""" | ||||||
|
||||||
data: Dict[str, List[Auction]] = {} | ||||||
|
||||||
def __init__(self, raw_data: RawData) -> None: | ||||||
"""A collection of Auctions. | ||||||
|
||||||
Args: | ||||||
raw_data (RawData): The collection of raw auction data from API keyed by Symbol. | ||||||
""" | ||||||
|
||||||
parsed_auctions = {} | ||||||
|
||||||
raw_auctions = raw_data | ||||||
|
||||||
if raw_auctions is not None: | ||||||
for symbol, auctions in raw_auctions.items(): | ||||||
|
||||||
auction_data = [] | ||||||
for auction in auctions: | ||||||
c = auction.get("c") | ||||||
o = auction.get("o") | ||||||
|
||||||
if c is not None: | ||||||
for close_auction in c: | ||||||
if close_auction: | ||||||
close_auction["at"] = "CLOSE" | ||||||
auction_data.extend(c) | ||||||
if o is not None: | ||||||
for open_auction in o: | ||||||
if open_auction: | ||||||
open_auction["at"] = "OPEN" | ||||||
auction_data.extend(o) | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. How about putting There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think we can use orderby timestamp in the final dataframe, and then open will be before close. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yeah. You are right. For the dataframe, it is easy. But also we have AuctionSet object and if we change here, the process not required in dataframe level as well? Do you have any concern to change order here? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Are you saying that the order of the AuctionSet should be consistent with the order of the dataframe? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. What I thought is order by
What I thought good is:
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. got it |
||||||
|
||||||
parsed_auctions[symbol] = [ | ||||||
Auction(symbol, auction) | ||||||
for auction in auction_data | ||||||
if auction is not None | ||||||
] | ||||||
|
||||||
super().__init__(data=parsed_auctions) |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -60,6 +60,29 @@ def __init__(self, **data: Any) -> None: | |
super().__init__(**data) | ||
|
||
|
||
# ############################## Auctions ################################# # | ||
|
||
|
||
class StockAuctionsRequest(BaseTimeseriesDataRequest): | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Could you please write docstring and also add to api_reference? |
||
""" | ||
The request model for retrieving auction data for stocks. | ||
|
||
See BaseTimeseriesDataRequest for more information on available parameters. | ||
|
||
Attributes: | ||
symbol_or_symbols (Union[str, List[str]]): The ticker identifier or list of ticker identifiers. | ||
start (Optional[datetime]): The beginning of the time interval for desired data. Timezone naive inputs assumed to be in UTC. | ||
end (Optional[datetime]): The end of the time interval for desired data. Defaults to now. Timezone naive inputs assumed to be in UTC. | ||
limit (Optional[int]): Upper limit of number of data points to return. Defaults to None. | ||
feed (Optional[DataFeed]): The stock data feed to retrieve from. | ||
sort (Optional[Sort]): The chronological order of response based on the timestamp. Defaults to ASC. | ||
asof (Optional[str]): The asof date of the queried stock symbol(s) in YYYY-MM-DD format. | ||
""" | ||
|
||
feed: Optional[DataFeed] = None | ||
asof: Optional[str] = None | ||
|
||
|
||
# ############################## Bars ################################# # | ||
|
||
|
||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We have recently introduced
page_size
parameter to_get_marketdata()
[1], could you please set page_size for auctions as well?*1 #583