Fastest SEC Filings Websocket vs Normal Websocket
Total Difference (all time): Calculating…
Total Difference (averaged by day): Calculating…
Choose a statistic to view its charts.
When a SEC filings is accepted by the SEC, a Filing Metadata page is immediately created. Then, seconds, minutes, hours, or days later the filing is emitted on the RSS feed. Fastest SEC Filings Websocket uses a combination of RSS improvements and predictive algorithms to detect filings faster. Below are graphs comparing it to the normal websocket. The normal websocket should be as fast or faster than existing commercial options. The underlying data is from SEC Filings Metadata. More details on design: How to Make a Fast SEC Filing Detection System.
Total Difference (all time): Calculating…
Total Difference (averaged by day): Calculating…
Total Difference (all time): Calculating…
Total Difference (averaged by day): Calculating…
Fastest SEC Filings prediction algorithm 'index_url' vs Websocket's 'anticipate'
Total Difference (all time): Calculating…
Total Difference (averaged by day): Calculating…
Source: Datamule public statistics data.
Use datamule-hub to download the source data for the last 30 complete Eastern days.
from datetime import datetime, time, timedelta
from zoneinfo import ZoneInfo
from datamulehub import databases
eastern = ZoneInfo("America/New_York")
end_date = datetime.now(eastern).date()
start_date = end_date - timedelta(days=30)
start_seconds = int(datetime.combine(start_date, time(), eastern).timestamp())
end_seconds = int(datetime.combine(end_date, time(), eastern).timestamp())
databases.query(
f"""
SELECT accession, detected_time, detection_method
FROM fastest_sec_filings_metadata
WHERE detected_time >= {start_seconds * 1000}
AND detected_time < {end_seconds * 1000}
""",
output_dir="fastest",
)
databases.query(
f"""
SELECT accession, source, detected_time
FROM monitor_dumps
WHERE detected_time >= {start_seconds}
AND detected_time < {end_seconds}
AND lower(source) IN ('rss', 'efts', 'anticipate')
""",
output_dir="websocket",
)
databases.query(
f"""
SELECT accessionnumber, acceptancedatetime, filingdate
FROM submissions_metadata
WHERE filingdate >= '{start_date}'
AND filingdate < '{end_date}'
""",
output_dir="linked_filings",
)
Loading filing types…
Source: Datamule filing types data.
Use datamule-hub to download the filing type counts.
from datamulehub import databases
databases.query(
"""
SELECT
submissiontype,
CAST(date_trunc('week', CAST(filingdate AS DATE)) AS DATE) AS week_start,
CAST(date_trunc('month', CAST(filingdate AS DATE)) AS DATE) AS month_start,
year(CAST(filingdate AS DATE)) AS calendar_year,
COUNT(*) AS count,
SUM(CASE WHEN containsxbrl = 1 THEN 1 ELSE 0 END) AS xbrl_count
FROM sec_submission_details_table
WHERE submissiontype IS NOT NULL AND filingdate IS NOT NULL
GROUP BY 1, 2, 3, 4
ORDER BY calendar_year, month_start, week_start, submissiontype
""",
output_dir="filing_types",
)
Loading signatures…
Source: Datamule signature data.
Use datamule-hub to download the last five years of SEC signature records.
from datamulehub import databases
databases.query(
"""
SELECT accessionnumber, filingdate, name
FROM (
SELECT accessionnumber, filingdate, signature AS name
FROM "schedule_13d_signature_person"
WHERE signature IS NOT NULL
UNION ALL
SELECT accessionnumber, filingdate, signaturename
FROM "345_owner_signature"
WHERE signaturename IS NOT NULL
UNION ALL
SELECT accessionnumber, filingdate, signaturereportingpersonname
FROM "schedule_13g_signature_information"
WHERE signaturereportingpersonname IS NOT NULL
UNION ALL
SELECT accessionnumber, filingdate, personsignature
FROM "c_signature_person"
WHERE personsignature IS NOT NULL
UNION ALL
SELECT accessionnumber, filingdate, personsignature
FROM "c_tr_signature_person"
WHERE personsignature IS NOT NULL
UNION ALL
SELECT accessionnumber, filingdate, signaturename
FROM "13fhr"
WHERE signaturename IS NOT NULL
UNION ALL
SELECT accessionnumber, filingdate, signaturename
FROM "d"
WHERE signaturename IS NOT NULL
UNION ALL
SELECT accessionnumber, filingdate, signaturename
FROM "25_nse"
WHERE signaturename IS NOT NULL
UNION ALL
SELECT accessionnumber, filingdate, signaturename
FROM "ncr"
WHERE signaturename IS NOT NULL
UNION ALL
SELECT accessionnumber, filingdate, signername
FROM "ma"
WHERE signername IS NOT NULL
UNION ALL
SELECT accessionnumber, filingdate, signername
FROM "ma_w"
WHERE signername IS NOT NULL
UNION ALL
SELECT accessionnumber, filingdate, signername
FROM "sbse_c"
WHERE signername IS NOT NULL
UNION ALL
SELECT accessionnumber, filingdate, signpersonname
FROM "x_17a_5"
WHERE signpersonname IS NOT NULL
UNION ALL
SELECT accessionnumber, filingdate, nameofsigningofficer
FROM "n_mfp12"
WHERE nameofsigningofficer IS NOT NULL
UNION ALL
SELECT accessionnumber, filingdate, nameofsigningofficer
FROM "n_mfp3"
WHERE nameofsigningofficer IS NOT NULL
UNION ALL
SELECT accessionnumber, filingdate, registrantsignedname
FROM "n_cen"
WHERE registrantsignedname IS NOT NULL
UNION ALL
SELECT accessionnumber, filingdate, signername
FROM "nport_p"
WHERE signername IS NOT NULL
UNION ALL
SELECT accessionnumber, filingdate, signaturename
FROM "ta_1"
WHERE signaturename IS NOT NULL
UNION ALL
SELECT accessionnumber, filingdate, signaturename
FROM "ta_2"
WHERE signaturename IS NOT NULL
UNION ALL
SELECT accessionnumber, filingdate, signaturename
FROM "ta_w"
WHERE signaturename IS NOT NULL
) signers
WHERE filingdate >= CAST(date_add('year', -5, current_date) AS VARCHAR)
""",
output_dir="all_signers",
)
Loading commissions…
Dollar values use a fixed logarithmic scale. Hover for the exact amount; click a point to open its SEC filing.
Source: Datamule commissions data.
Use datamule-hub to download the source records.
from datamulehub import databases
databases.query(
"""
SELECT
accessionnumber,
filingdate,
'd' AS submission_type,
CAST(findersfeedollaramount AS varchar) AS findersfee,
CAST(salescommissionsdollaramount AS varchar) AS commissions
FROM "d"
WHERE findersfeedollaramount IS NOT NULL
OR salescommissionsdollaramount IS NOT NULL
UNION ALL
SELECT
accessionnumber,
filingdate,
'1-A',
CAST(finderfeesfee AS varchar),
CAST(salescommissionsserviceproviderfees AS varchar)
FROM "1a"
WHERE finderfeesfee IS NOT NULL
OR salescommissionsserviceproviderfees IS NOT NULL
UNION ALL
SELECT
accessionnumber,
filingdate,
'1-K',
CAST(findersfees AS varchar),
CAST(salescommissionsfee AS varchar)
FROM "1k_summary_info"
WHERE findersfees IS NOT NULL
OR salescommissionsfee IS NOT NULL
UNION ALL
SELECT
accessionnumber,
filingdate,
'1-Z',
CAST(findersfees AS varchar),
CAST(salescommissionsfee AS varchar)
FROM "1_z"
WHERE findersfees IS NOT NULL
OR salescommissionsfee IS NOT NULL
""",
output_dir="finders_and_commissions",
)
Loading mergers…
Source: Datamule merger data. Dates shown are filing dates.
Use datamule-hub to download series-level merger filings.
from datamulehub import databases
databases.query(
"""
SELECT
accessionnumber,
filingdate,
acquiringcik,
acquiringentityname,
acquiringseriesid,
acquiringseriesname,
acquiringclasscontractid,
acquiringclasscontractname,
targetcik,
targetentityname,
targetseriesid,
targetseriesname,
targetclasscontractid,
targetclasscontractname
FROM "effect_merger"
WHERE acquiringseriesid IS NOT NULL
AND acquiringseriesname IS NOT NULL
AND targetseriesid IS NOT NULL
AND targetseriesname IS NOT NULL
""",
output_dir="effect_merger",
)
Compare the first nonzero digits of numeric XBRL values in one filing with Benford's Law.
Sources: XBRL Benford data and filer names.
Generate the first nonzero digit counts by accession, taxonomy, and submission type with datamule-hub.
from datamulehub import databases
databases.query(
"""
SELECT acc AS accessionnumber, c.cik, d.submissiontype, taxonomy, digit, n
FROM (
SELECT accessionnumber AS acc, taxonomy,
CAST(regexp_extract(value, '[1-9]') AS integer) AS digit,
count(*) AS n
FROM simple_xbrl
WHERE regexp_like(value, '^-?[0-9]+([.][0-9]+)?$')
AND regexp_like(value, '[1-9]')
GROUP BY 1, 2, 3
)
JOIN sec_accession_cik_table c ON acc = c.accessionnumber
JOIN sec_submission_details_table d ON acc = d.accessionnumber
ORDER BY 1, 2, 3, 4, 5
""",
output_dir="benford_by_accession_cik_taxonomy_type",
)