<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Quant Journey: Framework]]></title><description><![CDATA[Main QuantJourney Framework]]></description><link>https://quantjourney.substack.com/s/framework</link><image><url>https://substackcdn.com/image/fetch/$s_!jHVd!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2341db50-3694-4c36-b7c3-1d750a153cf9_400x400.png</url><title>Quant Journey: Framework</title><link>https://quantjourney.substack.com/s/framework</link></image><generator>Substack</generator><lastBuildDate>Fri, 01 May 2026 16:29:43 GMT</lastBuildDate><atom:link href="https://quantjourney.substack.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Quant Journey with Code]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[quantjourney@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[quantjourney@substack.com]]></itunes:email><itunes:name><![CDATA[Jakub]]></itunes:name></itunes:owner><itunes:author><![CDATA[Jakub]]></itunes:author><googleplay:owner><![CDATA[quantjourney@substack.com]]></googleplay:owner><googleplay:email><![CDATA[quantjourney@substack.com]]></googleplay:email><googleplay:author><![CDATA[Jakub]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Investment Memory: Why Most Portfolio Systems Lie to You]]></title><description><![CDATA[<link: https://quantjourney.substack.com/p/designing-a-real-portfolio-management>]]></description><link>https://quantjourney.substack.com/p/investment-memory-why-most-portfolio</link><guid isPermaLink="false">https://quantjourney.substack.com/p/investment-memory-why-most-portfolio</guid><dc:creator><![CDATA[Jakub]]></dc:creator><pubDate>Thu, 30 Apr 2026 10:39:24 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/7a6e6900-a9d6-4c67-9441-e026a3bbf8fc_1094x1099.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>Your last performance review was based on a portfolio that didn&#8217;t actually exist.</strong></p><p>Most investment platforms can show you a chart. <strong>Far fewer can reconstruct the portfolio as it actually existed on a given date - with the data, weights, flows, and risk state known at the time.</strong> The chart you are looking at is almost certainly not the history of your portfolio. <strong>It is a pro-forma backtest of your current book.</strong></p><p>Once you accept that, a different set of questions becomes urgent:</p><ul><li><p><em><strong>How much did the portfolio make, excluding deposits and withdrawals?</strong></em></p></li><li><p><em>Did NAV increase because the portfolio made money, or because new capital entered the account?</em></p></li><li><p><em><strong>Was the strategy beating its benchmark on a true time-weighted basis?</strong></em></p></li><li><p><em><strong>Was the profit realized, or was it still mark-to-market?</strong></em></p></li><li><p><em><strong>What was the Sharpe Ratio of the portfolio you actually held - not today&#8217;s holdings projected backward?</strong></em></p></li><li><p><em>Which investment thesis drove the weights at that time, and did it actually generate risk-adjusted return?</em></p></li></ul><p>And if you manage external capital, the audit questions get harder:</p><ul><li><p><em><strong>What NAV did the system show for March 15, 2026 as of 10:00 AM on March 16?</strong></em></p></li><li><p><em>If a vendor corrected a price after the report was published, can you show the original NAV, the corrected NAV, and the reason for the difference?</em></p></li><li><p><em>Which pricing policy, FX rate, corporate-action version, market calendar, and code version produced that number?</em></p></li><li><p><em>Was the NAV live-recorded at EOD, reconstructed later, or manually restated?</em></p></li><li><p><em><strong>Can you rerun the same risk model on the same data the system had then and get the same result?</strong></em></p></li></ul><p>Most systems can show a portfolio. Far fewer can answer these questions honestly. This is why a serious investment platform needs a Portfolio Management System (PMS) and, more importantly, an <strong>Investment Book of Record (IBOR)</strong>.</p><p>This is the second post in the PMS series. The first one - <a href="https://quantjourney.substack.com/p/designing-a-real-portfolio-management">Designing a PMS.</a> covers TWRR, MWRR, and the broader return-measurement landscape.</p><p><strong>Below are screens from QuantJourney PMS - holdings view: positions, weights, prices, P&amp;L, sector mapping, sleeves, and live portfolio state:</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!UJxp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4cb121e1-376c-4654-b6dc-cac8a700ab2d_1567x800.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!UJxp!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4cb121e1-376c-4654-b6dc-cac8a700ab2d_1567x800.png 424w, https://substackcdn.com/image/fetch/$s_!UJxp!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4cb121e1-376c-4654-b6dc-cac8a700ab2d_1567x800.png 848w, https://substackcdn.com/image/fetch/$s_!UJxp!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4cb121e1-376c-4654-b6dc-cac8a700ab2d_1567x800.png 1272w, https://substackcdn.com/image/fetch/$s_!UJxp!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4cb121e1-376c-4654-b6dc-cac8a700ab2d_1567x800.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!UJxp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4cb121e1-376c-4654-b6dc-cac8a700ab2d_1567x800.png" width="1456" height="743" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4cb121e1-376c-4654-b6dc-cac8a700ab2d_1567x800.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:743,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:579205,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://quantjourney.substack.com/i/195976628?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4cb121e1-376c-4654-b6dc-cac8a700ab2d_1567x800.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!UJxp!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4cb121e1-376c-4654-b6dc-cac8a700ab2d_1567x800.png 424w, https://substackcdn.com/image/fetch/$s_!UJxp!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4cb121e1-376c-4654-b6dc-cac8a700ab2d_1567x800.png 848w, https://substackcdn.com/image/fetch/$s_!UJxp!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4cb121e1-376c-4654-b6dc-cac8a700ab2d_1567x800.png 1272w, https://substackcdn.com/image/fetch/$s_!UJxp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4cb121e1-376c-4654-b6dc-cac8a700ab2d_1567x800.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Allocation view - sector, industry, country, and asset-class structure preserved as part of the portfolio state, not reconstructed from today&#8217;s holdings.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!L2Ug!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f6a9161-6111-49ea-a263-85f204379057_1568x885.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!L2Ug!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f6a9161-6111-49ea-a263-85f204379057_1568x885.png 424w, https://substackcdn.com/image/fetch/$s_!L2Ug!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f6a9161-6111-49ea-a263-85f204379057_1568x885.png 848w, https://substackcdn.com/image/fetch/$s_!L2Ug!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f6a9161-6111-49ea-a263-85f204379057_1568x885.png 1272w, https://substackcdn.com/image/fetch/$s_!L2Ug!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f6a9161-6111-49ea-a263-85f204379057_1568x885.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!L2Ug!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f6a9161-6111-49ea-a263-85f204379057_1568x885.png" width="1456" height="822" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1f6a9161-6111-49ea-a263-85f204379057_1568x885.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:822,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:532372,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://quantjourney.substack.com/i/195976628?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f6a9161-6111-49ea-a263-85f204379057_1568x885.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!L2Ug!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f6a9161-6111-49ea-a263-85f204379057_1568x885.png 424w, https://substackcdn.com/image/fetch/$s_!L2Ug!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f6a9161-6111-49ea-a263-85f204379057_1568x885.png 848w, https://substackcdn.com/image/fetch/$s_!L2Ug!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f6a9161-6111-49ea-a263-85f204379057_1568x885.png 1272w, https://substackcdn.com/image/fetch/$s_!L2Ug!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f6a9161-6111-49ea-a263-85f204379057_1568x885.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Attribution view - contribution, active weight, sector effects, contributors and detractors tied back to the actual book.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!pJQE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8baaf389-921f-4e97-ad7f-ecd305ae1d31_1567x962.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!pJQE!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8baaf389-921f-4e97-ad7f-ecd305ae1d31_1567x962.png 424w, https://substackcdn.com/image/fetch/$s_!pJQE!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8baaf389-921f-4e97-ad7f-ecd305ae1d31_1567x962.png 848w, https://substackcdn.com/image/fetch/$s_!pJQE!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8baaf389-921f-4e97-ad7f-ecd305ae1d31_1567x962.png 1272w, https://substackcdn.com/image/fetch/$s_!pJQE!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8baaf389-921f-4e97-ad7f-ecd305ae1d31_1567x962.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!pJQE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8baaf389-921f-4e97-ad7f-ecd305ae1d31_1567x962.png" width="1456" height="894" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8baaf389-921f-4e97-ad7f-ecd305ae1d31_1567x962.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:894,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:456137,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://quantjourney.substack.com/i/195976628?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8baaf389-921f-4e97-ad7f-ecd305ae1d31_1567x962.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!pJQE!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8baaf389-921f-4e97-ad7f-ecd305ae1d31_1567x962.png 424w, https://substackcdn.com/image/fetch/$s_!pJQE!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8baaf389-921f-4e97-ad7f-ecd305ae1d31_1567x962.png 848w, https://substackcdn.com/image/fetch/$s_!pJQE!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8baaf389-921f-4e97-ad7f-ecd305ae1d31_1567x962.png 1272w, https://substackcdn.com/image/fetch/$s_!pJQE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8baaf389-921f-4e97-ad7f-ecd305ae1d31_1567x962.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Risk Lab - VaR/CVaR, expected shortfall, Monte Carlo paths, probability of loss, and drawdown computed from the actual portfolio state.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!frpO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3ff3059-f4d6-4487-be06-e3188ab29b93_1203x1044.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!frpO!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3ff3059-f4d6-4487-be06-e3188ab29b93_1203x1044.png 424w, https://substackcdn.com/image/fetch/$s_!frpO!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3ff3059-f4d6-4487-be06-e3188ab29b93_1203x1044.png 848w, https://substackcdn.com/image/fetch/$s_!frpO!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3ff3059-f4d6-4487-be06-e3188ab29b93_1203x1044.png 1272w, https://substackcdn.com/image/fetch/$s_!frpO!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3ff3059-f4d6-4487-be06-e3188ab29b93_1203x1044.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!frpO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3ff3059-f4d6-4487-be06-e3188ab29b93_1203x1044.png" width="1203" height="1044" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f3ff3059-f4d6-4487-be06-e3188ab29b93_1203x1044.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1044,&quot;width&quot;:1203,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:435208,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://quantjourney.substack.com/i/195976628?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3ff3059-f4d6-4487-be06-e3188ab29b93_1203x1044.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!frpO!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3ff3059-f4d6-4487-be06-e3188ab29b93_1203x1044.png 424w, https://substackcdn.com/image/fetch/$s_!frpO!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3ff3059-f4d6-4487-be06-e3188ab29b93_1203x1044.png 848w, https://substackcdn.com/image/fetch/$s_!frpO!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3ff3059-f4d6-4487-be06-e3188ab29b93_1203x1044.png 1272w, https://substackcdn.com/image/fetch/$s_!frpO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3ff3059-f4d6-4487-be06-e3188ab29b93_1203x1044.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>It shows attribution, benchmark regression, sector allocation, and all the usual analytics. But as it&#8217;s not enough, we added the IBOR.</p><p><strong>A note on vocabulary: IBOR vs ABOR.</strong></p><blockquote><p>Institutional platforms distinguish two books of record, and the distinction matters because they answer different questions and serve different stakeholders.</p><p>The <strong>Accounting Book of Record (ABOR)</strong> is the back-office view. It tracks settled positions, official NAV-of-record for LPs, audited cash and securities balances, and regulatory reporting. It is the source of truth for fund administrators, auditors, and tax. It is intentionally conservative - it reflects what has settled, not what is intended.</p><p>The <strong>Investment Book of Record (IBOR)</strong> is the front-office view. It tracks intended exposures including pending and in-flight trades, reflects the portfolio as the manager sees it for decision-making, and supports real-time P&amp;L, attribution, risk, and pre-trade compliance. It is the source of truth for the CIO and the portfolio manager.</p></blockquote><p>A serious platform needs both, and they need to reconcile. <strong>ABOR without IBOR leaves the manager flying blind on intra-day exposure. IBOR without ABOR leaves the LP without an auditable NAV.</strong> The two books should agree on settlement date and disagree (in controlled, explainable ways) on trade date.</p><p>QuantJourney is built IBOR-first - the manager&#8217;s view is the primary object - with a reconciliation layer to the fund administrator&#8217;s ABOR (will share a post on reconciliation engine in the future). <strong>Bitemporal storage is what makes that reconciliation honest: every difference between IBOR and ABOR is reproducible, dated, and reasoned.</strong></p><h2>Portfolios are Evolving Narratives</h2><p>Portfolios are not static baskets. They are evolving expressions of investment theses.</p><ul><li><p>Last year, the strongest conviction in your portfolio may have been <strong>Precious Metals</strong>.</p></li><li><p>This year, perhaps <strong>Oil and Energy</strong> contributed more to the bottom line.</p></li><li><p>The <strong>AI thesis</strong> may still be structurally right, but the <em>expression</em> of that thesis has shifted: from semiconductors to data centers, then to power, software, and infrastructure.</p></li></ul><p>If we want to evaluate that evolution twelve months later, a current-holdings screen is not enough.</p><p>We need to know what the portfolio actually looked like then - not just what today&#8217;s holdings would have done in the past.</p><h2>Why PMS and IBOR matter</h2><p>A portfolio analytics screen can show positions, charts, and returns.</p><p>A Portfolio Management System has to preserve the operational state of the portfolio: positions, cash, tax lots, transactions, NAV, flows, exposures, and valuations.</p><p>An Investment Book of Record goes one level deeper. It becomes the source of truth for what the portfolio was, when it was known, and how each value was computed.</p><p>This is the distinction we care about in QuantJourney.</p><p>We do not want the portfolio layer to be a chart cache.</p><p>We want it to be the investment memory of the platform.</p><h2>The Common Shortcut: The &#8220;Pro-Forma&#8221; Trap</h2><p>Many analytics systems produce portfolio history by using a dangerous shortcut:</p><blockquote><p><code>current_weights</code><strong> &#215; </strong><code>historical_prices</code></p></blockquote><p>This produces a beautiful return series. But it answers a different question: <em>&#8220;What would today&#8217;s portfolio have done historically?&#8221;</em></p><p>It does <strong>not</strong> answer: <em>&#8220;What did my actual portfolio do?&#8221;</em></p><ul><li><p>If I own Oil today, it doesn&#8217;t mean I owned it last year.</p></li><li><p>If I increased AI exposure in March, that weight didn&#8217;t exist in January.</p></li><li><p>If I sold Gold after it peaked, today&#8217;s portfolio no longer contains the thesis that generated last year&#8217;s return.</p></li></ul><p>The resulting chart is not the history of your portfolio. It is a <strong>pro-forma backtest of your current book</strong>. In <strong>QuantJourney</strong>, we separate these explicitly.</p><h2>Why Risk Metrics Become Poisoned</h2><p>Sharpe Ratio, Volatility, Drawdown, and Beta are all functions of a return series. If the return series is synthetic (pro-forma), the risk metrics are synthetic too.</p><p>A Sharpe Ratio calculated on today&#8217;s holdings projected backward may be mathematically valid, but it is not the Sharpe Ratio of the portfolio you actually held. If the system doesn&#8217;t know what you held during a market crash, the &#8220;drawdown&#8221; it shows you isn&#8217;t <strong>your</strong> drawdown - it&#8217;s the drawdown of a hypothetical object that never existed.</p><h2>NAV as the Accounting Spine</h2><p>The right way is to persist the portfolio&#8217;s daily state - not just prices, but the portfolio itself. In <strong>QuantJourney</strong>, this becomes the canonical daily NAV and return spine.</p><p>The schema is not the product. The questions it allows us to answer are the product.</p><pre><code><code>ALTER TABLE nav_history ADD COLUMN inflows               NUMERIC(19,8) DEFAULT 0;
ALTER TABLE nav_history ADD COLUMN outflows              NUMERIC(19,8) DEFAULT 0;
ALTER TABLE nav_history ADD COLUMN fees                  NUMERIC(19,8) DEFAULT 0;
ALTER TABLE nav_history ADD COLUMN dividends_received    NUMERIC(19,8) DEFAULT 0;
ALTER TABLE nav_history ADD COLUMN interest_received     NUMERIC(19,8) DEFAULT 0;

