import%20marimo%0A%0A__generated_with%20%3D%20%220.23.1%22%0Aapp%20%3D%20marimo.App(width%3D%22medium%22)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20marimo%20as%20mo%0A%20%20%20%20import%20polars%20as%20pl%0A%20%20%20%20import%20duckdb%0A%20%20%20%20import%20plotly.graph_objects%20as%20go%0A%20%20%20%20from%20plotly.subplots%20import%20make_subplots%0A%0A%20%20%20%20%23%20Import%20modular%20logic%0A%20%20%20%20from%20src.config%20import%20EVENT_CATALOG%2C%20DSP_WINDOW_LENGTH%0A%20%20%20%20from%20src.processing%20import%20(%0A%20%20%20%20%20%20%20%20calculate_snr%2C%20%0A%20%20%20%20%20%20%20%20process_market_indicators%2C%20%0A%20%20%20%20%20%20%20%20match_historical_events%2C%20%0A%20%20%20%20%20%20%20%20calculate_ccl_indicators%0A%20%20%20%20)%0A%0A%20%20%20%20return%20(%0A%20%20%20%20%20%20%20%20DSP_WINDOW_LENGTH%2C%0A%20%20%20%20%20%20%20%20EVENT_CATALOG%2C%0A%20%20%20%20%20%20%20%20calculate_ccl_indicators%2C%0A%20%20%20%20%20%20%20%20calculate_snr%2C%0A%20%20%20%20%20%20%20%20duckdb%2C%0A%20%20%20%20%20%20%20%20go%2C%0A%20%20%20%20%20%20%20%20make_subplots%2C%0A%20%20%20%20%20%20%20%20match_historical_events%2C%0A%20%20%20%20%20%20%20%20mo%2C%0A%20%20%20%20%20%20%20%20pl%2C%0A%20%20%20%20%20%20%20%20process_market_indicators%2C%0A%20%20%20%20)%0A%0A%0A%40app.cell%0Adef%20_(calculate_ccl_indicators%2C%20calculate_snr%2C%20duckdb%2C%20pl)%3A%0A%20%20%20%20%23%20Data%20Connection%0A%20%20%20%20con%20%3D%20duckdb.connect(%22merval_data.db%22%2C%20read_only%3DTrue)%0A%20%20%20%20df%20%3D%20con.execute(%22SELECT%20*%20FROM%20merval_prices%22).pl()%0A%0A%20%20%20%20%23%20Available%20tickers%20(excluding%20helper%20tickers%20for%20CCL)%0A%20%20%20%20tickers%20%3D%20%5Bt%20for%20t%20in%20df%5B%22Ticker%22%5D.unique().to_list()%20if%20t%20!%3D%20%22GGAL.BA%22%20and%20t%20!%3D%20%22ARS%3DX%22%5D%0A%0A%20%20%20%20%23%20---%20CCL%20%26%20Brecha%20---%0A%20%20%20%20df_ccl%20%3D%20calculate_ccl_indicators(df)%0A%0A%20%20%20%20%23%20---%20Market%20SNR%20Analysis%20---%0A%20%20%20%20snrs%20%3D%20%7B%7D%0A%20%20%20%20for%20t_name%20in%20%5B%22%5EMERV%22%2C%20%22YPF%22%2C%20%22GGAL%22%5D%3A%0A%20%20%20%20%20%20%20%20s_price%20%3D%20df.filter(pl.col(%22Ticker%22)%20%3D%3D%20t_name)%5B%22Close%22%5D.to_numpy()%0A%20%20%20%20%20%20%20%20snrs%5Bt_name%5D%20%3D%20calculate_snr(s_price)%0A%20%20%20%20snrs%5B%22CCL%22%5D%20%3D%20calculate_snr(df_ccl%5B%22CCL_Price%22%5D.to_numpy())%0A%0A%20%20%20%20snr_table%20%3D%20pl.DataFrame(%7B%0A%20%20%20%20%20%20%20%20%22Asset%22%3A%20list(snrs.keys())%2C%0A%20%20%20%20%20%20%20%20%22SNR%20Ratio%22%3A%20%5Bround(v%2C%202)%20for%20v%20in%20snrs.values()%5D%0A%20%20%20%20%7D).sort(%22SNR%20Ratio%22)%0A%20%20%20%20return%20df%2C%20df_ccl%2C%20snr_table%2C%20tickers%0A%0A%0A%40app.cell%0Adef%20_(EVENT_CATALOG%2C%20mo%2C%20tickers)%3A%0A%20%20%20%20%23%20Interactivity%0A%20%20%20%20ticker_dropdown%20%3D%20mo.ui.dropdown(%0A%20%20%20%20%20%20%20%20options%3Dtickers%2C%0A%20%20%20%20%20%20%20%20value%3D%22%5EMERV%22%20if%20%22%5EMERV%22%20in%20tickers%20else%20tickers%5B0%5D%2C%0A%20%20%20%20%20%20%20%20label%3D%22Select%20Asset%20Strategy%3A%20%22%0A%20%20%20%20)%0A%20%20%20%20theme_switch%20%3D%20mo.ui.switch(label%3D%22Dark%20Mode%22%2C%20value%3DFalse)%0A%20%20%20%20trend_switch%20%3D%20mo.ui.switch(label%3D%22Show%20Denoised%20Trend%20(Savitzky-Golay%20DSP)%22%2C%20value%3DTrue)%0A%0A%20%20%20%20event_multiselect%20%3D%20mo.ui.multiselect(%0A%20%20%20%20%20%20%20%20options%3D%7Bev%5B%22title%22%5D%3A%20ev%20for%20ev%20in%20EVENT_CATALOG%7D%2C%0A%20%20%20%20%20%20%20%20value%3D%5Bev%5B%22title%22%5D%20for%20ev%20in%20EVENT_CATALOG%5D%2C%0A%20%20%20%20%20%20%20%20label%3D%22Overlay%20Events%20Filter%3A%22%0A%20%20%20%20)%0A%20%20%20%20return%20event_multiselect%2C%20theme_switch%2C%20ticker_dropdown%2C%20trend_switch%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20DSP_WINDOW_LENGTH%2C%0A%20%20%20%20df%2C%0A%20%20%20%20event_multiselect%2C%0A%20%20%20%20match_historical_events%2C%0A%20%20%20%20pl%2C%0A%20%20%20%20process_market_indicators%2C%0A%20%20%20%20ticker_dropdown%2C%0A)%3A%0A%20%20%20%20selected_ticker%20%3D%20ticker_dropdown.value%0A%0A%20%20%20%20%23%201.%20Filter%20and%20process%20basic%20indicators%20(Returns%2C%20Vol%2C%20DSP)%0A%20%20%20%20df_filtered%20%3D%20df.filter(pl.col(%22Ticker%22)%20%3D%3D%20selected_ticker)%0A%20%20%20%20df_calc%20%3D%20process_market_indicators(df_filtered%2C%20window_len%3DDSP_WINDOW_LENGTH)%0A%0A%20%20%20%20%23%202.%20Optimized%20Event%20Matching%20(Join_asof)%0A%20%20%20%20active_events%20%3D%20event_multiselect.value%20%20%23%20list%20of%20event%20dicts%0A%20%20%20%20df_calc%20%3D%20match_historical_events(df_calc%2C%20active_events)%0A%20%20%20%20return%20df_calc%2C%20selected_ticker%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20df_calc%2C%0A%20%20%20%20df_ccl%2C%0A%20%20%20%20go%2C%0A%20%20%20%20make_subplots%2C%0A%20%20%20%20pl%2C%0A%20%20%20%20selected_ticker%2C%0A%20%20%20%20theme_switch%2C%0A%20%20%20%20trend_switch%2C%0A)%3A%0A%20%20%20%20%23%20Two%20Subplots%3A%201%20for%20Ticker%2FAnomalies%2C%201%20for%20D%C3%B3lar%20CCL%20%26%20Brecha%0A%20%20%20%20fig%20%3D%20make_subplots(%0A%20%20%20%20%20%20%20%20rows%3D2%2C%20cols%3D1%2C%20%0A%20%20%20%20%20%20%20%20shared_xaxes%3DTrue%2C%20%0A%20%20%20%20%20%20%20%20vertical_spacing%3D0.1%2C%0A%20%20%20%20%20%20%20%20row_heights%3D%5B0.6%2C%200.4%5D%2C%0A%20%20%20%20%20%20%20%20subplot_titles%3D(f%22Price%20and%20Volatility%20Anomalies%3A%20%7Bselected_ticker%7D%22%2C%20%22D%C3%B3lar%20CCL%20vs%20Official%20%26%20Brecha%20(%25)%22)%2C%0A%20%20%20%20%20%20%20%20specs%3D%5B%5B%7B%22secondary_y%22%3A%20False%7D%5D%2C%20%5B%7B%22secondary_y%22%3A%20True%7D%5D%5D%0A%20%20%20%20)%0A%0A%20%20%20%20%23%20---%20TOP%20CHART%3A%20TICKER%20PRICE%20---%0A%20%20%20%20fig.add_trace(go.Scatter(%0A%20%20%20%20%20%20%20%20x%3Ddf_calc%5B%22Date%22%5D%2C%20y%3Ddf_calc%5B%22Close%22%5D%2C%20mode%3D'lines'%2C%20name%3D'Raw%20Close%20Price'%2C%20%0A%20%20%20%20%20%20%20%20line%3Ddict(color%3D'rgba(31%2C%20119%2C%20180%2C%200.5)'%2C%20width%3D1)%0A%20%20%20%20)%2C%20row%3D1%2C%20col%3D1)%0A%0A%20%20%20%20if%20trend_switch.value%20and%20%22Smoothed_Trend%22%20in%20df_calc.columns%3A%0A%20%20%20%20%20%20%20%20fig.add_trace(go.Scatter(%0A%20%20%20%20%20%20%20%20%20%20%20%20x%3Ddf_calc%5B%22Date%22%5D%2C%20y%3Ddf_calc%5B%22Smoothed_Trend%22%5D%2C%20mode%3D'lines'%2C%20name%3D'Denoised%20Trend%20(DSP)'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20line%3Ddict(color%3D'magenta'%2C%20width%3D3)%0A%20%20%20%20%20%20%20%20)%2C%20row%3D1%2C%20col%3D1)%0A%0A%20%20%20%20%23%20Anomalies%0A%20%20%20%20anomalies%20%3D%20df_calc.filter(pl.col(%22Is_Anomaly%22)%20%3D%3D%20True)%0A%0A%20%20%20%20for%20color%2C%20symbol%2C%20name%2C%20direction%20in%20%5B('green'%2C%20'triangle-up'%2C%20'Positive%20Anomaly'%2C%201)%2C%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20('red'%2C%20'triangle-down'%2C%20'Negative%20Anomaly'%2C%20-1)%5D%3A%0A%20%20%20%20%20%20%20%20subset%20%3D%20anomalies.filter((pl.col(%22Return%22)%20*%20direction)%20%3E%200)%0A%20%20%20%20%20%20%20%20if%20len(subset)%20%3E%200%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20fig.add_trace(go.Scatter(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20x%3Dsubset%5B%22Date%22%5D%2C%20y%3Dsubset%5B%22Close%22%5D%2C%20mode%3D'markers'%2C%20name%3Dname%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20marker%3Ddict(color%3Dcolor%2C%20size%3D12%2C%20symbol%3Dsymbol%2C%20line%3Ddict(width%3D1%2C%20color%3D'black'))%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20hovertemplate%3D%22Date%3A%20%25%7Bx%7D%3Cbr%3EPrice%3A%20%25%7By%3A.2f%7D%3Cextra%3E%3C%2Fextra%3E%22%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%20row%3D1%2C%20col%3D1)%0A%0A%20%20%20%20%23%20---%20HISTORICAL%20EVENTS%20---%0A%20%20%20%20matched_events%20%3D%20df_calc.filter(pl.col(%22Headline%22)%20!%3D%20%22Unknown%20Anomaly%20Event%22)%0A%20%20%20%20if%20len(matched_events)%20%3E%200%3A%0A%20%20%20%20%20%20%20%20fig.add_trace(go.Scatter(%0A%20%20%20%20%20%20%20%20%20%20%20%20x%3Dmatched_events%5B%22Date%22%5D%2C%20y%3Dmatched_events%5B%22Close%22%5D%2C%20mode%3D'markers'%2C%20name%3D'Event%20Map'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20marker%3Ddict(color%3D'gray'%2C%20size%3D6%2C%20symbol%3D'circle-open')%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20customdata%3Dmatched_events%5B%22Headline%22%5D%2C%20%0A%20%20%20%20%20%20%20%20%20%20%20%20hovertemplate%3D%22Date%3A%20%25%7Bx%7D%3Cbr%3EEvent%3A%20%25%7Bcustomdata%7D%3Cextra%3E%3C%2Fextra%3E%22%0A%20%20%20%20%20%20%20%20)%2C%20row%3D1%2C%20col%3D1)%0A%0A%20%20%20%20%23%20---%20BOTTOM%20CHART%3A%20FX%20%26%20BRECHA%20---%0A%20%20%20%20fig.add_trace(go.Scatter(%0A%20%20%20%20%20%20%20%20x%3Ddf_ccl%5B%22Date%22%5D%2C%20y%3Ddf_ccl%5B%22CCL_Price%22%5D%2C%20mode%3D'lines'%2C%20name%3D'D%C3%B3lar%20CCL'%2C%20line%3Ddict(color%3D'orange')%0A%20%20%20%20)%2C%20row%3D2%2C%20col%3D1%2C%20secondary_y%3DFalse)%0A%0A%20%20%20%20fig.add_trace(go.Scatter(%0A%20%20%20%20%20%20%20%20x%3Ddf_ccl%5B%22Date%22%5D%2C%20y%3Ddf_ccl%5B%22ARS_X_Close%22%5D%2C%20mode%3D'lines'%2C%20name%3D'Official%20USD'%2C%20line%3Ddict(color%3D'green')%0A%20%20%20%20)%2C%20row%3D2%2C%20col%3D1%2C%20secondary_y%3DFalse)%0A%0A%20%20%20%20fig.add_trace(go.Scatter(%0A%20%20%20%20%20%20%20%20x%3Ddf_ccl%5B%22Date%22%5D%2C%20y%3Ddf_ccl%5B%22Brecha_Pct%22%5D%2C%20mode%3D'lines'%2C%20%0A%20%20%20%20%20%20%20%20name%3D'Brecha%20(%25)'%2C%20fill%3D'tozeroy'%2C%20line%3Ddict(color%3D'rgba(128%2C%20128%2C%20128%2C%200.3)')%0A%20%20%20%20)%2C%20row%3D2%2C%20col%3D1%2C%20secondary_y%3DTrue)%0A%0A%20%20%20%20fig.update_layout(%0A%20%20%20%20%20%20%20%20template%3D%22plotly_dark%22%20if%20theme_switch.value%20else%20%22plotly_white%22%2C%0A%20%20%20%20%20%20%20%20hovermode%3D%22x%20unified%22%2C%0A%20%20%20%20%20%20%20%20height%3D800%2C%0A%20%20%20%20%20%20%20%20margin%3Ddict(l%3D20%2C%20r%3D20%2C%20t%3D60%2C%20b%3D20)%0A%20%20%20%20)%0A%20%20%20%20return%20fig%2C%20matched_events%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20event_multiselect%2C%0A%20%20%20%20fig%2C%0A%20%20%20%20matched_events%2C%0A%20%20%20%20mo%2C%0A%20%20%20%20snr_table%2C%0A%20%20%20%20theme_switch%2C%0A%20%20%20%20ticker_dropdown%2C%0A%20%20%20%20trend_switch%2C%0A)%3A%0A%20%20%20%20mo.vstack(%5B%0A%20%20%20%20%20%20%20%20mo.md(%22%23%20Argentine%20Macro%20%26%20Volatility%20Dashboard%20%F0%9F%87%A6%F0%9F%87%B7%22)%2C%0A%20%20%20%20%20%20%20%20mo.md(%22Analyze%20structural%20market%20shifts%20and%20political%20noise%20using%20Modern%20Data%20Stack%20(Polars%2C%20DuckDB).%22)%2C%0A%20%20%20%20%20%20%20%20mo.hstack(%5Bticker_dropdown%2C%20theme_switch%2C%20trend_switch%5D%2C%20align%3D%22center%22%2C%20gap%3D2)%2C%0A%20%20%20%20%20%20%20%20mo.md(%22%23%23%23%23%20Contextual%20Event%20Filters%22)%2C%0A%20%20%20%20%20%20%20%20event_multiselect%2C%0A%20%20%20%20%20%20%20%20mo.ui.plotly(fig)%2C%0A%20%20%20%20%20%20%20%20mo.md(%22%23%23%23%20Argentina%20Noise%20Factor%20(Signal-to-Noise%20Ratio)%22)%2C%0A%20%20%20%20%20%20%20%20mo.ui.table(snr_table%2C%20selection%3DNone)%2C%0A%20%20%20%20%20%20%20%20mo.md(%22%23%23%23%20Flagged%20Anomaly%20Events%20Log%22)%2C%0A%20%20%20%20%20%20%20%20mo.ui.table(%0A%20%20%20%20%20%20%20%20%20%20%20%20matched_events.select(%5B%22Date%22%2C%20%22Close%22%2C%20%22Return%22%2C%20%22Headline%22%2C%20%22Category%22%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20selection%3DNone%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%5D)%0A%20%20%20%20return%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
82b2c9bc2857ef70c9b3fc08ab5d1ebf