You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
polygon-ingester/03-fill-option-quotes.ts

100 lines
2.7 KiB
TypeScript

import { restClient } from "@polygon.io/client-js";
import { client } from "./clickhouse.js";
import PQueue from "p-queue";
import dotenv from "dotenv";
import { Env } from "@humanwhocodes/env";
dotenv.config();
const env = new Env();
const POLYGON_API_KEY = env.require("POLYGON_API_KEY");
const CONCURRENCY = Number.parseInt(env.get("CONCURRENCY", "6"));
const STOCK_QUOTES_TABLE = env.get("STOCK_QUOTES_TABLE", "stock_aggregates");
const START_DATE = env.get("START_DATE", "2022-08-01");
const END_DATE = env.get("END_DATE", "2022-12-31");
const polygon = restClient(POLYGON_API_KEY, "https://api.polygon.io", {
pagination: true,
});
const queue = new PQueue({ concurrency: CONCURRENCY });
function* dateRange(
startDateStr: string,
endDateStr: string
): Generator<string, void, unknown> {
// Convert the start and end date strings to Date objects
const startDate = new Date(startDateStr);
const endDate = new Date(endDateStr);
// Loop from the start date to the end date
for (
let currentDate = startDate;
currentDate <= endDate;
currentDate.setDate(currentDate.getDate() + 1)
) {
// Format the current date as YYYY-MM-DD
const formattedDate = currentDate.toISOString().split("T")[0];
// Yield the formatted date
yield formattedDate;
}
}
for (const date of dateRange(START_DATE, END_DATE)) {
/** To check if the market is open on the given date, we just fetch a few (10,
* for now) rows from the option_quotes table. If there are not 10 rows, then
* the market is closed. */
const isMarketOpen =
(
await (
await client.query({
query: `
SELECT *
FROM option_quotes
WHERE ts >= '${date} 00:00:00'
AND ts <= '${date} 23:59:59'
LIMIT 10
`,
format: "JSONEachRow",
})
).json()
).length === 10;
if (isMarketOpen) {
await client.command({
query: `
INSERT INTO option_quotes_filled
SELECT
option_type,
symbol,
expiration_date,
strike,
ts,
bid,
ask
FROM option_quotes
WHERE ts >= '${date} 00:00:00'
AND ts <= '${date} 23:59:59'
ORDER BY option_type, symbol, expiration_date, strike, ts
WITH FILL FROM toDateTime('${date} 09:30:00', 'America/New_York') TO toDateTime('${date} 16:15:01', 'America/New_York') INTERPOLATE (bid, ask)
`,
});
}
console.log("finished", date);
}
// const data = await polygon.options.quotes(
// "O:SPY241220P00600000",
// {
// "timestamp.gte": "2024-12-15",
// "timestamp.lte": "2024-12-16",
// sort: "timestamp",
// order: "asc",
// limit: 50000,
// },
// { pagination: true }
// );
// console.log(data.status);
// console.log(data.results?.length);