ALTER TABLE nav_history ADD COLUMN twrr_daily            NUMERIC(19,8) DEFAULT NULL;
ALTER TABLE nav_history ADD COLUMN modified_dietz_daily  NUMERIC(19,8) DEFAULT NULL;

ALTER TABLE nav_history ADD COLUMN gross_exposure        NUMERIC(19,8) DEFAULT 0;
ALTER TABLE nav_history ADD COLUMN net_exposure          NUMERIC(19,8) DEFAULT 0;
ALTER TABLE nav_history ADD COLUMN leverage              NUMERIC(19,8) DEFAULT 0;

ALTER TABLE nav_history ADD COLUMN realized_pnl_day      NUMERIC(19,8) DEFAULT 0;
ALTER TABLE nav_history ADD COLUMN unrealized_pnl_day    NUMERIC(19,8) DEFAULT 0;

ALTER TABLE nav_history ADD COLUMN valuation_run_id      UUID;
ALTER TABLE nav_history ADD COLUMN input_hash            TEXT;
ALTER TABLE nav_history ADD COLUMN pricing_policy_version TEXT;
ALTER TABLE nav_history ADD COLUMN nav_method            TEXT DEFAULT 'eod_mark_to_market';
ALTER TABLE nav_history ADD COLUMN calendar_mic          TEXT;
ALTER TABLE nav_history ADD COLUMN was_backfilled        BOOLEAN DEFAULT FALSE;</code></code></pre><p>This infrastructure allows us to separate <strong>manager performance</strong> from <strong>capital movement</strong>.</p><h2>Flows are not performance</h2><p>Suppose the portfolio starts the day at $10 million, and an investor deposits $2 million. The portfolio ends the day at $12.1 million. A naive return calculation says:</p><pre><code><code>(12.1m &#8722; 10.0m) / 10.0m = +21%</code></code></pre><p>That is obviously wrong. The portfolio did not make 21%. Most of the move was a cash flow. The correct return needs to remove external flows - but <em>how</em> you remove them is where most platforms get sloppy, and where institutional readers start asking pointed questions.</p><p>There are two industry-standard ways to do this, and they answer slightly different questions. We store both.</p><p><strong>True Time-Weighted Rate of Return (TWRR)</strong> is the GIPS-compliant definition. It removes the effect of cash flows by chaining sub-period returns, where each sub-period is broken at the moment of every external flow:</p><pre><code><code>R_TWRR = &#928; (1 + r_i) &#8722; 1</code></code></pre><p>Each <code>r_i</code> is computed between consecutive flows using the portfolio revaluation at the time of the flow. This requires intra-day NAV revaluation whenever capital enters or leaves the portfolio. It is the cleanest measure of manager skill, because it is fully insensitive to the size and timing of flows.</p><p><strong>Modified Dietz</strong> is the dollar-weighted approximation. It weights each flow by the fraction of the period it was present in the portfolio:</p><pre><code><code>R_MD = (NAV_t &#8722; NAV_{t&#8722;1} &#8722; F_t) / (NAV_{t&#8722;1} + &#931; w&#7522; &#183; F&#7522;)</code></code></pre><p>where <code>w&#7522; = (T &#8722; t&#7522;) / T</code> is the time-weight of each flow <code>F&#7522;</code> within the period. Modified Dietz does not require intra-day revaluation, which is why fund administrators have used it for decades - it is computable from EOD data alone.</p><p>At <strong>daily granularity with an end-of-day flow assumption</strong> (<code>w = 0</code>, i.e. the flow lands at close), Modified Dietz collapses to the simple form most platforms display and call &#8220;TWRR&#8221;:</p><pre><code><code>R_t &#8776; (NAV_t &#8722; NAV_{t&#8722;1} &#8722; F_t) / NAV_{t&#8722;1}</code></code></pre><p>Applied to our example:</p><pre><code><code>(12.1m &#8722; 10.0m &#8722; 2.0m) / 10.0m = +1%</code></code></pre><p>That is the actual investment return for the day. It separates manager performance from capital movement. Without this correction, Sharpe, volatility, drawdown, benchmark-relative performance, and attribution are all polluted.</p><p>Here is the subtlety that matters at the institutional level: when flows occur strictly at EOD, true TWRR and Modified Dietz converge to the same number. When they do not - when a $2m deposit lands at 10:00 AM on a day the market moves 3% - the two diverge, and the spread between them is itself a signal. It is also where reconciliation against the fund administrator&#8217;s books either succeeds or fails.</p><p>This is why the schema has both <code>twrr_daily</code> and <code>modified_dietz_daily</code> as separate columns. When intra-day flow timestamps are available, <code>twrr_daily</code> is the chained sub-period return. <code>modified_dietz_daily</code> is always the dollar-weighted approximation. Their difference is recorded, not hidden - because in performance reconciliation, hidden differences are how disputes start.</p><h2>The portfolio needs two clocks: Bitemporality</h2><p>There is another problem: history changes. Prices get corrected, corporate actions arrive late, and vendors revise data. Most systems simply overwrite the old data, destroying the audit trail.</p><p>A serious portfolio system needs two clocks:</p><pre><code><code>business time = the date the value applies to
system time   = when the system knew that value</code></code></pre><p>That is bitemporality.</p><p>For NAV history, we store system-time validity:</p><pre><code><code>CREATE EXTENSION IF NOT EXISTS btree_gist;

ALTER TABLE nav_history
  ADD COLUMN system_time_range TSTZRANGE NOT NULL DEFAULT tstzrange(now(), null);

ALTER TABLE nav_history
  ADD CONSTRAINT nav_history_no_system_overlap
  EXCLUDE USING gist (
    node_id WITH =,
    as_of_date WITH =,
    system_time_range WITH &amp;&amp;
  );

CREATE VIEW nav_history_current AS
SELECT *
FROM nav_history
WHERE upper(system_time_range) IS NULL;</code></code></pre><p>If a NAV for a past date is corrected, we do not overwrite the old row.</p><p>We close the old system-time range and insert a new version.</p><pre><code><code>Portfolio NAV for 2026-04-01

Version 1:
Known from: 2026-04-01 22:00
Known until: 2026-04-10 09:30
NAV: 10,000,000

Version 2:
Known from: 2026-04-10 09:30
Known until: current
NAV: 10,012,430
Reason: corrected corporate action / vendor restatement</code></code></pre><p>Now we can answer two different questions:</p><p><code>What is the corrected NAV for 2026-04-01 today?</code></p><p><code>What did the system believe the NAV was on 2026-04-02?</code></p><p>That second question is what most systems cannot answer.</p><h2>Why this matters for thesis-driven portfolios</h2><p>This is not only about accounting, it is about investment reasoning. So portfolio evolves through decisions, and while one thesis gets bigger, another gets reduced.</p><p>Or you add a hedge, or any position moves from watchlist to active. Or a scenario is confirmed or invalidated and macro regime changes the sizing.</p><p>So, let&#8217;s say six months later you want to ask:</p><p>&#8594; Show me the portfolio as we knew it on 2025-09-30.<br>&#8594; Show me the weights by thesis.<br>&#8594; Show me what was allocated to AI infrastructure.<br>&#8594; Show me what was allocated to oil.<br>&#8594; Show me what changed after the decision.<br>&#8594; Show me the actual NAV TWRR after that point.<br>&#8594; Show me the drawdown and Sharpe using the portfolio we actually held.</p><p>Without historical portfolio state, the system cannot answer that honestly. It can only reconstruct. And reconstruction is not the same as memory.</p><h2>What the API should return - our QuantJourney implementation</h2><p>The portfolio return series endpoint needs to expose not just values, but coverage and lineage.</p><p>Example:</p><pre><code><code>{
  "node_id":"portfolio_XYZ",
  "mode":"actual_nav_twrr",
  "calendar_mic":"XNYS",
  "series": [
    {
      "as_of_date":"2026-04-25",
      "nav":1234567.89,
      "twrr_daily":0.00123,
      "modified_dietz_daily":0.00118,
      "inflows":0,
      "outflows":0,
      "gross_exposure":1.28,
      "net_exposure":0.74,
      "leverage":1.28,
      "drawdown_pct":-0.032,
      "was_backfilled":false
    }
  ],
  "coverage": {
    "trading_days_expected":251,
    "trading_days_available":249,
    "missing_dates": ["2026-01-15","2026-02-03"],
    "has_backfilled_rows":true,
    "backfill_share":0.18
  },
  "lineage": {
    "pricing_policy_version":"official_close_v3",
    "system_time":"2026-04-28T13:42:00Z"
  }
}
</code></code></pre><p>That <code>coverage</code> block matters. If part of the history is backfilled, the user should know. And backfilled history can still be useful.</p><p>But it should not pretend to be the same as live-recorded history.</p><h2>Why calendar awareness matters</h2><p>A 60-day rolling Sharpe should mean 60 trading days. Not 60 calendar days.</p><p>That sounds obvious until the portfolio is global. A US portfolio follows a different calendar from a Saudi portfolio. A multi-region portfolio may need a composite calendar.</p><p>Exchange holidays change. Some markets have different weekends.</p><p>So the NAV series needs to know the portfolio calendar:</p><pre><code><code>calendar_mic = XNYS
calendar_mic = XSAU
calendar_mic = composite_global</code></code></pre><p>Please note: we extend MIC with internal composite codes for multi-region portfolios (within qj-calendar service).</p><p>Same applies to e.g. rolling windows, which should be computed over the trading-day-indexed series. Not naive calendar arithmetic.</p><h2>Final Thoughts: The Memory is the Product</h2><p>The real question in investing is rarely: <em>&#8220;What do we own now?&#8221;</em> It is: <strong>&#8220;What did we believe, how did we size it, what changed, and did it work?&#8221;</strong></p><p>If your &#8220;history&#8221; changes when today&#8217;s holdings change, it was never history. It was a reconstruction.</p><p>If corrected data overwrites the old record, your process is not reproducible.</p><p>And if your process is not reproducible, your risk metrics are not fully trustworthy.</p><p>At <strong>QuantJourney</strong>, we treat NAV history as infrastructure, not as a chart cache. The chart is just the output. <strong>The memory is the product.</strong></p><p></p><p><strong>&#8212; If you want to see this on your own portfolio or do PoC &#8212;</strong></p><p>QuantJourney is in development and targeted to private deployment (private cloud) with family offices and emerging managers. <strong>If you run a fund, a family office, or a multi-strategy book and the questions at the top of this post are ones you cannot currently answer</strong> - replay your portfolio as it actually existed on a given date, separate manager skill from capital flow, reconstruct NAV with full lineage, audit a corrected price against the original - we can show you what this looks like on your own data.</p><p>Just reach me,</p><p>Jakub</p>]]></content:encoded></item><item><title><![CDATA[Moving Beyond Correlation – Hunting Alpha with Lead-Lag & Granger Causality]]></title><description><![CDATA[TL;DR Contemporaneous correlation tells you how to hedge, not where to position - directional alpha requires a non-zero lag.]]></description><link>https://quantjourney.substack.com/p/moving-beyond-correlation-hunting</link><guid isPermaLink="false">https://quantjourney.substack.com/p/moving-beyond-correlation-hunting</guid><dc:creator><![CDATA[Jakub]]></dc:creator><pubDate>Wed, 22 Apr 2026 09:16:41 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/5e890c5b-4ec7-4be9-a6db-6e109718189a_995x995.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>TL;DR</strong></p><ul><li><p>Contemporaneous correlation tells you how to hedge, not where to position - directional alpha requires a non-zero lag.</p></li><li><p><strong>Lead-lag and Granger</strong> <strong>tests detect those lags</strong>, but a statistical lead is not an economic edge until you can explain the transmission mechanism.</p></li><li><p>Lead-lag is regime-conditional: a signal stable in one regime can invert in another, so rolling and state-indexed validation is mandatory.</p></li><li><p><strong>QuantJourney compiles these as ICDL thesis objects, regime-indexed, live-monitored, and audit-bound</strong> - this is the gap between research and tradable infrastructure</p></li></ul><p>In the next posts, we will go deeper into how we are building <strong>QuantJourney</strong> - a full buy-side investment platform for funds and institutional investors.</p><p>As we&#8217;re building the QuantJourney portfolio management system (PMS), one issue keeps surfacing: <strong>most strategies are built on symmetry, while markets reward asymmetry.</strong></p><p>Contemporaneous correlation is a trap. Two assets moving together tells you how to hedge, not where to position. You cannot extract directional alpha from a simultaneous move,  by the time both legs have printed, the information is gone.</p><p>What you can trade is the structural delay between them: the supply-chain shock that hits the commodity before it hits the downstream equity, the macro print that moves rates before it moves cyclicals, the flow that hits the ETF before it propagates to constituents.</p><p>This is where real positioning advantages are built. If you understand the lag between cause and reaction, you are not guessing direction, you are waiting for the math to play out. Today we cover two classical buy-side tools for finding these asymmetries: Lead-Lag Detection and Granger Causality.</p><p><strong>The Theory: How We Find Alpha in Time</strong></p><p><strong>1. Lead / Lag Detection (Cross-Correlation of Slopes)</strong></p><p>When we talk about lead-lag, we are looking for a peak in the cross-correlation function at a non-zero lag. You shouldn&#8217;t run it on raw price series as they are non-stationary, and any correlation you compute will be dominated by common trends rather than genuine co-movement.</p><p>Instead, we work with log-returns:</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;r_t = \\log(P_t) - \\log(P_{t-1}) \\approx \\frac{d \\log P}{dt}&quot;,&quot;id&quot;:&quot;QYDBHSTIJW&quot;}" data-component-name="LatexBlockToDOM"></div><p>Log-returns are (approximately) stationary, which is what makes the cross-correlation meaningful in the first place. We then evaluate:</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;\\rho_{\\tau} = corr(R_A(t), R_B(t + \\tau))&quot;,&quot;id&quot;:&quot;ZYXNECRTJK&quot;}" data-component-name="LatexBlockToDOM"></div><p>If $\tau&gt;0$ and the correlation is statistically significant, Asset A <em>lead</em>s Asset B. This only matters when the transmission mechanism is economically real, regime-consistent, and not yet arbitraged away.</p><p>Let&#8217;s test this on a classic macro relationship: Crude Oil (USO) and the Energy Sector ETF (XLE). One caveat before we start - USO is not a clean proxy for spot crude. It holds rolling front-month futures, so contango and roll yield inject their own dynamics into series (I covered this in more depth in How to Trade Oil post). For a production signal we would use front-month WTI directly; USO is used here for reproducibility with free data. Does oil lead the equities, do equities lead the commodity, or is it instantly priced in?</p><pre><code><code>tickers = ['USO', 'XLE']
data = yf.download(
    tickers,
    start='2020-01-01',
    end='2024-01-01',
    auto_adjust=False,
    progress=False,
)['Adj Close']

