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.
		
		
		
		
		
			
		
			
				
	
	
		
			101 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			TypeScript
		
	
			
		
		
	
	
			101 lines
		
	
	
		
			2.6 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-03-01");
 | 
						|
const END_DATE = env.get("END_DATE", "2025-01-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)) {
 | 
						|
  const quotes = await polygon.stocks.aggregates(
 | 
						|
    "SPY",
 | 
						|
    1,
 | 
						|
    "second",
 | 
						|
    date,
 | 
						|
    date,
 | 
						|
    {
 | 
						|
      adjusted: "true",
 | 
						|
      sort: "asc",
 | 
						|
      limit: 50000,
 | 
						|
    },
 | 
						|
    { pagination: true }
 | 
						|
  );
 | 
						|
  if (quotes.status?.toLowerCase() === "ok" && quotes.results) {
 | 
						|
    await client.insert({
 | 
						|
      table: STOCK_QUOTES_TABLE,
 | 
						|
      values: quotes.results.map(({ h: high, l: low, t: timestamp }) =>
 | 
						|
        typeof high === "number" &&
 | 
						|
        typeof low === "number" &&
 | 
						|
        typeof timestamp === "number"
 | 
						|
          ? {
 | 
						|
              symbol: "SPY",
 | 
						|
              ts: new Date(timestamp),
 | 
						|
              price: (high + low) / 2,
 | 
						|
            }
 | 
						|
          : {
 | 
						|
              symbol: "",
 | 
						|
              ts: 0,
 | 
						|
              price: 0,
 | 
						|
            }
 | 
						|
      ),
 | 
						|
      format: "JSONEachRow",
 | 
						|
    });
 | 
						|
 | 
						|
    // console.log(
 | 
						|
    //   date,
 | 
						|
    //   quotes.results?.map(({ h: high = 0, l: low = 0 }) => (high + low) / 2)
 | 
						|
    // );
 | 
						|
  }
 | 
						|
  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);
 |