
    J1j?              	      R   S r SSKJr  SSKrSSKrSSKrSSKrSSKrSSK	J
r
J	r	Jr  SSKJr  \" \5      R                  5       R                   S   r\S-  S-  rS	r0 S
S_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_S S!_S"S#_S$S%_S&S'_S(S)_S*S+_rS6S7S, jjr  S8   S9S- jjrS:S. jr\S/:X  a{  \" S05        \R
                  " 5       r\" / S1Q5      r\" S2\" \5       S3\R
                  " 5       \-
  S4 S535        \R;                  5        H  u  rr\" S2\S* S2\" \5       35        M     gg);u  Fetch CFTC COT (Commitment of Traders) data.

CFTC publishes weekly COT reports on cftc.gov. We use the Socrata Open Data
API (free, no key) for the legacy COT report:
  COT_ENDPOINT = "https://publicreporting.cftc.gov/resource/6dca-aqww.json"

The "current" report is published every Friday at 3:30 PM ET for the
Tuesday positions. We fetch the most recent report and parse it for our
universe.

This is a stub for now — we only need to know the report is available;
deep parsing comes in the data pipeline work (TODO §E).
    )annotationsN)datedatetime	timedelta)Path   z05-datacotz8https://publicreporting.cftc.gov/resource/6dca-aqww.jsongcGOLDsiSILVERhgCOPPERclz5CRUDE OIL, LIGHT SWEET - NEW YORK MERCANTILE EXCHANGEngzNATURAL GASzcCORNzwWHEATzsSOYBEANSeszE-MINI S&P 500nqzNASDAQ-100 (MINI)rtyzRUSSELL 2000 (MINI)6ezEURO FX6jzJAPANESE YEN6bzBRITISH POUND6azAUSTRALIAN DOLLAR6czCANADIAN DOLLAR6szSWISS FRANCc                   SU  S3nUSSS.n[         R                  R                  U5      n[         SU 3n [         R                  R                  XQS9 n[        R                  " UR                  5       R                  S5      5      nS	S	S	5        W(       a  US
   $  g	! , (       d  f       N= f! [         a)  n[        SU < SU 3[        R                  S9   S	nAg	S	nAff = f)u   Fetch the latest COT row for a market matching `market_substr`.

Socrata dataset 6dca-aqww — legacy COT report, futures only.
Order column: report_date_as_yyyy_mm_dd (not report_date).
z!market_and_exchange_names like '%z%'zreport_date_as_yyyy_mm_dd DESC1)z$wherez$orderz$limit?)timeoutzutf-8Nr   z  COT fetch error for z: )file)urllibparse	urlencodeCOT_ENDPOINTrequesturlopenjsonloadsreaddecode	Exceptionprintsysstderr)	market_substrr$   whereparamsqsurlrdataes	            ,/home/rpi/Obsidian-Macro/scripts/data/cot.pyfetch_latest_cotr=   7   s     0bAE2F
 
			'BN!B4
 CP^^##C#9Q::affhoog67D :7N   :9  P&}&7r!=CJJOPs/   B0 4B	B0 
B-)B0 0
C#:CC#c                "   U c  [        [        R                  5       5      n 0 nU  Hf  n[        R                  U5      nU(       d  SX#'   M%  UR	                  S5      S   R	                  S5      S   R                  5       n[        U5      X#'   Mh     U$ )zuFetch the latest COT for the universe (or a subset).

Returns a dict: instrument_id -> COT row (or None on failure).
N,r    )listCOT_MARKETSkeysgetsplitupperr=   )instrument_idscacheoutiidmktshorts         r<   fetch_universe_cotrM   S   s     k..01"$Cooc"CH 		#q!'',Q/557#E*  J    c                   U (       d  gU R                  SS5      nU R                  SS5      nU R                  SS5      nSn [        U5      [        U5      -
  nU R                  SS5      nSU S	U S
U 3$ ! [        [        4 a     N/f = f)z)Render a one-line summary from a COT row.zno datareport_date_as_yyyy_mm_ddr#   noncomm_positions_long_allnoncomm_positions_short_allNopen_interest_allzdate=z  noncomm net=z  OI=)rD   int	TypeError
ValueError)cot_rowrdnclncsncnetois         r<   cot_summaryr]   h   s    	0#	6B
++2C
8C
++3S
9CEC3s8# 
(#	.B2$nUG555 z" s   A6 6B	B	__main__z/Fetching latest COT for headline instruments...)r
   r   r   r   r   r   r   z  z instruments in z.1fs)   )r4   strr$   rT   returndict | None)NT)rG   zlist[str] | NonerH   boolrb   zdict[str, dict | None])rW   rc   rb   ra   ) __doc__
__future__r   r,   r2   timeurllib.parser&   urllib.requestr   r   r   pathlibr   __file__resolveparentsVAULTCOT_DIRr)   rB   r=   rM   r]   __name__r1   t0rowslenitemsrJ   row rN   r<   <module>rw      s   #  
    . . X ((+
)
e
# J
& 	( 	(	
 	
A 	- 	& 	' 	* 	
 	
 
  	) 	. 	/  	
!" 	
#$ 	-%,8 ;?%)".D*6  z	
;<	BHID	Bs4yk)$))+b.)=Q
?@JJLS3r("[-./0 ! rN   