returns = np.log(data / data.shift(1)).dropna()

def calculate_cross_correlation(series_a, series_b, max_lag=10, min_obs=252):
    """
    Cross-correlation of returns at lags in [-max_lag, +max_lag].
    lag &gt; 0  =&gt;  A leads B by `lag` periods.
    Drops lags where effective sample size &lt; min_obs (one trading year)
    to keep significance thresholds meaningful.
    """
    correlations = {}
    for lag in range(-max_lag, max_lag + 1):
        shifted_a = series_a.shift(lag)
        aligned = pd.concat([shifted_a, series_b], axis=1).dropna()
        if len(aligned) &lt; min_obs:
            correlations[lag] = np.nan
            continue
        correlations[lag] = aligned.iloc[:, 0].corr(aligned.iloc[:, 1])
    return pd.Series(correlations)

cross_corr = calculate_cross_correlation(returns['USO'], returns['XLE'], max_lag=5)
</code></code></pre><p>In perfectly efficient markets, the peak correlation occurs exactly at &#964; = 0. If you see a statistically significant spike at $&#964; &#8800; 0$ , it means yesterday&#8217;s oil move may provide a directional edge for today&#8217;s energy equities. In daily data, structural lags often stem from supply chain delays, institutional capital rotation, or retail flow catching up to macro news.</p><p>But detecting a lag is only the first step. A statistical lead is not yet an economic edge. The real question is: <strong>why does the lag exist?</strong></p><p>In production, we don&#8217;t stop at &#8220;USO leads XLE&#8221;. We ask what drives the delay:</p><ul><li><p>earnings revision propagation,</p></li><li><p>ETF flow mechanics,</p></li><li><p>options hedging,</p></li><li><p>sector reallocation,</p></li><li><p>or simply a transient common factor move?</p></li></ul><p><strong>If we cannot explain the path by which information travels from Asset A to Asset B, we treat the signal as unstable and likely non-scalable.</strong></p><p><strong>Alpha is not in detecting lag - it&#8217;s in knowing when the lag is stable, tradable, and not yet arbitraged away.</strong> This is where most retail pipelines fail. They detect a non-zero lag and immediately label it alpha. That is premature. A lag without mechanism is often just a temporary statistical artifact. Structural alpha comes from identifying <strong>how information diffuses, who is slow to react, and under what market state that delay remains tradable.</strong></p><p><strong>More importantly, lead-lag relationships are rarely constant. They are conditional on regime. The same pair can exhibit a clean positive lag in one environment and collapse or invert in another.</strong> In our research stack, we model lag as a regime-dependent object:</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;&#964;=f(volatility regime, liquidity regime, macro trend, positioning state)&quot;,&quot;id&quot;:&quot;NLPROJMPQC&quot;}" data-component-name="LatexBlockToDOM"></div><p>This is why rolling statistics matter. A global average lag is often misleading. The only lags worth trading are the ones that remain stable within clearly defined states of the world.</p><p>A feature that passes a full-sample Granger test (read below) but fails in rolling windows or loses significance out-of-sample is not alpha., it is a backtest artifact. In our pipeline, such features are automatically excluded.</p><p><strong>In QuantJourney, a primitive - what you would typically call an alpha factor - is not treated as a single time series but as a stateful intelligence object: trend, acceleration, z-score, percentile extremeness, and its relation graph to other primitives across multiple horizons.</strong> This matters because lead-lag rarely propagates through a clean pair. In real markets, information diffuses through a dependency network, not a single edge. Mapping that network is what allows us to move from pairwise statistics to regime-aware signal construction.</p><p>Even a statistically valid lag is not a strategy until it is mapped into execution. In practice, that means converting a relationship into a decision rule:</p><ul><li><p>when does the signal activate,</p></li><li><p>how strong must it be,</p></li><li><p>how long does it remain valid,</p></li><li><p>how is size determined,</p></li><li><p>and under what regime does it get disabled.</p></li></ul><p>In other words, the path we use in QuantJourney OMS is as follows:</p><p><strong>Signal &#8594; Position &#8594; Risk &#8594; Execution</strong></p><p>This is the difference between a research finding and a tradable portfolio process.</p><pre><code><code>def build_signal(feature_x, target_y, regime_state):
    lag_score = compute_lead_lag_score(feature_x, target_y)
    granger_score = rolling_granger_stability(feature_x, target_y)
    ic_score = rolling_information_coefficient(feature_x, target_y)

    if regime_state not in allowed_regimes(feature_x, target_y):
        return 0.0

    signal = lag_score * granger_score * ic_score
    return signal

def size_position(signal, regime_confidence, risk_budget):
    if signal &lt; 1.5:
        return 0.0
    return risk_budget * regime_confidence * signal_decay_adjustment(signal)</code></code></pre><p><strong>2. Granger Causality (Feature Selection)</strong></p><p>If lead-lag is a scalpel for timing, Granger Causality is a sieve for features. It asks a strict predictive question:</p><p><em>Does knowing the past values of Feature X improve our ability to predict, compared to predicting using ONLY the past values of Y?</em></p><p>The restricted model (Y explained by its own past):</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;Y_t = \\alpha_0 + \\sum_{i=1}^{p} \\alpha_i Y_{t-i} + \\epsilon_t&quot;,&quot;id&quot;:&quot;PYRUQWWDPL&quot;}" data-component-name="LatexBlockToDOM"></div><p>The unrestricted model (adding lagged X as predictor):</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;Y_t = \\gamma_0 + \\sum_{i=1}^{p} \\gamma_i Y_{t-i} + \\sum_{i=1}^{p} \\beta_i X_{t-i} + \\eta_t&quot;,&quot;id&quot;:&quot;EOSZSLOOIK&quot;}" data-component-name="LatexBlockToDOM"></div><p>Note that $a_i$ and <code>&#947;_i</code> are different estimates - they come from different regressions. Adding lagged X re-shuffles the explanatory work across all regressors, so the autoregressive coefficients on Y change as well. The test focuses on the new coefficients:</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;H_0: \\beta_1 = \\beta_2 = \\ldots = \\beta_p = 0&quot;,&quot;id&quot;:&quot;LWYHEVPAYI&quot;}" data-component-name="LatexBlockToDOM"></div><p>If the $\beta$ coefficients are jointly significantly different from zero (via an F-test), then X &#8220;Granger-causes&#8221; Y - meaning its lagged history carries predictive information beyond what Y&#8217;s own past already provides.</p><p>Granger causality is useful, but it is not causal inference in the economic sense. In production, it is better understood as a <strong>predictive inclusion test.</strong> It tells us whether the lagged history of X improves forecasting Y, not whether X is the true underlying driver.</p><p>This distinction matters because Granger tests can produce false positives in the presence of latent common factors, autocorrelation leakage, or regime shifts. For that reason, we do not rely on a single full-sample result. We evaluate rolling Granger stability, regime-conditional significance, and out-of-sample decay before promoting any feature into a live model.</p><p>Let&#8217;s test if the VIX (Volatility Index) Granger-causes SPY (S&amp;P 500) returns. Can a spike in volatility today mathematically improve our forecast for tomorrow&#8217;s index return?</p><p><strong>The Code: Granger Causality</strong></p><pre><code><code>from statsmodels.tsa.stattools import grangercausalitytests

tickers = ['SPY', '^VIX']
data_gc = yf.download(
    tickers,
    start='2022-01-01',
    end='2024-01-01',
    auto_adjust=False,
    progress=False,
)['Adj Close']

returns_gc = np.log(data_gc / data_gc.shift(1)).dropna()

# statsmodels expects a 2D array where:
#   Column 0 = TARGET (the variable we want to predict, here SPY)
#   Column 1 = PREDICTOR (the variable whose lagged values we test, here VIX)
gc_data = returns_gc[['SPY', '^VIX']].values

# maxlag=3: test whether up to 3 days of VIX history improves SPY forecasts
gc_results = grangercausalitytests(gc_data, maxlag=3)</code></code></pre><p>Interpreting the output:</p><p>The <code>grangercausalitytests</code> function will output F-tests and Chi-square tests for each lag. You are looking for the p-values.</p><ul><li><p>If $p&lt;0.05$ at lag 1: past values of VIX contain statistically significant predictive information about next-day SPY returns, beyond what SPY&#8217;s own past returns already provide.</p></li><li><p>If $p&gt;0.05$ : drop the feature. It may co-move contemporaneously, but it carries no forecasting alpha.</p></li></ul><h3><strong>How QuantJourney Operationalizes This</strong></h3><p>Everything above is classical methodology - lead-lag and Granger tests have been in the buy-side toolkit for decades. What matters in production is not running the test, but building infrastructure that lets you trust the result across regimes, across time, and across audit cycles. This is where QuantJourney diverges from the standard quant-blog pipeline.</p><blockquote><p><strong>Primitives as stateful objects, not time series.</strong> In our research stack, a feature like &#8220;USO leads XLE by &#964; days&#8221; is not a scalar coefficient and not a single time series. It is a compiled object holding its trend, acceleration, z-score, percentile extremeness, regime-conditional lag distribution, and a relation graph to every other primitive in the system across multiple horizons. When the regime state changes, the object re-evaluates itself against its regime-specific prior &#8212; not the full-sample one.</p><p><strong>Regime as a joint state, operationally defined.</strong> We index every primitive on a four-axis state vector: realized-volatility bucket (low / normal / stressed, rolling 63-day percentiles), liquidity regime (ADV and spread percentiles versus trailing year), macro trend (sign and persistence of the rates / dollar / credit factor), and positioning state (CFTC COT extremes, ETF flow percentiles). A lead-lag coefficient that is stable only in &#8220;low-vol, risk-on, long-positioning&#8221; is stored as such &#8212; and disabled everywhere else.</p><p><strong>Hypotheses as compiled, live-monitored objects.</strong> The statement <em>&#8220;USO leads XLE by 7 days in mid-vol regimes with rising crude term structure&#8221;</em> is not a comment in a research notebook. In QuantJourney it is written in ICDL (Investment Concept Description Language), compiled into a live thesis object, and monitored continuously by the Scenario Monitor. When the regime drifts or the lag decays, the thesis is flagged, its conditional risk is re-priced, and the downstream positions are surfaced in the PM Decision Cockpit with a structured decision log. No human has to remember to check it.</p><p><strong>Validation is institutional, not ad-hoc.</strong> Before any primitive enters the live signal graph, it passes walk-forward validation with CPCV, PBO calculation, and deflated Sharpe. SHA-256 reproducibility hashes are stored in the immutable audit vault so every production decision is traceable to the exact data, parameters, and code that generated the signal. A feature that looks good in-sample but fails CPCV is not quietly downgraded &#8212; it is excluded, with the rejection logged.</p></blockquote><p><strong>The Empirical Reality: Cutting Through the Noise</strong></p><p>When you run our full QuantJourney pipeline, you generate a series of diagnostic plots. Let&#8217;s look at the output from our latest run and discuss what a Portfolio Manager actually sees behind the pretty colors.</p><p><strong>1. The Lead-Lag Heatmap: Mapping the Ecosystem</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!twUu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd13d9061-e812-49d3-8e3f-2e0408010ea0_1584x598.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!twUu!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd13d9061-e812-49d3-8e3f-2e0408010ea0_1584x598.png 424w, https://substackcdn.com/image/fetch/$s_!twUu!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd13d9061-e812-49d3-8e3f-2e0408010ea0_1584x598.png 848w, https://substackcdn.com/image/fetch/$s_!twUu!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd13d9061-e812-49d3-8e3f-2e0408010ea0_1584x598.png 1272w, https://substackcdn.com/image/fetch/$s_!twUu!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd13d9061-e812-49d3-8e3f-2e0408010ea0_1584x598.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!twUu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd13d9061-e812-49d3-8e3f-2e0408010ea0_1584x598.png" width="1456" height="550" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d13d9061-e812-49d3-8e3f-2e0408010ea0_1584x598.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:550,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:243714,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://quantjourney.substack.com/i/195009588?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd13d9061-e812-49d3-8e3f-2e0408010ea0_1584x598.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!twUu!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd13d9061-e812-49d3-8e3f-2e0408010ea0_1584x598.png 424w, https://substackcdn.com/image/fetch/$s_!twUu!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd13d9061-e812-49d3-8e3f-2e0408010ea0_1584x598.png 848w, https://substackcdn.com/image/fetch/$s_!twUu!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd13d9061-e812-49d3-8e3f-2e0408010ea0_1584x598.png 1272w, https://substackcdn.com/image/fetch/$s_!twUu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd13d9061-e812-49d3-8e3f-2e0408010ea0_1584x598.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Look at the Optimal Lag matrix. The &#177;7 values between USO and XLE are not noise - they indicate structural friction. In this dataset, USO movements tend to lead XLE by roughly 7 trading days.</p><p>Seven days is long for two liquid, continuously quoted instruments, and you should read it with some suspicion. Part of it is economically real: slow-moving capital rotates into energy equities only after a sustained commodity trend confirms itself, and sell-side earnings revisions for E&amp;P names lag the spot print by a week or two. Part of it is an artifact of USO&#8217;s roll mechanics. Before sizing any position on this lag, we validate it against front-month WTI.</p><p>Notice the asymmetry. If the relationship were a pure contemporaneous beta, the optimal-lag matrix would be skew-symmetric: <code>lag(A&#8594;B) = &#8722;lag(B&#8594;A)</code>. <strong>When that symmetry breaks, information is flowing preferentially in one direction, you are not looking at co-movement, you are looking at a transmission channel</strong>. If you trade energy stocks off <em>today&#8217;s</em> oil price, you are a week early. The alpha window opens after the commodity has already moved.</p><p><strong>2. Granger Causality: Feature Selection or Noise?</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!c3z8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F594cd97c-b8cd-4f95-ae8d-a009538aaa33_1595x594.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!c3z8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F594cd97c-b8cd-4f95-ae8d-a009538aaa33_1595x594.png 424w, https://substackcdn.com/image/fetch/$s_!c3z8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F594cd97c-b8cd-4f95-ae8d-a009538aaa33_1595x594.png 848w, https://substackcdn.com/image/fetch/$s_!c3z8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F594cd97c-b8cd-4f95-ae8d-a009538aaa33_1595x594.png 1272w, https://substackcdn.com/image/fetch/$s_!c3z8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F594cd97c-b8cd-4f95-ae8d-a009538aaa33_1595x594.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!c3z8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F594cd97c-b8cd-4f95-ae8d-a009538aaa33_1595x594.png" width="1456" height="542" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/594cd97c-b8cd-4f95-ae8d-a009538aaa33_1595x594.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:542,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:187505,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://quantjourney.substack.com/i/195009588?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F594cd97c-b8cd-4f95-ae8d-a009538aaa33_1595x594.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!c3z8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F594cd97c-b8cd-4f95-ae8d-a009538aaa33_1595x594.png 424w, https://substackcdn.com/image/fetch/$s_!c3z8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F594cd97c-b8cd-4f95-ae8d-a009538aaa33_1595x594.png 848w, https://substackcdn.com/image/fetch/$s_!c3z8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F594cd97c-b8cd-4f95-ae8d-a009538aaa33_1595x594.png 1272w, https://substackcdn.com/image/fetch/$s_!c3z8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F594cd97c-b8cd-4f95-ae8d-a009538aaa33_1595x594.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This chart is the honest feature-selection test. At Lag 1 the p-value sits at 0.016, well below the 0.05 threshold.</p><p>VIX does not merely co-move with the market when it drops - its lagged values <em>Granger-cause</em> next-day SPY returns in the statistical sense defined above. For a machine learning model on SPY, VIX is a strong candidate feature: it carries information that SPY&#8217;s own price history does not. If all bars were above 0.05, we would drop the feature immediately to avoid overfitting downstream.</p><p>Remember the caveat from the theory section: VIX is derived from SPX options, so this is a predictive-inclusion result, not an economic causal claim. The leverage effect and volatility feedback are baked into the relationship.</p><p><strong>3. The Strategy Deep-Dive: Rolling IC &amp; Equity Curve</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!PDJX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F563bf876-5072-4529-b6b6-460451be129e_1592x500.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!PDJX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F563bf876-5072-4529-b6b6-460451be129e_1592x500.png 424w, https://substackcdn.com/image/fetch/$s_!PDJX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F563bf876-5072-4529-b6b6-460451be129e_1592x500.png 848w, https://substackcdn.com/image/fetch/$s_!PDJX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F563bf876-5072-4529-b6b6-460451be129e_1592x500.png 1272w, https://substackcdn.com/image/fetch/$s_!PDJX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F563bf876-5072-4529-b6b6-460451be129e_1592x500.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!PDJX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F563bf876-5072-4529-b6b6-460451be129e_1592x500.png" width="1456" height="457" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/563bf876-5072-4529-b6b6-460451be129e_1592x500.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:457,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:320625,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://quantjourney.substack.com/i/195009588?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F563bf876-5072-4529-b6b6-460451be129e_1592x500.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!PDJX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F563bf876-5072-4529-b6b6-460451be129e_1592x500.png 424w, https://substackcdn.com/image/fetch/$s_!PDJX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F563bf876-5072-4529-b6b6-460451be129e_1592x500.png 848w, https://substackcdn.com/image/fetch/$s_!PDJX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F563bf876-5072-4529-b6b6-460451be129e_1592x500.png 1272w, https://substackcdn.com/image/fetch/$s_!PDJX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F563bf876-5072-4529-b6b6-460451be129e_1592x500.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Now look at the Rolling 60d Correlation. This is the common failure mode in retail research. A global correlation of 0.17 gets treated as a constant, as if it were a physical law. It is not. You can see the relationship flip into negative territory during specific market regimes &#8212; the same &#8220;edge&#8221; that is tradable in one state of the world is a money-loser in another.</p><p>The backtest of this lag produces a Sharpe of 0.75 versus 0.32 for buy-and-hold. That is a solid improvement in risk-adjusted returns. The Information Coefficient is modest - ICIR of 0.33, which is &#8220;weak&#8221; by strict standards.</p><p>But the point of this signal is not raw return. It is the reduction in max drawdown, from &#8722;60% to &#8722;35%. That is what lets you stay in the game long enough to compound, and what lets you scale position size without blowing up on the next regime shift. In practice you would not &#8220;go long XLE&#8221; on this signal alone &#8212; you would use the lead-lag as a timing overlay on top of an existing sizing framework.</p><p>An IC of 0.04 sounds small, but in systematic trading magnitude matters less than stability. The break-even condition is roughly <code>|IC| &#215; &#963;_y &#215; &#8730;breadth &gt; cost_per_turnover</code>. On large-cap US equities at ~2&#8211;3 bps round-trip, a persistent IC in the 0.02&#8211;0.04 range clears the bar comfortably. On small-caps or EM names at 15&#8211;30 bps, the same IC is an academic curiosity. The edge is not in any single signal - it is in aggregation, regime conditioning, and execution discipline.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!eLup!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe336283-6f5d-4198-a1cb-8a7eaeafbb88_1394x792.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!eLup!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe336283-6f5d-4198-a1cb-8a7eaeafbb88_1394x792.png 424w, https://substackcdn.com/image/fetch/$s_!eLup!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe336283-6f5d-4198-a1cb-8a7eaeafbb88_1394x792.png 848w, https://substackcdn.com/image/fetch/$s_!eLup!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe336283-6f5d-4198-a1cb-8a7eaeafbb88_1394x792.png 1272w, https://substackcdn.com/image/fetch/$s_!eLup!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe336283-6f5d-4198-a1cb-8a7eaeafbb88_1394x792.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!eLup!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe336283-6f5d-4198-a1cb-8a7eaeafbb88_1394x792.png" width="1394" height="792" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/be336283-6f5d-4198-a1cb-8a7eaeafbb88_1394x792.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:792,&quot;width&quot;:1394,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:305134,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://quantjourney.substack.com/i/195009588?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe336283-6f5d-4198-a1cb-8a7eaeafbb88_1394x792.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!eLup!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe336283-6f5d-4198-a1cb-8a7eaeafbb88_1394x792.png 424w, https://substackcdn.com/image/fetch/$s_!eLup!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe336283-6f5d-4198-a1cb-8a7eaeafbb88_1394x792.png 848w, https://substackcdn.com/image/fetch/$s_!eLup!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe336283-6f5d-4198-a1cb-8a7eaeafbb88_1394x792.png 1272w, https://substackcdn.com/image/fetch/$s_!eLup!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe336283-6f5d-4198-a1cb-8a7eaeafbb88_1394x792.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Both $corr(slope_A(t), slope_b(t+lag))$ and Granger Causality are essential tools, but they are just the starting point for regime discovery.</p><ul><li><p><strong>Lead-Lag</strong> tells you <em>when</em> to execute.</p></li><li><p><strong>Granger Causality</strong> tells you <em>what</em> to include in your model.</p></li></ul><p>Run these tests on daily data and the zero-lag correlation will dominate most of the time - markets are highly efficient at daily resolution. The lags live in minute bars, tick data, and alternative sources: corporate-jet movements before M&amp;A announcements, credit-card panel data before earnings, satellite imagery before commodity prints. But the higher you go in frequency, the more the Epps effect contaminates the result - asynchronous trading alone produces spurious lead-lag structure, and nothing tick-level can be trusted without non-synchronous sampling corrections.</p><p>And the numbers always have to clear costs. A Granger test flagging Feature X as predictive is table stakes; predictive is not profitable. Every feature we promote to the live model at QuantJourney is evaluated at realistic net-of-cost IC, not gross. Most don&#8217;t survive.</p><p>This post covered pairwise lead-lag. In reality, information does not diffuse through a single edge - it propagates through a dependency graph across hundreds of instruments, sectors, and macro factors simultaneously. In the future posts, we move from pairwise lags to the full dependency network: <strong>how QuantJourney compiles it into a live, regime-aware signal layer that survives regime shifts instead of breaking at them.</strong></p><p>One final note on the methodology itself.<strong> Granger causality is linear by construction - it asks whether a linear combination of lagged X improves a linear forecast of Y. Real market dependencies are rarely that well-behaved. </strong>Tail dependence rises in crises, relationships become asymmetric under stress, and the same pair that looks uncorrelated on average can become highly predictive in the left tail. Transfer entropy - a model-free, information-theoretic measure of directed dependence - captures these nonlinearities without assuming any functional form. In QuantJourney we run both as complementary screens: Granger as the linear baseline, transfer entropy as the nonlinear layer. When they agree, the signal is robust. When transfer entropy is strong but Granger is weak, we are looking at a nonlinear dependency - tradeable, but with different sizing and different risk budgeting than a linear signal. <strong>When Granger is strong but transfer entropy is weak, it is usually a linear artifact that will not survive a regime shift. We will go deeper into the nonlinear layer in a future post.</strong></p><p>Happy Trading!</p><p>QuantJourney</p>]]></content:encoded></item><item><title><![CDATA[The Consumer Is Not the Trade]]></title><description><![CDATA[Why the next downturn will not hit all consumer exposure equally]]></description><link>https://quantjourney.substack.com/p/the-consumer-is-not-the-trade</link><guid isPermaLink="false">https://quantjourney.substack.com/p/the-consumer-is-not-the-trade</guid><dc:creator><![CDATA[Jakub]]></dc:creator><pubDate>Wed, 18 Mar 2026 08:55:02 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/4809ea4f-3250-4894-b764-e9643907463d_1074x1079.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Before we start, a quick personal note: <strong>QuantJourney just crossed 6,000 subscribers.</strong> Two years ago, this started as an idea: to build the kind of <strong>institutional-grade research framework</strong> I always wished existed for serious investors. That framework is now becoming <strong>QuantJourney - an investment research platform for funds, family offices, and sophisticated &#8230;</strong></p>
      <p>
          <a href="https://quantjourney.substack.com/p/the-consumer-is-not-the-trade">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[How to Trade Flows: Hedge Overlays, De-grossing, and When Markets Actually Break]]></title><description><![CDATA[TL;DR: If you&#8217;re net positive YTD and watching the market grind lower through every relief rally: this one is for you.]]></description><link>https://quantjourney.substack.com/p/how-to-trade-flows-hedge-overlays</link><guid isPermaLink="false">https://quantjourney.substack.com/p/how-to-trade-flows-hedge-overlays</guid><dc:creator><![CDATA[Jakub]]></dc:creator><pubDate>Tue, 17 Mar 2026 11:42:04 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/c72cf180-95ea-4202-a210-b3254ad52f63_1071x1023.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>TL;DR: <em><strong>If you&#8217;re net positive YTD and watching the market grind lower through every relief rally: this one is for you.</strong> Most institutional portfolios didn&#8217;t sell equities - they bought puts. That sounds like protection. It isn&#8217;t. It&#8217;s the same risk, repackaged with negative carry. <strong>We cover how de-grossing differs from deleveraging, why expensive overlays&#8230;</strong></em></p>
      <p>
          <a href="https://quantjourney.substack.com/p/how-to-trade-flows-hedge-overlays">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[How to Trade Credit: High Yield, Treasuries, Spreads, and the Regimes That Actually Matter]]></title><description><![CDATA[This is the third article from mini-series, How To Trade.]]></description><link>https://quantjourney.substack.com/p/how-to-trade-credit-high-yield-treasuries</link><guid isPermaLink="false">https://quantjourney.substack.com/p/how-to-trade-credit-high-yield-treasuries</guid><dc:creator><![CDATA[Jakub]]></dc:creator><pubDate>Fri, 13 Mar 2026 06:16:26 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/59c5d2eb-2bb7-4437-b97a-5185b5489161_1075x1075.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>This is <strong>the third article in the &#8216;How to Trade&#8217; mini-series</strong>. We covered <a href="https://quantjourney.substack.com/p/how-to-trade-oil-cl1-wti-reference">Oil </a>and <a href="https://quantjourney.substack.com/p/how-to-trade-vixy-long-short-term">Volatility</a>. Oil helps you read physical stress and curve structure. Volatility helps you read fear, convexity, and front-end repricing. Credit goes one layer deeper.</p><p>Credit is often a better read on underlying market stress. <strong>Credit is where macro, liquidity, and corporate bal&#8230;</strong></p>
      <p>
          <a href="https://quantjourney.substack.com/p/how-to-trade-credit-high-yield-treasuries">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[How to Trade VIXY - Long, Short, Term Structure, and Macro Regimes]]></title><description><![CDATA[In our earlier post, How We Trade Oil, we showed how stressed markets require the right instrument, not just the right direction.]]></description><link>https://quantjourney.substack.com/p/how-to-trade-vixy-long-short-term</link><guid isPermaLink="false">https://quantjourney.substack.com/p/how-to-trade-vixy-long-short-term</guid><dc:creator><![CDATA[Jakub]]></dc:creator><pubDate>Thu, 12 Mar 2026 09:46:53 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/031e099e-4721-4992-a129-13452d20ddc8_1076x1080.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In our earlier post, <strong>How We Trade Oil</strong>, we showed how stressed markets require the right instrument, not just the right direction. Volatility is no different.</p><p>The <strong>VIX</strong> measures the market&#8217;s expected <strong>30-day volatility</strong> for the <strong>S&amp;P 500</strong> and is often treated as Wall Street&#8217;s fear gauge. But it is <strong>not something you can buy directly</strong>.</p><p>When VIX spikes, many traders &#8230;</p>
      <p>
          <a href="https://quantjourney.substack.com/p/how-to-trade-vixy-long-short-term">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[How to Trade Oil - CL1!, WTI Reference, Curve Regimes, and Instrument Selection]]></title><description><![CDATA[As conflict in the Middle East continues to reshape the risk backdrop, oil remains one of the cleanest markets through which geopolitical stress gets expressed.]]></description><link>https://quantjourney.substack.com/p/how-to-trade-oil-cl1-wti-reference</link><guid isPermaLink="false">https://quantjourney.substack.com/p/how-to-trade-oil-cl1-wti-reference</guid><dc:creator><![CDATA[Jakub]]></dc:creator><pubDate>Tue, 10 Mar 2026 19:51:14 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/8cfb1c68-9b0f-454a-ac39-d213633dcc5e_1074x1073.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>As conflict in the Middle East continues to reshape the risk backdrop, oil remains one of the cleanest markets through which geopolitical stress gets expressed. <strong>But trading oil well is not just about getting the direction right. It is about understanding which part of the curve is moving, why it is moving, and which instrument actually matches that view.</strong></p>
      <p>
          <a href="https://quantjourney.substack.com/p/how-to-trade-oil-cl1-wti-reference">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[The Quantum Mechanics of Prediction Markets]]></title><description><![CDATA[Why a $0.30 contract isn&#8217;t &#8220;30% likely&#8221; - and what particle physics can teach us about betting.]]></description><link>https://quantjourney.substack.com/p/the-quantum-mechanics-of-prediction</link><guid isPermaLink="false">https://quantjourney.substack.com/p/the-quantum-mechanics-of-prediction</guid><dc:creator><![CDATA[Jakub]]></dc:creator><pubDate>Wed, 25 Feb 2026 21:10:37 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/d9475c9d-feed-4b8f-b3d3-3bbc357e3fe4_1077x1078.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Why a $0.30 contract isn&#8217;t &#8220;30% likely&#8221; - and what particle physics can teach us about betting.</em></p><p>My background is in high-energy physics. Before I started building quant models, I spent years on high-energy physics experiments - analysing particle collisions at TeV energies, measuring spin states, debugging Monte Carlo simulations on HPC clusters.</p><p>When I f&#8230;</p>
      <p>
          <a href="https://quantjourney.substack.com/p/the-quantum-mechanics-of-prediction">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Hypothesis Engine: Why Screeners Fail and What Professionals Do Instead]]></title><description><![CDATA[TL,DR: Most retail platforms give you a screener: set a few thresholds, get a list of stocks that pass.]]></description><link>https://quantjourney.substack.com/p/hypothesis-engine-why-screeners-fail</link><guid isPermaLink="false">https://quantjourney.substack.com/p/hypothesis-engine-why-screeners-fail</guid><dc:creator><![CDATA[Jakub]]></dc:creator><pubDate>Mon, 23 Feb 2026 09:23:43 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/ef8f8c99-04cb-47bf-b941-6fd25ecfa8de_1072x1078.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>TL,DR: Most retail platforms give you a screener: set a few thresholds, get a list of stocks that pass. It feels powerful - but structurally, it&#8217;s just flat filtering on isolated metrics. Professional investors don&#8217;t work that way. <strong>They don&#8217;t start with filters. They start with hypotheses.</strong></p><p>And Alpha does not live in isolated metrics - it lives in <strong>interac&#8230;</strong></p>
      <p>
          <a href="https://quantjourney.substack.com/p/hypothesis-engine-why-screeners-fail">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Why 77% Win-Rate Traders Go Broke on Polymarket]]></title><description><![CDATA[TL;DR: On Polymarket, buying a contract at $0.77 means risking $0.77 to win $0.23 - a 3.3:1 ratio against you. One loss wipes out three wins. The traders who consistently profit aren&#8217;t the ones who are right most often &#8212; they&#8217;re the ones who understand which bets are worth taking in the first place.]]></description><link>https://quantjourney.substack.com/p/why-77-win-rate-traders-go-broke</link><guid isPermaLink="false">https://quantjourney.substack.com/p/why-77-win-rate-traders-go-broke</guid><dc:creator><![CDATA[Jakub]]></dc:creator><pubDate>Tue, 10 Feb 2026 07:37:25 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/644d6176-521f-449b-9185-dd99cba04372_1072x1075.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>TL;DR:</strong> On Polymarket, buying a contract at $0.77 means risking $0.77 to win $0.23 &#8212; a 3.3:1 ratio against you. One loss wipes out three wins. <strong>The traders who consistently profit aren't the ones who are right most often &#8212; they're the ones who understand which bets are worth taking in the first place.</strong> </p><p>As <strong>Roger Federer said in his Stanford commencement spe&#8230;</strong></p>
      <p>
          <a href="https://quantjourney.substack.com/p/why-77-win-rate-traders-go-broke">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Polymarket - How prediction market microstructure shapes your edge - and why you need async + sync working together.]]></title><description><![CDATA[How prediction market microstructure shapes your edge &#8212; and why you need async + sync working together.]]></description><link>https://quantjourney.substack.com/p/understanding-the-polymarket-fee</link><guid isPermaLink="false">https://quantjourney.substack.com/p/understanding-the-polymarket-fee</guid><dc:creator><![CDATA[Jakub]]></dc:creator><pubDate>Mon, 09 Feb 2026 08:35:06 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/da974391-e4bf-4bff-9541-735af83978ab_1075x1085.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>TL;DR: Prediction markets are a uniquely transparent microstructure lab: small fees, asymmetric payoffs, and thin liquidity make execution discipline - not prediction - the primary source of edge. </strong>This makes them an unusually interesting market for process-driven trading systems. </p><p><strong>If you&#8217;re building a trading bot for Polymarket (or any prediction market)&#8230;</strong></p>
      <p>
          <a href="https://quantjourney.substack.com/p/understanding-the-polymarket-fee">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Why Most AI Finance Agents Fail: Model–Market Fit vs Institutional Reality]]></title><description><![CDATA[TL;DR: Most AI finance demos fail not because models are dumb, but because finance requires long-horizon, multi-tool, governed workflows.]]></description><link>https://quantjourney.substack.com/p/why-ai-agents-fail-in-finance-and</link><guid isPermaLink="false">https://quantjourney.substack.com/p/why-ai-agents-fail-in-finance-and</guid><dc:creator><![CDATA[Jakub]]></dc:creator><pubDate>Fri, 06 Feb 2026 13:25:34 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/bf79b10f-74fe-4687-bf39-7095b814d3a7_1074x1075.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>TL;DR: </strong>Most AI finance demos fail not because models are weak, but because finance requires long-horizon, multi-tool, governed workflows. Model&#8211;Market Fit is necessary, but Institutional-Workflow Fit is the real bottleneck. The durable advantage isn&#8217;t smarter models&#8212;it&#8217;s the scaffolding that turns outputs into defensible decisions.</p><p><strong>Let&#8217;s start.</strong></p><p>Every few &#8230;</p>
      <p>
          <a href="https://quantjourney.substack.com/p/why-ai-agents-fail-in-finance-and">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Designing a Real Portfolio Management System (Not a Positions UI)]]></title><description><![CDATA[Today I&#8217;ll walk through what it actually takes to build a portfolio management system of record - the kind used by family offices, RIAs, and institutional teams.]]></description><link>https://quantjourney.substack.com/p/designing-a-real-portfolio-management</link><guid isPermaLink="false">https://quantjourney.substack.com/p/designing-a-real-portfolio-management</guid><dc:creator><![CDATA[Jakub]]></dc:creator><pubDate>Tue, 03 Feb 2026 14:14:01 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/7660abd1-9237-4503-9ad1-383e551b454d_1073x1077.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I recently added a <strong>portfolio management system</strong> to QuantJourney and want to share the core design principles behind it.</p><p>Portfolio management looks like a UI problem. In practice it&#8217;s a <strong>truth problem</strong>: keeping positions and cash in a state that can be rebuilt <strong>day by day, backwards, deterministically</strong>.</p><p>A real failure mode: a custodian reports transactions with&#8230;</p>
      <p>
          <a href="https://quantjourney.substack.com/p/designing-a-real-portfolio-management">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Latency, Slippage, and Joins: The Database Layer Is the New Quant Edge (OpenAI vs. CedarDB)]]></title><description><![CDATA[As we use Postgres DBs in QuantJourney heavily, there is always a dilemma: what to pay for, and how to optimize to make it faster, cheaper, and more durable.]]></description><link>https://quantjourney.substack.com/p/the-great-database-fracture-openais</link><guid isPermaLink="false">https://quantjourney.substack.com/p/the-great-database-fracture-openais</guid><dc:creator><![CDATA[Jakub]]></dc:creator><pubDate>Wed, 28 Jan 2026 09:27:18 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/4be29e9b-5ec4-4bff-9a32-9c254d84a4e1_1074x1079.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>We rely heavily on PostgreSQL in QuantJourney, which creates a constant trade-off: what to pay for, and how to make the system faster, cheaper, and more durable. Affinity, cache locality, index management - it never ends. Recently I read OpenAI&#8217;s notes on scaling PostgreSQL, and then CedarDB&#8217;s work on a modern OLAP engine.</p><p>I wish to share with you the fi&#8230;</p>
      <p>
          <a href="https://quantjourney.substack.com/p/the-great-database-fracture-openais">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[How I Built a Self-Documenting Codebase with AI Skills (and Saved Myself 12 Hours a Week – No BS)
]]></title><description><![CDATA[Over the last 12 months, QuantJourney stopped being a single repo (or a bunch of code on my laptop) and became a set of cooperating systems running in the cloud.]]></description><link>https://quantjourney.substack.com/p/how-we-built-a-self-documenting-codebase</link><guid isPermaLink="false">https://quantjourney.substack.com/p/how-we-built-a-self-documenting-codebase</guid><dc:creator><![CDATA[Jakub]]></dc:creator><pubDate>Tue, 27 Jan 2026 09:56:40 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/64b95d34-37c3-48c3-aaf5-559190659b3d_1080x1079.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Over the last 12 months, QuantJourney stopped being a single repo (or a bunch of code on my laptop) and became a <strong>set of cooperating systems running in the cloud</strong>. At that point, documentation stopped being a nice-to-have and became operational risk.</p><p>I suddenly had <strong>multiple repositories moving fast</strong>: a production API server, a warehouse + ETL, a research we&#8230;</p>
      <p>
          <a href="https://quantjourney.substack.com/p/how-we-built-a-self-documenting-codebase">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Polymarket Trading Framework in Python (Streaming, Execution, Strategies)]]></title><description><![CDATA[Traditional markets are crowded and highly optimized.]]></description><link>https://quantjourney.substack.com/p/make-profit-on-polymarket-a-deep</link><guid isPermaLink="false">https://quantjourney.substack.com/p/make-profit-on-polymarket-a-deep</guid><dc:creator><![CDATA[Jakub]]></dc:creator><pubDate>Thu, 08 Jan 2026 11:40:29 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/11822520-f522-430c-a4f7-43572de2b414_1071x1072.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Traditional markets are crowded and highly optimized. Prediction markets are different: they&#8217;re smaller, structurally constrained by smart contracts, and often exhibit micro-inefficiencies that are hard to arbitrage elsewhere.</p><p>Over the past few weeks we built our <strong>Python framework for algorithmic trading on Polymarket</strong>. It&#8217;s an event-driven toolkit that cl&#8230;</p>
      <p>
          <a href="https://quantjourney.substack.com/p/make-profit-on-polymarket-a-deep">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Engineering a True Institutional-Grade Universe System: From Ticker Chaos to Point-in-Time Precision]]></title><description><![CDATA[At QuantJourney, we are building tools that bridge the gap between retail quant trading and the rigorous data infrastructures of quantitative hedge funds.]]></description><link>https://quantjourney.substack.com/p/engineering-a-true-institutional</link><guid isPermaLink="false">https://quantjourney.substack.com/p/engineering-a-true-institutional</guid><dc:creator><![CDATA[Jakub]]></dc:creator><pubDate>Mon, 29 Dec 2025 20:25:51 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/389a1b64-43d7-4863-b52e-c30e6c193659_1000x1003.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>At <strong>QuantJourney</strong>, we are building tools that bridge the gap between retail quant trading and the rigorous data infrastructures of quantitative hedge funds.</p><p>Our latest milestone is the release of the <strong>Universe System</strong> - a production-hardened, point-in-time (PIT) accurate architecture for tracking major US equity indices (S&amp;P 500, NASDAQ 100, Russell 2000, Do&#8230;</p>
      <p>
          <a href="https://quantjourney.substack.com/p/engineering-a-true-institutional">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[The illusion of safety: deconstructing the VWAP "Heartbeat”]]></title><description><![CDATA[&#8220;I used to view VWAP as the standard for &#8216;safe&#8217; execution.]]></description><link>https://quantjourney.substack.com/p/the-illusion-of-safety-deconstructing</link><guid isPermaLink="false">https://quantjourney.substack.com/p/the-illusion-of-safety-deconstructing</guid><dc:creator><![CDATA[Jakub]]></dc:creator><pubDate>Sun, 14 Dec 2025 15:28:22 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/0efdf8cf-64d1-4dd4-8e68-2ee08e23617e_979x983.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>&#8220;I used to view VWAP as the standard for &#8216;safe&#8217; execution. The data proved me wrong.&#8221;</em></p><p><strong>TL;DR</strong></p><ul><li><p>VWAP/TWAP <em>feels</em> safe because it spreads your order out - but &#8220;smooth&#8221; can become a fingerprint.</p></li><li><p>Regular slicing creates a rhythm in time and size that fast liquidity seekers can measure, not &#8220;guess.&#8221;</p></li><li><p>Once they detect the rhythm, they can lean ahead of your next slice&#8230;</p></li></ul>
      <p>
          <a href="https://quantjourney.substack.com/p/the-illusion-of-safety-deconstructing">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Beyond Geometry: A Quantitative Deconstruction of Market Microstructure]]></title><description><![CDATA[Traditional technical analysis often treats charts as geometry - identifying patterns like &#8216;Flags&#8217; to predict outcomes.]]></description><link>https://quantjourney.substack.com/p/beyond-geometry-a-quantitative-deconstruction</link><guid isPermaLink="false">https://quantjourney.substack.com/p/beyond-geometry-a-quantitative-deconstruction</guid><dc:creator><![CDATA[Jakub]]></dc:creator><pubDate>Fri, 05 Dec 2025 16:06:44 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/a9d261cc-1976-4815-8f1e-068ce9d04cab_1040x1039.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Traditional technical analysis often treats charts as geometry - identifying patterns like &#8216;Flags&#8217; to predict outcomes. From an institutional perspective, <strong>visual patterns are only the surface layer</strong>. To truly generate alpha, we must understand the mechanics driving these shapes.&#8221;</p><p>From an institutional quantitative perspective, this approach is fundamental&#8230;</p>
      <p>
          <a href="https://quantjourney.substack.com/p/beyond-geometry-a-quantitative-deconstruction">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Liquidity: What M2, RRP, TGA, and QT Say About Stocks in the Near Future]]></title><description><![CDATA[TL;DR. Liquidity is how much ready cash can buy assets on short notice.]]></description><link>https://quantjourney.substack.com/p/liquidity-is-policy-what-todays-m2</link><guid isPermaLink="false">https://quantjourney.substack.com/p/liquidity-is-policy-what-todays-m2</guid><dc:creator><![CDATA[Jakub]]></dc:creator><pubDate>Sat, 04 Oct 2025 19:09:41 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/ab0adae2-dac7-4a72-a46c-f840dfe2a750_1051x1056.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>TL;DR.</strong> <strong>Liquidity is how much ready cash can buy assets on short notice. When it falls, markets get fragile and stocks can drop.</strong> Many assets are at ATHs; if you&#8217;ve had a good year, this could be the moment to protect it: lock in some wins, keep cash flexible, and avoid chasing long-duration beta. If the run continues, a hedge-and-participate stance lets &#8230;</p>
      <p>
          <a href="https://quantjourney.substack.com/p/liquidity-is-policy-what-todays-m2">
              Read more
          </a>
      </p>
   ]]></content:encoded></item></channel></rss>