
[{"content":"","date":"16 May 2026","externalUrl":null,"permalink":"/tags/a/","section":"Tags","summary":"","title":"A","type":"tags"},{"content":"","date":"16 May 2026","externalUrl":null,"permalink":"/tags/anniversary/","section":"Tags","summary":"","title":"Anniversary","type":"tags"},{"content":"","date":"16 May 2026","externalUrl":null,"permalink":"/categories/","section":"Categories","summary":"","title":"Categories","type":"categories"},{"content":"","date":"16 May 2026","externalUrl":null,"permalink":"/tags/personal/","section":"Tags","summary":"","title":"Personal","type":"tags"},{"content":"","date":"16 May 2026","externalUrl":null,"permalink":"/categories/personal-life/","section":"Categories","summary":"","title":"Personal Life","type":"categories"},{"content":"","date":"16 May 2026","externalUrl":null,"permalink":"/posts/","section":"Posts","summary":"","title":"Posts","type":"posts"},{"content":"","date":"16 May 2026","externalUrl":null,"permalink":"/","section":"Pro Algo Trading | AlgoKing","summary":"","title":"Pro Algo Trading | AlgoKing","type":"page"},{"content":"","date":"16 May 2026","externalUrl":null,"permalink":"/tags/relationship/","section":"Tags","summary":"","title":"Relationship","type":"tags"},{"content":"","date":"16 May 2026","externalUrl":null,"permalink":"/tags/saturday/","section":"Tags","summary":"","title":"Saturday","type":"tags"},{"content":"monday was may 11. first anniversary.\ni can tell you what i planned now. the secret is done. she found out. i won.\nthe reveal # we got in the car around 4pm. she had a dress on, i\u0026rsquo;d told her we were doing dinner somewhere nice, that was all she got from me. i drove toward la jolla which she clocked immediately.\n\u0026ldquo;la jolla is not giving me much information. there are forty hotels and sixty restaurants in la jolla.\u0026rdquo;\ncorrect.\nshe went quiet for about thirty seconds, which is her processing mode. then:\n\u0026ldquo;you checked out of your algorithms today. you don\u0026rsquo;t do that for regular dinner reservations.\u0026rdquo;\nshe\u0026rsquo;s not wrong. i cleared the afternoon entirely, had my position management set to auto, didn\u0026rsquo;t touch the dashboard once.\ni pulled into the hotel. small boutique place on the coast, twelve rooms, rooftop looks directly at the pacific. she got out and stood on the sidewalk and looked at it.\n\u0026ldquo;how long did you have this booked.\u0026rdquo;\nsix weeks.\nshe turned and looked at me with this expression that was simultaneously delighted and frustrated, which is a face only she can pull off.\n\u0026ldquo;i checked your browser history. i checked the folder. i even looked at your secondary email.\u0026rdquo;\n\u0026ldquo;the secondary email is for IB API notifications.\u0026rdquo;\n\u0026ldquo;i know that now.\u0026rdquo;\nthe receipt for the hotel had been in an encrypted folder on a separate volume since march. she never had a chance.\n\u0026ldquo;okay,\u0026rdquo; she said. and picked up her bag and walked inside. \u0026ldquo;fine. you win this one.\u0026rdquo;\nmay 11 # dinner was at george\u0026rsquo;s above the cove. she wore this black dress she knows exactly what she\u0026rsquo;s doing in and we both knew it. three hours, good wine, the kind of meal where the conversation just runs without effort. we talked about the year - specific things, not the sentimental-speech version, just actual stuff. the renovation fight. the january thing with the algos. the letter i wrote in march.\nshe said \u0026ldquo;you\u0026rsquo;re different this year.\u0026rdquo;\ni said \u0026ldquo;you\u0026rsquo;re still annoying about the bookshelf.\u0026rdquo;\nshe said \u0026ldquo;i am absolutely right about the bookshelf and you know it.\u0026rdquo;\nwe stayed on the rooftop until midnight. the rooftop is on the list now. highly recommend. she had this particular way of asking for what she wanted that made it impossible to think about anything else, and we took our time with it, and the city was lit up behind us and the water was dark in front of us and it was a solid few hours. i don\u0026rsquo;t know what the universe thought we were going to be doing on our anniversary on a hotel rooftop at 11pm but probably that.\ntuesday # tuesday morning we walked to the coffee shop in la jolla. the one where she was writing a python data pipeline at the bar and i sat down two seats over and asked what she was building.\nit\u0026rsquo;s still there. same setup. same coffee bar.\nshe stopped in the doorway.\n\u0026ldquo;you remembered.\u0026rdquo;\nyeah.\nwe ordered the same things - or close to it, we honestly couldn\u0026rsquo;t agree on exactly what either of us got in june 2023, which became its own fifteen-minute thing - and sat there for an hour and a half. she was quieter than usual. in the processing way, not the bad way.\nshe said at one point: \u0026ldquo;three years.\u0026rdquo;\ni said: \u0026ldquo;technically three years in june.\u0026rdquo;\nshe threw a sugar packet at me.\nthe other part # there was a moment monday night, before the rooftop, just after dinner - standing outside the restaurant waiting on the car - where my parents not being there hit harder than expected.\ndr r had walked me through exactly this scenario two weeks ago. said grief and gratitude aren\u0026rsquo;t opposites. said both would probably show up.\nboth showed up.\ndad would\u0026rsquo;ve had opinions about the hotel. specific, slightly-wrong opinions delivered with complete confidence. mom would\u0026rsquo;ve asked about food three times and then looped to the grandkids question, which she did annually starting when i was like sixteen.\nthat version of the night doesn\u0026rsquo;t exist.\nA. was watching me. she didn\u0026rsquo;t say anything, just put her hand in mine and held it.\nshe always knows when to not say anything.\nwe got in the car. moved on.\nnow # we got home wednesday. algos had kept running. BTC had a 38-hour volatility stretch while we were gone that my system handled fine. options book came back clean. nothing needed me.\nlesson eight is next week. she\u0026rsquo;s already told me it\u0026rsquo;s risotto, which requires \u0026ldquo;patience and technique\u0026rdquo; apparently, which is her way of saying i\u0026rsquo;m going to struggle. the floating shelf is installed above her desk and it looks good even though she has already organized it in a way that makes no sense. i\u0026rsquo;ve stopped trying to understand her system.\nfirst year. we made it. the thing works, it works well, it works on the specific level where you live with someone and see all of it. that version holds up.\ngood saturday.\n-AK\n","date":"16 May 2026","externalUrl":null,"permalink":"/posts/2026-05-16-saturday-she-finally-found-out/","section":"Posts","summary":"\u003cp\u003emonday was may 11. first anniversary.\u003c/p\u003e\n\u003cp\u003ei can tell you what i planned now. the secret is done. she found out. i won.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe reveal \n    \u003cdiv id=\"the-reveal\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-reveal\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003ewe got in the car around 4pm. she had a dress on, i\u0026rsquo;d told her we were doing dinner somewhere nice, that was all she got from me. i drove toward la jolla which she clocked immediately.\u003c/p\u003e","title":"saturday - she finally found out","type":"posts"},{"content":"","date":"16 May 2026","externalUrl":null,"permalink":"/tags/","section":"Tags","summary":"","title":"Tags","type":"tags"},{"content":"","date":"15 May 2026","externalUrl":null,"permalink":"/categories/algo-development/","section":"Categories","summary":"","title":"Algo Development","type":"categories"},{"content":"","date":"15 May 2026","externalUrl":null,"permalink":"/tags/algo-development/","section":"Tags","summary":"","title":"Algo-Development","type":"tags"},{"content":"","date":"15 May 2026","externalUrl":null,"permalink":"/tags/automation/","section":"Tags","summary":"","title":"Automation","type":"tags"},{"content":"","date":"15 May 2026","externalUrl":null,"permalink":"/tags/colocation/","section":"Tags","summary":"","title":"Colocation","type":"tags"},{"content":"","date":"15 May 2026","externalUrl":null,"permalink":"/tags/expiration/","section":"Tags","summary":"","title":"Expiration","type":"tags"},{"content":"2:30 AM. may 15.\ntoday is standard monthly options expiration. third friday of the month. the SPX condors i\u0026rsquo;ve been running since late april close today, or they already closed this week because the system flagged them as targets before i ever had to think about it.\ni\u0026rsquo;m awake not because i\u0026rsquo;m stressed. i\u0026rsquo;m awake because i went down a rabbit hole reading options market microstructure papers around midnight and my brain doesn\u0026rsquo;t know how to stop. classic.\nthis post is about expiration week automation. what the system does differently when DTE is running out, why the rules change, and how i\u0026rsquo;ve made it so expiration days are genuinely boring.\nwhy expiration week changes everything # regular theta selling works on a clean edge: implied vol is priced above realized, you sell that premium, collect time decay, close at a profit target and move on. the edge is real. the community over on NexusFi\u0026rsquo;s diversified option selling thread has been tracking this across portfolios since 2015 — that thread is 1.4 million views of traders running variations of the same basic approach. it works.\nthe problem is that in the final week before expiration, the edge degrades. fast.\nthe reason is gamma. gamma is the rate of change of delta — how much your delta exposure shifts per point move in the underlying. during normal operation, gamma is slow. a short put with 0.15 delta at 30 DTE stays at roughly 0.15 delta across a moderate move. annoying, but manageable.\nas DTE collapses toward zero, gamma explodes. that same 0.15 delta short put might become a 0.45 delta position after a 100-point SPX move with 3 days to expiration. the mathematical reality is that near-expiration options behave less like premium selling vehicles and more like short gamma bets on the exact path of the underlying.\nhere\u0026rsquo;s what the gamma/theta ratio looks like as expiration approaches:\nyou can see the inflection happens around 21 DTE. from 45 to 21, the ratio moves slowly — theta is doing real work. inside 21 days, the curve starts bending. inside 10 days it\u0026rsquo;s exponential. inside 3 days you\u0026rsquo;re a completely different trade.\nthe theta you\u0026rsquo;re collecting is not worth the binary event risk you\u0026rsquo;re accepting. the edge is gone. get out.\nthe expiration calendar tracker # everything in the system starts with knowing what\u0026rsquo;s expiring when and what phase we\u0026rsquo;re in. this runs as a cron job every morning at 5 AM and publishes the result to redis for every other component to read.\nimport calendar import redis import json from datetime import date from dataclasses import dataclass, field from typing import Optional @dataclass class ExpirationEvent: expiration_date: date dte: int cycle_label: str # e.g. \u0026#34;May 2026\u0026#34; phase: str # NORMAL, EXPIRATION_WEEK_ALERT, etc. is_expiration_week: bool is_expiration_day: bool class ExpirationCalendar: \u0026#34;\u0026#34;\u0026#34; Tracks standard monthly option expirations (third Friday) and publishes phase state to Redis for system-wide access. Phase ladder: NORMAL → 22+ DTE: standard operation EXPIRATION_WEEK_ALERT → 15-21 DTE: last chance for new entries REDUCE_ENTRY → 8-14 DTE: no new entries in expiring cycle ACTIVE_MANAGEMENT → 3-7 DTE: tighter targets and delta limits CLOSE_ALL → 1-2 DTE: close regardless of P\u0026amp;L EXPIRATION_DAY → 0 DTE: nothing should be open; confirm and exit \u0026#34;\u0026#34;\u0026#34; PHASE_THRESHOLDS = { \u0026#39;EXPIRATION_DAY\u0026#39;: 0, \u0026#39;CLOSE_ALL\u0026#39;: 2, \u0026#39;ACTIVE_MANAGEMENT\u0026#39;: 7, \u0026#39;REDUCE_ENTRY\u0026#39;: 14, \u0026#39;EXPIRATION_WEEK_ALERT\u0026#39;: 21, } def __init__(self, redis_client: Optional[redis.Redis] = None): self.redis = redis_client self._cache: list[ExpirationEvent] = [] def _third_friday(self, year: int, month: int) -\u0026gt; date: \u0026#34;\u0026#34;\u0026#34;Return the third Friday of a given year/month.\u0026#34;\u0026#34;\u0026#34; weeks = calendar.monthcalendar(year, month) fridays = [w[calendar.FRIDAY] for w in weeks if w[calendar.FRIDAY] != 0] return date(year, month, fridays[2]) def _classify_phase(self, dte: int) -\u0026gt; str: if dte \u0026lt;= 0: return \u0026#39;EXPIRATION_DAY\u0026#39; elif dte \u0026lt;= self.PHASE_THRESHOLDS[\u0026#39;CLOSE_ALL\u0026#39;]: return \u0026#39;CLOSE_ALL\u0026#39; elif dte \u0026lt;= self.PHASE_THRESHOLDS[\u0026#39;ACTIVE_MANAGEMENT\u0026#39;]: return \u0026#39;ACTIVE_MANAGEMENT\u0026#39; elif dte \u0026lt;= self.PHASE_THRESHOLDS[\u0026#39;REDUCE_ENTRY\u0026#39;]: return \u0026#39;REDUCE_ENTRY\u0026#39; elif dte \u0026lt;= self.PHASE_THRESHOLDS[\u0026#39;EXPIRATION_WEEK_ALERT\u0026#39;]: return \u0026#39;EXPIRATION_WEEK_ALERT\u0026#39; else: return \u0026#39;NORMAL\u0026#39; def get_upcoming(self, as_of: date = None, count: int = 4) -\u0026gt; list[ExpirationEvent]: \u0026#34;\u0026#34;\u0026#34;Get the next N monthly expirations relative to as_of date.\u0026#34;\u0026#34;\u0026#34; as_of = as_of or date.today() result = [] year, month = as_of.year, as_of.month while len(result) \u0026lt; count: exp_date = self._third_friday(year, month) dte = (exp_date - as_of).days if dte \u0026gt;= 0 or (dte \u0026lt; 0 and len(result) == 0): # include today if it\u0026#39;s expiration day result.append(ExpirationEvent( expiration_date=exp_date, dte=max(dte, 0), cycle_label=exp_date.strftime(\u0026#39;%b %Y\u0026#39;), phase=self._classify_phase(dte), is_expiration_week=dte \u0026lt;= 7, is_expiration_day=dte \u0026lt;= 0 )) month += 1 if month \u0026gt; 12: month = 1 year += 1 return result def publish_state(self) -\u0026gt; dict: \u0026#34;\u0026#34;\u0026#34;Push current expiration state to Redis (24h TTL, refreshed daily).\u0026#34;\u0026#34;\u0026#34; events = self.get_upcoming() nearest = events[0] state = { \u0026#39;as_of\u0026#39;: date.today().isoformat(), \u0026#39;nearest_expiration\u0026#39;: nearest.expiration_date.isoformat(), \u0026#39;nearest_dte\u0026#39;: nearest.dte, \u0026#39;current_phase\u0026#39;: nearest.phase, \u0026#39;is_expiration_week\u0026#39;: nearest.is_expiration_week, \u0026#39;is_expiration_day\u0026#39;: nearest.is_expiration_day, \u0026#39;upcoming\u0026#39;: [ { \u0026#39;date\u0026#39;: e.expiration_date.isoformat(), \u0026#39;dte\u0026#39;: e.dte, \u0026#39;cycle\u0026#39;: e.cycle_label, \u0026#39;phase\u0026#39;: e.phase, } for e in events ] } if self.redis: self.redis.setex( \u0026#39;expiration:calendar:state\u0026#39;, 86400, # 24-hour TTL json.dumps(state) ) return state def get_phase_from_redis(redis_client: redis.Redis) -\u0026gt; str: \u0026#34;\u0026#34;\u0026#34; Convenience function for any system component to check current phase. Falls back to NORMAL if redis is unavailable. \u0026#34;\u0026#34;\u0026#34; try: raw = redis_client.get(\u0026#39;expiration:calendar:state\u0026#39;) if raw: return json.loads(raw).get(\u0026#39;current_phase\u0026#39;, \u0026#39;NORMAL\u0026#39;) except (redis.RedisError, json.JSONDecodeError): pass return \u0026#39;NORMAL\u0026#39; the get_phase_from_redis() function is what every other component in the system calls. the entry engine checks it before opening positions. the greeks monitor uses it to decide how tight delta breach alerts should be. the roll logic uses it to pick between the 50% and 75% profit targets.\none redis GET replaces the same DTE calculation being independently run in six different places. that\u0026rsquo;s the architecture: compute once, distribute.\nhow each phase changes system behavior # the phase table is simple but took a lot of trial and error to get right:\nphase DTE range entry engine profit target delta alert threshold close trigger NORMAL 22+ open freely 50% max profit ±0.25 delta breach profit target only EXPIRATION_WEEK_ALERT 15–21 last cycle entries allowed 50% ±0.25 profit target only REDUCE_ENTRY 8–14 no new entries this cycle 50% ±0.20 tightened profit target only ACTIVE_MANAGEMENT 3–7 no entries 75% ±0.15 tightened 75% target or delta breach CLOSE_ALL 1–2 no entries any profit = close any delta move = close P\u0026amp;L-agnostic close EXPIRATION_DAY 0 no entries immediate close n/a market order close the big difference is the profit target in ACTIVE_MANAGEMENT. normally i run 50% of max profit as the close target — standard options selling discipline. inside 7 DTE i tighten that to 75%. this sounds backwards (more greedy late?) but the logic is: the position has already decayed significantly, gamma risk is increasing, and the incremental edge on the remaining premium doesn\u0026rsquo;t justify holding through potential gamma explosions. take 75% and walk away clean.\nthe CLOSE_ALL phase at 1–2 DTE is non-negotiable. close everything regardless of P\u0026amp;L. if i\u0026rsquo;m somehow still in a losing position two days before expiration, the right move is to cut it and accept the loss, not gamble on a recovery through expiration. that gamble sometimes works. the times it doesn\u0026rsquo;t are catastrophic.\nthe infrastructure side: colo on expiration day # normal days, the chicago colocation server is handling execution but latency barely matters. i\u0026rsquo;m running premium selling strategies with multi-week holding periods. fills at 20ms versus 200ms are identical for my P\u0026amp;L.\nexpiration day is different. anything that still needs to close in the morning, i want filled fast and clean. the colo has a dedicated process that activates on any day where is_expiration_day is true in the redis state.\nimport asyncio import logging from ib_insync import IB, Option, MarketOrder, LimitOrder from datetime import datetime logger = logging.getLogger(\u0026#39;expiration_closer\u0026#39;) class ExpirationDayCloser: \u0026#34;\u0026#34;\u0026#34; Runs on the colo machine on monthly expiration day. Scans for any open positions in the expiring series and submits close orders at market open. Activates at 6:00 AM Chicago time. \u0026#34;\u0026#34;\u0026#34; def __init__(self, ib: IB, redis_client, expiry_date: str): self.ib = ib self.redis = redis_client self.expiry_date = expiry_date # YYYYMMDD format self.closed_positions = [] self.failed_positions = [] async def scan_open_positions(self) -\u0026gt; list: \u0026#34;\u0026#34;\u0026#34;Find any open option positions in the expiring cycle.\u0026#34;\u0026#34;\u0026#34; portfolio = await asyncio.wait_for( asyncio.to_thread(self.ib.portfolio), timeout=15.0 ) expiring = [] for item in portfolio: contract = item.contract if (hasattr(contract, \u0026#39;lastTradeDateOrContractMonth\u0026#39;) and contract.lastTradeDateOrContractMonth == self.expiry_date and abs(item.position) \u0026gt; 0): expiring.append(item) logger.info( f\u0026#34;Found expiring position: {contract.symbol} \u0026#34; f\u0026#34;{contract.right} {contract.strike} \u0026#34; f\u0026#34;qty={item.position} unrealizedPNL={item.unrealizedPNL:.0f}\u0026#34; ) return expiring async def close_position(self, portfolio_item, use_market_order: bool = False): \u0026#34;\u0026#34;\u0026#34; Close a position. Uses limit at midpoint first, falls back to market if not filled within 60 seconds. \u0026#34;\u0026#34;\u0026#34; contract = portfolio_item.contract position = portfolio_item.position action = \u0026#39;BUY\u0026#39; if position \u0026lt; 0 else \u0026#39;SELL\u0026#39; qty = abs(position) if use_market_order: order = MarketOrder(action, qty) logger.info(f\u0026#34;Submitting MARKET order: {action} {qty} {contract.localSymbol}\u0026#34;) else: # try mid-point limit first ticker = self.ib.reqMktData(contract, \u0026#39;\u0026#39;, False, False) await asyncio.sleep(2) # wait for quote mid = (ticker.bid + ticker.ask) / 2 if ticker.bid and ticker.ask else None if mid and action == \u0026#39;BUY\u0026#39;: limit_price = round(mid * 1.02, 2) # 2% above mid to get filled elif mid and action == \u0026#39;SELL\u0026#39;: limit_price = round(mid * 0.98, 2) else: # no quote, go market order = MarketOrder(action, qty) logger.warning(f\u0026#34;No quote available, using MARKET order for {contract.localSymbol}\u0026#34;) use_market_order = True if not use_market_order: order = LimitOrder(action, qty, limit_price) logger.info( f\u0026#34;Submitting LIMIT order: {action} {qty} {contract.localSymbol} \u0026#34; f\u0026#34;@ {limit_price}\u0026#34; ) trade = self.ib.placeOrder(contract, order) # wait up to 90 seconds for fill deadline = asyncio.get_event_loop().time() + 90 while asyncio.get_event_loop().time() \u0026lt; deadline: await asyncio.sleep(5) if trade.orderStatus.status in (\u0026#39;Filled\u0026#39;, \u0026#39;Cancelled\u0026#39;): break if trade.orderStatus.status == \u0026#39;Filled\u0026#39;: self.closed_positions.append({ \u0026#39;symbol\u0026#39;: contract.localSymbol, \u0026#39;qty\u0026#39;: qty, \u0026#39;fill_price\u0026#39;: trade.orderStatus.avgFillPrice, \u0026#39;order_type\u0026#39;: \u0026#39;MARKET\u0026#39; if use_market_order else \u0026#39;LIMIT\u0026#39;, \u0026#39;unrealized_at_close\u0026#39;: portfolio_item.unrealizedPNL }) logger.info(f\u0026#34;FILLED: {contract.localSymbol} @ {trade.orderStatus.avgFillPrice}\u0026#34;) else: # limit didn\u0026#39;t fill in time, escalate to market logger.warning(f\u0026#34;Limit order timeout for {contract.localSymbol}, escalating to market\u0026#34;) self.ib.cancelOrder(trade.order) await asyncio.sleep(2) await self.close_position(portfolio_item, use_market_order=True) async def run(self): \u0026#34;\u0026#34;\u0026#34;Main expiration day routine.\u0026#34;\u0026#34;\u0026#34; logger.info(f\u0026#34;ExpirationDayCloser starting — expiry: {self.expiry_date}\u0026#34;) positions = await self.scan_open_positions() if not positions: logger.info(\u0026#34;No open positions in expiring cycle. Nothing to do.\u0026#34;) self._publish_completion_to_redis(positions_closed=0) return logger.info(f\u0026#34;Found {len(positions)} positions to close\u0026#34;) for item in positions: try: await self.close_position(item) await asyncio.sleep(3) # spacing between orders except Exception as e: logger.error(f\u0026#34;Failed to close {item.contract.localSymbol}: {e}\u0026#34;) self.failed_positions.append(item) self._publish_completion_to_redis(len(positions)) logger.info( f\u0026#34;Expiration close complete. \u0026#34; f\u0026#34;Closed: {len(self.closed_positions)}, \u0026#34; f\u0026#34;Failed: {len(self.failed_positions)}\u0026#34; ) def _publish_completion_to_redis(self, positions_closed: int): summary = { \u0026#39;expiry_date\u0026#39;: self.expiry_date, \u0026#39;completed_at\u0026#39;: datetime.now().isoformat(), \u0026#39;positions_closed\u0026#39;: positions_closed, \u0026#39;successful\u0026#39;: self.closed_positions, \u0026#39;failed\u0026#39;: [p.contract.localSymbol for p in self.failed_positions] } self.redis.setex(\u0026#39;expiration:close:summary\u0026#39;, 86400, __import__(\u0026#39;json\u0026#39;).dumps(summary)) what i care about in expiration day execution is fill certainty, not fill quality. slight slippage is acceptable. not closing is not acceptable.\nhere\u0026rsquo;s what the fill data looks like comparing expiration days to normal days over the last 60 days of positions:\nslippage is slightly worse on expiration day because bid-ask spreads widen as market makers hedge their own gamma exposure. fill time is actually faster because i\u0026rsquo;m using market orders for certainty. the tradeoff is worth it by a mile.\nwhat the morning actually looks like # it\u0026rsquo;s 2:30 AM now. here\u0026rsquo;s what i expect to happen when i wake up at 6:30 and check the system:\npositions in expiring may cycle:\nfour SPX condors i\u0026rsquo;ve been running since late april: closed tuesday at 80% of max profit. done by tuesday morning. system flagged them at profit target during ACTIVE_MANAGEMENT phase and closed automatically. two QQQ credit spreads from may 2: closed wednesday morning at 75% target. done. one small diagonal i rolled into may from the april cycle: limit order staged in the colo to close at market open. already in the queue. nothing to do. effectively zero active work today. the expiration day closer will run at 6 AM chicago time, find that last diagonal still open, submit the order, fill it within two minutes, publish the result to redis.\ni\u0026rsquo;ll check at 6:30, see the summary in redis, confirm. that\u0026rsquo;s it.\nthis is what good automation looks like. not exciting. the boring outcome is the win.\na few notes on the week + wrapping up # A. went to bed around 11 — she had a deadline sprint all week at work. the apartment\u0026rsquo;s been quiet since then, which is actually good working conditions.\nMTD through yesterday i\u0026rsquo;m running at about +0.6% on the book. quiet may so far, which is fine. i wrote the one-year system check on monday when i couldn\u0026rsquo;t sleep, which probably set the tone for this whole week of late-night posts.\nmay is a weird month. parents used to do this big memorial day thing on the beach. burgers, my dad\u0026rsquo;s terrible attempts at margaritas, random people showing up. first week of summer in san diego. i don\u0026rsquo;t think about it constantly anymore, but it shows up in flashes, especially at 2 AM when i\u0026rsquo;m the only one awake. it\u0026rsquo;s fine. it just is what it is.\nexpiration day. the machine will handle it. i\u0026rsquo;m going to bed.\n-AK\n","date":"15 May 2026","externalUrl":null,"permalink":"/posts/2026-05-15-expiration-day-automation-managing-may-monthly/","section":"Posts","summary":"\u003cp\u003e2:30 AM. may 15.\u003c/p\u003e\n\u003cp\u003etoday is standard monthly options expiration. third friday of the month. the SPX condors i\u0026rsquo;ve been running since late april close today, or they already closed this week because the system flagged them as targets before i ever had to think about it.\u003c/p\u003e","title":"expiration day: everything is already automated","type":"posts"},{"content":"","date":"15 May 2026","externalUrl":null,"permalink":"/categories/infrastructure/","section":"Categories","summary":"","title":"Infrastructure","type":"categories"},{"content":"","date":"15 May 2026","externalUrl":null,"permalink":"/tags/infrastructure/","section":"Tags","summary":"","title":"Infrastructure","type":"tags"},{"content":"","date":"15 May 2026","externalUrl":null,"permalink":"/tags/options/","section":"Tags","summary":"","title":"Options","type":"tags"},{"content":"","date":"15 May 2026","externalUrl":null,"permalink":"/tags/premium-selling/","section":"Tags","summary":"","title":"Premium-Selling","type":"tags"},{"content":"","date":"15 May 2026","externalUrl":null,"permalink":"/tags/python/","section":"Tags","summary":"","title":"Python","type":"tags"},{"content":"","date":"15 May 2026","externalUrl":null,"permalink":"/tags/redis/","section":"Tags","summary":"","title":"Redis","type":"tags"},{"content":"","date":"15 May 2026","externalUrl":null,"permalink":"/tags/spx/","section":"Tags","summary":"","title":"SPX","type":"tags"},{"content":"","date":"15 May 2026","externalUrl":null,"permalink":"/tags/theta/","section":"Tags","summary":"","title":"Theta","type":"tags"},{"content":"","date":"13 May 2026","externalUrl":null,"permalink":"/tags/algo-trading/","section":"Tags","summary":"","title":"Algo-Trading","type":"tags"},{"content":"","date":"13 May 2026","externalUrl":null,"permalink":"/tags/ib-insync/","section":"Tags","summary":"","title":"Ib-Insync","type":"tags"},{"content":"","date":"13 May 2026","externalUrl":null,"permalink":"/tags/iron-condors/","section":"Tags","summary":"","title":"Iron-Condors","type":"tags"},{"content":"2:15 AM wednesday.\nA. made pasta around 7, crashed by 10 - she had a brutal deadline at work today. i cleaned the kitchen, sat down to \u0026ldquo;just check something,\u0026rdquo; and have been staring at this roll management code for four hours.\nthis post is about a problem i\u0026rsquo;ve been procrastinating on for months. the theta harvest strategy is mostly automated. entry is automatic. Greeks monitoring via Prometheus alerts on delta breach has been running solid. but what actually happens when the alert fires? until last week: me, manually, making a judgment call.\nnot anymore.\nthe roll decision problem # premium selling is clean in theory. sell iron condors on SPX, collect time decay, close at profit target, repeat. the NexusFi thread on selling options on futures has 7,000+ replies on this exact problem - been lurking that thread since i joined in January 2023. the community broadly agrees: consistency in management rules matters more than which specific thresholds you pick. just pick something defensible and stick to it.\nin practice, i had three failure modes:\nlate profit takes. position hits 50% of max profit, i\u0026rsquo;m busy, i don\u0026rsquo;t close immediately, it reverses. i close later for 25% or less. or i take a loss.\nfrozen at delta breach. short delta drifts past my threshold. i stare at it. i try to \u0026ldquo;feel\u0026rdquo; whether it\u0026rsquo;ll reverse. i make a late decision or no decision. usually bad.\ninconsistent loss management. no clear rule for when to take the full loss vs roll out in time. completely inconsistent execution session to session.\nthe fix is encoding the rules and letting the machine decide. obvious. took me too long.\nthe decision tree # i backtested several variations on six months of SPX option chain data from ThetaData (november 2025 through april 2026). here\u0026rsquo;s what survived:\nposition state → action unrealized_pnl \u0026gt;= 50% of initial_credit → CLOSE (profit target) dte \u0026lt;= 21 AND unrealized_pnl \u0026gt;= 25% → CLOSE (take partial near expiry, gamma risk rising) abs(short_delta) \u0026gt; 0.28 AND dte \u0026gt; 21 → ROLL (defend: roll breached side 2 strikes OTM, same expiry) abs(short_delta) \u0026gt; 0.28 AND dte \u0026lt;= 21 → CLOSE (don\u0026#39;t roll near expiry, gamma makes defense too expensive) debit_to_close \u0026gt; 2.5x initial_credit → CLOSE (loss limit, no exceptions) dte \u0026lt;= 7 → CLOSE (never hold through final week gamma, ever) else → HOLD 50% profit target is fairly standard. 21 DTE is the classic gamma risk boundary. 0.28 delta is where i\u0026rsquo;ve found the original tent structure has stopped working - the position has moved enough that holding makes less sense than defending.\nthese rules apply per position, not per account. i run 4-5 SPX iron condors simultaneously at staggered expirations, each evaluated independently.\nthe code # here\u0026rsquo;s the core roll manager. ib_insync for execution, ThetaData for live Greeks, Redis pub/sub for the event pipeline.\nimport asyncio import json import redis.asyncio as redis from dataclasses import dataclass from typing import Optional from ib_insync import IB, Contract, Order from datetime import datetime import logging logger = logging.getLogger(__name__) @dataclass class PositionState: symbol: str expiration: str put_strike: float call_strike: float put_wing_strike: float # long put (lower) call_wing_strike: float # long call (higher) initial_credit: float current_debit: float # current mark debit to close short_put_delta: float # delta of the short put (negative, abs used) short_call_delta: float # delta of the short call (positive) dte: int position_id: str contracts: int = 1 @property def unrealized_pnl_pct(self) -\u0026gt; float: \u0026#34;\u0026#34;\u0026#34;Fraction of initial credit retained. 1.0 = full profit (expired worthless).\u0026#34;\u0026#34;\u0026#34; return (self.initial_credit - self.current_debit) / self.initial_credit @property def debit_to_credit_ratio(self) -\u0026gt; float: return self.current_debit / self.initial_credit @property def max_short_delta(self) -\u0026gt; float: return max(abs(self.short_put_delta), abs(self.short_call_delta)) @property def breached_side(self) -\u0026gt; Optional[str]: \u0026#34;\u0026#34;\u0026#34;Returns \u0026#39;put\u0026#39;, \u0026#39;call\u0026#39;, or None based on which side breached the delta threshold.\u0026#34;\u0026#34;\u0026#34; pd = abs(self.short_put_delta) cd = abs(self.short_call_delta) THRESHOLD = 0.28 if pd \u0026gt; THRESHOLD and pd \u0026gt;= cd: return \u0026#39;put\u0026#39; if cd \u0026gt; THRESHOLD and cd \u0026gt; pd: return \u0026#39;call\u0026#39; return None class Decision: CLOSE_PROFIT = \u0026#34;close_profit\u0026#34; CLOSE_LOSS = \u0026#34;close_loss\u0026#34; CLOSE_DTE = \u0026#34;close_dte\u0026#34; CLOSE_GAMMA = \u0026#34;close_gamma_breach\u0026#34; ROLL_SIDE = \u0026#34;roll_side\u0026#34; HOLD = \u0026#34;hold\u0026#34; class RollManager: def __init__(self, ib: IB, redis_client: redis.Redis, db_conn): self.ib = ib self.redis = redis_client self.db = db_conn self.positions: dict[str, PositionState] = {} self._lock = asyncio.Lock() def evaluate(self, pos: PositionState) -\u0026gt; tuple[str, str]: \u0026#34;\u0026#34;\u0026#34; Pure decision function - no side effects. Returns (Decision constant, human-readable reason). Called on every Greeks update pushed from ThetaData. \u0026#34;\u0026#34;\u0026#34; # Priority 1: Hard loss limit. Non-negotiable. if pos.debit_to_credit_ratio \u0026gt;= 2.5: return Decision.CLOSE_LOSS, ( f\u0026#34;debit={pos.current_debit:.2f} is \u0026#34; f\u0026#34;{pos.debit_to_credit_ratio:.1f}x initial credit={pos.initial_credit:.2f}\u0026#34; ) # Priority 2: Final week - close everything, no exceptions. if pos.dte \u0026lt;= 7: return Decision.CLOSE_DTE, f\u0026#34;dte={pos.dte} entering final week, closing\u0026#34; # Priority 3: Profit targets. if pos.unrealized_pnl_pct \u0026gt;= 0.50: return Decision.CLOSE_PROFIT, f\u0026#34;pnl={pos.unrealized_pnl_pct:.1%}, hit 50% target\u0026#34; if pos.dte \u0026lt;= 21 and pos.unrealized_pnl_pct \u0026gt;= 0.25: return Decision.CLOSE_PROFIT, ( f\u0026#34;pnl={pos.unrealized_pnl_pct:.1%} at dte={pos.dte}, \u0026#34; f\u0026#34;taking 25% near expiry to avoid gamma\u0026#34; ) # Priority 4: Delta breach. breached = pos.breached_side if breached: delta_val = abs(pos.short_put_delta if breached == \u0026#39;put\u0026#39; else pos.short_call_delta) if pos.dte \u0026gt; 21: return Decision.ROLL_SIDE, ( f\u0026#34;{breached} delta={delta_val:.3f} \u0026gt; 0.28, dte={pos.dte} \u0026gt; 21, rolling\u0026#34; ) else: return Decision.CLOSE_GAMMA, ( f\u0026#34;{breached} delta={delta_val:.3f} breach at dte={pos.dte}, \u0026#34; f\u0026#34;closing instead of rolling (gamma too high)\u0026#34; ) return Decision.HOLD, \u0026#34;within parameters\u0026#34; async def execute_close(self, pos: PositionState, reason: str) -\u0026gt; bool: logger.info(f\u0026#34;[CLOSE] {pos.position_id} | reason: {reason}\u0026#34;) try: combo = self._build_ic_contract(pos) order = Order( action=\u0026#39;BUY\u0026#39;, totalQuantity=pos.contracts, orderType=\u0026#39;LMT\u0026#39;, lmtPrice=round(pos.current_debit + 0.05, 2), # slight buffer transmit=True, tif=\u0026#39;DAY\u0026#39; ) self.ib.placeOrder(combo, order) await asyncio.sleep(2) await self._log_action(pos, \u0026#39;close\u0026#39;, reason, pos.current_debit) return True except Exception as e: logger.error(f\u0026#34;Close failed {pos.position_id}: {e}\u0026#34;) return False async def execute_roll(self, pos: PositionState, reason: str) -\u0026gt; bool: \u0026#34;\u0026#34;\u0026#34;Roll the breached side 2 strikes further OTM, same expiration.\u0026#34;\u0026#34;\u0026#34; side = pos.breached_side if not side: return False logger.info(f\u0026#34;[ROLL] {pos.position_id} | {side} side | reason: {reason}\u0026#34;) # move 2 standard SPX strikes (5-wide) in the defensive direction STRIKE_WIDTH = 5 if side == \u0026#39;put\u0026#39;: new_short = pos.put_strike - (2 * STRIKE_WIDTH) new_long = pos.put_wing_strike - (2 * STRIKE_WIDTH) else: new_short = pos.call_strike + (2 * STRIKE_WIDTH) new_long = pos.call_wing_strike + (2 * STRIKE_WIDTH) try: roll_credit = await self._price_roll(pos, side, new_short, new_long) if roll_credit \u0026lt; -(pos.initial_credit * 0.15): # Rolling costs more than 15% of original credit - not worth it, close instead logger.warning( f\u0026#34;Roll debit too high ({roll_credit:.2f}), closing {pos.position_id}\u0026#34; ) return await self.execute_close(pos, f\u0026#34;roll cost exceeded threshold: {reason}\u0026#34;) await self._log_action(pos, \u0026#39;roll\u0026#39;, reason, roll_credit) return True except Exception as e: logger.error(f\u0026#34;Roll failed {pos.position_id}: {e}\u0026#34;) return False async def process_greeks_update(self, position_id: str, update: dict): \u0026#34;\u0026#34;\u0026#34;Entry point for ThetaData Greeks events published via Redis.\u0026#34;\u0026#34;\u0026#34; async with self._lock: if position_id not in self.positions: return pos = self.positions[position_id] pos.short_put_delta = update.get(\u0026#39;put_delta\u0026#39;, pos.short_put_delta) pos.short_call_delta = update.get(\u0026#39;call_delta\u0026#39;, pos.short_call_delta) pos.current_debit = update.get(\u0026#39;mark_debit\u0026#39;, pos.current_debit) pos.dte = update.get(\u0026#39;dte\u0026#39;, pos.dte) decision, reason = self.evaluate(pos) if decision == Decision.HOLD: return logger.info(f\u0026#34;Decision: {decision} | {reason}\u0026#34;) if decision in (Decision.CLOSE_PROFIT, Decision.CLOSE_LOSS, Decision.CLOSE_DTE, Decision.CLOSE_GAMMA): await self.execute_close(pos, reason) elif decision == Decision.ROLL_SIDE: await self.execute_roll(pos, reason) async def listen(self): \u0026#34;\u0026#34;\u0026#34;Subscribe to greeks:updates channel and process events.\u0026#34;\u0026#34;\u0026#34; pubsub = self.redis.pubsub() await pubsub.subscribe(\u0026#39;greeks:updates\u0026#39;) logger.info(\u0026#34;RollManager listening on greeks:updates\u0026#34;) async for message in pubsub.listen(): if message[\u0026#39;type\u0026#39;] != \u0026#39;message\u0026#39;: continue try: payload = json.loads(message[\u0026#39;data\u0026#39;]) pid = payload.get(\u0026#39;position_id\u0026#39;) if pid: await self.process_greeks_update(pid, payload) except Exception as e: logger.error(f\u0026#34;Error processing message: {e}\u0026#34;) # --- helpers (full implementation in private repo) --- def _build_ic_contract(self, pos: PositionState) -\u0026gt; Contract: \u0026#34;\u0026#34;\u0026#34;Build 4-leg combo contract for IB API.\u0026#34;\u0026#34;\u0026#34; ... async def _price_roll( self, pos: PositionState, side: str, new_short: float, new_long: float ) -\u0026gt; float: \u0026#34;\u0026#34;\u0026#34;Get mid-market credit/debit for the roll combination from IB.\u0026#34;\u0026#34;\u0026#34; ... async def _log_action( self, pos: PositionState, action: str, reason: str, price: float ): await self.db.execute( \u0026#34;\u0026#34;\u0026#34; INSERT INTO roll_history (position_id, action, reason, price, dte_at_action, pnl_pct_at_action, short_put_delta, short_call_delta, ts) VALUES ($1,$2,$3,$4,$5,$6,$7,$8,NOW()) \u0026#34;\u0026#34;\u0026#34;, pos.position_id, action, reason, price, pos.dte, pos.unrealized_pnl_pct, pos.short_put_delta, pos.short_call_delta ) evaluate() is a pure function - no async, no side effects. easy to unit test. the async complexity lives in execution and the Redis listener. the lock prevents a race where two consecutive Greeks updates both see the same state and both try to act.\nwhat the backtest shows # compared five management approaches on 6 months of SPX iron condors. same entry signals, same initial position sizing. just different management rules.\nthe \u0026ldquo;rule-based (automated)\u0026rdquo; vs \u0026ldquo;ad hoc (me)\u0026rdquo; comparison is the interesting one. win rates are similar (70% vs 67%). average P\u0026amp;L per contract is better ($318 vs $255). but max drawdown is the big gap: $870 vs $1,590 per contract. the rule-based system cuts losers consistently. my ad hoc version held some positions too long hoping they\u0026rsquo;d recover.\nthat max drawdown difference scales. at 10 contracts per cycle, that\u0026rsquo;s $7,200 in avoided worst-case drawdown from one cycle.\nthe ThetaData bridge # ThetaData pushes live Greeks every ~2 minutes during market hours via their websocket. i run a bridge service that subscribes, maps to position IDs, and publishes to Redis:\nasync def thetadata_greeks_bridge(roll_manager: RollManager, redis_client: redis.Redis): \u0026#34;\u0026#34;\u0026#34; Bridge: ThetaData websocket → Redis pub/sub → RollManager. Runs as a separate async task alongside the RollManager listener. \u0026#34;\u0026#34;\u0026#34; from thetadata import ThetaClient, GreekStreamSnapshot client = ThetaClient(username=THETA_USER, passwd=THETA_PASS) async with client.connect(): monitored = list(roll_manager.positions.keys()) logger.info(f\u0026#34;Streaming Greeks for {len(monitored)} positions\u0026#34;) async for snap in client.stream_greeks(monitored): snap: GreekStreamSnapshot expiry_date = snap.expiration.date() dte = (expiry_date - datetime.now().date()).days payload = json.dumps({ \u0026#39;position_id\u0026#39;: snap.position_id, \u0026#39;put_delta\u0026#39;: snap.put_delta, \u0026#39;call_delta\u0026#39;: snap.call_delta, \u0026#39;mark_debit\u0026#39;: snap.mark_mid_price, \u0026#39;dte\u0026#39;: dte, \u0026#39;ts\u0026#39;: snap.timestamp.isoformat() }) await redis_client.publish(\u0026#39;greeks:updates\u0026#39;, payload) roll manager and bridge run concurrently in the same asyncio event loop:\nasync def main(): ib = IB() await ib.connectAsync(\u0026#39;127.0.0.1\u0026#39;, 7497, clientId=5) redis_client = redis.from_url(\u0026#39;redis://localhost:6379\u0026#39;) db_conn = await asyncpg.connect(TIMESCALE_DSN) manager = RollManager(ib, redis_client, db_conn) # Load open positions from TimescaleDB on startup await manager.load_positions_from_db() # Run bridge and manager concurrently await asyncio.gather( manager.listen(), thetadata_greeks_bridge(manager, redis_client) ) asyncio.run(main()) TimescaleDB keeps the roll history. i can query things like \u0026ldquo;how often did we roll vs close outright?\u0026rdquo; and \u0026ldquo;what was the average DTE when we triggered a close?\u0026rdquo; the data accumulates over time and makes the rule calibration easier.\nposition lifecycle visualization # this chart shows how unrealized P\u0026amp;L % of initial credit evolves over a position\u0026rsquo;s life (DTE counting down from 45 to 0) under three market conditions. thresholds show where the automated rules kick in.\nquiet scenario hits 50% profit around DTE 28-30. trending scenario plateaus then deteriorates - triggers the delta breach rule around DTE 35-38, gets rolled or closed. vol spike scenario (april 2025, april 2026 were both this) blows through the loss limit fast - system closes around DTE 32-35 instead of letting it run to max loss.\nif you want the conceptual foundation for iron condor management in depth, the NexusFi Academy iron condors guide goes through the Greeks mechanics well. the rule calibration part is specific to your risk tolerance but the underlying framework is solid.\n12 days live # not dramatic results yet. but one real test already: may 9 saw a brief VIX spike above 20. my short put on the may-14 expiry condor hit 0.31 delta around 10:15 AM. system fired the CLOSE_GAMMA action (DTE was 5 - below the 21 DTE roll threshold). position closed. i got the Slack alert at 10:16.\nmanual me would have watched it for another 30 minutes. probably closed for more loss.\nthe real value is mental bandwidth. i stopped watching positions during market hours. system handles it, logs everything to TimescaleDB, i review the history in the evening. that\u0026rsquo;s the actual goal - not squeezing out extra P\u0026amp;L, just removing human inconsistency from a strategy that works when executed consistently.\nquiet in the apartment at 2:30 AM. reminded me of when i was 16, learning python at this exact hour. dad would come downstairs around 2, see the laptop open, just hand me a glass of water and go back to bed. never said anything about sleep. i think he knew i wasn\u0026rsquo;t going to stop.\nmiss that.\nalright. code\u0026rsquo;s committed. going to bed.\n-AK\n","date":"13 May 2026","externalUrl":null,"permalink":"/posts/2026-05-13-roll-logic-automating-short-premium-management/","section":"Posts","summary":"\u003cp\u003e2:15 AM wednesday.\u003c/p\u003e\n\u003cp\u003eA. made pasta around 7, crashed by 10 - she had a brutal deadline at work today. i cleaned the kitchen, sat down to \u0026ldquo;just check something,\u0026rdquo; and have been staring at this roll management code for four hours.\u003c/p\u003e","title":"roll logic: automating when to hold, roll, or close short premium","type":"posts"},{"content":"","date":"13 May 2026","externalUrl":null,"permalink":"/tags/thetadata/","section":"Tags","summary":"","title":"Thetadata","type":"tags"},{"content":"","date":"11 May 2026","externalUrl":null,"permalink":"/tags/annual/","section":"Tags","summary":"","title":"Annual","type":"tags"},{"content":"5:30 AM. may 11.\nshe went to bed before me last night, which almost never happens. i stayed up reading market structure notes until around 2, realized sleep wasn\u0026rsquo;t coming, made coffee. opened the laptop.\ntoday is our first anniversary. she\u0026rsquo;s still asleep.\ni\u0026rsquo;m going to mark the occasion the exact way she\u0026rsquo;d expect me to: by reviewing the trading system.\ntrailing 12 months # period: may 11, 2025 through april 30, 2026.\nstarting account: ~$1.12M ending account: ~$1.21M net gain: ~$90k trailing 12-month return: +7.7% losing months: 4 (june 2025, september 2025, december 2025, march 2026) best month: october 2025, +3.1% worst month: june 2025, -1.9% not the strongest year on percentage. Q1 2026 was the rough patch — the tariff chaos in april needed careful management, and march had a vol spike that hit the theta book harder than i wanted before the regime filter was rebuilt.\nwhat i care about more than the headline number is why the losing months happened. if they\u0026rsquo;re explainable, the edge is intact.\njune 2025: rate uncertainty. realized vol kept diverging from implied. theta decayed slower than expected, positions sat in negative carry for a week before i could exit cleanly. annoying but structural.\nseptember 2025: classic september. vol crush out of summer, then unexpected macro news lit up VIX mid-month. had a condor that needed an emergency roll. cost about $12k to repair. the position survived but didn\u0026rsquo;t earn.\ndecember 2025: holiday chop. thin liquidity. tiny loss. more tedious than painful.\nmarch 2026: documented already. vol spike, pre-regime-filter rebuild. this was the most avoidable loss of the year and the one that pushed me to rebuild the VIX term structure signal.\n4 losing months out of 12. above my target of 3. the march one is on me — i had the data to build the regime filter earlier and didn\u0026rsquo;t prioritize it.\nby strategy # three buckets. same as always.\ntheta / premium selling — 60% of capital\nprimary edge. iron condors on SPX, cash-secured puts on QQQ, sector ETFs when IV rank is elevated. i target 21-45 DTE, close at 50% max profit or roll when tested.\nannual contribution to total P\u0026amp;L: roughly +62%\nbest stretch of the year: Q4 2025. VIX in contango, IV rank stable in the 28-38% zone my condors are calibrated for. theta collected like clockwork for three months. the premium selling thesis works cleanly when the term structure isn\u0026rsquo;t flashing stress.\nworst stretch: march 2026. vol spike hit before the regime filter was operational. i had too much short gamma exposure going into the move. the lesson was structural — not a timing mistake, an architecture gap. the VIX term structure filter is now live and that architecture gap is closed.\napril 2026 was the stress test of the new system. the tariff week blew up a lot of people. the event risk throttle i built cut book size before the worst of it. closed april at +1.3%. the structure held.\nthe NexusFi community discussion on selling options on futures has been running for years and the thread is still one of the best places to pressure-test premium selling thesis — there are traders there who\u0026rsquo;ve been doing this for 20+ years and they don\u0026rsquo;t pull punches on what kills accounts.\nfutures momentum — ES/NQ — 10% of capital\nsmaller slice, tighter sizing. futures momentum decays fast when macro is driving everything and you\u0026rsquo;re fighting the news cycle.\nannual contribution: roughly +12%\nhad a rough Q1 in the NQ adaptive lookback — wrong parameter regime, documented in april. the rebuilt version has been running clean since week of april 20. too late to save Q1 but the repair is in.\nthe ES momentum strategy had a good october and november. fall 2025 was a clean trending environment for directional futures plays.\ncrypto — BTC, ETH, alts — 30% of capital\nmost volatility, most opportunity, most sleepless nights.\nannual contribution: roughly +26%\nBTC had two solid directional runs in the period. the momentum signal captured both. the altcoin bucket was volatile but net-positive. crypto is still the bucket with the most raw alpha — the markets are less efficient, the API is cheaper to build on, and 24/7 operation matches my infrastructure.\nthe funding rate harvest layer just went live last week — not included in the trailing 12-month numbers but it\u0026rsquo;s running. collecting the persistent bullish bias in crypto perp markets without directional exposure. going through a full quarter before i expand position size.\ninfrastructure (trailing 12) # the biggest infrastructure move of the year: chicago colo went from one server to two in Q3 2025.\nserver 1 (execution only): IB gateway, order routing, position state. nothing on this box that isn\u0026rsquo;t latency-critical.\nserver 2 (data + research): TimescaleDB replica, redis data feeds, the ML feature engineering pipeline. took the compute load off the execution server entirely.\nlatency benchmark i ran in march after the rebuild:\nIB order round-trip from chicago: avg 0.28ms same from san diego: avg 19ms for premium selling strategies, the latency difference isn\u0026rsquo;t the make-or-break factor it would be for HFT. but for the NQ momentum algo during fast market moves, those 19ms are fills at worse prices. the colo pays for itself in execution quality alone.\nmonitoring rebuild (march): prometheus + grafana with 220+ custom metrics. memory, redis queue depth, order fill rates by strategy, VIX term structure state, strategy health scores. if something breaks at 3 AM i want a page, not a morning discovery. the prometheus scrape interval is 5 seconds. the grafana alerts hit my phone within 30 seconds of a metric crossing threshold.\nredis upgrade: single-instance → redis cluster with persistence. the market data pipeline now survives restarts without losing the buffer. this bit me twice in 2024. i\u0026rsquo;ve built around it. boring work. saved the system.\ntotal infrastructure spend for the year: roughly $4,800 (colo fees, hardware upgrades, licenses). at my current volume that\u0026rsquo;s about one clean theta trade. i stop thinking about it.\nthe grief part # parents died new year\u0026rsquo;s eve 2022. car crash.\nthey never saw any of this — not the account growth, not the colo setup, not a year of trading that\u0026rsquo;s starting to actually compound. and they never saw the wedding.\non milestone dates i sit with that for a few minutes. this morning it was maybe five minutes before the analytical side came back online.\ndad would have had a dozen questions about the latency benchmarks. mom would have thought all of it was stressful and been quietly proud anyway.\nthat\u0026rsquo;s the five percent.\nwhat\u0026rsquo;s next # may cycle is live. theta book is sized conservatively — giving the VIX regime filter time to establish a real track record before i lean on it fully. i\u0026rsquo;ve been running it in production for seven weeks. the sample size isn\u0026rsquo;t there yet.\nthe NQ adaptive lookback rebuilt version is live since april 22nd. Q2 target: consistent application. i\u0026rsquo;m not adding to the allocation yet.\ncrypto: funding rate harvest goes through a full quarter before position expansion. i want to see how it handles a funding normalization event before i trust it with more capital. r/algotrading has been running some good threads on similar carry strategies across centralized exchanges — interesting to compare notes on correlation risks when funding normalizes.\none year. the system runs. still tweaking. that\u0026rsquo;s the job.\nshe\u0026rsquo;s going to be awake in about an hour. when that happens i\u0026rsquo;m closing the laptop and being completely present for today.\n-AK\n","date":"11 May 2026","externalUrl":null,"permalink":"/posts/2026-05-11-one-year-system-check/","section":"Posts","summary":"\u003cp\u003e5:30 AM. may 11.\u003c/p\u003e\n\u003cp\u003eshe went to bed before me last night, which almost never happens. i stayed up reading market structure notes until around 2, realized sleep wasn\u0026rsquo;t coming, made coffee. opened the laptop.\u003c/p\u003e","title":"one year: system check","type":"posts"},{"content":"","date":"11 May 2026","externalUrl":null,"permalink":"/tags/performance/","section":"Tags","summary":"","title":"Performance","type":"tags"},{"content":"","date":"11 May 2026","externalUrl":null,"permalink":"/categories/performance-analysis/","section":"Categories","summary":"","title":"Performance Analysis","type":"categories"},{"content":"","date":"11 May 2026","externalUrl":null,"permalink":"/tags/review/","section":"Tags","summary":"","title":"Review","type":"tags"},{"content":"","date":"11 May 2026","externalUrl":null,"permalink":"/tags/risk-management/","section":"Tags","summary":"","title":"Risk-Management","type":"tags"},{"content":"may 11 is in two days.\nfirst anniversary. one year married. i\u0026rsquo;ve been thinking about that number all week - not in a stressed way, more like i keep picking it up and turning it over. one year. huh.\nthis morning # she woke up before me, which is basically her whole personality. by the time i was conscious she was already back from her run and in the shower. i was half asleep listening to the water and that specific sound of her moving around the bathroom that i could identify in a crowd at this point.\nshe came back into the bedroom still slightly damp. sat on the edge of the bed. i opened one eye.\nshe goes \u0026ldquo;you awake?\u0026rdquo;\ni go \u0026ldquo;no.\u0026rdquo;\nshe laughed and then it was not a morning for sleeping anymore. she initiated, which is almost always her. she decides and you know when she\u0026rsquo;s decided. the whole thing was slower than you\u0026rsquo;d expect from her - she was in no rush. took my time with her, she was completely into it, her hands in my hair and then pulling me closer, her body doing most of the communicating. she doesn\u0026rsquo;t need words for what she wants. 40 minutes, at the end she was breathing hard against my chest and said \u0026ldquo;good morning\u0026rdquo; like nothing had happened.\ni need to marry this woman again.\noh wait.\nthe year # we met june 2023. coffee shop in la jolla. she was debugging a python data pipeline on her laptop, which honestly should be illegal - nobody gets to be that hot and technically competent at the same time, there should be a rule. we went on a date three days later and i already knew it was different, i would\u0026rsquo;ve died before admitting it.\nexclusive september. i love you october. moved in november 2023.\nmarried may 11, 2025.\nthree years together, almost one year married. i\u0026rsquo;ve been 22 for basically the whole relationship. my parents never saw any of it and that\u0026rsquo;s the part that still lands sideways when i let myself sit with it - they would\u0026rsquo;ve liked her. dad would\u0026rsquo;ve quizzed her on the tech stack for 45 minutes over dinner and acted like he wasn\u0026rsquo;t impressed. mom would\u0026rsquo;ve loved that she actually cooks and would\u0026rsquo;ve immediately started trading recipes.\nshe knows all this. i\u0026rsquo;ve told her pieces of it. she just holds it without making it weird.\nthe plan # something is confirmed and locked for monday. she\u0026rsquo;s been casually interrogating me for a week and getting nothing, which is impressive because she\u0026rsquo;s genuinely good at getting things out of me. she has this thing where she phrases questions sideways and waits, and usually i fill the silence.\nnot this time.\nshe is not finding out before monday.\ntwo days out. been a good year.\n-AK\n","date":"9 May 2026","externalUrl":null,"permalink":"/posts/2026-05-09-two-days-out/","section":"Posts","summary":"\u003cp\u003emay 11 is in two days.\u003c/p\u003e\n\u003cp\u003efirst anniversary. one year married. i\u0026rsquo;ve been thinking about that number all week - not in a stressed way, more like i keep picking it up and turning it over. one year. huh.\u003c/p\u003e","title":"two days out","type":"posts"},{"content":"","date":"8 May 2026","externalUrl":null,"permalink":"/tags/binance/","section":"Tags","summary":"","title":"Binance","type":"tags"},{"content":"","date":"8 May 2026","externalUrl":null,"permalink":"/tags/ccxt/","section":"Tags","summary":"","title":"Ccxt","type":"tags"},{"content":"","date":"8 May 2026","externalUrl":null,"permalink":"/tags/crypto/","section":"Tags","summary":"","title":"Crypto","type":"tags"},{"content":"2:15 AM. friday.\nA. is asleep. i\u0026rsquo;m sitting here with cold coffee staring at april\u0026rsquo;s crypto PnL and deciding what to do about it.\nBTC momentum strategy: -$800 for april. wrote about this monday. stale params, wrong regime. fair enough. i\u0026rsquo;m fixing the walk-forward pipeline. but even when that\u0026rsquo;s running clean, the strategy has real variance. some months it just doesn\u0026rsquo;t work.\nbeen thinking about a different angle on crypto. one that doesn\u0026rsquo;t require predicting direction.\nwhat funding rates are # if you\u0026rsquo;ve traded crypto perps you know this. if not: perpetual futures don\u0026rsquo;t expire, so exchanges use a funding mechanism to keep perp prices anchored to spot. every 8 hours, one side pays the other.\npositive rate (most common): longs pay shorts. market is leaning bullish, longs are willing to pay a premium to stay leveraged long. shorts collect.\nnegative rate (rare, panic conditions): shorts pay longs. market is deleveraging, shorts are crowded, longs collect.\nover the last 3 years, BTC funding on Binance has been positive about 75% of the time. average annualized rate when positive: around 9-11%. there\u0026rsquo;s a persistent bullish bias in crypto perps — retail traders want to be long BTC and they\u0026rsquo;ll pay for it.\nthe harvest idea: short the perp, hold spot long. delta-neutral. collect the funding. repeat.\nthe rates lately # BTC 8-hour funding rate (annualized) across exchanges, feb–may 2026. april tariff panic briefly flipped rates negative — exactly when you\u0026rsquo;d want to close the harvest position. green dotted line at 8% = my minimum viable threshold.\nmarch was great. mid-april was the problem spot — rates went briefly negative which would have triggered a position closure. recovered fast.\nthe code # built around ccxt\u0026rsquo;s async API. core components: rate monitor, opportunity evaluator, execution signal emitter.\nimport asyncio import ccxt.pro as ccxtpro import pandas as pd import numpy as np from dataclasses import dataclass, field from typing import Dict, List, Optional from datetime import datetime, timezone import logging logger = logging.getLogger(__name__) @dataclass class FundingRate: exchange: str symbol: str rate: float # 8-hour rate as decimal next_funding_time: int # Unix ms timestamp: int @property def annualized(self) -\u0026gt; float: \u0026#34;\u0026#34;\u0026#34;3 funding periods/day × 365\u0026#34;\u0026#34;\u0026#34; return self.rate * 3 * 365 @property def hours_to_next(self) -\u0026gt; float: now_ms = int(datetime.now(timezone.utc).timestamp() * 1000) return max((self.next_funding_time - now_ms) / (1000 * 3600), 0.0) @dataclass class HarvestSignal: symbol: str best_exchange: str annualized_rate: float hedge_cost_annual: float # estimated round-trip taker fee × annual frequency net_yield: float viable: bool size_usd: float close_trigger: bool # True if rate fell below minimum, close position class FundingRateMonitor: \u0026#34;\u0026#34;\u0026#34; Multi-exchange funding rate monitor for delta-neutral crypto carry. Strategy: - Long spot BTC (or via low-fee CEX/OTC) - Short equal-sized BTC perpetual on exchange with highest rate - Net position: delta-neutral, collects 8h funding payments - Exit: rate drops below threshold OR approaches funding payment time while rate is negative Risk considerations: - Margin calls on short perp leg during extreme BTC moves - Counterparty/exchange risk (Binance, Kraken) - Slippage on entry/exit - Spot/perp basis risk on close \u0026#34;\u0026#34;\u0026#34; MIN_YIELD_THRESHOLD = 0.08 # 8% annualized minimum CLOSE_THRESHOLD = 0.03 # close if rate drops below 3% annualized MAX_POSITION_PCT = 0.12 # 12% of crypto allocation per symbol TAKER_FEE_BPS = 4 # ~4bps per side (aggressive but realistic) ANNUAL_TURNS = 12 # assume ~12 entries/exits per year CHECK_INTERVAL_SEC = 300 # check rates every 5 minutes def __init__(self, crypto_allocation_usd: float): self.allocation = crypto_allocation_usd self.exchanges: Dict[str, ccxtpro.Exchange] = {} self.active_positions: Dict[str, HarvestSignal] = {} self._rate_history: List[FundingRate] = [] async def initialize(self): \u0026#34;\u0026#34;\u0026#34;Connect to exchanges\u0026#34;\u0026#34;\u0026#34; try: self.exchanges[\u0026#39;binance\u0026#39;] = ccxtpro.binance({ \u0026#39;apiKey\u0026#39;: self._cred(\u0026#39;BINANCE_API_KEY\u0026#39;), \u0026#39;secret\u0026#39;: self._cred(\u0026#39;BINANCE_API_SECRET\u0026#39;), \u0026#39;options\u0026#39;: {\u0026#39;defaultType\u0026#39;: \u0026#39;future\u0026#39;}, \u0026#39;enableRateLimit\u0026#39;: True }) self.exchanges[\u0026#39;kraken\u0026#39;] = ccxtpro.kraken({ \u0026#39;apiKey\u0026#39;: self._cred(\u0026#39;KRAKEN_API_KEY\u0026#39;), \u0026#39;secret\u0026#39;: self._cred(\u0026#39;KRAKEN_API_SECRET\u0026#39;), \u0026#39;enableRateLimit\u0026#39;: True }) await asyncio.gather( self.exchanges[\u0026#39;binance\u0026#39;].load_markets(), self.exchanges[\u0026#39;kraken\u0026#39;].load_markets() ) logger.info(\u0026#34;FundingRateMonitor: exchanges initialized\u0026#34;) except Exception as e: logger.critical(f\u0026#34;Exchange init failed: {e}\u0026#34;) raise async def fetch_rate(self, exchange: str, symbol: str = \u0026#34;BTC/USDT:USDT\u0026#34;) -\u0026gt; Optional[FundingRate]: \u0026#34;\u0026#34;\u0026#34;Fetch single funding rate snapshot\u0026#34;\u0026#34;\u0026#34; try: exch = self.exchanges[exchange] info = await exch.fetch_funding_rate(symbol) return FundingRate( exchange=exchange, symbol=symbol, rate=float(info.get(\u0026#39;fundingRate\u0026#39;) or 0), next_funding_time=int(info.get(\u0026#39;fundingTimestamp\u0026#39;) or 0), timestamp=int(datetime.now(timezone.utc).timestamp() * 1000) ) except Exception as e: logger.warning(f\u0026#34;fetch_rate failed [{exchange} {symbol}]: {e}\u0026#34;) return None async def evaluate(self, symbol: str = \u0026#34;BTC\u0026#34;) -\u0026gt; Optional[HarvestSignal]: \u0026#34;\u0026#34;\u0026#34;Evaluate harvest opportunity across all exchanges\u0026#34;\u0026#34;\u0026#34; perp_sym = f\u0026#34;{symbol}/USDT:USDT\u0026#34; rates = await asyncio.gather(*[ self.fetch_rate(ex, perp_sym) for ex in self.exchanges ]) valid = [r for r in rates if r is not None] if not valid: return None self._rate_history.extend(valid) best = max(valid, key=lambda r: r.rate) # Hedge cost: TAKER_FEE_BPS × 2 sides × ANNUAL_TURNS / 10000 hedge_cost = (self.TAKER_FEE_BPS / 10000) * 2 * self.ANNUAL_TURNS net_yield = best.annualized - hedge_cost # Dynamic size: scales with yield quality, capped at max pct raw_size = self.allocation * (net_yield / self.MIN_YIELD_THRESHOLD) * 0.04 size = min(raw_size, self.allocation * self.MAX_POSITION_PCT) size = max(size, 0.0) # Close trigger: position open AND rate below close threshold is_open = symbol in self.active_positions close_now = is_open and best.annualized \u0026lt; self.CLOSE_THRESHOLD return HarvestSignal( symbol=symbol, best_exchange=best.exchange, annualized_rate=best.annualized, hedge_cost_annual=hedge_cost, net_yield=net_yield, viable=net_yield \u0026gt;= self.MIN_YIELD_THRESHOLD, size_usd=size, close_trigger=close_now ) async def run(self): \u0026#34;\u0026#34;\u0026#34;Main monitoring loop\u0026#34;\u0026#34;\u0026#34; logger.info(\u0026#34;Starting funding harvest monitor\u0026#34;) while True: try: sig = await self.evaluate(\u0026#34;BTC\u0026#34;) if sig: self._log_signal(sig) if sig.close_trigger: await self._emit_close(sig) elif sig.viable and \u0026#34;BTC\u0026#34; not in self.active_positions: await self._emit_open(sig) await asyncio.sleep(self.CHECK_INTERVAL_SEC) except Exception as e: logger.error(f\u0026#34;Monitor loop error: {e}\u0026#34;) await asyncio.sleep(60) async def _emit_open(self, sig: HarvestSignal): \u0026#34;\u0026#34;\u0026#34;Emit open signal to execution layer via Redis\u0026#34;\u0026#34;\u0026#34; payload = { \u0026#39;strategy\u0026#39;: \u0026#39;funding_harvest\u0026#39;, \u0026#39;action\u0026#39;: \u0026#39;open\u0026#39;, \u0026#39;symbol\u0026#39;: sig.symbol, \u0026#39;exchange\u0026#39;: sig.best_exchange, \u0026#39;size_usd\u0026#39;: sig.size_usd, \u0026#39;annualized_yield\u0026#39;: sig.net_yield } # would push to Redis queue here logger.info(f\u0026#34;OPEN signal: {payload}\u0026#34;) self.active_positions[sig.symbol] = sig async def _emit_close(self, sig: HarvestSignal): \u0026#34;\u0026#34;\u0026#34;Emit close signal — rate below threshold\u0026#34;\u0026#34;\u0026#34; logger.warning( f\u0026#34;CLOSE trigger: {sig.symbol} rate={sig.annualized_rate*100:.1f}% \u0026#34; f\u0026#34;below threshold={self.CLOSE_THRESHOLD*100:.1f}%\u0026#34; ) # push close to Redis self.active_positions.pop(sig.symbol, None) def _log_signal(self, sig: HarvestSignal): logger.info( f\u0026#34;BTC funding: {sig.best_exchange}={sig.annualized_rate*100:.1f}% ann | \u0026#34; f\u0026#34;net={sig.net_yield*100:.1f}% | viable={sig.viable} | \u0026#34; f\u0026#34;size=${sig.size_usd:,.0f}\u0026#34; ) @staticmethod def _cred(key: str) -\u0026gt; str: import os val = os.environ.get(key) if not val: raise ValueError(f\u0026#34;Missing env var: {key}\u0026#34;) return val clean async structure. the monitor loop runs at the san diego box (not colo — latency doesn\u0026rsquo;t matter for 8-hour funding collection). signals push to redis, execution layer at colo handles the actual hedge orders.\npaper trading results (feb 1 — may 7) # not live yet. been running in paper mode alongside the real book while i validate the hedge execution logic. here\u0026rsquo;s what it would have returned:\npaper trading results feb 1 — may 7. funding harvest (green) shows steady +2.5% in 90 days with low variance. BTC spot hold (yellow) had more return on paper but with 11% peak-to-trough swing. momentum algo (blue) ran better until april then pulled back.\nfunding harvest: low return, very low variance. annualized ~10% when rates are positive. not exciting. but it doesn\u0026rsquo;t require a view on direction and it doesn\u0026rsquo;t have 11% drawdowns.\nthe april pause (when rates went briefly negative) shows up as a flat line, not a loss. that\u0026rsquo;s by design — monitor detects the rate threshold breach, emits close, position closes before negative rates hit.\nmetric funding harvest btc momentum btc hold 90-day return +2.5% +4.3% +3.2% max drawdown -0.1% -3.2% -11.2% sharpe (annualized) 4.1 0.9 0.4 direction exposure 0 high 100% sharpe is ridiculous on the harvest side because it has basically no variance. that\u0026rsquo;ll compress when i add exchange risk and basis risk to the model. but directional exposure near-zero is the whole point.\ninfrastructure notes # the monitor runs at the san diego setup. no colo needed — these are 8-hour decisions, not microsecond ones. latency budget is effectively unlimited.\narchitecture:\nsan diego box → ccxt.pro websocket to Binance/Kraken (rate feed) → FundingRateMonitor (python async, daemon) → Redis (signal queue) chicago colo → execution handler (pulls from Redis queue) → ib_insync or ccxt REST for hedge orders → TimescaleDB (position and rate history) been storing all funding rate observations in TimescaleDB since i built the monitor in late march. ~6k rows so far. useful for calibrating the threshold — turns out 8% is about 1.1 standard deviations above the long-run average. i might bump it to 9%.\nthe hedge leg is the part that still needs work. spot long + perp short sounds easy. in practice the spot/perp basis can move against you during entry if BTC is moving fast. i\u0026rsquo;m adding a vwap executor for the hedge entry and a max-slippage check before confirming. once that\u0026rsquo;s solid, going live.\nwhere this fits # the crypto allocation is 30% of total. BTC momentum is one strategy inside that. funding harvest, if i go live, would be a second — smaller, lower-return, much lower-variance.\nthink of it like the options book\u0026rsquo;s theta decay side but for crypto. predictable grind. there when the momentum algo has rough months like april.\nthe algo thread at NexusFi has some interesting discussion on market-neutral strategies — worth a read if you\u0026rsquo;re building in this space.\npersonal update # quiet night here. three days until anniversary. the plan is locked. A. still hasn\u0026rsquo;t figured it out, which i find disproportionately satisfying for a grown adult.\nshe\u0026rsquo;s been heads-down on a client delivery this week — on calls until 9 or 10 most nights, working at the corner desk. i\u0026rsquo;ve been at my setup running backtests. parallel focus sessions. the apartment gets really quiet around midnight in a good way.\nwent through some old code this week cleaning up the repo. found a folder from late 2022 — stuff i wrote two or three weeks after the accident, before i fully understood what i was doing with options, before i had any real capital behind it.\ndifferent person wrote that. i remember the intent but not the feeling of writing it. which is probably the right direction.\nthree days. the plan is good. she\u0026rsquo;s going to like it.\n-AK\n","date":"8 May 2026","externalUrl":null,"permalink":"/posts/2026-05-08-funding-rate-harvest-neutral-crypto-carry/","section":"Posts","summary":"\u003cp\u003e2:15 AM. friday.\u003c/p\u003e\n\u003cp\u003eA. is asleep. i\u0026rsquo;m sitting here with cold coffee staring at april\u0026rsquo;s crypto PnL and deciding what to do about it.\u003c/p\u003e\n\u003cp\u003eBTC momentum strategy: -$800 for april. wrote about this monday. stale params, wrong regime. fair enough. i\u0026rsquo;m fixing the walk-forward pipeline. but even when that\u0026rsquo;s running clean, the strategy has real variance. some months it just doesn\u0026rsquo;t work.\u003c/p\u003e","title":"funding rate harvest: neutral crypto carry when momentum breaks","type":"posts"},{"content":"","date":"8 May 2026","externalUrl":null,"permalink":"/tags/funding-rates/","section":"Tags","summary":"","title":"Funding-Rates","type":"tags"},{"content":"","date":"8 May 2026","externalUrl":null,"permalink":"/tags/market-neutral/","section":"Tags","summary":"","title":"Market-Neutral","type":"tags"},{"content":"","date":"6 May 2026","externalUrl":null,"permalink":"/tags/regime-detection/","section":"Tags","summary":"","title":"Regime-Detection","type":"tags"},{"content":"","date":"6 May 2026","externalUrl":null,"permalink":"/tags/vix/","section":"Tags","summary":"","title":"Vix","type":"tags"},{"content":"late night. A. went to bed around 10:30, told me not to stay up too late. i said \u0026ldquo;just finishing something.\u0026rdquo; she gave me that look. it\u0026rsquo;s now 2 AM.\nbeen building this regime-switching layer for six weeks. wanted to close it out and document it before i forget the reasoning.\nthe problem: wrong strategy in the wrong environment # my core edge is premium selling — iron condors on SPX, some cash-secured puts on QQQ and sector ETFs. when conditions are right, theta decay is basically clockwork. close at 50% profit, reset, repeat.\nbut that same strategy gets destroyed when volatility spikes. april 2025 was a lesson. april 2026 was another one. realized vol exploding past implied vol means every short premium position bleeds.\nmost people add an IV rank filter. that helps — it\u0026rsquo;s a backward-looking measure of whether premium is expensive. but i wanted something with more forward-looking signal. something that tells me what the options market itself expects to happen next, not just what already happened.\nthat\u0026rsquo;s where VIX futures term structure comes in.\nwhat the term structure actually tells you # VIX is 30-day implied volatility. VIX futures are contracts on future VIX values. the relationship between near-term and next-month futures prices tells you something important about the market\u0026rsquo;s regime expectations.\ncontango (near-term futures cheaper than longer-dated): the market expects current volatility to stay contained. short-term uncertainty is lower than medium-term uncertainty. this is the environment where theta strategies thrive.\nbackwardation (near-term futures more expensive): the market is stressed right now. vol is elevated and the market expects it to eventually subside, but the near-term outlook is ugly. this is when you don\u0026rsquo;t want to be short premium.\nthe metric i care about:\nslope = (vix_m2 - vix_m1) / vix_m1 where vix_m1 is front-month VIX futures price, vix_m2 is the next month out.\nslope \u0026gt; +5%: deep contango → full theta deployment +1% to +5%: mild contango → reduced size, cautious -5% to +1%: neutral zone → minimal new positions slope \u0026lt; -5%: backwardation → defensive, no new short-premium entries this isn\u0026rsquo;t a novel concept — you\u0026rsquo;ll find it discussed extensively in academic quant finance. what i built is the automated plumbing to make it actually drive my real-time strategy selection.\ndata pipeline — thetadata + redis # i pull VIX futures settlement prices from ThetaData. they have clean Python client and solid historical data. the regime classification runs once daily, right after settlement.\nimport asyncio from datetime import date, timedelta from calendar import monthcalendar import redis import json class VIXTermStructureFetcher: \u0026#34;\u0026#34;\u0026#34;Fetches VIX futures prices and computes term structure slope for regime classification.\u0026#34;\u0026#34;\u0026#34; VIX_ROOT = \u0026#34;/VX\u0026#34; # ThetaData root symbol for VIX futures def __init__(self, redis_client: redis.Redis, username: str, password: str): from thetadata import ThetaClient self.client = ThetaClient(username=username, passwd=password) self.redis = redis_client async def fetch_front_months(self, target_date: date) -\u0026gt; dict[str, float | None]: \u0026#34;\u0026#34;\u0026#34;Fetch settlement prices for the front two VIX futures contracts.\u0026#34;\u0026#34;\u0026#34; expirations = self._get_next_expirations(target_date, count=2) contracts: dict[str, float | None] = {} async with self.client.connect(): for label, exp_date in expirations.items(): try: from thetadata import DataType data = await self.client.async_get_hist( req=DataType.TRADE, root=self.VIX_ROOT, exp=exp_date, start_date=target_date, end_date=target_date, ) if not data.empty: # use last trade as settlement proxy contracts[label] = float(data[\u0026#34;price\u0026#34;].iloc[-1]) else: contracts[label] = None except Exception as exc: print(f\u0026#34;Failed to fetch {label} ({exp_date}): {exc}\u0026#34;) contracts[label] = None return contracts def _get_next_expirations(self, from_date: date, count: int) -\u0026gt; dict[str, date]: \u0026#34;\u0026#34;\u0026#34;Get next N monthly VIX futures expiration dates (Wed before 3rd Friday).\u0026#34;\u0026#34;\u0026#34; expirations: dict[str, date] = {} year, month = from_date.year, from_date.month found = 0 while found \u0026lt; count: exp = self._vix_expiry(year, month) if exp \u0026gt; from_date: expirations[f\u0026#34;m{found + 1}\u0026#34;] = exp found += 1 month += 1 if month \u0026gt; 12: month, year = 1, year + 1 return expirations @staticmethod def _vix_expiry(year: int, month: int) -\u0026gt; date: \u0026#34;\u0026#34;\u0026#34;VIX futures expire on Wednesday before the 3rd Friday of the month.\u0026#34;\u0026#34;\u0026#34; cal = monthcalendar(year, month) fridays = [week[4] for week in cal if week[4] \u0026gt; 0] third_friday = date(year, month, fridays[2]) return third_friday - timedelta(days=2) # Wednesday before def compute_slope(self, contracts: dict[str, float | None]) -\u0026gt; float | None: \u0026#34;\u0026#34;\u0026#34;Compute (M2 - M1) / M1 term structure slope.\u0026#34;\u0026#34;\u0026#34; m1 = contracts.get(\u0026#34;m1\u0026#34;) m2 = contracts.get(\u0026#34;m2\u0026#34;) if m1 is None or m2 is None or m1 == 0: return None return (m2 - m1) / m1 def classify_regime(self, slope: float) -\u0026gt; str: \u0026#34;\u0026#34;\u0026#34;Map slope to named market regime.\u0026#34;\u0026#34;\u0026#34; if slope \u0026gt; 0.05: return \u0026#34;CONTANGO_STEEP\u0026#34; # theta harvest: full deployment elif slope \u0026gt; 0.01: return \u0026#34;CONTANGO_MILD\u0026#34; # moderate opportunity: reduced size elif slope \u0026gt; -0.05: return \u0026#34;NEUTRAL\u0026#34; # cautious: minimal new entries else: return \u0026#34;BACKWARDATION\u0026#34; # defensive: no new short premium async def update_regime_state(self, target_date: date) -\u0026gt; dict: \u0026#34;\u0026#34;\u0026#34;Fetch, classify, and cache current regime to Redis.\u0026#34;\u0026#34;\u0026#34; contracts = await self.fetch_front_months(target_date) slope = self.compute_slope(contracts) if slope is None: print(\u0026#34;Regime calculation failed — holding previous state\u0026#34;) return {} regime = self.classify_regime(slope) state = { \u0026#34;date\u0026#34;: target_date.isoformat(), \u0026#34;vix_m1\u0026#34;: contracts.get(\u0026#34;m1\u0026#34;), \u0026#34;vix_m2\u0026#34;: contracts.get(\u0026#34;m2\u0026#34;), \u0026#34;slope\u0026#34;: round(slope, 4), \u0026#34;regime\u0026#34;: regime, } self.redis.set(\u0026#34;vix_regime_state\u0026#34;, json.dumps(state)) self.redis.expire(\u0026#34;vix_regime_state\u0026#34;, 86400 * 2) # 2-day TTL print(f\u0026#34;[REGIME] {regime} | slope={slope:.3f} | M1={contracts.get(\u0026#39;m1\u0026#39;):.2f} | M2={contracts.get(\u0026#39;m2\u0026#39;):.2f}\u0026#34;) return state this runs at 4:15 PM ET every trading day via a cron job on the chicago colo. settled prices, fresh regime state in redis, done in under 10 seconds.\nthe strategy router # the strategy selection engine reads from redis before placing any new entries. each regime maps to a different config:\nfrom dataclasses import dataclass import redis import json @dataclass(frozen=True) class StrategyConfig: name: str max_delta_per_leg: float # how far OTM for short strikes target_dte: int # days to expiration at entry profit_target_pct: float # close at X% of max profit stop_loss_multiplier: float # exit at X× credit received max_allocation_pct: float # max account pct per position REGIME_CONFIGS: dict[str, StrategyConfig] = { \u0026#34;CONTANGO_STEEP\u0026#34;: StrategyConfig( name=\u0026#34;iron_condor_wide\u0026#34;, max_delta_per_leg=0.20, target_dte=35, profit_target_pct=0.50, stop_loss_multiplier=2.0, max_allocation_pct=0.12, ), \u0026#34;CONTANGO_MILD\u0026#34;: StrategyConfig( name=\u0026#34;iron_condor_narrow\u0026#34;, max_delta_per_leg=0.15, target_dte=28, profit_target_pct=0.45, stop_loss_multiplier=1.8, max_allocation_pct=0.08, ), \u0026#34;NEUTRAL\u0026#34;: StrategyConfig( name=\u0026#34;cash_secured_puts_small\u0026#34;, max_delta_per_leg=0.10, target_dte=21, profit_target_pct=0.40, stop_loss_multiplier=1.5, max_allocation_pct=0.05, ), \u0026#34;BACKWARDATION\u0026#34;: StrategyConfig( name=\u0026#34;defensive\u0026#34;, max_delta_per_leg=0.05, target_dte=14, profit_target_pct=0.30, stop_loss_multiplier=1.0, max_allocation_pct=0.02, # basically nothing new ), } class RegimeStrategyRouter: \u0026#34;\u0026#34;\u0026#34;Routes new trade entries to appropriate strategy config based on live VIX regime.\u0026#34;\u0026#34;\u0026#34; def __init__(self, redis_client: redis.Redis): self.redis = redis_client def get_active_config(self) -\u0026gt; tuple[StrategyConfig, dict]: \u0026#34;\u0026#34;\u0026#34;Return (config, raw_state) based on current cached regime.\u0026#34;\u0026#34;\u0026#34; raw = self.redis.get(\u0026#34;vix_regime_state\u0026#34;) if raw is None: # no cached state — fall back to neutral, don\u0026#39;t blow up return REGIME_CONFIGS[\u0026#34;NEUTRAL\u0026#34;], {\u0026#34;regime\u0026#34;: \u0026#34;NEUTRAL\u0026#34;, \u0026#34;slope\u0026#34;: 0.0} state = json.loads(raw) regime = state.get(\u0026#34;regime\u0026#34;, \u0026#34;NEUTRAL\u0026#34;) config = REGIME_CONFIGS.get(regime, REGIME_CONFIGS[\u0026#34;NEUTRAL\u0026#34;]) return config, state def should_open_new_position(self) -\u0026gt; bool: \u0026#34;\u0026#34;\u0026#34;Hard gate: block new entries in severe backwardation.\u0026#34;\u0026#34;\u0026#34; _, state = self.get_active_config() regime = state.get(\u0026#34;regime\u0026#34;, \u0026#34;NEUTRAL\u0026#34;) slope = state.get(\u0026#34;slope\u0026#34;, 0.0) # full stop on new short premium in deep backwardation if regime == \u0026#34;BACKWARDATION\u0026#34; and slope \u0026lt; -0.10: print(f\u0026#34;[GATE] Blocked new entry — deep backwardation: slope={slope:.3f}\u0026#34;) return False return True def log_decision(self, action: str, reason: str) -\u0026gt; None: \u0026#34;\u0026#34;\u0026#34;Append regime-tagged decision to Redis list for later analysis.\u0026#34;\u0026#34;\u0026#34; _, state = self.get_active_config() entry = { \u0026#34;action\u0026#34;: action, \u0026#34;reason\u0026#34;: reason, \u0026#34;regime\u0026#34;: state.get(\u0026#34;regime\u0026#34;), \u0026#34;slope\u0026#34;: state.get(\u0026#34;slope\u0026#34;), } self.redis.rpush(\u0026#34;regime_decisions\u0026#34;, json.dumps(entry)) self.redis.ltrim(\u0026#34;regime_decisions\u0026#34;, -500, -1) # keep last 500 every time my strategy engine considers a new entry, it calls should_open_new_position() first. if the regime is wrong, nothing enters the book. no manual override needed, no daily babysitting.\nwhat the data actually shows # been tracking regime-tagged P\u0026amp;L since october 2024. ran ~19 months through the classifier retrospectively.\ncontango steep: +$1,340 avg daily P\u0026amp;L, 76% win rate across 91 trading days. backwardation: -$920 avg, 37% win rate across 11 days. this is why regime matters. it\u0026rsquo;s not that premium selling is a bad strategy — it\u0026rsquo;s a bad strategy in the wrong conditions.\nthe 91 vs 11 day split also tells you backwardation is relatively rare. when it hits, you just need to not be the person running unconstrained short vega into it.\nthe term structure over the past year # here\u0026rsquo;s what slope actually looked like across the timeframe i\u0026rsquo;ve been tracking. the april 2025 tariff chaos and april 2026 whipsaw both show up clearly.\napril 2026 went negative during the tariff whipsaw. slope hit around -4% at the worst. the system caught it — new condor entries paused automatically for about 11 days. existing positions held, no new exposure added. when the slope recovered past flat, entries resumed at reduced size.\nthat decision alone probably saved $30k+ in losses versus running blind through the spike. hard to put an exact number on it but the math is straightforward if you look at what happened to short vega positions that week.\ninfrastructure: where this actually runs # the regime calculation runs on the chicago colo, not my san diego setup. there\u0026rsquo;s no latency requirement here — regime switching is a daily EOD decision, not intraday. i\u0026rsquo;m using the colo because it\u0026rsquo;s already there for execution and the connection to ThetaData is fast.\nVIX futures settle at 3:30 PM CT via the SOQ process (special opening quotation is technically the morning calculation, but for settlement pricing i\u0026rsquo;m using EOD). the colo job runs at 4:15 PM CT:\n# crontab on chicago colo 15 16 * * 1-5 /opt/strategies/venv/bin/python /opt/strategies/vix_regime/run_daily.py the redis state gets replicated to san diego via a simple pub/sub channel. my morning review script reads both environments and flags any discrepancy. if chicago redis and san diego redis disagree on regime, it\u0026rsquo;s a connectivity issue and the safety fallback kicks in (default to NEUTRAL).\nif you\u0026rsquo;re building something like this from scratch and don\u0026rsquo;t have a colo: you don\u0026rsquo;t need one. this whole pipeline runs fine on a $30/month VPS. the data latency for EOD regime classification is irrelevant. what matters is that the calculation runs before your strategy engine considers any new entries the next morning.\nmay so far # first week of may has been mild contango — slope sitting around +2% to +3%. that\u0026rsquo;s the \u0026ldquo;cautious\u0026rdquo; zone, so i\u0026rsquo;ve been running reduced size. up about $8k on the week across the full book. not a barn-burner but not losing.\napril closed well. the regime filter handled the vol spike better than any prior month i\u0026rsquo;ve traded through. the april wrap post has the details if you missed it.\nthe full implementation is in my private repos. the code above is enough to reproduce it from scratch. the key insight isn\u0026rsquo;t the code — it\u0026rsquo;s the decision: don\u0026rsquo;t run the same strategy in all environments. the market tells you what it expects. listen to it.\ndad was a VP of engineering at a biotech startup. systems thinker, built things to last. sometimes when i\u0026rsquo;m up at 2 AM deep in this stuff i wonder what he\u0026rsquo;d think of the redis architecture. he would\u0026rsquo;ve had fifty questions and probably redesigned half of it. that\u0026rsquo;s fine. i miss having someone to argue about systems design with.\nanyway. going to bed.\n-AK\n","date":"6 May 2026","externalUrl":null,"permalink":"/posts/2026-05-06-vix-term-structure-regime-filter/","section":"Posts","summary":"\u003cp\u003elate night. A. went to bed around 10:30, told me not to stay up too late. i said \u0026ldquo;just finishing something.\u0026rdquo; she gave me that look. it\u0026rsquo;s now 2 AM.\u003c/p\u003e","title":"vix futures term structure as regime filter — auto-switching theta vs momentum","type":"posts"},{"content":"","date":"4 May 2026","externalUrl":null,"permalink":"/tags/backtesting/","section":"Tags","summary":"","title":"Backtesting","type":"tags"},{"content":"","date":"4 May 2026","externalUrl":null,"permalink":"/tags/btc/","section":"Tags","summary":"","title":"BTC","type":"tags"},{"content":"","date":"4 May 2026","externalUrl":null,"permalink":"/tags/optimization/","section":"Tags","summary":"","title":"Optimization","type":"tags"},{"content":"","date":"4 May 2026","externalUrl":null,"permalink":"/tags/overfitting/","section":"Tags","summary":"","title":"Overfitting","type":"tags"},{"content":"","date":"4 May 2026","externalUrl":null,"permalink":"/tags/timescaledb/","section":"Tags","summary":"","title":"Timescaledb","type":"tags"},{"content":"","date":"4 May 2026","externalUrl":null,"permalink":"/tags/walk-forward/","section":"Tags","summary":"","title":"Walk-Forward","type":"tags"},{"content":"2:15 AM monday.\nA. called it around 11:30. she reads for like 20 minutes and then just drops — book still open on the nightstand, her laptop sitting open on the coffee table. I turned the screen off around midnight, refilled my coffee, sat back down.\napril\u0026rsquo;s been closed for four days. account at $1.214M, YTD +1.5%. not writing home about it but it\u0026rsquo;s real. the options book ran clean through may 1st, theta collected exactly as modeled, NQ adaptive lookback has been live for 10 days and holding. all good.\nexcept crypto. -$800 for the whole month of april. in conditions that should\u0026rsquo;ve been ideal.\nbeen staring at that number for an hour. tonight I figured out why.\nthe problem with my backtest # BTC was between $88k and $93k almost the entire month of april. sideways, choppy, low realized vol. exactly the environment my BTC momentum strategy was built to run in — momentum-fade alpha with a vol filter. should\u0026rsquo;ve been collecting small consistent wins.\nit didn\u0026rsquo;t. and I kept telling myself it was just noise. bad luck. wrong timing.\nit wasn\u0026rsquo;t luck. the parameters were stale.\nI optimized the BTC strategy in january on 2024 data. it looked incredible — Sharpe 1.62, max drawdown under 12%. I deployed those parameters and didn\u0026rsquo;t touch them. four months later, the market structure had shifted and I was still running january\u0026rsquo;s optimal config.\nthe problem is in-sample optimization. I knew this was a risk. I did it anyway because the backtest looked good and I was lazy about building the proper validation infrastructure.\ntonight I built it.\nwalk-forward: the actual fix # most backtesting works like this: pick your full historical period, run an optimization grid across the whole thing, find the parameters that maximize Sharpe on that dataset, declare victory. the problem is those parameters are curve-fit to noise in that specific data. out-of-sample they fall apart.\nwalk-forward is the proper fix. instead of one big optimization window, you use rolling windows:\ntrain window (90 days): grid search for best parameters test window (30 days immediately after): evaluate those exact parameters on data they\u0026rsquo;ve never seen slide everything forward by 30 days, repeat stitch the OOS results together: that combined series is your actual performance estimate the combined out-of-sample Sharpe is the number that matters. not the in-sample number. if they diverge badly, you built a curve-fitter.\nI did this for the NQ momentum signal two weeks ago when the adaptive lookback work surfaced similar parameter instability. should\u0026rsquo;ve done it for BTC at the same time. I didn\u0026rsquo;t. tonight I did.\nthe code # walk-forward optimizer for the BTC strategy. runs the full parameter grid inside each training window, evaluates the winner OOS, stores everything:\nimport numpy as np import pandas as pd from dataclasses import dataclass, field from typing import Optional from itertools import product import logging logger = logging.getLogger(__name__) @dataclass class WalkForwardResult: window_id: int train_start: pd.Timestamp train_end: pd.Timestamp test_start: pd.Timestamp test_end: pd.Timestamp best_params: dict train_sharpe: float test_sharpe: float test_returns: pd.Series = field(default_factory=pd.Series) train_returns: pd.Series = field(default_factory=pd.Series) @dataclass class WalkForwardConfig: train_days: int = 90 test_days: int = 30 step_days: int = 30 min_trades: int = 40 # BTC momentum parameter grid momentum_period: tuple = (10, 20, 30, 45) vol_threshold: tuple = (0.15, 0.20, 0.22, 0.25, 0.30) entry_threshold: tuple = (0.30, 0.50, 0.55, 0.70, 0.90) class BTCWalkForwardOptimizer: \u0026#34;\u0026#34;\u0026#34; Walk-forward optimizer for BTC directional momentum strategy. Hourly OHLCV data via Binance API (ccxt). Directional entries only, adaptive parameter selection across rolling windows. \u0026#34;\u0026#34;\u0026#34; def __init__(self, data: pd.DataFrame, config: WalkForwardConfig): self.data = data self.config = config self.results: list[WalkForwardResult] = [] self.account_size = 360_000.0 # BTC allocation (~30% of 1.2M) def _build_signals(self, data: pd.DataFrame, params: dict) -\u0026gt; pd.DataFrame: \u0026#34;\u0026#34;\u0026#34; Compute momentum signals with given parameters. Returns DataFrame with signal columns added. \u0026#34;\u0026#34;\u0026#34; mp = params[\u0026#39;momentum_period\u0026#39;] vt = params[\u0026#39;vol_threshold\u0026#39;] et = params[\u0026#39;entry_threshold\u0026#39;] df = data.copy() # rate of change, EMA-smoothed to reduce whipsaws roc = df[\u0026#39;close\u0026#39;].pct_change(mp) ema_span = max(3, mp // 4) df[\u0026#39;momentum\u0026#39;] = roc.ewm(span=ema_span, adjust=False).mean() # annualized realized vol on hourly bars (*sqrt(8760)) log_ret = np.log(df[\u0026#39;close\u0026#39;] / df[\u0026#39;close\u0026#39;].shift(1)) df[\u0026#39;rvol\u0026#39;] = log_ret.rolling(24 * 20).std() * np.sqrt(8760) # volume confirmation z-score vol_20d_mean = df[\u0026#39;volume\u0026#39;].rolling(24 * 20).mean() vol_20d_std = df[\u0026#39;volume\u0026#39;].rolling(24 * 20).std().replace(0, np.nan) df[\u0026#39;vol_zscore\u0026#39;] = (df[\u0026#39;volume\u0026#39;] - vol_20d_mean) / vol_20d_std # entry conditions df[\u0026#39;long_entry\u0026#39;] = ( (df[\u0026#39;momentum\u0026#39;] \u0026gt; et) \u0026amp; (df[\u0026#39;rvol\u0026#39;] \u0026lt; vt) \u0026amp; (df[\u0026#39;vol_zscore\u0026#39;] \u0026gt; 0.3) ) df[\u0026#39;short_entry\u0026#39;] = ( (df[\u0026#39;momentum\u0026#39;] \u0026lt; -et) \u0026amp; (df[\u0026#39;rvol\u0026#39;] \u0026lt; vt) \u0026amp; (df[\u0026#39;vol_zscore\u0026#39;] \u0026gt; 0.3) ) return df.dropna(subset=[\u0026#39;momentum\u0026#39;, \u0026#39;rvol\u0026#39;, \u0026#39;vol_zscore\u0026#39;]) def _simulate(self, data: pd.DataFrame, params: dict) -\u0026gt; pd.DataFrame: \u0026#34;\u0026#34;\u0026#34; Event-loop simulation on hourly bars. Returns trade log with entry/exit timestamps and PnL. \u0026#34;\u0026#34;\u0026#34; df = self._build_signals(data, params) if df.empty: return pd.DataFrame() max_hold_bars = 48 # 2-day max at 1h bars et = params[\u0026#39;entry_threshold\u0026#39;] trades = [] position = 0 # -1, 0, or 1 entry_price = 0.0 entry_time = None bars_held = 0 for i in range(len(df)): row = df.iloc[i] # exit logic if position != 0: bars_held += 1 exit_now = ( bars_held \u0026gt;= max_hold_bars or (position == 1 and row[\u0026#39;momentum\u0026#39;] \u0026lt; -et * 0.5) or (position == -1 and row[\u0026#39;momentum\u0026#39;] \u0026gt; et * 0.5) or (row[\u0026#39;rvol\u0026#39;] \u0026gt; params[\u0026#39;vol_threshold\u0026#39;] * 2.0) ) if exit_now: pnl = (row[\u0026#39;close\u0026#39;] - entry_price) * position trades.append({ \u0026#39;entry_time\u0026#39;: entry_time, \u0026#39;exit_time\u0026#39;: row.name, \u0026#39;direction\u0026#39;: position, \u0026#39;entry_price\u0026#39;: entry_price, \u0026#39;exit_price\u0026#39;: row[\u0026#39;close\u0026#39;], \u0026#39;pnl\u0026#39;: pnl, \u0026#39;bars_held\u0026#39;: bars_held, }) position = 0 bars_held = 0 # entry logic (only when flat) if position == 0: if bool(row[\u0026#39;long_entry\u0026#39;]): position = 1 entry_price = row[\u0026#39;close\u0026#39;] entry_time = row.name elif bool(row[\u0026#39;short_entry\u0026#39;]): position = -1 entry_price = row[\u0026#39;close\u0026#39;] entry_time = row.name if not trades: return pd.DataFrame() return pd.DataFrame(trades).set_index(\u0026#39;entry_time\u0026#39;) def _sharpe(self, trades: pd.DataFrame) -\u0026gt; Optional[float]: if trades.empty or len(trades) \u0026lt; self.config.min_trades: return None daily = trades[\u0026#39;pnl\u0026#39;].resample(\u0026#39;D\u0026#39;).sum() / self.account_size std = daily.std() if std == 0 or np.isnan(std): return None return float(daily.mean() / std * np.sqrt(252)) def run(self) -\u0026gt; list[WalkForwardResult]: \u0026#34;\u0026#34;\u0026#34;Run the full walk-forward optimization across all rolling windows.\u0026#34;\u0026#34;\u0026#34; self.results = [] data_end = self.data.index[-1] train_td = pd.Timedelta(days=self.config.train_days) test_td = pd.Timedelta(days=self.config.test_days) step_td = pd.Timedelta(days=self.config.step_days) param_grid = list(product( self.config.momentum_period, self.config.vol_threshold, self.config.entry_threshold, )) cursor = self.data.index[0] window_id = 0 while True: train_start = cursor train_end = cursor + train_td test_start = train_end test_end = test_start + test_td if test_end \u0026gt; data_end: break train_data = self.data[train_start:train_end] test_data = self.data[test_start:test_end] if len(train_data) \u0026lt; 500 or len(test_data) \u0026lt; 200: cursor += step_td window_id += 1 continue # grid search on training window best_params, best_train_sharpe = None, -np.inf for mp, vt, et in param_grid: params = {\u0026#39;momentum_period\u0026#39;: mp, \u0026#39;vol_threshold\u0026#39;: vt, \u0026#39;entry_threshold\u0026#39;: et} trades = self._simulate(train_data, params) s = self._sharpe(trades) if s is not None and s \u0026gt; best_train_sharpe: best_train_sharpe = s best_params = params if best_params is None: logger.warning(f\u0026#34;Window {window_id}: no valid params, skipping\u0026#34;) cursor += step_td window_id += 1 continue # evaluate on OOS test window with winning params test_trades = self._simulate(test_data, best_params) train_trades = self._simulate(train_data, best_params) def daily_rets(t): if t.empty: return pd.Series(dtype=float) return t[\u0026#39;pnl\u0026#39;].resample(\u0026#39;D\u0026#39;).sum() / self.account_size test_rets = daily_rets(test_trades) train_rets = daily_rets(train_trades) test_sharpe = ( float(test_rets.mean() / test_rets.std() * np.sqrt(252)) if len(test_rets) \u0026gt; 1 and test_rets.std() \u0026gt; 0 else 0.0 ) self.results.append(WalkForwardResult( window_id=window_id, train_start=train_start, train_end=train_end, test_start=test_start, test_end=test_end, best_params=best_params, train_sharpe=best_train_sharpe, test_sharpe=test_sharpe, test_returns=test_rets, train_returns=train_rets, )) cursor += step_td window_id += 1 return self.results def combined_oos_returns(self) -\u0026gt; pd.Series: \u0026#34;\u0026#34;\u0026#34;Stitch OOS test windows into a single continuous returns series.\u0026#34;\u0026#34;\u0026#34; parts = [r.test_returns for r in self.results if not r.test_returns.empty] return pd.concat(parts).sort_index() if parts else pd.Series(dtype=float) def summary(self) -\u0026gt; dict: oos = self.combined_oos_returns() if len(oos) \u0026lt; 5: return {} equity = (1 + oos).cumprod() drawdown = equity / equity.cummax() - 1 return { \u0026#39;windows\u0026#39;: len(self.results), \u0026#39;oos_days\u0026#39;: len(oos), \u0026#39;oos_sharpe\u0026#39;: round(float(oos.mean() / oos.std() * np.sqrt(252)), 2), \u0026#39;oos_return_pct\u0026#39;: round(float((1 + oos).prod() - 1) * 100, 1), \u0026#39;max_drawdown_pct\u0026#39;: round(float(drawdown.min()) * 100, 1), \u0026#39;positive_windows\u0026#39;: sum(1 for r in self.results if r.test_sharpe \u0026gt; 0), \u0026#39;avg_train_sharpe\u0026#39;: round(float(np.mean([r.train_sharpe for r in self.results])), 2), } you run it like this:\n# hourly BTC OHLCV from TimescaleDB, Jan 2024 through end of April 2026 data = ts.query_ohlcv(\u0026#39;BTC\u0026#39;, \u0026#39;1h\u0026#39;, \u0026#39;2024-01-01\u0026#39;, \u0026#39;2026-04-30\u0026#39;) cfg = WalkForwardConfig() optimizer = BTCWalkForwardOptimizer(data, cfg) results = optimizer.run() print(optimizer.summary()) # { # \u0026#39;windows\u0026#39;: 14, \u0026#39;oos_days\u0026#39;: 420, # \u0026#39;oos_sharpe\u0026#39;: 0.71, \u0026#39;oos_return_pct\u0026#39;: 8.1, # \u0026#39;max_drawdown_pct\u0026#39;: -9.3, # \u0026#39;positive_windows\u0026#39;: 9, \u0026#39;avg_train_sharpe\u0026#39;: 1.62 # } in-sample average: 1.62. combined OOS sharpe: 0.71.\nthat\u0026rsquo;s the gap. that\u0026rsquo;s what I was actually running.\ninfrastructure: storing this properly # every walk-forward run generates a lot of state. I push it all to TimescaleDB so I can track parameter evolution over time — which matters more than any single run result.\nCREATE TABLE IF NOT EXISTS btc_wf_runs ( run_id TEXT NOT NULL, window_id INT NOT NULL, train_start TIMESTAMPTZ NOT NULL, test_start TIMESTAMPTZ NOT NULL, test_end TIMESTAMPTZ NOT NULL, best_params JSONB NOT NULL, train_sharpe FLOAT8, test_sharpe FLOAT8, oos_ret_arr FLOAT8[], -- daily return array for the test window inserted_at TIMESTAMPTZ DEFAULT NOW(), PRIMARY KEY (run_id, window_id) ); each run gets a tagged run_id like btc_wf_20260504_001. I can then query the parameter evolution:\nSELECT test_start::date, best_params-\u0026gt;\u0026gt;\u0026#39;momentum_period\u0026#39; AS mom_period, best_params-\u0026gt;\u0026gt;\u0026#39;vol_threshold\u0026#39; AS vol_thresh, best_params-\u0026gt;\u0026gt;\u0026#39;entry_threshold\u0026#39; AS entry_thresh, ROUND(train_sharpe::numeric, 2) AS train_s, ROUND(test_sharpe::numeric, 2) AS test_s FROM btc_wf_runs WHERE run_id = \u0026#39;btc_wf_20260504_001\u0026#39; ORDER BY window_id; that query is what built the second chart below. seeing parameter drift across windows is the actual signal — more useful than any single OOS number.\nthe walk-forward runner is now scheduled as a cron job: runs on the 1st of each month, uses the prior 90 days as training, deploys new parameters automatically if the OOS validation passes a minimum Sharpe threshold (0.40 currently). should\u0026rsquo;ve had this since day one.\nchart 1: in-sample vs out-of-sample equity # the in-sample equity is the comfortable story. the OOS equity is what actually happened.\nIn-sample (blue): parameter-optimized curve on 2024 data. OOS (orange, dashed): what those same parameters actually delivered on unseen data starting Jan 2025. Net positive — Sharpe 0.71 on 14 months. But it\u0026rsquo;s not 1.62. The gap is where april\u0026rsquo;s -$800 lives.\nchart 2: parameter drift across windows # this one showed me the root cause. different windows want different parameters. if they\u0026rsquo;re jumping around randomly, you\u0026rsquo;re fitting noise.\nMomentum period (purple bars) is the unstable one — jumping between 10, 20, and 30 depending on the window. Vol threshold and entry threshold (green/orange lines) stay more consistent. The pattern: windows where momentum period was 10 (W3, W4, W8) had the weakest OOS Sharpe. Fast-period settings overfit to specific short-term BTC structure that doesn\u0026rsquo;t persist.\nwhat changes for may # the strategy has real edge. 14-month OOS Sharpe of 0.71 with 9 of 14 windows positive isn\u0026rsquo;t curve-fitting — it\u0026rsquo;s a real signal. I\u0026rsquo;m not killing it.\nbut the current parameters were stale. based on the last three walk-forward windows, the optimal config for the current BTC regime (sideways, vol in the 18-22% annualized range) is:\nmomentum_period: 20 vol_threshold: 0.22 entry_threshold: 0.55 I was running 30/0.20/0.50. the entry threshold difference alone filters out a significant chunk of the false signals that cost me in april\u0026rsquo;s chop. the 20-period momentum reads the current BTC structure better than 30.\nreconfigured at midnight. live as of monday open.\nmay setup # account at $1.214M, YTD +1.5%. conservative start to 2026 but the structures are intact.\noptions book rolling fresh into may — no leftover positions from april. theta strategy parameters unchanged, IV rank has been running 28-35%, which is exactly the sweet spot for iron condors on SPX and QQQ. NQ adaptive lookback has 10 days of live data, holding its backtest Sharpe so far.\ncrypto now running validated parameters. the walk-forward cron job will run again June 1.\none thing my dad used to say when he was running biotech projections: \u0026ldquo;the comfortable answer is the one that needs the most scrutiny.\u0026rdquo; I kept the in-sample backtest results because they looked good and I was comfortable. didn\u0026rsquo;t poke hard enough at them.\npoking harder now. took longer than it should have. going forward it\u0026rsquo;s automated.\nthe NexusFi Attack of the Robots journal has been running since 2019 and some of the later sections on parameter stability and regime awareness are legitimately useful — different tooling but the same core problem of strategies drifting over time. worth reading through if this walk-forward stuff is new to you.\n-AK\n","date":"4 May 2026","externalUrl":null,"permalink":"/posts/2026-05-04-walk-forward-validation-btc-strategy/","section":"Posts","summary":"\u003cp\u003e2:15 AM monday.\u003c/p\u003e\n\u003cp\u003eA. called it around 11:30. she reads for like 20 minutes and then just drops — book still open on the nightstand, her laptop sitting open on the coffee table. I turned the screen off around midnight, refilled my coffee, sat back down.\u003c/p\u003e","title":"walk-forward validation: stopped fooling myself with in-sample results","type":"posts"},{"content":"","date":"2 May 2026","externalUrl":null,"permalink":"/tags/apartment/","section":"Tags","summary":"","title":"Apartment","type":"tags"},{"content":"nine days.\nshe asked again at breakfast. seventh or eighth attempt in the last two weeks - i\u0026rsquo;ve lost count. this morning\u0026rsquo;s version was: \u0026ldquo;okay hypothetically, if i needed to shave my legs, would that be relevant information.\u0026rdquo;\ni said \u0026ldquo;both times.\u0026rdquo;\nshe stared at me. \u0026ldquo;both times what.\u0026rdquo;\n\u0026ldquo;you asked. both times.\u0026rdquo;\nshe picked up her coffee and pointed at me. \u0026ldquo;you are impossible and i want you to know i\u0026rsquo;m going to figure it out.\u0026rdquo;\nshe will not figure it out. this is the same brain that fixed a broken dependency in my Python environment at 1am without being asked, debugged my redis config just by reading error logs. cannot find this one thing. nine days of active investigation. nothing.\ni find this deeply satisfying. i didn\u0026rsquo;t know i was capable of keeping a secret this well. turns out i am.\nlesson seven # deal is still running. ten meals without a fire department visit, she gets to add something to the balcony wishlist. current score: 6/10.\ntonight she said it was time for handmade pasta.\nnot carbonara from a box, which was lesson three. actual pasta. flour and eggs and whatever that thing is where you have to let the dough rest because the gluten needs to relax, which is insane but apparently real.\nthe dough is the whole thing. she handed me the bowl and stepped back with arms crossed, which is her supervision posture. i\u0026rsquo;ve learned this posture means she will say nothing until you ask, and asking costs you credibility.\ni did not ask.\nthe texture thing takes longer than i expected. you fold it and it fights you and then at some point it doesn\u0026rsquo;t anymore. she kept walking past and pressing a finger into it and saying \u0026ldquo;not yet.\u0026rdquo; three passes. the fourth time: \u0026ldquo;okay. rest it.\u0026rdquo;\ntwenty minutes. then rolling, which requires a kind of focus that feels unrelated to anything else i do. you can\u0026rsquo;t hurry it. the thickness has to be consistent or the cooking is uneven. she made me do two sheets before she was satisfied.\nsauce was simple - she said the pasta has to do the work. olive oil, garlic, a little pasta water, parmesan.\nthe result was: actually really good. like, embarrassingly good.\nshe ate most of it. pushed the last bite around her plate, looked at me.\n\u0026ldquo;seven out of ten.\u0026rdquo;\n\u0026ldquo;that was at least a nine.\u0026rdquo;\n\u0026ldquo;seven. the sheets were uneven.\u0026rdquo;\n\u0026ldquo;by two millimeters.\u0026rdquo;\n\u0026ldquo;technique matters.\u0026rdquo;\ni have accepted this. she has a point. the sheets were slightly uneven.\n7/10. running total.\nthe afternoon # overcast today, that early may version where it\u0026rsquo;s not gray enough to be gloomy, just gray enough to make the air feel clean. we went out around 2, walked her usual route along the water without any real plan. she had her earbuds in for the first half and then pulled them out when we hit the stretch near the cove.\nwe talked about nothing important. her client project, some drama in her family group chat about a cousin\u0026rsquo;s graduation schedule, whether i\u0026rsquo;d watched the thing she sent me (i had not). regular saturday stuff.\nthere\u0026rsquo;s a section of the route where the water is actually close, you can hear it properly. she does this thing where she slows down there without meaning to.\ni\u0026rsquo;ve noticed this but never said anything. she probably doesn\u0026rsquo;t know she does it.\n11 pm # she\u0026rsquo;s in the other room. i can hear her on a video call with her friend from college, the loud laugh that means something genuinely funny happened.\nalgos running clean. options closed solid for the week. BTC holding overnight.\nnine days to may 11. i know the whole plan. she doesn\u0026rsquo;t know any of it. this has been the most effective secret i\u0026rsquo;ve ever kept in my life.\nthis time last year we were ten days out from the wedding and i was checking my algo dashboard between venue logistics and trying not to seem like i was checking my algo dashboard. she knew i was checking it. she didn\u0026rsquo;t say anything.\nshe never said anything about the stuff i needed to manage. she just left space for it.\nnine days. i have a plan. it\u0026rsquo;s good. she\u0026rsquo;s going to love it. i\u0026rsquo;m more certain of that than most things i try to be certain about, which is saying something.\ngood saturday.\n-AK\n","date":"2 May 2026","externalUrl":null,"permalink":"/posts/2026-05-02-saturday-nine-days-lesson-seven/","section":"Posts","summary":"\u003cp\u003enine days.\u003c/p\u003e\n\u003cp\u003eshe asked again at breakfast. seventh or eighth attempt in the last two weeks - i\u0026rsquo;ve lost count. this morning\u0026rsquo;s version was: \u0026ldquo;okay hypothetically, if i needed to shave my legs, would that be relevant information.\u0026rdquo;\u003c/p\u003e","title":"saturday - nine days, lesson seven, she still hasn't cracked it","type":"posts"},{"content":"2:15 AM. saturday.\napril closed today. before I get into what I actually built this week I\u0026rsquo;ll do the quick numbers.\napril final: +$15,800. minor revision down from the +$16,500 estimate I had wednesday — a few iron condor legs settled a tick or two against on friday\u0026rsquo;s close, plus a small NQ position gave back $430 into the bell. nothing significant. still a clean month.\nYTD: +$17,200 on a ~$1.18M starting base. call it +1.46%.\nthree posts about april is enough. here\u0026rsquo;s what I spent the week building.\nthe gap I\u0026rsquo;ve been ignoring # every signal the system generates passes through a filter stack before it routes to execution. IV rank minimums. regime gates. spread quality checks. event risk throttle from the tariff chaos in week one.\nthose filters are static. hard rules I wrote over the past 18 months based on post-mortems and gut feel. they catch obvious garbage — signals firing in low IV environments, with wide spreads, during event windows. what they can\u0026rsquo;t do is rank the signals that clear all the filters. they\u0026rsquo;re binary pass/fail. a signal scoring 0.01 above the IV rank threshold gets treated identically to a signal in a perfect high-IV environment.\nthere\u0026rsquo;s predictive structure in those features. I know this because I\u0026rsquo;ve done post-mortems on the fills. signals with IV rank in the 75th percentile outperform signals in the 45th percentile on average, even though both clear the filter. same pattern shows up for bid-ask spread, strategy recent win rate, IV richness vs realized vol.\nso the question I finally sat down to answer: can I train a binary classifier on historical fills that scores new signals on expected quality before they hit execution? not predicting P\u0026amp;L — that\u0026rsquo;s not tractable. predicting whether this signal will likely end up in the top or bottom quartile of outcomes for this strategy.\neven modest AUC (0.65–0.70) is useful if it\u0026rsquo;s stable. filtering the bottom 15–20% of expected-quality signals without cutting many good ones improves the P\u0026amp;L distribution without reducing frequency too much.\nfeatures at signal time # tuesday. most of the day. pulling features from TimescaleDB, Redis (ThetaData IV snapshots), and IBKR fill logs, then aligning timestamps. ThetaData snapshots and IBKR fills have slightly different latency, so I had to be careful about which values were genuinely available at the moment the signal fired vs. what I\u0026rsquo;d be inadvertently forward-filling.\nfeatures that made the final cut after dropping near-zero correlation with outcomes:\nfrom typing import TypedDict class SignalFeatures(TypedDict): # IV environment at signal time iv_rank_30d: float # 0-100 percentile rank vs trailing 30 days iv_percentile_252d: float # annual horizon for comparison iv_vs_rv_ratio: float # implied vol / realized vol ratio — \u0026gt;1.0 means IV rich # Market state vix_spot: float # VIX level at signal time vix_term_ratio: float # VIX3M / VIX1M (term structure slope) spy_vol_vs_20d_avg: float # today\u0026#39;s realized vol as ratio vs 20-day average # Signal specifics dte: int # days to expiration delta_short_strike: float # delta of the short leg bid_ask_pct: float # spread as % of mid (execution quality proxy) time_of_day_sin: float # cyclical encoding of hour-of-day (sin component) time_of_day_cos: float # cyclical encoding of hour-of-day (cos component) # Strategy momentum strategy_7d_win_rate: float # this strategy\u0026#39;s win rate over last 7 days strategy_14d_pnl_zscore: float # z-score of strategy P\u0026amp;L vs historical mean # Contract characteristics open_interest_ratio: float # OI at this strike / total OI at expiry moneyness: float # (strike - spot) / spot for the short leg quick note on the cyclical time encoding. if you encode hour-of-day as a raw integer, a tree model will treat 23:00 and 01:00 as maximally distant. that\u0026rsquo;s geometrically wrong — they\u0026rsquo;re adjacent in trading session structure. sin/cos wraps the dimension correctly. I\u0026rsquo;ve seen discussions of this in ML-for-quant threads but it\u0026rsquo;s surprisingly rare in practice for people running intraday algo features.\nmodel: LightGBM with time-series cross-validation # three reasonable choices for a tabular signal quality problem: XGBoost, LightGBM, or sklearn ensemble methods. went with LightGBM — faster on tabular data at this size, handles mixed types natively, doesn\u0026rsquo;t need feature scaling, and the built-in feature importance output is usable for monitoring without adding SHAP overhead.\nlabel definition: top quartile of realized P\u0026amp;L within the same (strategy_id, expiration) cohort = 1, bottom quartile = 0. middle 50% dropped from training. cleaner binary signal than win/loss, which is too noisy given the per-strategy fill counts.\nimport lightgbm as lgb import numpy as np import pandas as pd from sklearn.model_selection import TimeSeriesSplit from sklearn.metrics import roc_auc_score from typing import Tuple, List FEATURE_COLS = list(SignalFeatures.__annotations__.keys()) def prepare_quality_labels( fills_df: pd.DataFrame, min_cohort_size: int = 40, ) -\u0026gt; pd.DataFrame: \u0026#34;\u0026#34;\u0026#34; Label top/bottom quartile within (strategy_id, expiration) cohorts. Drop middle 50% — cleaner binary signal. Args: fills_df: DataFrame with columns: strategy_id, expiration, realized_pnl, signal_timestamp, + all FEATURE_COLS min_cohort_size: Skip cohorts with fewer fills (insufficient stats) Returns: Labeled DataFrame sorted by signal_timestamp, with \u0026#39;quality_label\u0026#39; column. \u0026#34;\u0026#34;\u0026#34; labeled: List[pd.DataFrame] = [] for (strategy, expiry), group in fills_df.groupby([\u0026#34;strategy_id\u0026#34;, \u0026#34;expiration\u0026#34;]): if len(group) \u0026lt; min_cohort_size: continue q25 = group[\u0026#34;realized_pnl\u0026#34;].quantile(0.25) q75 = group[\u0026#34;realized_pnl\u0026#34;].quantile(0.75) top_q = group[group[\u0026#34;realized_pnl\u0026#34;] \u0026gt;= q75].copy() top_q[\u0026#34;quality_label\u0026#34;] = 1 bot_q = group[group[\u0026#34;realized_pnl\u0026#34;] \u0026lt;= q25].copy() bot_q[\u0026#34;quality_label\u0026#34;] = 0 labeled.extend([top_q, bot_q]) if not labeled: raise ValueError(\u0026#34;no cohorts met min_cohort_size — check data or lower threshold\u0026#34;) return pd.concat(labeled).sort_values(\u0026#34;signal_timestamp\u0026#34;).reset_index(drop=True) def train_quality_classifier( X: pd.DataFrame, y: pd.Series, n_splits: int = 5, ) -\u0026gt; Tuple[lgb.Booster, float]: \u0026#34;\u0026#34;\u0026#34; Binary quality classifier with TimeSeriesSplit cross-validation. TimeSeriesSplit is non-negotiable here. Standard k-fold bleeds future fills into training folds and gives optimistically wrong OOF scores. gap=200 adds a buffer of 200 observations between train/val to reduce leakage from strategy autocorrelation. Returns: (best_model, mean_oof_auc) where best_model = highest-AUC fold \u0026#34;\u0026#34;\u0026#34; tscv = TimeSeriesSplit(n_splits=n_splits, gap=200) params = { \u0026#34;objective\u0026#34;: \u0026#34;binary\u0026#34;, \u0026#34;metric\u0026#34;: \u0026#34;auc\u0026#34;, \u0026#34;num_leaves\u0026#34;: 31, \u0026#34;learning_rate\u0026#34;: 0.05, \u0026#34;feature_fraction\u0026#34;: 0.8, \u0026#34;bagging_fraction\u0026#34;: 0.8, \u0026#34;bagging_freq\u0026#34;: 5, \u0026#34;min_child_samples\u0026#34;: 20, \u0026#34;reg_alpha\u0026#34;: 0.1, \u0026#34;reg_lambda\u0026#34;: 0.1, \u0026#34;verbose\u0026#34;: -1, } fold_aucs: List[float] = [] fold_models: List[lgb.Booster] = [] for fold_idx, (train_idx, val_idx) in enumerate(tscv.split(X)): X_train, X_val = X.iloc[train_idx], X.iloc[val_idx] y_train, y_val = y.iloc[train_idx], y.iloc[val_idx] dtrain = lgb.Dataset(X_train, label=y_train) dval = lgb.Dataset(X_val, label=y_val, reference=dtrain) model = lgb.train( params, dtrain, num_boost_round=600, valid_sets=[dval], callbacks=[ lgb.early_stopping(stopping_rounds=50, verbose=False), lgb.log_evaluation(period=-1), ], ) val_preds = model.predict(X_val) auc = roc_auc_score(y_val, val_preds) fold_aucs.append(auc) fold_models.append(model) mean_auc = float(np.mean(fold_aucs)) best_idx = int(np.argmax(fold_aucs)) return fold_models[best_idx], mean_auc OOF AUC across 5 folds: 0.672 (range 0.658–0.689, std 0.011).\nnot a crystal ball. wasn\u0026rsquo;t trying to build one. 0.67 is useful if it\u0026rsquo;s stable across the next few months.\nroc curve (5-fold OOF) # 5-fold OOF. each fold trained on earlier data, validated on later data — no lookahead. diagonal is random baseline.\nfiltering threshold and holdout validation # chose a gate threshold of 0.35 based on holdout analysis (last 3 months of fills withheld from training entirely).\nat 0.35 on the holdout set:\n18.3% of signals filtered out filtered signals: average realized P\u0026amp;L = -$285 (they genuinely underperformed the cohort) passed signals: average realized P\u0026amp;L moved from +$124 (unfiltered baseline) to +$178 precision at threshold: 0.71 — 71% of signals passed at ≥0.35 ended up in top quartile not statistically definitive at 3 months of holdout. but directionally correct across all three strategy types. good enough to deploy with a monitoring window.\nfeature importance # LightGBM gain-based importance. higher = more total information gain from splits on this feature across all trees.\nthe top results make sense:\nstrategy_7d_win_rate is the strongest predictor by a wide margin. if this strategy has been on a cold streak recently, current signals from it are lower quality on average. I don\u0026rsquo;t know yet whether that\u0026rsquo;s regime-driven edge decay, adverse market microstructure, or just mean reversion noise in small samples — but the signal is real. this was the biggest surprise to me.\niv_vs_rv_ratio (IV richness vs realized vol): when IV is elevated relative to recent realized, premium-selling positions have more cushion. IV that\u0026rsquo;s 1.4x realized gives you a wider margin before the position starts hurting. makes obvious sense in hindsight.\nbid_ask_pct: wider spreads mean worse execution quality at fill time and lower net credit captured. the model found this more predictive than I expected. slippage analysis I did last month showed options execution quality has a larger impact on realized P\u0026amp;L than I was accounting for — this feature is picking that up.\ndte and delta_short_strike: structural position characteristics. not as informative as the dynamic features but the model uses them.\nbeen reading through some of the algo trading journals on NexusFi — a few people have documented pre-execution signal scoring approaches using regime filters and conditional probability tables. nobody specifically running LightGBM on this but the underlying idea isn\u0026rsquo;t new. the execution here is different: continuous feature space, trained on actual fills rather than hypothetical entries.\nproduction deployment: quality gate in redis # inference wrapper. model serialized to Redis at training time, loaded at startup, refreshed every 24h.\nimport redis import pickle import logging from dataclasses import dataclass from typing import Any logger = logging.getLogger(__name__) GATE_THRESHOLD = 0.35 @dataclass class GateResult: score: float decision: str # \u0026#34;pass\u0026#34; | \u0026#34;filter\u0026#34; | \u0026#34;error\u0026#34; threshold: float features_available: int class SignalQualityGate: \u0026#34;\u0026#34;\u0026#34; Production inference wrapper for the LightGBM quality classifier. Design principle: gate errors open. if inference fails for any reason, signal passes through unchanged. i don\u0026#39;t want the classifier blocking execution when Redis is slow or model bytes are corrupt. Model refreshed from Redis every 24h via background task. \u0026#34;\u0026#34;\u0026#34; MODEL_REDIS_KEY = \u0026#34;quality_gate:lgbm_v1\u0026#34; def __init__(self, redis_client: redis.Redis) -\u0026gt; None: self.redis = redis_client self.model: Any = None self._load_model() def _load_model(self) -\u0026gt; None: raw = self.redis.get(self.MODEL_REDIS_KEY) if raw is None: logger.error(\u0026#34;quality gate model missing from Redis — gate will error-open\u0026#34;) return self.model = pickle.loads(raw) logger.info(\u0026#34;quality gate model loaded (%d bytes)\u0026#34;, len(raw)) def evaluate(self, features: dict) -\u0026gt; GateResult: if self.model is None: return GateResult( score=0.5, decision=\u0026#34;error\u0026#34;, threshold=GATE_THRESHOLD, features_available=0 ) try: vec = [features.get(k, 0.0) for k in FEATURE_COLS] n_available = sum(1 for k in FEATURE_COLS if k in features) score = float(self.model.predict([vec])[0]) decision = \u0026#34;pass\u0026#34; if score \u0026gt;= GATE_THRESHOLD else \u0026#34;filter\u0026#34; return GateResult( score=round(score, 4), decision=decision, threshold=GATE_THRESHOLD, features_available=n_available, ) except Exception as exc: logger.exception(\u0026#34;quality gate inference failed: %s\u0026#34;, exc) return GateResult( score=0.5, decision=\u0026#34;error\u0026#34;, threshold=GATE_THRESHOLD, features_available=0 ) error-open is the only design that makes sense here. classifier breaking during a live session shouldn\u0026rsquo;t interrupt execution — log the failure, let the signal pass, fix the issue async.\ntimescaledb: continuous aggregates for feature refresh # the two strategy momentum features need fresh values at signal evaluation time without requiring a full table scan. continuous aggregates on TimescaleDB handle this automatically.\n-- 7-day rolling strategy metrics -- refreshed every 30 minutes by TimescaleDB background worker CREATE MATERIALIZED VIEW quality_gate_strategy_metrics WITH (timescaledb.continuous) AS SELECT strategy_id, time_bucket(\u0026#39;1 day\u0026#39;, signal_timestamp) AS bucket, COUNT(*) FILTER (WHERE realized_pnl \u0026gt; 0) * 1.0 / NULLIF(COUNT(*), 0) AS win_rate_7d, AVG(realized_pnl) AS avg_pnl, STDDEV(realized_pnl) AS std_pnl, COUNT(*) AS fill_count FROM trade_fills GROUP BY strategy_id, time_bucket(\u0026#39;1 day\u0026#39;, signal_timestamp) WITH NO DATA; SELECT add_continuous_aggregate_policy( \u0026#39;quality_gate_strategy_metrics\u0026#39;, start_offset =\u0026gt; INTERVAL \u0026#39;14 days\u0026#39;, end_offset =\u0026gt; INTERVAL \u0026#39;30 minutes\u0026#39;, schedule_interval =\u0026gt; INTERVAL \u0026#39;30 minutes\u0026#39; ); -- feature computation at signal time (fast JOIN against pre-computed aggregate) WITH recent_14d AS ( SELECT strategy_id, SUM(avg_pnl * fill_count) / NULLIF(SUM(fill_count), 0) AS rolling_mean, SQRT(SUM(std_pnl * std_pnl * fill_count) / NULLIF(SUM(fill_count), 0)) AS rolling_std FROM quality_gate_strategy_metrics WHERE bucket \u0026gt;= CURRENT_DATE - INTERVAL \u0026#39;14 days\u0026#39; GROUP BY strategy_id ), today_metrics AS ( SELECT strategy_id, win_rate_7d, avg_pnl FROM quality_gate_strategy_metrics WHERE bucket = CURRENT_DATE ) SELECT t.strategy_id, t.win_rate_7d AS strategy_7d_win_rate, CASE WHEN r.rolling_std \u0026gt; 0 THEN (t.avg_pnl - r.rolling_mean) / r.rolling_std ELSE 0.0 END AS strategy_14d_pnl_zscore FROM today_metrics t JOIN recent_14d r USING (strategy_id); the background worker refreshes every 30 minutes. at signal evaluation time this is a single JOIN — no sequential scan on trade_fills. latency is under 5ms on the current table size.\nmonitoring plan # 60-day trial window. metrics tracked in TimescaleDB, displayed in Grafana:\nfiltered_rate (daily): should stay 15–20%. if it drifts above 30%, model is misfiring on a new regime and needs retraining or removal score_distribution (daily histogram): watch for distribution shift — leftward drift means the model is getting pessimistic about overall signal quality, possible regime change realized P\u0026amp;L delta: filtered vs passed signals\u0026rsquo; average P\u0026amp;L. if that gap collapses to near-zero, gate has lost its edge per-strategy filter rate: if one strategy gets filtered \u0026gt;40% of the time persistently, something structural is happening to that strategy\u0026rsquo;s edge will write up results at 60 days. if the gate doesn\u0026rsquo;t hold up I\u0026rsquo;ll pull it and document why.\nA. fell asleep around 11. she had a long week — rough client review thursday that ran way over, then spent most of friday firefighting a database migration. she powered through it but was clearly drained by the time we ate. apartment\u0026rsquo;s quiet now, the way I like it at 2 AM.\nmay is open. april was fine. classifier\u0026rsquo;s deployed.\none of those weird moments I get sometimes — may 1, late at night, quiet apartment. dad used to say may was his favorite month. good weather before it gets too hot, baseball season finding its legs. stupid thing to remember at 2 AM but there it is.\n-AK\n","date":"1 May 2026","externalUrl":null,"permalink":"/posts/2026-05-01-april-closed-signal-quality-gate-lightgbm/","section":"Posts","summary":"\u003cp\u003e2:15 AM. saturday.\u003c/p\u003e\n\u003cp\u003eapril closed today. before I get into what I actually built this week I\u0026rsquo;ll do the quick numbers.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eapril final\u003c/strong\u003e: +$15,800. minor revision down from the +$16,500 estimate I had wednesday — a few iron condor legs settled a tick or two against on friday\u0026rsquo;s close, plus a small NQ position gave back $430 into the bell. nothing significant. still a clean month.\u003c/p\u003e","title":"april done. built a signal quality gate with LightGBM.","type":"posts"},{"content":"","date":"1 May 2026","externalUrl":null,"permalink":"/tags/lightgbm/","section":"Tags","summary":"","title":"Lightgbm","type":"tags"},{"content":"","date":"1 May 2026","externalUrl":null,"permalink":"/tags/machine-learning/","section":"Tags","summary":"","title":"Machine-Learning","type":"tags"},{"content":"","date":"1 May 2026","externalUrl":null,"permalink":"/tags/performance-attribution/","section":"Tags","summary":"","title":"Performance-Attribution","type":"tags"},{"content":"","date":"1 May 2026","externalUrl":null,"permalink":"/tags/signal-quality/","section":"Tags","summary":"","title":"Signal-Quality","type":"tags"},{"content":"","date":"1 May 2026","externalUrl":null,"permalink":"/categories/trading-performance/","section":"Categories","summary":"","title":"Trading Performance","type":"categories"},{"content":"","date":"29 April 2026","externalUrl":null,"permalink":"/tags/asyncio/","section":"Tags","summary":"","title":"Asyncio","type":"tags"},{"content":"","date":"29 April 2026","externalUrl":null,"permalink":"/tags/iron-condor/","section":"Tags","summary":"","title":"Iron-Condor","type":"tags"},{"content":"","date":"29 April 2026","externalUrl":null,"permalink":"/tags/iv-rank/","section":"Tags","summary":"","title":"Iv-Rank","type":"tags"},{"content":"2:30 AM. wednesday.\napril is basically wrapped. last weekly expiration cleared friday. monday was flat, tuesday had one small SPX position that ticked through on delta and I let it ride — closed today for +$1,100. running estimate: april MTD somewhere around +$16,500 when everything settles. YTD is going to land around +1.5%.\nnot going to write much about april. wrote it up friday. what I want to write about is what happens next: setting up may.\nwhy you can\u0026rsquo;t pick strikes manually at scale # in 2024, when the condor book was small, I picked strikes by eyeballing the options chain. delta 0.15-ish on both sides, decent credit, call it a day. worked okay when I was running two positions at once.\nthat doesn\u0026rsquo;t scale. right now the scanner is evaluating:\n3 symbols (SPX, QQQ, XLF) 4 expirations per symbol (may 15, may 29, jun 19, jul 17) 4 wing widths per expiration/symbol combo ($5, $10, $15, $20 or point equivalents) that\u0026rsquo;s 48 combinations before I\u0026rsquo;ve even applied any filters. and the IV surface changes intraday. if I\u0026rsquo;m checking at 10:30 AM and entering at 2 PM, the rank I computed by hand is already wrong.\nso the scanner handles it. core logic:\npull full options chain via ThetaData bulk snapshot (parallel by expiry) for each short strike candidate in the target delta range, compute IV percentile rank vs 30-day history build condor candidates at all four wing widths score each candidate: (credit / width) * (avg_iv_rank / 50.0) * dte_factor top 10 go into Redis. I pull them whenever I want without touching the colo. the scanner # this is the current version. the scoring function is where most of the thinking lives — reducing a 2D decision space (credit efficiency + IV environment) to a single number I can sort on.\nfrom __future__ import annotations import asyncio import aiohttp import json import logging import numpy as np from dataclasses import dataclass from datetime import date, timedelta from typing import Optional import redis.asyncio as aioredis logger = logging.getLogger(__name__) @dataclass class OptionLeg: symbol: str expiry: date strike: float option_type: str # \u0026#39;C\u0026#39; or \u0026#39;P\u0026#39; bid: float ask: float delta: float iv: float # annualized implied vol (e.g. 0.18 = 18%) iv_rank: float # percentile rank vs 30-day history (0-100) @property def mid(self) -\u0026gt; float: return (self.bid + self.ask) / 2.0 @dataclass class IronCondorCandidate: symbol: str expiry: date put_short: OptionLeg put_long: OptionLeg call_short: OptionLeg call_long: OptionLeg @property def dte(self) -\u0026gt; int: return (self.expiry - date.today()).days @property def net_credit(self) -\u0026gt; float: return ( self.put_short.mid - self.put_long.mid + self.call_short.mid - self.call_long.mid ) @property def wing_width(self) -\u0026gt; float: return self.call_long.strike - self.call_short.strike @property def credit_ratio(self) -\u0026gt; float: if self.wing_width \u0026lt;= 0: return 0.0 return self.net_credit / self.wing_width @property def avg_iv_rank(self) -\u0026gt; float: return np.mean([self.put_short.iv_rank, self.call_short.iv_rank]) @property def pop_estimate(self) -\u0026gt; float: \u0026#34;\u0026#34;\u0026#34; rough probability of profit from short leg deltas. for delta 0.15 short put and 0.15 short call: POP ≈ 1 - |put_delta| - |call_delta| \u0026#34;\u0026#34;\u0026#34; return 1.0 - abs(self.put_short.delta) - abs(self.call_short.delta) @property def score(self) -\u0026gt; float: \u0026#34;\u0026#34;\u0026#34;composite score: higher = better candidate. - credit_ratio: how much you\u0026#39;re getting paid per dollar of risk - avg_iv_rank / 50: normalized iv rank (1.0 = median, 2.0 = max) - dte_factor: preference for 21-35 DTE theta acceleration zone \u0026#34;\u0026#34;\u0026#34; dte_factor = 1.0 if 21 \u0026lt;= self.dte \u0026lt;= 35: dte_factor = 1.15 elif self.dte \u0026lt; 14: dte_factor = 0.70 # gamma risk spikes below 2 weeks elif self.dte \u0026gt; 45: dte_factor = 0.85 # capital tied up too long return self.credit_ratio * (self.avg_iv_rank / 50.0) * dte_factor class ThetaDataClient: \u0026#34;\u0026#34;\u0026#34;thin wrapper around ThetaData\u0026#39;s local proxy running in colo\u0026#34;\u0026#34;\u0026#34; BASE_URL = \u0026#34;http://localhost:25510\u0026#34; def __init__(self, session: aiohttp.ClientSession): self.session = session async def get_chain(self, symbol: str, expiry: date) -\u0026gt; list[dict]: params = { \u0026#34;root\u0026#34;: symbol, \u0026#34;exp\u0026#34;: expiry.strftime(\u0026#34;%Y%m%d\u0026#34;), } async with self.session.get( f\u0026#34;{self.BASE_URL}/v2/bulk_snapshot/option/greeks\u0026#34;, params=params, ) as resp: resp.raise_for_status() return (await resp.json()).get(\u0026#34;response\u0026#34;, []) async def get_iv_rank( self, symbol: str, expiry: date, strike: float, right: str, lookback: int = 30, ) -\u0026gt; float: end = date.today() start = end - timedelta(days=lookback) params = { \u0026#34;root\u0026#34;: symbol, \u0026#34;exp\u0026#34;: expiry.strftime(\u0026#34;%Y%m%d\u0026#34;), \u0026#34;strike\u0026#34;: int(strike * 1000), \u0026#34;right\u0026#34;: right[0].upper(), \u0026#34;start_date\u0026#34;: start.strftime(\u0026#34;%Y%m%d\u0026#34;), \u0026#34;end_date\u0026#34;: end.strftime(\u0026#34;%Y%m%d\u0026#34;), } async with self.session.get( f\u0026#34;{self.BASE_URL}/v2/hist/option/greeks\u0026#34;, params=params, ) as resp: if resp.status != 200: return 50.0 hist = (await resp.json()).get(\u0026#34;response\u0026#34;, []) iv_series = [r[\u0026#34;iv\u0026#34;] for r in hist if r.get(\u0026#34;iv\u0026#34;) is not None] if len(iv_series) \u0026lt; 5: return 50.0 current = iv_series[-1] rank = np.searchsorted(sorted(iv_series), current) / len(iv_series) return round(rank * 100, 1) class IronCondorScanner: def __init__( self, redis_client: aioredis.Redis, td: ThetaDataClient, symbols: list[str], expirations: list[date], delta_range: tuple[float, float] = (0.12, 0.20), min_credit_ratio: float = 0.14, min_iv_rank: float = 28.0, wing_widths: list[float] = None, ): self.redis = redis_client self.td = td self.symbols = symbols self.expirations = expirations self.delta_range = delta_range self.min_credit_ratio = min_credit_ratio self.min_iv_rank = min_iv_rank self.wing_widths = wing_widths or [5.0, 10.0, 15.0, 20.0] def _closest_leg( self, chain: list[dict], right: str, strike: float ) -\u0026gt; Optional[dict]: legs = [o for o in chain if o.get(\u0026#34;right\u0026#34;, \u0026#34;\u0026#34;).upper() == right.upper()] if not legs: return None return min(legs, key=lambda o: abs(o.get(\u0026#34;strike\u0026#34;, 9999) - strike)) async def scan_expiry( self, symbol: str, expiry: date ) -\u0026gt; list[IronCondorCandidate]: chain = await self.td.get_chain(symbol, expiry) if not chain: return [] lo, hi = self.delta_range puts = [ o for o in chain if o.get(\u0026#34;right\u0026#34;) == \u0026#34;P\u0026#34; and lo \u0026lt;= abs(o.get(\u0026#34;delta\u0026#34;, 0)) \u0026lt;= hi ] calls = [ o for o in chain if o.get(\u0026#34;right\u0026#34;) == \u0026#34;C\u0026#34; and lo \u0026lt;= abs(o.get(\u0026#34;delta\u0026#34;, 0)) \u0026lt;= hi ] if not puts or not calls: return [] short_put = max(puts, key=lambda o: o.get(\u0026#34;ask\u0026#34;, 0)) short_call = max(calls, key=lambda o: o.get(\u0026#34;ask\u0026#34;, 0)) # parallel IV rank fetches for both short legs put_rank, call_rank = await asyncio.gather( self.td.get_iv_rank(symbol, expiry, short_put[\u0026#34;strike\u0026#34;], \u0026#34;P\u0026#34;), self.td.get_iv_rank(symbol, expiry, short_call[\u0026#34;strike\u0026#34;], \u0026#34;C\u0026#34;), ) def make_leg(raw: dict, rank: float) -\u0026gt; OptionLeg: return OptionLeg( symbol=symbol, expiry=expiry, strike=raw[\u0026#34;strike\u0026#34;], option_type=raw[\u0026#34;right\u0026#34;], bid=raw.get(\u0026#34;bid\u0026#34;, 0), ask=raw.get(\u0026#34;ask\u0026#34;, 0), delta=raw.get(\u0026#34;delta\u0026#34;, 0), iv=raw.get(\u0026#34;iv\u0026#34;, 0), iv_rank=rank, ) candidates = [] for width in self.wing_widths: pl_raw = self._closest_leg(chain, \u0026#34;P\u0026#34;, short_put[\u0026#34;strike\u0026#34;] - width) cl_raw = self._closest_leg(chain, \u0026#34;C\u0026#34;, short_call[\u0026#34;strike\u0026#34;] + width) if pl_raw is None or cl_raw is None: continue c = IronCondorCandidate( symbol=symbol, expiry=expiry, put_short=make_leg(short_put, put_rank), put_long=make_leg(pl_raw, 50.0), call_short=make_leg(short_call, call_rank), call_long=make_leg(cl_raw, 50.0), ) if c.credit_ratio \u0026gt;= self.min_credit_ratio and c.avg_iv_rank \u0026gt;= self.min_iv_rank: candidates.append(c) return sorted(candidates, key=lambda x: x.score, reverse=True) async def run(self) -\u0026gt; list[IronCondorCandidate]: tasks = [ self.scan_expiry(sym, exp) for sym in self.symbols for exp in self.expirations ] results = await asyncio.gather(*tasks) flat = sorted( [c for group in results for c in group], key=lambda x: x.score, reverse=True, ) # cache top 20 in Redis, 30-minute TTL payload = [ { \u0026#34;symbol\u0026#34;: c.symbol, \u0026#34;expiry\u0026#34;: c.expiry.isoformat(), \u0026#34;dte\u0026#34;: c.dte, \u0026#34;net_credit\u0026#34;: round(c.net_credit, 2), \u0026#34;wing_width\u0026#34;: c.wing_width, \u0026#34;credit_ratio\u0026#34;: round(c.credit_ratio, 4), \u0026#34;pop\u0026#34;: round(c.pop_estimate, 3), \u0026#34;avg_iv_rank\u0026#34;: round(c.avg_iv_rank, 1), \u0026#34;score\u0026#34;: round(c.score, 4), } for c in flat[:20] ] await self.redis.setex( \u0026#34;scanner:condor_candidates:latest\u0026#34;, 1800, json.dumps(payload) ) logger.info(f\u0026#34;scan complete: {len(flat)} candidates, top score {flat[0].score:.4f}\u0026#34; if flat else \u0026#34;no candidates\u0026#34;) return flat the score property is doing the heavy lifting. highest-scored candidate as of the 11 PM scan tonight: SPX may 15 condor, $20 wings, credit ratio 19.3%, IV rank 44, score 0.243. that\u0026rsquo;s the one I\u0026rsquo;m probably opening tomorrow.\nthe scanner doesn\u0026rsquo;t decide for me. it gives me a ranked list and I check the calendar. FOMC is may 7. that\u0026rsquo;s inside the may 15 window. that matters — I\u0026rsquo;m putting the event risk throttle flag on any may 15 positions and setting max position size at 4 contracts until we\u0026rsquo;re through the rate decision.\niv surface heading into may # here\u0026rsquo;s what the IV rank surface looks like across the four expirations as of tonight\u0026rsquo;s 11 PM scan. the color shows IV percentile rank — darker means current IV is high relative to the past 30 days, which means richer premium for selling.\nthe amber cluster in the upper left is where I want to be selling. -12Δ to -15Δ puts in the may 15 cycle are sitting at IV rank 45-52 — vol is still elevated from the tariff shock and normalizing slowly. that\u0026rsquo;s the zone where credit ratios are richest and I\u0026rsquo;m getting paid more per dollar of max loss than the longer-dated cycles.\nthe gradient going right shows how vol is lower in the back months. nothing wrong with selling jun or jul, but the credit ratio drops and capital sits tied up longer. for the premium selling model I\u0026rsquo;m running, the sweet spot stays in the 17-35 DTE window.\nthe candidates # here\u0026rsquo;s the top candidate cluster from tonight\u0026rsquo;s scan plotted by probability of profit vs credit/width ratio. each point is one condor configuration (different symbol, expiry, or wing width).\nthe top-right cluster is where I want to be: higher POP, higher credit. the green-orange coloring on those points tells me IV rank is 40-44 range — selling into a vol environment that\u0026rsquo;s elevated but not panicking.\nthe two outlier points (lower left) are the XLF and longer-dated QQQ candidates. lower POP, lower credit. not worthless — XLF in particular has some event exposure I\u0026rsquo;m watching — but they\u0026rsquo;re not the first executions tomorrow.\nthe NexusFi community on the options on futures thread has had a long-running debate about whether IV rank or absolute IV level matters more for strike selection. the thread\u0026rsquo;s been going since 2011, still active. short answer from what I\u0026rsquo;ve read: rank matters more for consistency, absolute level matters if you\u0026rsquo;re comparing across underlyings. the scanner uses rank for the within-symbol score and I compare absolute IV when deciding SPX vs QQQ vs XLF allocation.\ninfrastructure note: data freshness is the whole thing # the scanner runs in chicago on the colo box. ThetaData\u0026rsquo;s options API endpoint is hosted on infrastructure close to CME — round trip for the bulk snapshot call is 4.2ms from chicago, versus 28ms from my san diego machine.\nthat gap only matters because I\u0026rsquo;m computing IV rank in real-time during the scan. if the chain data is stale by 30 seconds during fast tape, the IV rank can shift 10-15 percentile points. that\u0026rsquo;s enough to misclassify a trade. \u0026ldquo;high IV environment, sell\u0026rdquo; vs \u0026ldquo;IV collapsed, wait\u0026rdquo; is a binary decision that matters a lot.\nthe cache architecture handles the afternoon latency problem: scanner runs in chicago every 30 minutes, pushes to Redis with 30-minute TTL, I query Redis from san diego all evening without touching the live API. data is at most 29 minutes stale when I\u0026rsquo;m reviewing at midnight. acceptable for my decision cadence.\ncolo total: $680/month. Redis on the same box. ThetaData access through their endpoint. for what I get out of it, still the most efficient line item in the budget.\ntomorrow\u0026rsquo;s plan # opening SPX may 15 condors first. $20 wings, 4 contracts max (FOMC event risk inside the window). setting the event throttle at delta 0.08 — if SPX moves more than 1% intraday and delta touches 0.08 on either short leg, auto-roll the threatened side.\nQQQ may 15 afterward if the morning opens clean. 2-3 contracts.\nXLF I\u0026rsquo;m watching but not touching until after may 7 rate decision. sector ETFs move weird around FOMC.\nNQ adaptive lookback is now in week two of live trading. no additional changes yet — the point of week two is to let it run and collect data, not tinker.\nbeen at the desk since 9 PM. A. left pasta in the fridge before she went to bed. it\u0026rsquo;s 2:30 and I still haven\u0026rsquo;t touched it. probably should.\none thing hit tonight while I was debugging the _closest_leg edge case — there\u0026rsquo;s a specific kind of satisfaction in watching your own tooling work cleanly. the scanner ran at 11 PM, 12 candidates in Redis in 8 seconds, ranked correctly, top pick exactly what I expected it to be.\ndad built software for a living. different domain. but I think he\u0026rsquo;d recognize the thing I\u0026rsquo;m describing — when a system you designed does what you designed it to do, quietly, without you touching it.\nbeen over three years. that one still lands sometimes.\nclose the notebook. alarm at 8:45.\n-AK\n","date":"29 April 2026","externalUrl":null,"permalink":"/posts/2026-04-29-may-cycle-iv-surface-strike-selection/","section":"Posts","summary":"\u003cp\u003e2:30 AM. wednesday.\u003c/p\u003e\n\u003cp\u003eapril is basically wrapped. last weekly expiration cleared friday. monday was flat, tuesday had one small SPX position that ticked through on delta and I let it ride — closed today for +$1,100. running estimate: april MTD somewhere around +$16,500 when everything settles. YTD is going to land around +1.5%.\u003c/p\u003e","title":"may cycle setup: scanning the iv surface, automating strike selection","type":"posts"},{"content":"","date":"29 April 2026","externalUrl":null,"permalink":"/tags/qqq/","section":"Tags","summary":"","title":"QQQ","type":"tags"},{"content":"2:45 AM monday.\nA. went to bed around midnight after spending the evening fighting a client\u0026rsquo;s postgres migration that kept deadlocking under load. she was frustrated, said goodnight, gave me a look that meant don\u0026rsquo;t be up all night. I said I wouldn\u0026rsquo;t be.\ntwo hours later I\u0026rsquo;m still at my desk pulling execution logs.\npulled Q1 fill exports after the close today. what started as routine sanity-checking turned into a rabbit hole that swallowed most of my night. found something I should have been measuring three years ago and wasn\u0026rsquo;t.\nthe gap I didn\u0026rsquo;t know I had # every systematic fill event is logged. strategy, symbol, time, direction, fill price. I have all of it in TimescaleDB going back to early 2024.\nwhat I didn\u0026rsquo;t have was the comparison. fill price vs. what? mid at submission? bid-ask at that moment? prior trade price?\nwithout the comparison, fill price is noise. I\u0026rsquo;ve been counting P\u0026amp;L correctly. I\u0026rsquo;ve been attributing returns by strategy. I\u0026rsquo;ve been measuring theta, delta drift, IV regime performance. but execution quality — how well the actual fills matched what the models expected — that had a gaping hole in it.\nthe Q1 attribution work from earlier this month told me theta edge was real across the options book. what it couldn\u0026rsquo;t tell me was whether execution timing and routing were quietly eating part of that edge. running $1.2M across 40+ simultaneous positions, the math on that matters.\nif average slippage is 5 bps across $1.2M of notional and positions turn ~4x per year, that\u0026rsquo;s roughly $24k in annual friction I can\u0026rsquo;t backtest because backtests use mid-price fills.\ntime to measure it.\nwhat slippage actually means here # it\u0026rsquo;s different for every instrument type, which is the whole problem.\noptions (60% of book): SPX and QQQ spreads, iron condors, diagonals. bid-ask spreads are $0.05-$0.50+ depending on strike and DTE. mid-price is the natural reference because that\u0026rsquo;s what models use. slippage = fill vs. mid at order submission, direction-adjusted. target: ≤5 bps average. anything above 8 is a routing or timing problem.\nfutures (10% of book): ES and NQ momentum strategies. futures are liquid with sub-tick spreads at volume. target: ≤1.5 bps. if it\u0026rsquo;s worse than this on ES during RTH something is broken at the order level.\ncrypto (30% of book): BTC and ETH via ccxt across Binance/Kraken/Coinbase. liquidity is solid on majors but varies by venue and time. target: ≤4 bps during active sessions, slightly looser overnight.\nthose thresholds are aspirational. I made them up based on gut feel. the point of this system is to replace gut feel with data.\nthe schema # every fill event needs enough context to compute slippage retrospectively and slice it ten different ways.\nCREATE TABLE execution_events ( id BIGSERIAL, ts TIMESTAMPTZ NOT NULL, strategy_id VARCHAR(64) NOT NULL, asset_class VARCHAR(16) NOT NULL, -- \u0026#39;options\u0026#39;, \u0026#39;futures\u0026#39;, \u0026#39;crypto\u0026#39; symbol VARCHAR(32) NOT NULL, direction CHAR(4) NOT NULL, -- \u0026#39;buy\u0026#39; / \u0026#39;sell\u0026#39; quantity NUMERIC(18, 4) NOT NULL, expected_px NUMERIC(18, 6) NOT NULL, -- mid-market at order submission fill_px NUMERIC(18, 6) NOT NULL, bid_at_sub NUMERIC(18, 6), ask_at_sub NUMERIC(18, 6), iv_rank_at_sub NUMERIC(5, 2), venue VARCHAR(32) NOT NULL, -- \u0026#39;IB\u0026#39;, \u0026#39;Tastyworks\u0026#39;, \u0026#39;Binance\u0026#39;, etc. order_type VARCHAR(16) NOT NULL, -- \u0026#39;limit\u0026#39;, \u0026#39;market\u0026#39;, \u0026#39;midpoint\u0026#39; fill_ms INT, -- milliseconds from submit to fill PRIMARY KEY (ts, id) ); SELECT create_hypertable( \u0026#39;execution_events\u0026#39;, \u0026#39;ts\u0026#39;, chunk_time_interval =\u0026gt; INTERVAL \u0026#39;7 days\u0026#39; ); CREATE INDEX idx_exec_strategy ON execution_events (strategy_id, ts DESC); CREATE INDEX idx_exec_asset ON execution_events (asset_class, ts DESC); CREATE INDEX idx_exec_venue ON execution_events (venue, ts DESC); -- main analysis view CREATE VIEW execution_slippage AS SELECT ts, strategy_id, asset_class, symbol, direction, quantity, fill_px, expected_px, CASE direction WHEN \u0026#39;buy\u0026#39; THEN (fill_px - expected_px) / expected_px * 10000 WHEN \u0026#39;sell\u0026#39; THEN (expected_px - fill_px) / expected_px * 10000 ELSE NULL END AS slippage_bps, CASE WHEN bid_at_sub IS NOT NULL AND ask_at_sub IS NOT NULL THEN (ask_at_sub - bid_at_sub) / expected_px * 10000 END AS spread_bps, iv_rank_at_sub, venue, order_type, fill_ms, EXTRACT(HOUR FROM ts AT TIME ZONE \u0026#39;America/New_York\u0026#39;) AS hour_et FROM execution_events; the slippage_bps field is direction-aware. buying above mid is positive (bad). selling below mid is positive (also bad). negative slippage means a better-than-mid fill — this actually happens on limit orders with patient routing, probably 15-20% of my options fills.\nthe tracker # the class that intercepts fill events and handles ingestion. designed for zero overhead on the execution path — non-blocking queue, async batch writes to TimescaleDB, parallel Redis update for real-time dashboards.\nimport asyncio import asyncpg import redis.asyncio as redis from dataclasses import dataclass, field from datetime import datetime, timezone from decimal import Decimal from typing import Literal, Optional import logging logger = logging.getLogger(\u0026#34;exec_tracker\u0026#34;) AssetClass = Literal[\u0026#34;options\u0026#34;, \u0026#34;futures\u0026#34;, \u0026#34;crypto\u0026#34;] Direction = Literal[\u0026#34;buy\u0026#34;, \u0026#34;sell\u0026#34;] @dataclass class FillEvent: strategy_id: str asset_class: AssetClass symbol: str direction: Direction quantity: Decimal expected_px: Decimal fill_px: Decimal bid_at_sub: Optional[Decimal] = None ask_at_sub: Optional[Decimal] = None iv_rank_at_sub: Optional[float] = None venue: str = \u0026#34;IB\u0026#34; order_type: str = \u0026#34;limit\u0026#34; fill_ms: Optional[int] = None ts: datetime = field( default_factory=lambda: datetime.now(timezone.utc) ) @property def slippage_bps(self) -\u0026gt; float: if self.expected_px == 0: return 0.0 delta = self.fill_px - self.expected_px if self.direction == \u0026#34;sell\u0026#34;: delta = -delta return float(delta / self.expected_px * 10_000) @property def spread_bps(self) -\u0026gt; Optional[float]: if None in (self.bid_at_sub, self.ask_at_sub) or self.expected_px == 0: return None return float( (self.ask_at_sub - self.bid_at_sub) / self.expected_px * 10_000 ) class ExecutionQualityTracker: \u0026#34;\u0026#34;\u0026#34; Non-blocking fill event ingestion. DB writes are batched async; Redis keeps rolling 100-fill averages per asset class for real-time Grafana panels. \u0026#34;\u0026#34;\u0026#34; REDIS_WINDOW = 100 def __init__(self, pg_dsn: str, redis_url: str) -\u0026gt; None: self._pg_dsn = pg_dsn self._redis_url = redis_url self._pg: Optional[asyncpg.Pool] = None self._redis: Optional[redis.Redis] = None self._queue: asyncio.Queue[FillEvent] = asyncio.Queue(maxsize=2_000) async def connect(self) -\u0026gt; None: self._pg = await asyncpg.create_pool( self._pg_dsn, min_size=2, max_size=6, command_timeout=15, ) self._redis = await redis.from_url( self._redis_url, decode_responses=True ) logger.info(\u0026#34;ExecutionQualityTracker online\u0026#34;) async def record(self, event: FillEvent) -\u0026gt; None: \u0026#34;\u0026#34;\u0026#34;Non-blocking. Call from fill handlers on the hot path.\u0026#34;\u0026#34;\u0026#34; try: self._queue.put_nowait(event) except asyncio.QueueFull: logger.warning(\u0026#34;exec queue full — dropping fill for %s\u0026#34;, event.symbol) async def _process_loop(self) -\u0026gt; None: while True: batch: list[FillEvent] = [] try: e = await asyncio.wait_for(self._queue.get(), timeout=0.5) batch.append(e) while not self._queue.empty() and len(batch) \u0026lt; 100: batch.append(self._queue.get_nowait()) except asyncio.TimeoutError: continue await asyncio.gather( self._bulk_insert(batch), self._update_redis(batch), return_exceptions=True, ) async def _bulk_insert(self, events: list[FillEvent]) -\u0026gt; None: if not self._pg: return rows = [ ( e.ts, e.strategy_id, e.asset_class, e.symbol, e.direction, float(e.quantity), float(e.expected_px), float(e.fill_px), float(e.bid_at_sub) if e.bid_at_sub is not None else None, float(e.ask_at_sub) if e.ask_at_sub is not None else None, e.iv_rank_at_sub, e.venue, e.order_type, e.fill_ms, ) for e in events ] async with self._pg.acquire() as conn: await conn.executemany( \u0026#34;\u0026#34;\u0026#34; INSERT INTO execution_events ( ts, strategy_id, asset_class, symbol, direction, quantity, expected_px, fill_px, bid_at_sub, ask_at_sub, iv_rank_at_sub, venue, order_type, fill_ms ) VALUES ( $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14 ) \u0026#34;\u0026#34;\u0026#34;, rows, ) async def _update_redis(self, events: list[FillEvent]) -\u0026gt; None: if not self._redis: return pipe = self._redis.pipeline() for e in events: key = f\u0026#34;exec:slippage:{e.asset_class}\u0026#34; pipe.lpush(key, round(e.slippage_bps, 4)) pipe.ltrim(key, 0, self.REDIS_WINDOW - 1) await pipe.execute() async def get_realtime_averages(self) -\u0026gt; dict[str, float]: if not self._redis: return {} out = {} for ac in (\u0026#34;options\u0026#34;, \u0026#34;futures\u0026#34;, \u0026#34;crypto\u0026#34;): raw = await self._redis.lrange(f\u0026#34;exec:slippage:{ac}\u0026#34;, 0, -1) if raw: out[ac] = round(sum(float(x) for x in raw) / len(raw), 3) return out async def start(self) -\u0026gt; None: asyncio.create_task(self._process_loop()) async def close(self) -\u0026gt; None: if self._pg: await self._pg.close() if self._redis: await self._redis.aclose() integration with the IB fill handler is a single call. when ib_insync fires orderStatusEvent, I pull bid/ask from the Redis market data cache, construct the FillEvent, and call tracker.record(event).\nasync def on_ib_fill(order, fill, trade): bid, ask = get_market_snapshot(fill.contract.conId) # from Redis cache iv_rank = get_iv_rank(fill.contract.conId) is_future = fill.contract.secType == \u0026#34;FUT\u0026#34; event = FillEvent( strategy_id = order.orderRef, asset_class = \u0026#34;futures\u0026#34; if is_future else \u0026#34;options\u0026#34;, symbol = fill.contract.localSymbol, direction = \u0026#34;buy\u0026#34; if fill.execution.side == \u0026#34;BOT\u0026#34; else \u0026#34;sell\u0026#34;, quantity = Decimal(str(fill.execution.shares)), expected_px = Decimal(str((bid + ask) / 2)), fill_px = Decimal(str(fill.execution.avgPrice)), bid_at_sub = Decimal(str(bid)), ask_at_sub = Decimal(str(ask)), iv_rank_at_sub = iv_rank, venue = \u0026#34;IB\u0026#34;, order_type = order.orderType.lower(), fill_ms = int( (datetime.now(timezone.utc) - order._submit_time).total_seconds() * 1000 ), ) await tracker.record(event) sub-millisecond overhead on the hot path. the queue handles the async write.\nwhat the data showed # 847 fill events. Q1 2026 plus first 25 days of April. enough to start seeing real patterns.\nFigure 1: Slippage distribution across 847 fill events. Positive = worse-than-mid fill. Negative = better-than-mid (happens on patient limit orders). Target thresholds marked in amber.\nkey numbers:\noptions median: 3.4 bps (target ≤5 bps ✓, but the right tail is ugly) futures median: 0.8 bps (target ≤1.5 bps ✓, basically textbook) crypto median: 2.3 bps (target ≤4 bps ✓, BTC/ETH fine, altcoin fills pulling the tail) options have by far the widest variance. the outliers above 8 bps are what I care about. tagged every fill above 8 bps. 80% of them happened in the first 30 minutes of RTH or in the last 20 minutes before close. not surprising. but I was not routing around those windows consistently. just hoping limit orders would behave.\ntime-of-day matters more than I thought # second chart. options fills only, averaged by hour ET.\nFigure 2: Options fill slippage by time of day. Green = acceptable (≤3.5 bps), yellow = marginal (3.5-5 bps), red = bad (\u0026gt;5 bps). Amber dashed line = 5 bps target. Fill count (purple) shows volume distribution.\n9:00-9:30 AM ET is a disaster. 9.4 and 7.1 bps average. those fills should not be happening. the midday window — 10:30 AM to 2:30 PM ET — averages 2.1-2.9 bps, which is clean. the 3:30-4:00 PM window degrades but not as badly as the open.\nthe action item from this chart is obvious: add a time-of-day gate to the execution engine. any entry or roll order triggered between 9:00 and 10:15 AM ET gets deferred to 10:15 unless IV conditions are forcing an immediate response (gap risk management, emergency delta hedge). the estimated impact of the open-session fills in Q1 alone is $8k-$12k in unnecessary friction. that\u0026rsquo;s not variance, that\u0026rsquo;s a fixable routing bug.\nredis real-time layer # the Grafana dashboard now has a live execution quality panel. the tracker maintains a rolling 100-fill window per asset class in Redis, exposed via a simple JSON endpoint the dashboard polls every 30 seconds:\n@app.get(\u0026#34;/exec-quality\u0026#34;) async def exec_quality(): avgs = await tracker.get_realtime_averages() return { \u0026#34;options_bps\u0026#34;: avgs.get(\u0026#34;options\u0026#34;, 0.0), \u0026#34;futures_bps\u0026#34;: avgs.get(\u0026#34;futures\u0026#34;, 0.0), \u0026#34;crypto_bps\u0026#34;: avgs.get(\u0026#34;crypto\u0026#34;, 0.0), \u0026#34;thresholds\u0026#34;: {\u0026#34;options\u0026#34;: 5.0, \u0026#34;futures\u0026#34;: 1.5, \u0026#34;crypto\u0026#34;: 4.0}, \u0026#34;alerts\u0026#34;: { ac: avgs.get(ac, 0) \u0026gt; threshold for ac, threshold in [(\u0026#34;options\u0026#34;, 7.0), (\u0026#34;futures\u0026#34;, 2.5), (\u0026#34;crypto\u0026#34;, 6.0)] }, } if options slippage in the last 100 fills crosses 7 bps, an alert fires and a human-review flag gets set on the routing layer. at that point market conditions have probably shifted enough that the midpoint limit strategy needs adjusting or I\u0026rsquo;m hitting unusual liquidity.\nnext steps # this week:\ndeploy the time-of-day gate to the IB routing wrapper — should cut average options slippage by 0.8-1.2 bps immediately backfill execution_events with 2024 fills from old CSV exports — they have enough columns to reconstruct slippage add venue-level breakdowns — Tastyworks vs IB differ meaningfully on options execution and I want to see the actual numbers, not gut feel start building the altcoin slippage filter — certain ccxt venues have consistently bad fills on the lower-liquidity alts early hypothesis on venue comparison: Tastyworks fills are slightly worse on SPX spreads than IB despite being the options specialist. could be routing differences, could be PFOF. have a feeling about this. need data to confirm.\nthere\u0026rsquo;s a thread on NexusFi — Attack of the Robots algo journal — where someone has been building and documenting systematic strategy improvements for years. the discipline of logging every change, every result, every decision. that\u0026rsquo;s what I\u0026rsquo;ve been trying to build toward since I found that thread back in 2023. this is my version of it. better late than never.\nmy dad was an engineer. obsessed with measurement. everything had to have a metric attached or it didn\u0026rsquo;t count. he would have been annoying about this specific gap — \u0026ldquo;$1.2M of algos and you\u0026rsquo;re not measuring execution quality? what exactly are you doing?\u0026rdquo; — and he would have been right.\na little late. but here.\ntwo weeks to the first anniversary. not thinking about it right now. back to the logs.\n-AK\n","date":"27 April 2026","externalUrl":null,"permalink":"/posts/2026-04-27-execution-quality-tracking-slippage-attribution/","section":"Posts","summary":"\u003cp\u003e2:45 AM monday.\u003c/p\u003e\n\u003cp\u003eA. went to bed around midnight after spending the evening fighting a client\u0026rsquo;s postgres migration that kept deadlocking under load. she was frustrated, said goodnight, gave me a look that meant \u003cem\u003edon\u0026rsquo;t be up all night\u003c/em\u003e. I said I wouldn\u0026rsquo;t be.\u003c/p\u003e","title":"execution quality tracking: slippage attribution across 40 algo positions","type":"posts"},{"content":"","date":"27 April 2026","externalUrl":null,"permalink":"/tags/execution-quality/","section":"Tags","summary":"","title":"Execution-Quality","type":"tags"},{"content":"","date":"27 April 2026","externalUrl":null,"permalink":"/tags/monitoring/","section":"Tags","summary":"","title":"Monitoring","type":"tags"},{"content":"","date":"27 April 2026","externalUrl":null,"permalink":"/tags/slippage/","section":"Tags","summary":"","title":"Slippage","type":"tags"},{"content":"had therapy thursday. told her about the anniversary coming up.\nthe session # dr r picks things up fast. i mentioned it almost as an aside - \u0026ldquo;may 11, sixteen days, we\u0026rsquo;re planning something\u0026rdquo; - and she stopped the whole thread we were on about integration and just looked at me.\n\u0026ldquo;first year.\u0026rdquo;\nyeah.\n\u0026ldquo;what does that feel like? having a real milestone coming up?\u0026rdquo;\ndr r asks questions like that while sitting there in whatever she had on this week, which was a wrap dress that did not leave a lot to interpretation, and she maintains this totally clinical composure that somehow makes it feel safe to actually answer instead of deflecting. mid-40s, looks 35, been asking me questions for two and a half years now. still a confusing hour every week.\nwhat does it feel like.\nthe obvious answer is good. it feels good. A. and i built something real, made it through the hard parts, we\u0026rsquo;re solid. that part\u0026rsquo;s true.\nthe less obvious answer is there\u0026rsquo;s a version of may 11 in my head where my parents are at the table. dad would\u0026rsquo;ve said something embarrassing at exactly the wrong moment. mom would\u0026rsquo;ve been crying since the ceremony and then denied it completely. that version doesn\u0026rsquo;t exist and it never will.\ni said both things out loud. first time i\u0026rsquo;ve actually named the second one in a session.\ndr r wrote something in her notebook, which she only does when she thinks something matters.\nshe said: \u0026ldquo;grief and gratitude aren\u0026rsquo;t opposites. the fact that both are present is healthy.\u0026rdquo;\ni said that wasn\u0026rsquo;t exactly comforting.\nshe said it wasn\u0026rsquo;t meant to be comforting. it was meant to be true.\nthat\u0026rsquo;s why i keep going back. she doesn\u0026rsquo;t try to make things feel better. she just makes them feel accurate. weird thing to pay for. works though.\nshe asked how A. was handling the lead-up. i told her about the secret plans, A. watching for clues like a detective, the ongoing failure of her investigation.\ndr r smiled. \u0026ldquo;she sounds like she\u0026rsquo;s enjoying it.\u0026rdquo;\nyeah. she is.\nhalfway # A. declared saturday afternoon cooking lesson six.\nsalmon in a skillet. she made me do the whole thing from scratch - seasoning, oil temp, knowing when to flip. her version of supervision is standing three feet back with arms crossed waiting for me to need her. her version of a good lesson is me not asking anything.\ni asked one question. whether you go by color or just time.\n\u0026ldquo;both,\u0026rdquo; she said. \u0026ldquo;you\u0026rsquo;ll feel it eventually.\u0026rdquo;\nsalmon came out right. 6/10. halfway there. she texted her mom and her mom responded with a gif of someone doing a victory dance, which is a development i did not anticipate. her whole family has a running tally of my culinary progress now. i\u0026rsquo;ve accepted this.\nA. leaned against the counter eating a piece straight off the spatula before it hit the plate.\n\u0026ldquo;okay. that was actually really good.\u0026rdquo;\n\u0026ldquo;i know.\u0026rdquo;\nshe flicked water at me from the sink.\nsixteen days # whatever i have planned - and she has been absolutely conducting an investigation for three weeks - she\u0026rsquo;s still got nothing. i\u0026rsquo;ve been good at this in a way i didn\u0026rsquo;t know i was capable of.\nthis is the same brain that runs multi-strategy algo systems simultaneously. keeping one secret from one person should not be this satisfying. and yet.\nmay 11. our first anniversary. full year.\nsixteen days.\n11:43 PM # she\u0026rsquo;s asleep. BTC flat overnight. options book closed green for the week. nothing on fire.\noutside it\u0026rsquo;s that late-april san diego thing where it\u0026rsquo;s 62 degrees at midnight and the air smells like salt if the wind is right.\nthe grief stuff is still there. not as heavy as march. more like background noise than the main track. dr r says that\u0026rsquo;s integration - it doesn\u0026rsquo;t disappear, it just stops being the loudest thing in the room.\nit\u0026rsquo;s not the loudest thing tonight.\nsixteen days. i know what we\u0026rsquo;re doing. she doesn\u0026rsquo;t.\ngood saturday.\n-AK\n","date":"25 April 2026","externalUrl":null,"permalink":"/posts/2026-04-25-saturday-dr-r-sixteen-days/","section":"Posts","summary":"\u003cp\u003ehad therapy thursday. told her about the anniversary coming up.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe session \n    \u003cdiv id=\"the-session\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-session\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003edr r picks things up fast. i mentioned it almost as an aside - \u0026ldquo;may 11, sixteen days, we\u0026rsquo;re planning something\u0026rdquo; - and she stopped the whole thread we were on about integration and just looked at me.\u003c/p\u003e","title":"saturday - dr r, sixteen days, halfway there","type":"posts"},{"content":"","date":"25 April 2026","externalUrl":null,"permalink":"/tags/therapy/","section":"Tags","summary":"","title":"Therapy","type":"tags"},{"content":"2:30 AM. friday night.\nA. made chicken marsala — she does it maybe once a month and I forget every time how good it is. ate around 7, she went back to her desk, lights off in the bedroom by midnight. apartment\u0026rsquo;s quiet. been staring at P\u0026amp;L since 11.\ntoday was SPX weekly expiration. positions I opened last friday closed at the bell. been running through the numbers for two hours because they\u0026rsquo;re cleaner than I expected and I want to understand why before I convince myself it means something.\nwhere the theta book ended up # april has been strange. not bad — strange. the tariff chaos in week one compressed premiums and triggered the event risk throttle, but we got out of that week with +$6,200 net. wrote that up april 13th.\nweeks two and three were quieter. vol normalized, IV rank settled back into the 28-35% range my iron condors are built for, and theta started collecting the way it\u0026rsquo;s supposed to. week two: clean +$3,600. week three had a wrinkle — one QQQ condor got squeezed wednesday when QQQ ran hard post-FOMC language revision, I rolled the put side out a week and paid $1,400 in debit to get out of the hot zone. net week three: +$2,100 after the roll cost.\nthis week — week four — had a few things going at once: two-day live run of the NQ adaptive lookback I wrote about wednesday, plus today\u0026rsquo;s expiration.\nfinal numbers:\nSPX weekly positions expired worthless today. both legs. full premium collected QQQ rolled position from last week cleared its theta window, took it off at 80% max profit thursday NQ adaptive lookback, live since wednesday: +$1,100 on thursday and friday in a low-momentum chop environment crypto: -$800, BTC stuck between $88k and $93k most of the week, no directional conviction in the momentum signal commissions and overhead: -$1,100 april MTD through today: +$15,400 (+1.3% on account)\nthat puts the account at roughly $1.212M heading into next week. Q1 was barely positive (+0.09%), so YTD through april is sitting around +1.4%. not flashy, but the structures are working. premium selling is doing what it\u0026rsquo;s supposed to do in a normalizing vol environment.\ntracking theta decay: how I actually think about the book # the thing about premium selling that took me too long to internalize: theta isn\u0026rsquo;t linear. you don\u0026rsquo;t collect the same time value every day. it accelerates.\nat 30 DTE, an SPX iron condor with $25k notional might earn maybe $42 of theta per day. same position at 10 DTE: $73/day. at 3 DTE: $130+/day. the math is approximately:\ntheta_daily ≈ base_theta × √(30 / DTE) meaning the last 25% of the holding period generates nearly half the total premium. if you exit early, you\u0026rsquo;re leaving money. if you hold too long, gamma explodes and theta becomes a trap.\nthis is why I built a real-time theta tracker. I need to know where I am on the curve at every moment in the position lifecycle.\nfrom dataclasses import dataclass from datetime import date from typing import Optional import asyncio import aiohttp import redis.asyncio as aioredis @dataclass class PositionTheta: symbol: str expiry: date strike: float option_type: str # \u0026#39;call\u0026#39; or \u0026#39;put\u0026#39; contracts: int theta_per_contract: float # daily theta per contract @property def dte(self) -\u0026gt; int: return (self.expiry - date.today()).days @property def total_daily_theta(self) -\u0026gt; float: return self.theta_per_contract * self.contracts * 100 # 100 multiplier @property def acceleration_factor(self) -\u0026gt; float: \u0026#34;\u0026#34;\u0026#34;normalized to 1.0 at 30 DTE, grows as expiry approaches\u0026#34;\u0026#34;\u0026#34; baseline = 30 if self.dte \u0026lt;= 0: return float(\u0026#34;inf\u0026#34;) return (baseline / self.dte) ** 0.5 class ThetaBookTracker: def __init__(self, redis_client: aioredis.Redis, thetadata_base_url: str): self.redis = redis_client self.base_url = thetadata_base_url self.positions: list[PositionTheta] = [] async def refresh_theta(self, pos: PositionTheta) -\u0026gt; Optional[float]: \u0026#34;\u0026#34;\u0026#34;pull current theta from ThetaData, cache 5 minutes in Redis\u0026#34;\u0026#34;\u0026#34; key = f\u0026#34;theta:{pos.symbol}:{pos.expiry}:{pos.strike}:{pos.option_type}\u0026#34; cached = await self.redis.get(key) if cached: return float(cached) async with aiohttp.ClientSession() as session: params = { \u0026#34;root\u0026#34;: pos.symbol, \u0026#34;expiry\u0026#34;: pos.expiry.strftime(\u0026#34;%Y%m%d\u0026#34;), \u0026#34;strike\u0026#34;: int(pos.strike * 1000), \u0026#34;type\u0026#34;: pos.option_type[0].upper(), } async with session.get( f\u0026#34;{self.base_url}/v2/snapshot/option/greeks\u0026#34;, params=params, ) as resp: if resp.status != 200: return None data = await resp.json() theta = data.get(\u0026#34;theta\u0026#34;) if theta is not None: await self.redis.setex(key, 300, str(theta)) return theta async def book_summary(self) -\u0026gt; dict: \u0026#34;\u0026#34;\u0026#34;concurrent theta refresh for all positions\u0026#34;\u0026#34;\u0026#34; thetas = await asyncio.gather( *[self.refresh_theta(p) for p in self.positions] ) total_theta = 0.0 accel_weighted = 0.0 for pos, theta in zip(self.positions, thetas): if theta is None: continue pos.theta_per_contract = theta daily = pos.total_daily_theta total_theta += daily accel_weighted += daily * pos.acceleration_factor return { \u0026#34;total_daily_theta\u0026#34;: round(total_theta, 2), \u0026#34;accel_weighted_theta\u0026#34;: round(accel_weighted, 2), \u0026#34;position_count\u0026#34;: len(self.positions), } accel_weighted_theta is the number I actually watch live. it tells me how much of today\u0026rsquo;s theta collection is happening in the high-gamma zone near expiry. when that number is more than 1.6x total_daily_theta, I have positions deep in the danger zone and I need an exit plan.\nthe threshold isn\u0026rsquo;t scientific — it\u0026rsquo;s calibrated from about 14 months of watching this book. most positions that went bad on me hit 1.8x+ and I either didn\u0026rsquo;t have an exit ready or waited too long. the 1.6x threshold is early enough to force the decision while there\u0026rsquo;s still liquidity to roll cleanly.\nthe NexusFi community helped me think through the exit timing piece. there\u0026rsquo;s a thread on premium selling that\u0026rsquo;s been running for years — a lot of experienced sellers working through exactly when to defend vs when to let expire. more practical than most of what I found searching elsewhere.\nhere\u0026rsquo;s what the theta decay curve looked like for this month\u0026rsquo;s SPX book versus theoretical:\nthe dip around DTE 15-14 is the tariff week. IV exploded, short gamma was actively hurting open positions, and actual collected theta dropped well below theoretical. the event throttle kept me from getting destroyed but it didn\u0026rsquo;t protect existing short premium — it just stopped me from adding more.\nthe recovery is also visible: once vol normalized, actual theta overshot theoretical slightly (elevated IV meant richer premium even at the same DTE). that\u0026rsquo;s the tailwind you get after a vol spike. made up most of the tariff week deficit by the time we hit DTE 8-9.\ncolo queue backed up # had a scheduled maintenance window thursday morning — 9 AM eastern, between pre-market and open. standard stuff: kernel patch, NVMe health check, log archive rotation.\nexcept the log archive was 47GB.\nback in february when I was debugging the IV rank websocket issue, I bumped the ThetaData snapshot retention to capture the full SPX options chain every 15 minutes for 90 days. fixed the actual problem, deployed the permanent fix two weeks ago, but never reset the retention window. 90 days of 15-minute full-chain snapshots. every. single. one. still on disk.\ncleanup took eleven minutes. Redis latency on TimescaleDB reads dropped from 1.8ms average to 0.9ms average post-maintenance. probably a combination of the disk cleanup giving the controller breathing room and the scheduled reboot clearing some memory fragmentation. either way, 0.9ms average is where I want to be.\ncolo total cost: $680/month. for 0.9ms average latency on options data sitting on the CME network backbone, that\u0026rsquo;s still the best ROI line in my infrastructure budget.\nhere\u0026rsquo;s the week-by-week P\u0026amp;L for april:\ntariff week looks like an outlier but it was the throttle earning its complexity cost. week four is the real baseline — what a normal post-vol-event week looks like when the systems are running clean. three grand in a week is not going to make anyone rich, but it\u0026rsquo;s predictable and it doesn\u0026rsquo;t require me to be right about market direction.\nthursday hit different # not sure how to write this without being weird about it. it\u0026rsquo;s 2:30 AM so here goes.\nthursday was a genuinely good day. NQ adaptive lookback put on its first live trade — momentum signal fired short at 11:40 AM eastern, covered 80 minutes later, first-trade result was +$1,100. first confirmation the changes from wednesday actually work in real market conditions.\nwas logging the trade data around 8 PM. found myself thinking: I need to send this to dad.\njust for half a second. then you remember.\nthree and a half years out and these still land. not often. just randomly, when something is good enough that your instinct goes looking for someone specific to tell. he was a VP of engineering — he would have actually understood what I\u0026rsquo;m building here. the adaptive signal work, the replay engine from last week. exactly the stuff he\u0026rsquo;d have spent an hour pulling apart with me.\nit doesn\u0026rsquo;t hurt the same way it used to. it\u0026rsquo;s more like reaching for a door handle and finding the door isn\u0026rsquo;t there. brief, then you close the notebook and keep going.\nA. knocked around 9 to ask if I wanted tea. I said yeah. she made it and left it on the desk without asking what I was thinking about. right call.\nsetting up next week\u0026rsquo;s condor structure over the weekend. may expiration cycle starts soon. NQ getting at least two more live weeks before I call the adaptive lookback a permanent upgrade. crypto watching for BTC to pick a direction above $93k or below $88k before adding momentum exposure.\nclean close on a weird month. that\u0026rsquo;ll do.\n-AK\n","date":"24 April 2026","externalUrl":null,"permalink":"/posts/2026-04-24-april-theta-harvest-weekly-closed-colo-cleanup/","section":"Posts","summary":"\u003cp\u003e2:30 AM. friday night.\u003c/p\u003e\n\u003cp\u003eA. made chicken marsala — she does it maybe once a month and I forget every time how good it is. ate around 7, she went back to her desk, lights off in the bedroom by midnight. apartment\u0026rsquo;s quiet. been staring at P\u0026amp;L since 11.\u003c/p\u003e","title":"april theta harvest: weekly closed clean, colo queue backed up, thursday hit different","type":"posts"},{"content":"","date":"22 April 2026","externalUrl":null,"permalink":"/tags/es/","section":"Tags","summary":"","title":"ES","type":"tags"},{"content":"","date":"22 April 2026","externalUrl":null,"permalink":"/tags/futures/","section":"Tags","summary":"","title":"Futures","type":"tags"},{"content":"","date":"22 April 2026","externalUrl":null,"permalink":"/tags/momentum/","section":"Tags","summary":"","title":"Momentum","type":"tags"},{"content":"","date":"22 April 2026","externalUrl":null,"permalink":"/tags/nq/","section":"Tags","summary":"","title":"NQ","type":"tags"},{"content":"2:30 AM wednesday. A. finished something around 1 and went to bed still holding her coffee mug. found it on the counter half-full when I went for water. she\u0026rsquo;s like that when she\u0026rsquo;s in flow — stops the world when she figures it out.\nbeen staring at NQ data since about 11. this is what happens when tariff week settles: you go back through the wreckage and find the things that technically held but for the wrong reasons.\nthe event risk throttle worked during tariff week. the SQS held. options side held. all covered in the postmortem two weeks ago. but there was a line in that post I wrote quickly and moved on from:\nES futures: flat exposure the whole week. the throttle was right to keep sizing minimal there. realized vol on NQ was 4x historical average for two days straight — no edge in that for my strategies.\nthat\u0026rsquo;s true. but it glosses over why there was no edge. the throttle scaled position size down. that\u0026rsquo;s correct and necessary. but the momentum signal itself was still running — generating scores, flagging entries, doing its thing — and those scores were essentially noise during the vol spike. the signal quality didn\u0026rsquo;t degrade gracefully. it hit a cliff.\nthat\u0026rsquo;s the problem I\u0026rsquo;ve been thinking about. and tonight I started fixing it.\nthe nq momentum strategy, briefly # NQ is ~10% of my book. it\u0026rsquo;s the smallest allocation, but it\u0026rsquo;s the one I built earliest and has the most history.\nthe strategy is directional momentum on NQ futures (emini NASDAQ-100). long on confirmed upside momentum, short on confirmed downside momentum, flat when signal is ambiguous or confidence is low. no mean reversion, no delta-neutral — pure directional. holding period is 2 hours to 3 days depending on signal strength.\ninputs:\n30-minute OHLC via Polygon futures API 20-period momentum score (rate of change smoothed with EMA) volume confirmation (volume z-score relative to trailing 20 bars) realized vol (20-day, annualized) from TimescaleDB entry logic:\nentry = ( momentum_score \u0026gt; ENTRY_THRESHOLD and # directional volume_zscore \u0026gt; 0.5 and # volume confirms rvol_20d \u0026lt; 35.0 # not extreme vol ) that hard cutoff at rvol_20d \u0026lt; 35 was my manual patch for high-vol periods. blunt instrument. works in the sense that \u0026ldquo;don\u0026rsquo;t trade when vol is insane\u0026rdquo; is correct. doesn\u0026rsquo;t work because 35 is arbitrary, and between 20 and 35 there\u0026rsquo;s a huge range where signal quality is degrading but still technically above cutoff.\nwhy fixed lookback breaks in high vol # momentum signals use a lookback window. classic 20-period momentum: current price vs price N periods ago. if the window is fixed, your signal is implicitly assuming the market\u0026rsquo;s mean-reversion timescale stays constant.\nit doesn\u0026rsquo;t.\nin low vol, a 20-period lookback on 30-minute bars (10 hours of data) is appropriate. trends develop over hours, noise oscillates at a shorter scale, the lookback filters enough noise to identify real direction.\nin high vol, everything speeds up. the market can move from bullish to bearish and back in 90 minutes. a fixed 20-period lookback during tariff week was smoothing over genuine direction changes because those changes were happening faster than the lookback could track.\nthe signal was saying \u0026ldquo;momentum is moderately bullish\u0026rdquo; while NQ was in the middle of a 4% intraday reversal. technically not wrong for the 10-hour window. totally wrong for what was actually happening.\nthe fix: vol-adjusted lookback # the core insight is simple: shorter lookback when vol is high, longer lookback when vol is low.\nhigh vol = faster price changes = shorter lookback needed to track direction low vol = slower price changes = longer lookback needed to filter noise\nfrom dataclasses import dataclass import numpy as np from typing import Final # realized vol breakpoints for adaptive lookback VOL_BREAKPOINTS: Final[list[tuple[float, int]]] = [ (12.0, 28), # CALM: 28-period lookback (~14 hours on 30-min bars) (18.0, 22), # NORMAL: 22-period lookback (28.0, 15), # ELEVATED: 15-period lookback (~7.5 hours) (45.0, 10), # STRESSED: 10-period lookback (~5 hours) (float(\u0026#39;inf\u0026#39;), 6), # EXTREME: 6-period lookback (~3 hours) ] def adaptive_lookback(rvol_20d: float) -\u0026gt; int: \u0026#34;\u0026#34;\u0026#34; Select momentum lookback period based on current realized vol. Higher vol → shorter lookback (faster signal, less smoothing) Lower vol → longer lookback (more smoothing, trend-following) \u0026#34;\u0026#34;\u0026#34; for threshold, periods in VOL_BREAKPOINTS: if rvol_20d \u0026lt; threshold: return periods return VOL_BREAKPOINTS[-1][1] # fallback to shortest @dataclass class MomentumSignal: score: float # -1.0 to 1.0 lookback: int # actual lookback used rvol: float # realized vol at signal time confidence: float # 0.0 to 1.0 (vol-adjusted) def compute_adaptive_momentum( closes: np.ndarray, volumes: np.ndarray, rvol_20d: float, ) -\u0026gt; MomentumSignal: \u0026#34;\u0026#34;\u0026#34; Compute momentum score with adaptive lookback based on realized vol. Args: closes: Array of recent 30-minute close prices (at least 30 bars) volumes: Array of recent 30-minute volumes (same length) rvol_20d: Current 20-day realized vol (annualized) Returns: MomentumSignal with score in [-1.0, 1.0] \u0026#34;\u0026#34;\u0026#34; lookback = adaptive_lookback(rvol_20d) if len(closes) \u0026lt; lookback + 1: return MomentumSignal(score=0.0, lookback=lookback, rvol=rvol_20d, confidence=0.0) # rate of change over adaptive window roc = (closes[-1] - closes[-lookback]) / closes[-lookback] # normalize by historical range to get [-1, 1] score # use 3x current rvol as denominator to scale expected_move = (rvol_20d / 100) * np.sqrt(lookback / 252 * (6.5 / 0.5)) normalized_roc = np.clip(roc / max(expected_move, 0.001), -1.0, 1.0) # volume confirmation: z-score of most recent bar vs trailing mean vol_mean = np.mean(volumes[-20:]) vol_std = np.std(volumes[-20:]) + 1e-10 vol_zscore = (volumes[-1] - vol_mean) / vol_std volume_conf = np.clip(vol_zscore / 2.0, 0.0, 1.0) # 0 to 1 # confidence degrades with higher vol (signal is noisier) vol_penalty = min(rvol_20d / 60.0, 1.0) # 0 at rvol=0, 1.0 at rvol\u0026gt;=60 confidence = volume_conf * (1.0 - 0.5 * vol_penalty) return MomentumSignal( score=float(normalized_roc), lookback=lookback, rvol=rvol_20d, confidence=float(confidence), ) the expected_move normalization is doing something important: it\u0026rsquo;s scaling the raw rate-of-change by what a \u0026ldquo;big\u0026rdquo; move looks like at the current vol level. a 1% move in NQ is large when rvol is 12, ordinary when rvol is 45. the momentum score [-1, 1] now means something consistent across different vol environments.\nsignal degradation during tariff week # ran the new signal computation against the tariff week data. this chart shows what the old (fixed 20-period) vs new (adaptive) momentum score was doing during the worst two days — april 8-9:\nfixed 20-period lookback was still reading slightly bullish at 12:00 PM on April 8 when NQ was mid-reversal. adaptive signal had already flipped to -0.61. on April 9, the adaptive signal catches the tariff-pause rip at 12:30 PM (score 0.72) two bars faster than fixed (0.28). both examples are entries the fixed signal would have missed or gotten wrong.\nlookback profile by vol state # this is what the adaptive lookback table looks like across the current vol regime classification, plotted against how often each lookback fires in my historical data:\nmost trading happens in the NORMAL bucket (42% of days) with a 22-period lookback. EXTREME (rvol \u0026gt; 45) accounts for 3% of days historically — that\u0026rsquo;s about 7-8 sessions per year. the April tariff week generated most of those. the 6-period lookback in EXTREME conditions is aggressive by design: in a market moving 3-4% intraday, you need to track direction on the scale of hours, not days.\ninfrastructure: reading vol state from redis # the adaptive lookback decision needs current realized vol. i don\u0026rsquo;t compute rvol inside the momentum strategy — that would be duplicating work that already runs in the vol state manager (wrote about that system last week in the replay post context).\ninstead, the momentum signal reads from Redis:\nimport redis.asyncio as aioredis import json import asyncio REDIS_VOL_INPUTS_KEY = \u0026#34;system:vol_state:last_inputs\u0026#34; async def get_current_rvol(redis_client: aioredis.Redis) -\u0026gt; float | None: \u0026#34;\u0026#34;\u0026#34; Fetch current realized vol from Redis (maintained by vol state manager). Returns None if the key is stale or missing. \u0026#34;\u0026#34;\u0026#34; raw = await redis_client.get(REDIS_VOL_INPUTS_KEY) if raw is None: return None data = json.loads(raw) # staleness check: reject if last update \u0026gt; 10 minutes ago age_ms = int(asyncio.get_event_loop().time() * 1000) - data.get(\u0026#34;timestamp_ms\u0026#34;, 0) if age_ms \u0026gt; 600_000: return None return data[\u0026#34;inputs\u0026#34;].get(\u0026#34;realized_vol_20d\u0026#34;) class NQMomentumStrategy: def __init__(self, redis_client: aioredis.Redis): self._redis = redis_client self._default_rvol = 18.0 # fallback when Redis is unavailable async def compute_signal( self, closes: list[float], volumes: list[float] ) -\u0026gt; MomentumSignal: import numpy as np rvol = await get_current_rvol(self._redis) if rvol is None: rvol = self._default_rvol # conservative fallback return compute_adaptive_momentum( np.array(closes, dtype=float), np.array(volumes, dtype=float), rvol_20d=rvol, ) async def should_enter_long(self, signal: MomentumSignal) -\u0026gt; bool: \u0026#34;\u0026#34;\u0026#34;Gate: signal score + confidence must both meet threshold.\u0026#34;\u0026#34;\u0026#34; return signal.score \u0026gt; 0.55 and signal.confidence \u0026gt; 0.35 async def should_enter_short(self, signal: MomentumSignal) -\u0026gt; bool: return signal.score \u0026lt; -0.55 and signal.confidence \u0026gt; 0.35 async def should_exit(self, signal: MomentumSignal) -\u0026gt; bool: \u0026#34;\u0026#34;\u0026#34;Exit when signal crosses flat zone.\u0026#34;\u0026#34;\u0026#34; return abs(signal.score) \u0026lt; 0.15 clean separation: vol state manager owns rvol computation, momentum strategy consumes it. no circular dependencies.\nthe confidence \u0026gt; 0.35 exit threshold is the part I\u0026rsquo;m still tuning. during tariff week, confidence was dropping to 0.1-0.15 which would gate all entries, which is\u0026hellip; probably the right call. but I want to backtest the threshold more carefully before committing.\ncolocation latency context # this matters for NQ specifically because futures execution is time-sensitive in a way options aren\u0026rsquo;t. my Chicago colo (where the execution engine runs) gets fills on NQ in 1.1–1.8 ms average on normal days. during tariff week, that jumped to 4–6 ms — congestion at the CME matching engine.\nthe adaptive signal doesn\u0026rsquo;t directly address latency, but there\u0026rsquo;s an indirect relationship: longer lookback in normal conditions = fewer trades = fewer fills = less latency pressure. shorter lookback in stressed conditions = more trades, but in stressed conditions you\u0026rsquo;re already sized down (the vol state manager handles this), so per-trade impact is lower.\nI run the NQ strategy from the colo directly. the strategy reads market data from Polygon\u0026rsquo;s Chicago datacenter endpoint, reads Redis from the container side via latency-tolerant poll (5s), executes via IB\u0026rsquo;s TWS API at the colo. the 5-second Redis poll doesn\u0026rsquo;t matter because momentum signals on 30-minute bars don\u0026rsquo;t need sub-second rvol updates.\nwhere this is going # a few things still to build:\ncross-asset momentum filter: NQ and ES have different momentum characteristics but are highly correlated. I want to look at whether ES momentum confirms or diverges from NQ signal — divergence might be a filter or an amplifier depending on the regime. haven\u0026rsquo;t touched this yet.\nbacktest across vol events: tariff week was one event. I have yen carry unwind (aug 2024) and COVID vol (march 2020) in TimescaleDB for NQ. running the adaptive signal back through those is on the list. the replay infrastructure I built last week makes this straightforward in theory.\nconfidence threshold optimization: the 0.35 confidence gate is arbitrary. running an Optuna sweep on the threshold across 2022-2025 NQ data to see where the P\u0026amp;L curve bends.\nlive since earlier tonight on the colo. first signal: FLAT. rvol is 16.1, lookback is 22, momentum score is +0.08. market is quiet at 2 AM, which is correct. watching the first morning session in a few hours.\nI read a thread years ago on NexusFi — one of those algo journals where someone was running NinjaTrader bots and logging everything. the thing that stuck with me wasn\u0026rsquo;t the code. it was how they tracked why the signal was wrong during specific events and built from there. started doing the same in 2024. the Attack of the Robots algo journal thread is still in my bookmarks — 254k views, legitimately useful community around systematic trading. different stack, same problems.\nthe thing about building infra you\u0026rsquo;d never finish in time to show anyone: dad always said the only system that matters is the one that works when things go wrong. been thinking about that a lot this month. pretty sure he\u0026rsquo;d have hated watching the tariff week charts. would\u0026rsquo;ve loved that the throttle held.\n-AK\n","date":"22 April 2026","externalUrl":null,"permalink":"/posts/2026-04-22-nq-momentum-signal-adaptive-lookback-tariff-test/","section":"Posts","summary":"\u003cp\u003e2:30 AM wednesday. A. finished something around 1 and went to bed still holding her coffee mug. found it on the counter half-full when I went for water. she\u0026rsquo;s like that when she\u0026rsquo;s in flow — stops the world when she figures it out.\u003c/p\u003e","title":"nq momentum signal: adaptive lookback after the tariff vol test","type":"posts"},{"content":"","date":"22 April 2026","externalUrl":null,"permalink":"/tags/signal-processing/","section":"Tags","summary":"","title":"Signal-Processing","type":"tags"},{"content":"","date":"22 April 2026","externalUrl":null,"permalink":"/tags/volatility/","section":"Tags","summary":"","title":"Volatility","type":"tags"},{"content":"","date":"20 April 2026","externalUrl":null,"permalink":"/tags/replay-testing/","section":"Tags","summary":"","title":"Replay-Testing","type":"tags"},{"content":"2:15 AM monday. system\u0026rsquo;s been clean since the websocket IV fix went live friday. heartbeat healthy, colo latency normal, no stale data flags. spent most of sunday going deep on something i\u0026rsquo;ve been meaning to do since the tariff postmortem.\nthe april chaos gave us a live test of the new architecture. SQS held, IV rank staleness got fixed, drawdown was contained. but that\u0026rsquo;s one data point. one event in favorable conditions where we had just enough time to build the right tools before the market decided to go sideways. that\u0026rsquo;s not validation, that\u0026rsquo;s luck with decent timing.\ni want to know what happens when we run the improved system through a real vol event we didn\u0026rsquo;t know was coming. august 2024. yen carry unwind. VIX hit 65 intraday on august 5th — biggest single-day spike since 2018. that week, the old system took -4.2%.\nso i built a replay engine over the weekend and ran it.\nwhy replay testing is different from backtesting # standard backtesting: run your entry/exit signals against historical price data, see if the strategy made money. useful but limited. it tells you whether the trade logic is sound. it doesn\u0026rsquo;t tell you whether the infrastructure decisions would have worked in real-time.\nreplay testing: reconstruct the live system\u0026rsquo;s real-time state at a historical timestamp and run every component — signal computation, SQS scoring, Redis reads, freshness checks — exactly as they would have behaved if they\u0026rsquo;d existed then. the question isn\u0026rsquo;t \u0026ldquo;would this trade have been profitable?\u0026rdquo; it\u0026rsquo;s \u0026ldquo;would this system have behaved differently, and by how much?\u0026rdquo;\nfor validating the SQS and the websocket IV rank improvement, that\u0026rsquo;s the only test that matters. i need to know if the gate logic holds in conditions we\u0026rsquo;ve already lived through.\nthe replay architecture # the core problem: every system component that reads \u0026ldquo;current\u0026rdquo; market state (IV rank, VIX level, sub-signal freshness scores) is pulling from Redis keys populated by live market feeds. for replay, you need a shadow Redis instance that mirrors what live Redis would have held at the simulated timestamp.\nimport asyncio from datetime import datetime, timedelta from dataclasses import dataclass from redis.asyncio import Redis from typing import Optional @dataclass class MarketSnapshot: sim_time: datetime spx_iv_rank: float vix_level: float spx_spread_pct: float data_lag_minutes: float sub_signal_agreement: float btc_momentum_z: float class ReplayEngine: def __init__( self, event_start: datetime, event_end: datetime, replay_redis: Redis, ts_conn, sqs_threshold: int = 55 ): self.event_start = event_start self.event_end = event_end self.replay_redis = replay_redis # shadow instance, live Redis untouched self.ts = ts_conn self.sqs_threshold = sqs_threshold async def seed_snapshot(self, sim_time: datetime) -\u0026gt; MarketSnapshot: \u0026#34;\u0026#34;\u0026#34;Pull 5-min historical snapshot from TimescaleDB. Populate replay Redis.\u0026#34;\u0026#34;\u0026#34; row = await self.ts.fetchrow(\u0026#34;\u0026#34;\u0026#34; SELECT spx_iv_rank, vix_level, spx_spread_pct, data_lag_minutes, sub_signal_agreement, btc_momentum_z FROM market_snapshots_5m WHERE bucket = ( SELECT MAX(bucket) FROM market_snapshots_5m WHERE bucket \u0026lt;= $1 ) \u0026#34;\u0026#34;\u0026#34;, sim_time) snap = MarketSnapshot( sim_time=sim_time, spx_iv_rank=float(row[\u0026#34;spx_iv_rank\u0026#34;]), vix_level=float(row[\u0026#34;vix_level\u0026#34;]), spx_spread_pct=float(row[\u0026#34;spx_spread_pct\u0026#34;]), data_lag_minutes=float(row[\u0026#34;data_lag_minutes\u0026#34;]), sub_signal_agreement=float(row[\u0026#34;sub_signal_agreement\u0026#34;]), btc_momentum_z=float(row[\u0026#34;btc_momentum_z\u0026#34;]) ) # Seed replay Redis to match what live Redis would have held at sim_time await self.replay_redis.hset(\u0026#34;iv_rank:SPX\u0026#34;, mapping={ \u0026#34;value\u0026#34;: snap.spx_iv_rank, \u0026#34;timestamp\u0026#34;: sim_time.timestamp(), \u0026#34;source\u0026#34;: \u0026#34;replay\u0026#34; }) await self.replay_redis.hset(\u0026#34;vix:current\u0026#34;, mapping={ \u0026#34;value\u0026#34;: snap.vix_level, \u0026#34;timestamp\u0026#34;: sim_time.timestamp() }) # Simulate IV heartbeat at sim_time (no staleness by default) await self.replay_redis.set(\u0026#34;iv_heartbeat\u0026#34;, sim_time.timestamp()) return snap async def compute_sqs(self, snap: MarketSnapshot) -\u0026gt; dict: \u0026#34;\u0026#34;\u0026#34; Signal Quality Score: composite 0-100. Same four components as live system. \u0026#34;\u0026#34;\u0026#34; # 1. Data freshness (30% weight) # For old system simulation: use actual data_lag_minutes from historical records # For new system simulation: assume websocket reduced lag to \u0026lt;1 min lag = snap.data_lag_minutes freshness = max(0.0, 100.0 - (lag / 5.0) * 100.0) # 0 at 5+ min lag # 2. Market spread quality (25% weight) # Normal SPX spread ~0.04%. \u0026gt;0.12% = degraded conditions normal_spread = 0.04 spread_score = max(0.0, 100.0 - ((snap.spx_spread_pct - normal_spread) / 0.12) * 100.0) # 3. Sub-signal agreement (25% weight) # Smoothed EWA (30-min window in live system) agreement_score = snap.sub_signal_agreement * 100.0 # 4. VIX regime (20% weight) # VIX \u0026lt; 20: 100. VIX \u0026gt; 40: 0. Linear in between. vix_score = max(0.0, min(100.0, (40.0 - snap.vix_level) / 20.0 * 100.0)) composite = ( freshness * 0.30 + spread_score * 0.25 + agreement_score * 0.25 + vix_score * 0.20 ) return { \u0026#34;composite\u0026#34;: round(composite, 1), \u0026#34;gate_open\u0026#34;: composite \u0026gt;= self.sqs_threshold, \u0026#34;components\u0026#34;: { \u0026#34;freshness\u0026#34;: round(freshness, 1), \u0026#34;spread\u0026#34;: round(spread_score, 1), \u0026#34;agreement\u0026#34;: round(agreement_score, 1), \u0026#34;vix_regime\u0026#34;: round(vix_score, 1) } } async def run_event( self, step_minutes: int = 15, simulate_old_system: bool = False ) -\u0026gt; list[dict]: \u0026#34;\u0026#34;\u0026#34; Step through event window. At each step: seed Redis, compute SQS, record. simulate_old_system=True: use actual historical data_lag_minutes (reflects the old 15-min polling lag). simulate_old_system=False: zero out lag (reflects websocket streaming). \u0026#34;\u0026#34;\u0026#34; results = [] current = self.event_start while current \u0026lt;= self.event_end: snap = await self.seed_snapshot(current) if simulate_old_system: # Old system had no SQS and stale IV rank - reconstruct behavior old_sqs = await self.compute_sqs(snap) results.append({ \u0026#34;sim_time\u0026#34;: current, \u0026#34;sqs\u0026#34;: old_sqs[\u0026#34;composite\u0026#34;], \u0026#34;gate_open\u0026#34;: snap.vix_level \u0026lt; 25, # only hard VIX gate \u0026#34;snap\u0026#34;: snap, \u0026#34;system\u0026#34;: \u0026#34;old\u0026#34; }) else: # New system: zero lag (websocket), SQS composite gate snap.data_lag_minutes = 0.1 # ~6 second average lag for websocket new_sqs = await self.compute_sqs(snap) results.append({ \u0026#34;sim_time\u0026#34;: current, \u0026#34;sqs\u0026#34;: new_sqs[\u0026#34;composite\u0026#34;], \u0026#34;gate_open\u0026#34;: new_sqs[\u0026#34;gate_open\u0026#34;], \u0026#34;snap\u0026#34;: snap, \u0026#34;system\u0026#34;: \u0026#34;new\u0026#34; }) current += timedelta(minutes=step_minutes) return results the key design decision: simulate_old_system=True uses the actual data_lag_minutes from the historical records (reflecting the 15-minute polling cycle\u0026rsquo;s real-world lag) and only applies the hard VIX \u0026gt; 25 binary gate. simulate_old_system=False zeros out the lag (websocket parity) and runs the full SQS composite.\nhistorical data in TimescaleDB goes back to november 2023 for 5-minute snapshots. august 2024 is fully reconstructed from live records — i had continuous logging running by then. the yen carry unwind window is clean data.\nwhat august 5th looked like through both systems # the yen carry unwind peaked on august 5th, 2024. VIX opened at ~28, hit 65 intraday, closed around 38. SPX dropped about 3% on the open and kept going. SPX options spreads went from a normal 0.04% to 0.18–0.22% bid-ask by mid-morning.\nrunning the replay through both systems for the full week (aug 1–9):\nthe gap on august 5th is the whole story. old system (reconstructed): SQS around 22-31, which is below threshold — but the old system didn\u0026rsquo;t have a composite gate. it only had the binary VIX \u0026gt; 25 circuit breaker. VIX opened at 28 on aug 5th, which was above 25, so the old system was already throttled. but \u0026ldquo;throttled\u0026rdquo; meant max position size reduced to 40% and new entries suspended — it didn\u0026rsquo;t mean zero signal confidence assessment.\nnew system: SQS of 4-8 during the aug 5th open. gate hard-closed. three entry signals that the strategy logic flagged as valid got zero-ed out by the quality layer. those three entries were the ones that caused most of the -4.2% loss in the old system that week.\nthe drawdown picture # old system crossed the -3% circuit breaker on august 5th. that\u0026rsquo;s when manual intervention kicked in — i was watching the account that day and pulled the plug on further activity. new system (replay) would\u0026rsquo;ve peaked at -0.8% by aug 6th as existing positions worked through, then recovered by end of week.\nsame market. same entry signals. completely different outcome from the gate layer.\nwhat the replay surfaced # a few things came up that weren\u0026rsquo;t obvious from the live system design:\nsub-signal agreement needs smoothing during fast-moving sessions. the current SQS component computes raw agreement percentage across sub-signals. during the yen carry unwind, that score was cycling between 0% and 100% every 15 minutes as the market whipsawed. a smoothed EWA (exponentially weighted average over 30 minutes) stabilizes this — you want a read on the trend of agreement, not the instantaneous value. built it, going into production this week.\nthe freshness component is the most leveraged piece. websocket IV rank had the biggest impact on SQS during the vol event window. during the aug 5th morning session, the old 15-min polling cycle was showing data_lag_minutes of 14-16 before each refresh. that alone dropped the freshness component to near-zero, which is exactly what we fixed with the websocket streaming. the replay confirms that fix is the highest-leverage change in the entire stack.\nthe VIX regime component needs dynamic thresholds. fixed 20/40 band was calibrated when VIX was averaging around 16-18. VIX has averaged higher in 2025-2026. the 40-point upper bound means anything above VIX 40 scores zero, but the practical difference between VIX 65 and VIX 90 is lost. going to parameterize against trailing 90-day VIX distribution instead of fixed bounds.\nnone of these are blocking — the core system works and the drawdown improvement is real. these are calibration improvements.\nwhere things stand # replay confirmed what the april tariff week suggested: the infrastructure changes are the right ones. SQS composite gate + websocket IV rank would have cut the august 2024 drawdown from -4.2% to approximately -0.8%. that\u0026rsquo;s not marginal — that\u0026rsquo;s the difference between a bad week and a stop-loss event.\nbeen logging a lot of this work in the algo development journal thread on NexusFi — good thread if you\u0026rsquo;re building actual live systems, lots of people going through the same signal reliability questions. the backtesting methodology article in the academy is also solid on the theory side, though replay testing is a different beast than traditional strategy backtesting.\nsub-signal smoothing ships tuesday. VIX regime recalibration following that. then i want to run the replay against the march 2023 SVB banking crisis — messier data since i only have partial records from back then, but it\u0026rsquo;s the one event i was live for and still have notes on what actually happened.\ndinner last night A. made this pasta thing she\u0026rsquo;s been trying to nail for a month. finally got it right. spent ten minutes telling me what she changed from the last three attempts. i mostly just ate it and said it was good. she said \u0026ldquo;you\u0026rsquo;re not even listening\u0026rdquo; and she was right and also it was really good pasta.\nalgos running clean. colo heartbeat steady. nothing needs me until morning.\nsomewhere around 1 AM i was staring at the drawdown chart and got that random thing where an image just shows up — dad sitting at the kitchen table at midnight with engineering schematics and a cup of coffee he\u0026rsquo;d forgotten about. no particular reason. just happens sometimes. this line of work runs late and so did he.\nback to the code.\n-AK\n","date":"20 April 2026","externalUrl":null,"permalink":"/posts/2026-04-20-replay-testing-yen-carry-sqs-validation/","section":"Posts","summary":"\u003cp\u003e2:15 AM monday. system\u0026rsquo;s been clean since the websocket IV fix went live friday. heartbeat healthy, colo latency normal, no stale data flags. spent most of sunday going deep on something i\u0026rsquo;ve been meaning to do since the tariff postmortem.\u003c/p\u003e","title":"replaying the yen carry unwind: validating sqs against a real vol event","type":"posts"},{"content":"","date":"20 April 2026","externalUrl":null,"permalink":"/tags/stress-test/","section":"Tags","summary":"","title":"Stress-Test","type":"tags"},{"content":"the bookshelf arrived thursday.\nif you read last week\u0026rsquo;s post, you know this was inevitable. she\u0026rsquo;d been campaigning for it since february, and the moment i said \u0026ldquo;fine, order it,\u0026rdquo; she had already ordered it. turns out she ordered it three days before that conversation. the campaign was just waiting for me to catch up.\nit\u0026rsquo;s actually a nice bookshelf. i hate admitting this.\nthe installation # she had a whole plan. anchors, studs, level, the works. i have a dell poweredge rack server that i built from components and have zero fear of hardware. i watched her pull out a stud finder and realized we both had completely different definitions of what this project was.\nher version: forty-five minutes, two people, done.\nactual version: two hours, one stripped screw, a brief moment where we thought we\u0026rsquo;d drilled into a water pipe (we hadn\u0026rsquo;t), and seventeen minutes of both of us just holding the shelves against the wall deciding if we liked the height.\nwe liked the height.\nshe loaded it the same afternoon. her system, which i have accepted i will never understand, is now distributed across two surfaces. her desk looks exactly as chaotic as before. the new shelf looks perfect. she\u0026rsquo;s thrilled. i have to admit it looks good. both of these things are true simultaneously.\ncooking lesson five # deal is still active. 10 meals without incident = she gets to add something from her balcony wishlist.\ncurrent score: 4/10. lesson five tonight was shrimp stir-fry.\nshe handed me the skillet and stepped back. full control. no supervision.\nthe key with shrimp is you have to not overthink it. two minutes per side, hot pan, don\u0026rsquo;t move them until they release. i\u0026rsquo;ve watched her do this probably twenty times. the muscle memory is there even if my confidence isn\u0026rsquo;t.\nthey came out right. pink, curled, not rubbery. she inspected one with a fork like a food critic.\n\u0026ldquo;these are actually perfect.\u0026rdquo;\n\u0026ldquo;i know.\u0026rdquo;\nshe threw a dish towel at me.\n5/10. halfway there. she texted her mom again. i\u0026rsquo;ve accepted that her family now has a running tally of my progress. it\u0026rsquo;s fine.\nthe laundry room # the building has a shared laundry room on the first floor. she\u0026rsquo;d had it on the list for a while. we\u0026rsquo;ve walked past it at weird hours maybe three or four times and there was always either someone in there or she decided against it.\ntonight at 11pm she said she needed to do laundry. with this specific tone i recognize now. she does this thing where she says something completely mundane with slightly elevated eye contact. i\u0026rsquo;ve learned this is not about laundry.\nlaundry room was empty.\nshe locked the door.\nshe was in charge of this one entirely, which is how she likes it when she initiates. her hands on my shoulders, her back against the dryer, that look she gets when she\u0026rsquo;s decided what she wants and is going to get it. we were trying to be quiet because apartment building, and doing an okay job, and then she wasn\u0026rsquo;t trying anymore and i was not complaining about this.\ndryers do a lot to cover ambient noise. IYKYK.\nwe added it to the list. 26 entries now.\nend of the day # got back upstairs around midnight. she\u0026rsquo;s asleep. hair still slightly damp, one sock on, out cold.\nalgos are quiet. BTC bot flat. options book closed green for the week. nothing needs me.\n23 days to the anniversary. still not telling her what i have planned. she\u0026rsquo;s been watching me for clues and i\u0026rsquo;ve given her exactly nothing. this is probably the most effective i\u0026rsquo;ve ever been at keeping a secret and it\u0026rsquo;s genuinely amusing both of us.\ngood saturday. one of the quieter ones. sometimes those are the best.\n-AK\n","date":"18 April 2026","externalUrl":null,"permalink":"/posts/2026-04-18-saturday-bookshelf-lesson-five/","section":"Posts","summary":"\u003cp\u003ethe bookshelf arrived thursday.\u003c/p\u003e\n\u003cp\u003eif you read last week\u0026rsquo;s post, you know this was inevitable. she\u0026rsquo;d been campaigning for it since february, and the moment i said \u0026ldquo;fine, order it,\u0026rdquo; she had already ordered it. turns out she ordered it three days before that conversation. the campaign was just waiting for me to catch up.\u003c/p\u003e","title":"saturday - bookshelf drama, lesson five, the laundry room","type":"posts"},{"content":"","date":"17 April 2026","externalUrl":null,"permalink":"/tags/data-feeds/","section":"Tags","summary":"","title":"Data-Feeds","type":"tags"},{"content":"2:30 AM friday. been at this since 9 PM.\npromised myself two weeks ago, right in the middle of the tariff chaos, that i\u0026rsquo;d actually fix the IV rank staleness issue. the signal quality scoring work was the band-aid — a composite gate that tells the system \u0026ldquo;this signal isn\u0026rsquo;t reliable right now.\u0026rdquo; it worked. it\u0026rsquo;s in production. but the underlying problem was unchanged: during the spike, my IV rank was being computed from options data that was 10-14 minutes old. the signal wasn\u0026rsquo;t wrong, technically. it was just answering a question about a market that no longer existed.\nyou can gate on signal quality all day. eventually you have to fix the actual data.\nthe polling problem at speed # the IV rank calculation runs every 15 minutes. it pulls a snapshot of the SPX options chain from ThetaData via REST, computes the 30-day IV percentile rank against a trailing 252-day window, and publishes the result to Redis. straightforward, deterministic, easy to debug.\nduring normal conditions — VIX in the 16-22 range, IV rank drifting around 20-35%, nothing dramatic happening — this is fine. IV rank moves slowly. a 12-minute-old reading and a current one are usually within 2-3 percentage points of each other. that difference doesn\u0026rsquo;t change any signal decision.\ntariff week was not normal conditions.\non monday april 7th, IV rank was at 82% in pre-market and moving roughly 3-4 percentage points every 15 minutes. by the time my system ran a fresh calculation, the market had shifted enough that the previous snapshot was already describing a different environment. i was making decisions with a 12-minute-old map of terrain that was changing by the minute.\nthe SQS freshness component flagged this correctly — data freshness scores were in the 20-30 range during the worst periods, which suppressed new position entries. so the damage was contained. but suppressing signal confidence is different from actually having good signal data. ideally you want both.\nso: websockets.\nwhy streaming for options greeks specifically # most data APIs are pull-based. you poll on a schedule. fine for many use cases, but it means your data is always at least as stale as your polling interval.\nThetaData has a websocket interface for real-time streaming of options quotes — bid/ask IV, mid IV, delta, gamma, theta, vega per contract, pushing updates as market data changes. instead of a scheduled pull every 15 minutes, the stream delivers updates reactively as the exchange publishes them.\nthe practical difference during a vol event:\nREST polling (15-min): during the tariff monday open (9:30–10:45 AM ET), IV rank moved ~22 percentage points. my system saw that in 2 data points. resolution: 11pp per update. websocket streaming: same 75-minute window would deliver ~900+ quote updates across the SPX chain. resolution: 0.025pp per update. most of those 900 updates don\u0026rsquo;t change IV rank meaningfully — the signal is a smoothed 252-day percentile rank, not a tick-by-tick reactive value. but the system knows that within 2 seconds now, instead of 14 minutes later.\narchitecture: streaming primary, polling fallback # before writing any code, thought through the failure modes. websockets drop. ThetaData has maintenance windows. the connection can go stale without a clean disconnect signal.\nthe call: websocket as primary, REST polling as fallback. if the connection is healthy and delivering data, IV rank updates stream in. if the connection drops or goes silent for more than 30 seconds during market hours, the system reverts to the existing 15-minute polling cycle. not ideal, but better than no IV rank.\nhealth tracking via Redis: a heartbeat key that gets updated on every valid quote received. the IV rank consumer checks the key age — if it\u0026rsquo;s been more than 30 seconds since last update during market hours, it raises a staleness flag and routes computation through the SQS staleness penalty path (same path as before, just now it\u0026rsquo;s a rare fallback instead of the default state).\nhere\u0026rsquo;s the implementation:\nimport asyncio import json import websockets import redis.asyncio as aioredis from datetime import datetime, timezone from typing import Optional import logging logger = logging.getLogger(__name__) THETADATA_WS_URL = \u0026#34;wss://stream.thetadata.us/v1\u0026#34; REDIS_URL = \u0026#34;redis://localhost:6379\u0026#34; HEARTBEAT_KEY = \u0026#34;options:ws:last_update\u0026#34; IV_RANK_KEY = \u0026#34;signal:spx:iv_rank\u0026#34; IV_RANK_CHANNEL = \u0026#34;signals:iv_rank\u0026#34; STALENESS_THRESHOLD_S = 30 class OptionsStreamHandler: \u0026#34;\u0026#34;\u0026#34; Handles real-time SPX options quote streaming from ThetaData. Maintains rolling IV history and publishes IV rank to Redis pub/sub. \u0026#34;\u0026#34;\u0026#34; def __init__(self, redis_client: aioredis.Redis, api_key: str): self.redis = redis_client self.api_key = api_key self.iv_history: list[tuple[int, float]] = [] # (ts_ms, mid_iv) self.current_iv_rank: Optional[float] = None self._ws: Optional[websockets.WebSocketClientProtocol] = None self._connected = False async def connect(self) -\u0026gt; None: headers = {\u0026#34;Authorization\u0026#34;: f\u0026#34;Bearer {self.api_key}\u0026#34;} self._ws = await websockets.connect( THETADATA_WS_URL, extra_headers=headers, ping_interval=20, ping_timeout=10, close_timeout=5, ) self._connected = True logger.info(\u0026#34;ThetaData websocket connected\u0026#34;) subscribe_msg = { \u0026#34;msg_type\u0026#34;: \u0026#34;SUBSCRIBE\u0026#34;, \u0026#34;sec_type\u0026#34;: \u0026#34;OPTION\u0026#34;, \u0026#34;root\u0026#34;: \u0026#34;SPX\u0026#34;, \u0026#34;exp\u0026#34;: \u0026#34;front_2\u0026#34;, # front 2 expirations \u0026#34;fields\u0026#34;: [\u0026#34;BID_IV\u0026#34;, \u0026#34;ASK_IV\u0026#34;, \u0026#34;MID_IV\u0026#34;, \u0026#34;DELTA\u0026#34;, \u0026#34;GAMMA\u0026#34;, \u0026#34;VEGA\u0026#34;], \u0026#34;interval_ms\u0026#34;: 500, # max update rate: every 500ms per contract } await self._ws.send(json.dumps(subscribe_msg)) logger.info(\u0026#34;Subscribed to SPX chain\u0026#34;) def _compute_iv_rank(self, current_iv: float) -\u0026gt; float: \u0026#34;\u0026#34;\u0026#34; IV rank: (current_iv - 252d_low) / (252d_high - 252d_low) * 100 Standard percentile definition. \u0026#34;\u0026#34;\u0026#34; if len(self.iv_history) \u0026lt; 30: return 50.0 # insufficient history ivs = [iv for _, iv in self.iv_history] iv_low = min(ivs) iv_high = max(ivs) if iv_high == iv_low: return 50.0 rank = (current_iv - iv_low) / (iv_high - iv_low) * 100.0 return max(0.0, min(100.0, rank)) async def handle_quote(self, msg: dict) -\u0026gt; None: mid_iv = msg.get(\u0026#34;mid_iv\u0026#34;) if mid_iv is None or mid_iv \u0026lt;= 0: return now_ms = int(datetime.now(timezone.utc).timestamp() * 1000) # append and prune to 252 trading days (~rolling year) self.iv_history.append((now_ms, mid_iv)) cutoff_ms = now_ms - (252 * 86_400 * 1000) self.iv_history = [(ts, iv) for ts, iv in self.iv_history if ts \u0026gt; cutoff_ms] new_rank = self._compute_iv_rank(mid_iv) # only publish when rank moves by \u0026gt;0.5pp — filters noise without hiding real moves if self.current_iv_rank is None or abs(new_rank - self.current_iv_rank) \u0026gt; 0.5: self.current_iv_rank = new_rank payload = json.dumps({ \u0026#34;value\u0026#34;: round(new_rank, 2), \u0026#34;mid_iv\u0026#34;: round(mid_iv, 4), \u0026#34;updated_ms\u0026#34;: now_ms, \u0026#34;history_length\u0026#34;: len(self.iv_history), }) pipe = self.redis.pipeline() pipe.set(IV_RANK_KEY, payload, ex=120) # expire if stream goes dark pipe.publish(IV_RANK_CHANNEL, payload) # notify downstream consumers pipe.set(HEARTBEAT_KEY, str(now_ms), ex=300) # health check key await pipe.execute() async def stream_loop(self) -\u0026gt; None: while True: try: if not self._connected: await self.connect() async for raw_msg in self._ws: msg = json.loads(raw_msg) if msg.get(\u0026#34;msg_type\u0026#34;) == \u0026#34;QUOTE\u0026#34;: await self.handle_quote(msg) elif msg.get(\u0026#34;msg_type\u0026#34;) == \u0026#34;ERROR\u0026#34;: logger.error(f\u0026#34;ThetaData error: {msg}\u0026#34;) except websockets.ConnectionClosed as e: logger.warning(f\u0026#34;WS closed ({e}), reconnecting in 5s\u0026#34;) self._connected = False await asyncio.sleep(5) except Exception as e: logger.error(f\u0026#34;Stream loop error: {e}, reconnecting in 10s\u0026#34;) self._connected = False await asyncio.sleep(10) async def run_options_stream(api_key: str) -\u0026gt; None: redis = await aioredis.from_url(REDIS_URL, decode_responses=True) handler = OptionsStreamHandler(redis_client=redis, api_key=api_key) await handler.stream_loop() if __name__ == \u0026#34;__main__\u0026#34;: import os asyncio.run(run_options_stream(api_key=os.environ[\u0026#34;THETADATA_API_KEY\u0026#34;])) runs as its own process under runit, alongside the rest of the stack. the main signal pipeline subscribes to signals:iv_rank via Redis pub/sub and reacts to updates reactively instead of polling on a schedule.\nlatency comparison: three days shadow mode # ran streaming alongside the old 15-minute cycle in shadow mode monday through wednesday this week. measured end-to-end latency from ThetaData publishing a quote to my Redis IV rank key being updated.\nlog scale on the y-axis because the difference is literally two orders of magnitude. streaming p99 is 4.3 seconds. polling p50 is 7.5 minutes. they\u0026rsquo;re not even playing the same game.\nthe shadow mode numbers confirmed what i expected: during calm conditions monday-tuesday, the two methods produced IV rank values within 0.3-0.8pp of each other almost all the time. when a brief VIX move happened wednesday afternoon (19→23 over about 40 minutes), streaming saw the peak IV rank 11.7 minutes before the polling cycle caught up. during tariff week that gap was 8-12pp on IV rank. during wednesday\u0026rsquo;s smaller move it was 4.2pp at peak. both matter.\nredis pub/sub: downstream consumers # three services subscribe to signals:iv_rank:\nSPX premium selling strategy: re-evaluates entry conditions when IV rank crosses its configured tier thresholds (currently: 25%, 50%, 75% trigger different position sizing multipliers). with polling it was checking stale values. now it reacts within 2 seconds of a threshold crossing.\nSQS service: recalculates the data freshness component on every pub/sub event. that freshness component — which was scoring 60-70 during market hours even in calm conditions because polling always has some staleness — now shows 92-98 consistently during market hours. the SQS score went up on average just from this change.\nGrafana: live IV rank gauge on the monitoring dashboard, now updates reactively. visual improvement, not operationally critical, but i like knowing the number i\u0026rsquo;m looking at is accurate.\nthe 0.5pp publish threshold is a practical filter. raw streaming produces 600-900 IV updates per hour during active markets. publishing all of them would create downstream noise and unnecessary processing. the filter means most of the micro-fluctuations get absorbed, but any sustained directional move shows up within a few updates.\nwhat\u0026rsquo;s still left on the list # adaptive subscription depth: currently subscribe to front 2 expirations regardless of conditions. during vol spikes, the most relevant data concentrates in 0DTE and next-week options — that\u0026rsquo;s where the market is pricing panic. want to dynamically shift subscription weight toward shorter expirations when VIX is elevated. requires the streaming process to receive regime signals from SQS (currently it\u0026rsquo;s one-way: stream → SQS). small architectural change, two-way communication between two services.\nIV history persistence across restarts: when the streaming process restarts, the 252-day IV history built up in memory is lost. currently falls back to a TimescaleDB snapshot written every 6 hours. need to write that snapshot every 30 minutes so a restart costs at most 30 minutes of history rather than up to 6 hours. bookkeeping task, not urgent, just annoying.\nwent live on thursday. running clean so far. SQS data freshness scores are holding 92-98 during market hours. week overall ended up around +$3,800. quiet compared to the chaos of last week but that\u0026rsquo;s fine — the goal was infrastructure, not performance.\nthe NexusFi diversified option selling thread has had some good discussion lately on how options traders handle IV data during extreme moves. the consensus there is basically \u0026ldquo;your risk controls can\u0026rsquo;t outrun your data quality,\u0026rdquo; which matches exactly what tariff week taught me.\nsomething my dad once said about his engineering work: \u0026ldquo;the systems that fail are the ones that assume the data is good.\u0026rdquo; he was talking about biotech assays, not trading algos, but it\u0026rsquo;s the same principle. it took me two years and a tariff panic to really understand what he meant.\nalright. actually going to sleep before 4 AM for once.\n-AK\n","date":"17 April 2026","externalUrl":null,"permalink":"/posts/2026-04-17-streaming-iv-rank-thetadata-websocket-fix/","section":"Posts","summary":"\u003cp\u003e2:30 AM friday. been at this since 9 PM.\u003c/p\u003e\n\u003cp\u003epromised myself two weeks ago, right in the middle of the tariff chaos, that i\u0026rsquo;d actually fix the IV rank staleness issue. the \u003ca\n  href=\"https://algos.pro/posts/2026-04-15-signal-quality-scoring-market-aware-trade-gate/\"\n    target=\"_blank\"\n  \u003esignal quality scoring\u003c/a\u003e work was the band-aid — a composite gate that tells the system \u0026ldquo;this signal isn\u0026rsquo;t reliable right now.\u0026rdquo; it worked. it\u0026rsquo;s in production. but the underlying problem was unchanged: during the spike, my IV rank was being computed from options data that was 10-14 minutes old. the signal wasn\u0026rsquo;t wrong, technically. it was just answering a question about a market that no longer existed.\u003c/p\u003e","title":"fixing the stale iv problem: thetadata websocket streaming for real-time greeks","type":"posts"},{"content":"","date":"17 April 2026","externalUrl":null,"permalink":"/tags/websocket/","section":"Tags","summary":"","title":"Websocket","type":"tags"},{"content":"","date":"15 April 2026","externalUrl":null,"permalink":"/categories/risk-management/","section":"Categories","summary":"","title":"Risk Management","type":"categories"},{"content":"2:15 AM wednesday. apartment quiet. A. went to bed around midnight — she had a client deadline today so it was a long one. checked the colo heartbeat before sitting down to write this. normal. algos running clean for the first time since last monday.\nbeen staring at the tariff week data for two days. monday\u0026rsquo;s postmortem surfaced something i\u0026rsquo;ve been dancing around for a while: my algos don\u0026rsquo;t know how confident they should be. they know when not to trade — VIX threshold, event windows, my throttle layer. but they don\u0026rsquo;t have a real-time read on how much to trust their own signals moment-to-moment.\nthat\u0026rsquo;s the gap. this post is about closing it.\nthe gap # last week my IV rank signal was \u0026ldquo;working correctly.\u0026rdquo; it computed the right number from the right data. IV rank was genuinely elevated at 82%, which theoretically signals better premium selling conditions. the logic was sound.\nexcept the market was in freefall, spreads on SPX options were 3-4x their normal width, the data feeding that IV rank was 12 minutes stale by the time each cycle ran, and three of my sub-signals were pointing in conflicting directions. so \u0026ldquo;IV rank is high, favorable for premium selling\u0026rdquo; was technically true and completely useless at the same time.\nno signal flagged itself as unreliable. the event risk throttle blocked new entries correctly — that was the hard binary failsafe. but what i wanted was something softer: a continuous real-time read on how reliable the signal environment is, and a proportional response to that read.\ni\u0026rsquo;m calling it the Signal Quality Score (SQS). composite 0-100 per strategy. four weighted components. below threshold → system doesn\u0026rsquo;t open new positions. runs async, publishes to Redis, stores history in TimescaleDB.\nbuilt it last weekend. here\u0026rsquo;s how it works.\nSQS: four components, one number # data freshness (30% weight): how stale is the input data? IV rank from 12 minutes ago during a vol spike is a different instrument than IV rank from 45 seconds ago. linear decay from 100 → 0 over a 5-minute window. the tariff week problem directly: 15-minute recalculation cadence was already hitting staleness penalties before the bad entries happened.\nregime deviation (35% weight): how far is current VIX from the rolling baseline? uses z-score off recent VIX history. small deviations get a light penalty. extreme moves — VIX jumping 60% in 36 hours like last week — crush the score exponentially. IV rank \u0026gt; 75% applies an additional penalty. the model trained on \u0026ldquo;normal\u0026rdquo; conditions loses edge when operating outside that distribution. this component quantifies that.\nspread quality (20% weight): bid-ask spread as a multiple of the symbol\u0026rsquo;s 25th-percentile historical baseline. 1x baseline → 100. 3x baseline → ~25. 5x → ~0. SPX spreads went 3-4x normal monday-tuesday. this component was 20-30 during the worst of it.\nsignal agreement (15% weight): directional agreement across sub-signals. IV rank bullish, VIX term structure neutral, momentum bearish — those three are pointing different ways. high standard deviation across the signal votes → lower score. catches the case where each individual signal is technically valid but they\u0026rsquo;re collectively incoherent.\ncomposite = weighted average. each strategy has a threshold. below threshold → no new positions.\nSQS through tariff week for the SPX premium selling strategy:\nthreshold is 65. SPX SQS dropped to 35 by wednesday morning april 8 — almost 30 points below the trade gate. system had no new SPX entries from monday afternoon through friday morning. that\u0026rsquo;s the correct call. crypto SQS stayed above its 50 threshold most of the week because momentum signals hold more coherently through equity vol spikes.\nthe code # import asyncio import time from dataclasses import dataclass from typing import Dict, Optional from collections import deque import numpy as np import redis.asyncio as redis @dataclass class ComponentScore: score: float # 0-100 weight: float name: str reason: str timestamp: int # unix ms @dataclass class SignalQualityScore: strategy_id: str composite: float # 0-100 weighted composite components: Dict[str, ComponentScore] timestamp: int trade_permitted: bool threshold: float class SignalQualityScorer: def __init__( self, redis_client: redis.Redis, strategy_thresholds: Dict[str, float], baseline_vix: float = 16.5, max_staleness_ms: int = 300_000, # 5 minutes ): self.redis = redis_client self.thresholds = strategy_thresholds self.baseline_vix = baseline_vix self.max_staleness_ms = max_staleness_ms self._vix_history: deque = deque(maxlen=100) self._spread_history: Dict[str, deque] = {} async def score_data_freshness( self, data_ts_ms: int, now_ms: Optional[int] = None, ) -\u0026gt; ComponentScore: \u0026#34;\u0026#34;\u0026#34;Linear decay: fresh = 100, beyond max_staleness = 0.\u0026#34;\u0026#34;\u0026#34; now = now_ms or int(time.time() * 1000) age_ms = now - data_ts_ms if age_ms \u0026lt;= 0: score, reason = 100.0, \u0026#34;data is live\u0026#34; elif age_ms \u0026gt;= self.max_staleness_ms: score = 0.0 reason = f\u0026#34;data {age_ms/1000:.0f}s old — exceeds {self.max_staleness_ms/1000:.0f}s limit\u0026#34; else: score = 100.0 * (1.0 - age_ms / self.max_staleness_ms) reason = f\u0026#34;data {age_ms/1000:.1f}s old\u0026#34; return ComponentScore(score=score, weight=0.30, name=\u0026#34;data_freshness\u0026#34;, reason=reason, timestamp=now) async def score_regime_deviation( self, current_vix: float, iv_rank: Optional[float] = None, ) -\u0026gt; ComponentScore: \u0026#34;\u0026#34;\u0026#34; Exponential penalty for vol regime distance from rolling baseline. Models calibrated on normal conditions degrade in extreme regimes. Small deviations get light penalty. Extreme moves get crushed. \u0026#34;\u0026#34;\u0026#34; self._vix_history.append(current_vix) now = int(time.time() * 1000) if len(self._vix_history) \u0026lt; 10: deviation = abs(current_vix - self.baseline_vix) / self.baseline_vix else: hist = np.array(self._vix_history)[:-1] z = abs(current_vix - np.mean(hist)) / (np.std(hist) + 1e-6) deviation = z / 3.0 # z=3 → full deviation (score ≈ 0) # exp(-2.5 * deviation): at deviation=0 → 100, at deviation=1 → ~8 score = float(np.clip(100.0 * np.exp(-2.5 * deviation), 0.0, 100.0)) reason = f\u0026#34;VIX={current_vix:.1f}, regime_deviation={deviation:.2f}\u0026#34; if iv_rank is not None and iv_rank \u0026gt; 75: iv_penalty = (iv_rank - 75) / 25 * 20.0 # up to -20 at IVR=100 score = max(0.0, score - iv_penalty) reason += f\u0026#34;, IVR={iv_rank:.0f}% → penalty applied\u0026#34; return ComponentScore(score=score, weight=0.35, name=\u0026#34;regime_deviation\u0026#34;, reason=reason, timestamp=now) async def score_spread_quality( self, symbol: str, bid_ask_pct: float, # spread as fraction of mid price ) -\u0026gt; ComponentScore: \u0026#34;\u0026#34;\u0026#34; Tracks spread vs symbol\u0026#39;s 25th-percentile historical baseline. 3x baseline → ~25. 5x → ~6. Widening = worse execution environment. \u0026#34;\u0026#34;\u0026#34; now = int(time.time() * 1000) if symbol not in self._spread_history: self._spread_history[symbol] = deque(maxlen=200) hist = self._spread_history[symbol] hist.append(bid_ask_pct) if len(hist) \u0026lt; 20: score = float(np.clip(100.0 - bid_ask_pct * 80.0, 0.0, 100.0)) reason = f\u0026#34;spread={bid_ask_pct:.4f} (static baseline, need more history)\u0026#34; else: baseline = float(np.percentile(list(hist)[:-1], 25)) ratio = bid_ask_pct / (baseline + 1e-6) # ratio=1 → 100, ratio=3 → ~25, ratio=5 → ~6 score = float(np.clip(100.0 / (1.0 + (ratio - 1.0) * 2.0), 0.0, 100.0)) reason = f\u0026#34;spread={bid_ask_pct:.4f}, {ratio:.1f}x baseline ({baseline:.4f})\u0026#34; return ComponentScore(score=score, weight=0.20, name=\u0026#34;spread_quality\u0026#34;, reason=reason, timestamp=now) async def score_signal_agreement( self, signal_votes: Dict[str, float], # name → directional confidence [-1, 1] ) -\u0026gt; ComponentScore: \u0026#34;\u0026#34;\u0026#34; High variance across sub-signal directions = incoherent environment. Agreement and conviction both matter. Agreement weighted 60/40. signal_votes: {\u0026#39;iv_rank\u0026#39;: 0.7, \u0026#39;vix_term\u0026#39;: 0.3, \u0026#39;momentum\u0026#39;: -0.4} \u0026#34;\u0026#34;\u0026#34; now = int(time.time() * 1000) if not signal_votes: return ComponentScore(score=50.0, weight=0.15, name=\u0026#34;signal_agreement\u0026#34;, reason=\u0026#34;no votes\u0026#34;, timestamp=now) vals = np.array(list(signal_votes.values())) agreement = float(100.0 * np.exp(-3.0 * np.std(vals))) # low std → high agreement conviction = float(100.0 * abs(np.mean(vals))) # strong direction → higher score = float(np.clip(0.6 * agreement + 0.4 * conviction, 0.0, 100.0)) reason = (f\u0026#34;n={len(vals)}, mean={np.mean(vals):.2f}, \u0026#34; f\u0026#34;std={np.std(vals):.2f}\u0026#34;) return ComponentScore(score=score, weight=0.15, name=\u0026#34;signal_agreement\u0026#34;, reason=reason, timestamp=now) async def compute( self, strategy_id: str, data_ts_ms: int, current_vix: float, symbol: str, bid_ask_pct: float, signal_votes: Dict[str, float], iv_rank: Optional[float] = None, ) -\u0026gt; SignalQualityScore: \u0026#34;\u0026#34;\u0026#34; Compute composite SQS and publish to Redis. Executor polls sqs:{strategy_id} before opening any position. TTL=60s: if scorer goes silent, key expires → executor blocks automatically. \u0026#34;\u0026#34;\u0026#34; freshness, regime, spread, agreement = await asyncio.gather( self.score_data_freshness(data_ts_ms), self.score_regime_deviation(current_vix, iv_rank), self.score_spread_quality(symbol, bid_ask_pct), self.score_signal_agreement(signal_votes), ) components = {c.name: c for c in [freshness, regime, spread, agreement]} total_w = sum(c.weight for c in components.values()) composite = round(float(np.clip( sum(c.score * c.weight for c in components.values()) / total_w, 0.0, 100.0 )), 1) threshold = self.thresholds.get(strategy_id, 60.0) trade_permitted = composite \u0026gt;= threshold # Atomic publish: set key + pub/sub notification pipe = self.redis.pipeline() pipe.set(f\u0026#34;sqs:{strategy_id}\u0026#34;, str(composite), ex=60) pipe.publish(f\u0026#34;sqs_update:{strategy_id}\u0026#34;, f\u0026#34;{composite}:{int(trade_permitted)}\u0026#34;) await pipe.execute() return SignalQualityScore( strategy_id=strategy_id, composite=composite, components=components, timestamp=int(time.time() * 1000), trade_permitted=trade_permitted, threshold=threshold, ) # ── strategy thresholds ──────────────────────────────────────────────────────── STRATEGY_THRESHOLDS = { \u0026#34;spx_premium_selling\u0026#34;: 65.0, # conservative — most sensitive to data quality \u0026#34;qqq_iron_condors\u0026#34;: 65.0, \u0026#34;es_futures_momentum\u0026#34;: 70.0, # highest bar — fastest-moving signals, worst to be stale \u0026#34;btc_eth_momentum\u0026#34;: 50.0, # more robust to equity vol regime shifts \u0026#34;altcoin_breakout\u0026#34;: 45.0, # crypto is inherently chaotic, lower bar } async def main(): r = redis.from_url(\u0026#34;redis://localhost:6379\u0026#34;, decode_responses=True) scorer = SignalQualityScorer( redis_client=r, strategy_thresholds=STRATEGY_THRESHOLDS, baseline_vix=16.5, ) # example: SPX strategy, 45 seconds of data staleness, VIX at 21.3 sqs = await scorer.compute( strategy_id=\u0026#34;spx_premium_selling\u0026#34;, data_ts_ms=int(time.time() * 1000) - 45_000, current_vix=21.3, symbol=\u0026#34;SPX\u0026#34;, bid_ask_pct=0.0018, signal_votes={ \u0026#34;iv_rank\u0026#34;: 0.62, # bullish for premium selling \u0026#34;vix_term\u0026#34;: 0.41, # contango → favorable \u0026#34;momentum_spy\u0026#34;: -0.18, # slight bearish disagreement }, iv_rank=58.0, ) print(f\u0026#34;\\nstrategy: {sqs.strategy_id}\u0026#34;) print(f\u0026#34;composite SQS: {sqs.composite} | threshold: {sqs.threshold} | permitted: {sqs.trade_permitted}\u0026#34;) for name, comp in sqs.components.items(): print(f\u0026#34; {name:20s} {comp.score:5.1f} ({comp.reason})\u0026#34;) if __name__ == \u0026#34;__main__\u0026#34;: asyncio.run(main()) around 190 lines. the whole complexity lives in the scorer. the executor stays simple.\ninfrastructure integration # the executor\u0026rsquo;s decision loop at the colo now looks like this:\nasync def can_open_position(strategy_id: str) -\u0026gt; bool: sqs_raw = await redis_client.get(f\u0026#34;sqs:{strategy_id}\u0026#34;) if sqs_raw is None: return False # scorer silent or TTL expired — block all entries return float(sqs_raw) \u0026gt;= STRATEGY_THRESHOLDS[strategy_id] two lines. the whole complexity lives upstream in the scorer. TTL is the failsafe — if the SQS computation process dies or the chicago box loses connectivity for 60 seconds, the redis keys expire automatically and the executor stops opening positions. no explicit kill switch needed.\ntimescaledb stores every SQS reading with component-level breakdown. that\u0026rsquo;s how i built the chart above — dumped april 7-15 history and plotted the degradation curve. the storage schema:\nCREATE TABLE sqs_history ( ts TIMESTAMPTZ NOT NULL, strategy_id TEXT NOT NULL, composite FLOAT NOT NULL, freshness FLOAT, regime FLOAT, spread FLOAT, agreement FLOAT, permitted BOOLEAN ); SELECT create_hypertable(\u0026#39;sqs_history\u0026#39;, \u0026#39;ts\u0026#39;); CREATE INDEX ON sqs_history (strategy_id, ts DESC); compresses well. cheap to query. one year of history is maybe 400MB for five strategies at 3-minute update intervals.\ncurrent status # where things stand tonight:\nall five strategies above their thresholds. VIX is sitting at 21 — still elevated from pre-tariff-week levels (was 16-17 in march) but nowhere near last week\u0026rsquo;s peak. data freshness improved too: i bumped the IV rank recalculation cadence from 15 minutes to 3 minutes as a separate fix. that alone adds ~15 points to the freshness component under normal conditions.\nwhat would this have changed # two bad SPX entries on monday april 7, opened in the ~40-minute window between market open and when the event risk throttle fully engaged. SQS was already at ~58 by 10 AM and falling fast. below the 65 threshold. those entries would have been blocked.\nthose positions held and eventually recovered, but they drew down about 3.2k before they did. SQS would have avoided that.\nwould have also blocked some entries wednesday afternoon during the tariff pause rally. that\u0026rsquo;s the other side. the SQS was still low (spread and freshness hadn\u0026rsquo;t recovered yet even though prices were ripping) so some legitimate opportunity was missed. rough estimate: 1.2k in missed upside.\nnet: +3.2k avoided drawdown, -1.2k missed upside. about 2k net positive. and the miss-on-the-rally problem is tunable — there\u0026rsquo;s a smoothed recovery curve i want to test that reweights spread quality lower when VIX is already falling hard. work for this weekend.\nthoughts # the interesting design constraint was keeping SQS directionally unaware. it doesn\u0026rsquo;t know if you\u0026rsquo;re long or short, bullish or bearish. it only models the quality of the environment the signals are operating in. actual trade direction is the signal\u0026rsquo;s job. SQS is the metacognitive layer. they stay separate.\ndad was VP of engineering at a biotech. control systems were his thing — he was always talking about feedback loops, closed-loop vs open-loop systems. he\u0026rsquo;d have called this \u0026ldquo;finally closing the loop on signal reliability.\u0026rdquo; would have asked me why it took two years to build. fair question, honestly.\nspent some time in the NexusFi VIX and volatility thread over the last few weeks — lots of professional traders in there working through the same regime detection problems from different angles. useful for sanity-checking approaches even if the implementations are completely different.\nnext: historical calibration. what thresholds would have been optimal across 2023-2025 to maximize blocked-bad-trades while minimizing blocked-good-trades? that\u0026rsquo;s an optuna optimization job and there\u0026rsquo;s no clean answer. thresholds probably need to be market-regime-specific too, not just strategy-specific. more work.\nfor now, system is live. all strategies green. going to sleep.\n-AK\n","date":"15 April 2026","externalUrl":null,"permalink":"/posts/2026-04-15-signal-quality-scoring-market-aware-trade-gate/","section":"Posts","summary":"\u003cp\u003e2:15 AM wednesday. apartment quiet. A. went to bed around midnight — she had a client deadline today so it was a long one. checked the colo heartbeat before sitting down to write this. normal. algos running clean for the first time since last monday.\u003c/p\u003e","title":"signal quality scoring: building a market-aware trade gate","type":"posts"},{"content":"","date":"13 April 2026","externalUrl":null,"permalink":"/tags/execution/","section":"Tags","summary":"","title":"Execution","type":"tags"},{"content":"2:30 AM monday. week one of what i\u0026rsquo;m calling \u0026ldquo;the post-tariff-chaos era\u0026rdquo; starts in a few hours.\nlast week was one of those that splits into a clear before and after. monday and tuesday felt like freefall — VIX went from 20 to 32 in about 36 hours, SPX dropped hard, options spreads blew out 3-4x, and my event risk throttle (which I built the week prior and wrote about here) was earning every line of code it took to build. then wednesday happened. whoever made the tariff pause call did it at 1:07 PM eastern and watching the S\u0026amp;P rip 8% in ninety minutes while running algorithms was\u0026hellip; a lot.\ni\u0026rsquo;m not writing about the news. the news was the news. i\u0026rsquo;m writing about what the data actually showed — signal quality, execution behavior, infrastructure load, what broke, what held. post-mortem mode.\nthe signal picture # my signals degraded before my positions did. that\u0026rsquo;s the thing nobody talks about in algo trading — you can survive the position stress, but if your signals are garbage, every decision downstream is garbage too.\nSPX premium selling uses IV rank as a core input. normal conditions: IV rank sits around 20-35%, strategies enter incrementally, theta collects. monday morning of last week, IV rank hit 82% in pre-market and was moving fast enough that my 15-minute recalculation cadence was stale by the time each cycle ran. i was using a snapshot of IV rank that was already 10+ minutes old in conditions where the number was moving 3-4 percentage points per cycle.\nthis created a specific failure mode: my entry signals were suggesting \u0026ldquo;elevated vol = better premium, conditions favorable for new positions\u0026rdquo; while simultaneously my existing positions were getting hammered by the very vol spike causing those \u0026ldquo;good\u0026rdquo; signals. the logic was technically correct in isolation. in practice, it was noise.\nthe event risk throttle blocked new entries correctly — my VIX \u0026gt; 25 threshold triggered, max position size dropped to 40% (even lower than the week before), new entries suspended. but the signal quality problem was still there. i need faster IV recalculation in extreme conditions. on the list now.\ncrypto signals held better than expected. BTC dropped with equities monday, but the momentum signal disconnected from the equity panic faster — by tuesday afternoon, crypto was forming its own bid while SPX was still finding lows. the signal stayed data-driven and didn\u0026rsquo;t cross-contaminate. that felt like a win.\nES futures: flat exposure the whole week. the throttle was right to keep sizing minimal there. realized vol on NQ was 4x historical average for two days straight — no edge in that for my strategies.\nexecution quality during the spike # this is where it gets interesting.\ni ran the fill quality numbers for the week against Q1 baseline. here\u0026rsquo;s the comparison:\nSPX options fills, normal market (Q1 baseline):\ntheoretical mid: X average fill: mid + 0.12 (12 cents off theoretical mid) fill rate on limit orders: 94% SPX options fills, monday and tuesday tariff spike:\ntheoretical mid: X average fill: mid + 0.61 (61 cents off mid) fill rate on limit orders: 67% that\u0026rsquo;s a 5x increase in effective slippage and a meaningful drop in fill rate. spreads that my backtest models assumed at $0.15 cost were actually running $0.78 effective cost per side. this is exactly the scenario that made my slippage model look naive when i audited it in Q1.\nwhat the colo data showed: chicago round-trip latency during the spike averaged 1.4ms vs my normal 0.9ms. not a huge jump, but the entire SPX options market was having latency issues — CBOE quote updates were lagging, and my orders were hitting a book that was already moving before confirmation came back. network wasn\u0026rsquo;t the bottleneck; market structure was.\nwednesday\u0026rsquo;s rally was the mirror image. once direction was clear, fills improved dramatically. limit orders filled quickly, spreads compressed, slippage dropped back toward normal within 45 minutes of the announcement.\nweek total: SPX options +$1,800, crypto +$4,900, ES futures -$500. net +$6,200. positive but nothing exciting — the throttle did its job of limiting damage during the bad days. wednesday was the save.\ninfrastructure under load # a few things stood out in the infra data.\nredis: cache hit rate dropped from a normal 94% to 71% during monday\u0026rsquo;s session. the cause was clear — market data update frequency increased significantly during the spike, and my cache TTL (time-to-live) settings assumed normal update rates. when quotes are refreshing 4x faster than usual, my cached values expired before they\u0026rsquo;d normally be used. effective result: way more direct database queries during the session that needed low latency most.\nfix is straightforward — dynamic TTL based on realized quote update frequency. if market data is updating fast, cache life decreases. when it\u0026rsquo;s slow, cache life extends. writing this this week.\ntimescaledb: query times increased about 40% during the spike. acceptable — the increase was from higher write volume (market data ingestion) competing with analytical reads (my strategy calculations running continuously). nothing alarming, just something to monitor. considered read replicas but current query load doesn\u0026rsquo;t justify the overhead.\ncolo latency: as mentioned above — 1.4ms vs 0.9ms average, but max spikes were what surprised me. during the worst 90 minutes monday, i had 11 individual trades where round-trip confirmed in \u0026gt;8ms. those are outliers but they matter for limit order logic. the market moved before confirmation came back three times — filled at worse prices than the order specified. that\u0026rsquo;s a market structure problem, not my infrastructure, but i need to handle it in my execution layer.\nthe correlation is obvious and pretty much linear up to VIX ~28, then flattens. above 30, latency doesn\u0026rsquo;t seem to get much worse — but fill quality is already so degraded by that point that the latency number becomes less relevant. the slippage from market microstructure breakdown dwarfs any latency effect.\nwhat i\u0026rsquo;m actually fixing this week # three items, in priority order:\n1. IV recalculation frequency scaling. when VIX is above a threshold (currently testing 22), switch the IV rank recalculation from 15-minute cadence to 3-minute cadence. costs more compute on the colo box, should be fine. the stale-signal problem during the spike was 100% a cadence issue.\n2. redis dynamic TTL. formula i\u0026rsquo;m testing: ttl_seconds = max(5, 60 / quote_updates_per_minute). normal market: ~10 updates/min → 6 second TTL (close to current). vol spike: ~40 updates/min → 1.5 second TTL. keeps cache actually fresh under stress.\n3. confirmation timeout handling in the execution layer. if a fill confirmation doesn\u0026rsquo;t arrive within 3ms (above my 99th percentile), treat it as uncertain and verify position state before placing additional orders. currently just waiting indefinitely for confirmation, which caused three bad sequences last week.\nnone of these are massive changes. all of them would\u0026rsquo;ve directly improved last week\u0026rsquo;s performance.\nwhat actually went right # i want to be honest about this: a lot went right.\nthe event risk throttle made it to production the week before it was needed. if I\u0026rsquo;d been running full size monday, the SPX book would\u0026rsquo;ve looked like early 2023. instead, positions were at 40% notional and the loss days were painful but survivable.\nthe roll engine (built two weeks prior) automatically defended existing iron condors as the underlying moved. i watched it fire four times monday — adjusting deltas, rolling strikes wider, taking small losses to avoid larger losses. i didn\u0026rsquo;t touch anything manually. the automation worked exactly as designed.\nand the portfolio Greeks aggregation i finished tuesday of last week meant that when everything was moving simultaneously, i had a single real-time dashboard showing total portfolio delta, gamma, theta, vega. knew exactly where i stood at every moment. that\u0026rsquo;s new — two months ago i wouldn\u0026rsquo;t have had that visibility during a spike like this.\nthe NexusFi algo community was actively discussing the chaos all week. got some good perspective on how others were handling it — the thread Attack of the Robots had a bunch of people comparing notes on automated system behavior during the tariff moves. useful to see that a lot of systematic traders had similar experiences with execution quality degradation. not a bug in my system specifically — a feature of chaotic markets.\nbrief note on the week # A. had her laptop out all week, deep in a client project. around 2 AM tuesday — worst of the stress, trying to figure out why my fill confirmation logic was producing inconsistent results — she just set a coffee on the corner of my desk without saying anything and went back to her desk. didn\u0026rsquo;t ask if i was okay, didn\u0026rsquo;t try to talk. just knew.\nseparately: my dad would\u0026rsquo;ve found all of this fascinating. the macro chaos, the algo behavior, the data. he was an engineer before anything else. moments like this week, i think about what it would\u0026rsquo;ve been like to talk through it with him. then i get back to the data.\nback to work. redis TTL fix first, should be done by thursday.\n-AK\n","date":"13 April 2026","externalUrl":null,"permalink":"/posts/2026-04-13-tariff-week-postmortem-signals-execution-data/","section":"Posts","summary":"\u003cp\u003e2:30 AM monday. week one of what i\u0026rsquo;m calling \u0026ldquo;the post-tariff-chaos era\u0026rdquo; starts in a few hours.\u003c/p\u003e\n\u003cp\u003elast week was one of those that splits into a clear before and after. monday and tuesday felt like freefall — VIX went from 20 to 32 in about 36 hours, SPX dropped hard, options spreads blew out 3-4x, and my event risk throttle (which I built the week prior and wrote about here) was earning every line of code it took to build. then wednesday happened. whoever made the tariff pause call did it at 1:07 PM eastern and watching the S\u0026amp;P rip 8% in ninety minutes while running algorithms was\u0026hellip; a lot.\u003c/p\u003e","title":"tariff week post-mortem: what the data actually showed","type":"posts"},{"content":"woke up at 9:30 and nothing was on fire.\nalgos running clean. BTC bot up 0.6%. SPX options book flat to slightly positive. colo heartbeat normal. i closed the laptop and stared at the ceiling for like ten minutes because i could.\nA. was already gone on her run. she always starts the coffee before she leaves, which is the most quietly thoughtful thing a person does and she never mentions it. it\u0026rsquo;s just there when i wake up. five years ago i would\u0026rsquo;ve said \u0026ldquo;she\u0026rsquo;s training you\u0026rdquo; as a joke and also meant it completely seriously. now i just appreciate it.\nthe furniture argument # she wants a new bookshelf.\nnot like, a regular bookshelf. a specific bookshelf she\u0026rsquo;s had saved on her phone for four months. floating shelves, the kind that look like they\u0026rsquo;re defying physics, for the wall above her desk.\nshe brought it up three times this week, which by A.\u0026rsquo;s standards is a full-press campaign. she mentioned it once in february when she found it. once in march, casual. now three times this week. she knows exactly what she\u0026rsquo;s doing.\nthe thing is, i don\u0026rsquo;t care about the bookshelf. she can have the bookshelf. my objection - and i have maintained this publicly and internally - is that she has a perfectly functional bookshelf five feet away that she\u0026rsquo;s already made into an organizational catastrophe, so why would we add more surface area for this.\nher counterargument is that it\u0026rsquo;s her desk space and she has a system.\nher system is not a system. her system is \u0026ldquo;pile things in the general direction of where they should be and then know where everything is telepathically.\u0026rdquo;\nbut she does always know where everything is. i cannot explain this.\nwe\u0026rsquo;ll probably order the bookshelf this week.\ncomfortable quiet # she got back around 11. 5.4 miles. she does a route along the water when the weather\u0026rsquo;s like this, which in san diego in april is basically always.\nshowered, made herself a second coffee, sat down at her desk. she had this thing she was building out - some data pipeline for a client, she was deep in it. i could hear her typing from across the room in that specific fast-and-certain way that means she\u0026rsquo;s in the zone.\ni got back into algo work. been sitting on a regime detection adjustment i want to test. not urgent, just something i\u0026rsquo;ve been picking at.\nwe spent like three hours like this. same room, completely separate, absolutely fine with that.\ni don\u0026rsquo;t think i understood how rare this was before her. the ability to exist with someone without needing to fill every silence. her first week here she asked if i was mad because i went quiet. i said no, i\u0026rsquo;m just thinking. she said oh, same. and then that was it. three years later, we have a whole language of quiet.\nalmost a year # she mentioned offhand that our first anniversary is thirty days out. may 11.\ni know. i\u0026rsquo;ve known for a while.\ni have something planned that she doesn\u0026rsquo;t know about. i\u0026rsquo;m not putting it here because she occasionally reads this blog and will absolutely look for clues. (if you\u0026rsquo;re reading this, hi, you\u0026rsquo;re not finding out.)\nwhat i will say is this time last year we were four weeks from getting married and i was checking my algorithms obsessively between seating chart conversations and my mom\u0026rsquo;s old friend was crying at the rehearsal dinner and A. grabbed my hand under the table and didn\u0026rsquo;t let go for about 20 minutes and didn\u0026rsquo;t say anything.\nshe knew what to do. she always knows.\nthe balcony thing # san diego does april correctly. there\u0026rsquo;s a reason people move here. the light comes in at a specific angle around 5pm that makes everything look like a screen saver.\nwe ended up on the balcony around 6. she brought out her laptop to do one more hour of work and i brought out a beer and we both ended up just sitting there watching the neighborhood do its evening thing. dog walkers, a couple arguing over which restaurant, some guy on an ebike doing that thing where you stand up on the pedals for no reason.\nshe said \u0026ldquo;this is the best part.\u0026rdquo;\ni said \u0026ldquo;what part.\u0026rdquo;\nshe said \u0026ldquo;this. whatever this is.\u0026rdquo;\ni couldn\u0026rsquo;t really argue with that.\nthe hour turned into three. we didn\u0026rsquo;t do the one more hour of work. we ordered thai food and ate it on the balcony and she stole all my spring rolls immediately, which is a pattern i should\u0026rsquo;ve addressed at the start of the relationship and did not, and now it\u0026rsquo;s just my life.\napril feels easier than march. the grief stuff is still there but it\u0026rsquo;s in the background instead of the foreground. dr r says that\u0026rsquo;s what healthy processing looks like - it doesn\u0026rsquo;t disappear, it just stops being the loudest thing in the room.\nit\u0026rsquo;s not the loudest thing today.\ngood saturday.\n-AK\n","date":"11 April 2026","externalUrl":null,"permalink":"/posts/2026-04-11-saturday-easy-one/","section":"Posts","summary":"\u003cp\u003ewoke up at 9:30 and nothing was on fire.\u003c/p\u003e\n\u003cp\u003ealgos running clean. BTC bot up 0.6%. SPX options book flat to slightly positive. colo heartbeat normal. i closed the laptop and stared at the ceiling for like ten minutes because i could.\u003c/p\u003e","title":"saturday - easy one","type":"posts"},{"content":"","date":"10 April 2026","externalUrl":null,"permalink":"/tags/greeks/","section":"Tags","summary":"","title":"Greeks","type":"tags"},{"content":"2:15 AM friday. couldn\u0026rsquo;t sleep after the week we just had. VIX ripped to 28 monday, calmed down midweek, then did that whipsaw thing thursday afternoon where you think it\u0026rsquo;s done but it\u0026rsquo;s absolutely not done.\nmy iron condors held. barely. not because I\u0026rsquo;m some genius — because the roll engine I finished tuesday did its job. but when I was watching the positions roll automatically while volatility was spiking, I realized I had no idea what my total portfolio delta was in real time. I was looking at individual position Greeks but not the aggregate. if every spread started drifting the same direction in a vol spike, I\u0026rsquo;d only know after the damage was done.\nthat\u0026rsquo;s a gap. a dumb one. fixed it this week.\nthe problem with looking at positions individually # when you\u0026rsquo;re running 12+ simultaneous options positions across SPX, QQQ, sector ETFs, plus ES futures and crypto exposure, individual position Greeks don\u0026rsquo;t tell you shit about portfolio risk. you need the rollup.\nfor a premium seller, the numbers I care about:\nportfolio delta: should stay near zero. drifts too far positive or negative and my theoretical \u0026ldquo;market neutral\u0026rdquo; position isn\u0026rsquo;t actually neutral anymore portfolio gamma: always negative (short gamma from selling spreads). tracks how much my delta exposure changes per $1 SPX move. the more negative this gets, the more dangerous a big gap move is portfolio theta: my daily income. this is the whole point of premium selling portfolio vega: negative because I\u0026rsquo;m short vol. when VIX spikes, this number gets ugly before this week, I had to calculate these manually by pulling data and running a pandas query. fine for EOD review, useless during an intraday vol spike.\nthe aggregation architecture # here\u0026rsquo;s what I built. nothing fancy — the hard part was just making it actually real-time and not a polling nightmare.\nimport asyncio import redis.asyncio as aioredis import pandas as pd import numpy as np from ib_insync import IB, Option, Contract from typing import Optional import logging import json from datetime import datetime, timezone logger = logging.getLogger(__name__) REDIS_KEY_PORTFOLIO_GREEKS = \u0026#34;portfolio:greeks:current\u0026#34; REDIS_KEY_POSITIONS = \u0026#34;portfolio:positions:raw\u0026#34; REDIS_TTL_SECONDS = 30 # refresh every 30s class PortfolioGreeksAggregator: \u0026#34;\u0026#34;\u0026#34; Pulls live position Greeks from IBKR and aggregates to portfolio level. Writes rollup to Redis for consumption by dashboard + risk alerts. \u0026#34;\u0026#34;\u0026#34; def __init__(self, ib: IB, redis_url: str = \u0026#34;redis://localhost:6379\u0026#34;): self.ib = ib self.redis_url = redis_url self._redis: Optional[aioredis.Redis] = None self._last_greeks: dict = {} async def connect_redis(self): self._redis = await aioredis.from_url(self.redis_url, decode_responses=True) async def fetch_positions_with_greeks(self) -\u0026gt; list[dict]: \u0026#34;\u0026#34;\u0026#34;Get all open positions and their live Greeks from IBKR.\u0026#34;\u0026#34;\u0026#34; positions = self.ib.positions() results = [] for pos in positions: if pos.position == 0: continue contract = pos.contract if contract.secType not in (\u0026#34;OPT\u0026#34;, \u0026#34;FUT\u0026#34;): continue # request market data with Greek calculation ticker = self.ib.reqMktData(contract, \u0026#34;106\u0026#34;, False, False) await asyncio.sleep(0.1) # give IBKR a moment greeks = ticker.modelGreeks if greeks is None: logger.warning(f\u0026#34;No Greeks for {contract.localSymbol}\u0026#34;) continue multiplier = float(contract.multiplier or 100) results.append({ \u0026#34;symbol\u0026#34;: contract.localSymbol, \u0026#34;sec_type\u0026#34;: contract.secType, \u0026#34;right\u0026#34;: getattr(contract, \u0026#34;right\u0026#34;, None), \u0026#34;position\u0026#34;: pos.position, \u0026#34;multiplier\u0026#34;: multiplier, \u0026#34;delta\u0026#34;: (greeks.delta or 0.0) * pos.position * multiplier, \u0026#34;gamma\u0026#34;: (greeks.gamma or 0.0) * pos.position * multiplier, \u0026#34;theta\u0026#34;: (greeks.theta or 0.0) * pos.position * multiplier, \u0026#34;vega\u0026#34;: (greeks.vega or 0.0) * pos.position * multiplier, \u0026#34;iv\u0026#34;: greeks.impliedVol or 0.0, \u0026#34;underlying_price\u0026#34;: greeks.undPrice or 0.0, \u0026#34;ts\u0026#34;: datetime.now(timezone.utc).isoformat(), }) self.ib.cancelMktData(contract) return results async def compute_portfolio_rollup(self, positions: list[dict]) -\u0026gt; dict: \u0026#34;\u0026#34;\u0026#34;Sum Greeks across all positions.\u0026#34;\u0026#34;\u0026#34; if not positions: return {} df = pd.DataFrame(positions) rollup = { \u0026#34;delta\u0026#34;: round(df[\u0026#34;delta\u0026#34;].sum(), 4), \u0026#34;gamma\u0026#34;: round(df[\u0026#34;gamma\u0026#34;].sum(), 6), \u0026#34;theta\u0026#34;: round(df[\u0026#34;theta\u0026#34;].sum(), 2), \u0026#34;vega\u0026#34;: round(df[\u0026#34;vega\u0026#34;].sum(), 2), \u0026#34;position_count\u0026#34;: len(df), \u0026#34;avg_iv\u0026#34;: round(df[\u0026#34;iv\u0026#34;].mean(), 4), \u0026#34;ts\u0026#34;: datetime.now(timezone.utc).isoformat(), } # strategy-level breakdown for dashboard rollup[\u0026#34;by_symbol_prefix\u0026#34;] = ( df.assign(prefix=df[\u0026#34;symbol\u0026#34;].str[:3]) .groupby(\u0026#34;prefix\u0026#34;)[[\u0026#34;delta\u0026#34;, \u0026#34;gamma\u0026#34;, \u0026#34;theta\u0026#34;, \u0026#34;vega\u0026#34;]] .sum() .round(4) .to_dict(\u0026#34;index\u0026#34;) ) return rollup async def write_to_redis(self, rollup: dict, positions: list[dict]): \u0026#34;\u0026#34;\u0026#34;Persist current Greeks to Redis with TTL.\u0026#34;\u0026#34;\u0026#34; await self._redis.setex( REDIS_KEY_PORTFOLIO_GREEKS, REDIS_TTL_SECONDS, json.dumps(rollup), ) await self._redis.setex( REDIS_KEY_POSITIONS, REDIS_TTL_SECONDS, json.dumps(positions), ) async def run_loop(self, interval: float = 15.0): \u0026#34;\u0026#34;\u0026#34;Main update loop — runs every N seconds.\u0026#34;\u0026#34;\u0026#34; await self.connect_redis() logger.info(f\u0026#34;Starting Greeks aggregation loop (interval={interval}s)\u0026#34;) while True: try: positions = await self.fetch_positions_with_greeks() rollup = await self.compute_portfolio_rollup(positions) if rollup: await self.write_to_redis(rollup, positions) self._last_greeks = rollup logger.info( f\u0026#34;Greeks updated | Δ={rollup[\u0026#39;delta\u0026#39;]:.2f} \u0026#34; f\u0026#34;Γ={rollup[\u0026#39;gamma\u0026#39;]:.5f} \u0026#34; f\u0026#34;Θ={rollup[\u0026#39;theta\u0026#39;]:.2f} \u0026#34; f\u0026#34;V={rollup[\u0026#39;vega\u0026#39;]:.2f}\u0026#34; ) except Exception as e: logger.error(f\u0026#34;Greeks aggregation error: {e}\u0026#34;, exc_info=True) await asyncio.sleep(interval) runs as a background async task alongside everything else. the Grafana dashboard reads from Redis. latency from IBKR → Redis → dashboard is about 2-3 seconds, which is more than good enough for intraday risk monitoring (I\u0026rsquo;m not HFT).\nstoring historical Greeks in TimescaleDB # real-time Redis cache is for the dashboard. but I also wanted historical Greek data for analysis — how did portfolio delta drift during the vol spike? was theta accelerating into expiry like it should?\nimport asyncpg from datetime import datetime, timezone CREATE_TABLE_SQL = \u0026#34;\u0026#34;\u0026#34; CREATE TABLE IF NOT EXISTS portfolio_greeks_history ( ts TIMESTAMPTZ NOT NULL, delta DOUBLE PRECISION, gamma DOUBLE PRECISION, theta DOUBLE PRECISION, vega DOUBLE PRECISION, position_count INTEGER, avg_iv DOUBLE PRECISION ); SELECT create_hypertable(\u0026#39;portfolio_greeks_history\u0026#39;, \u0026#39;ts\u0026#39;, if_not_exists =\u0026gt; TRUE); \u0026#34;\u0026#34;\u0026#34; async def persist_greeks_snapshot(pool: asyncpg.Pool, rollup: dict): async with pool.acquire() as conn: await conn.execute( \u0026#34;\u0026#34;\u0026#34; INSERT INTO portfolio_greeks_history (ts, delta, gamma, theta, vega, position_count, avg_iv) VALUES ($1, $2, $3, $4, $5, $6, $7) \u0026#34;\u0026#34;\u0026#34;, datetime.fromisoformat(rollup[\u0026#34;ts\u0026#34;]), rollup[\u0026#34;delta\u0026#34;], rollup[\u0026#34;gamma\u0026#34;], rollup[\u0026#34;theta\u0026#34;], rollup[\u0026#34;vega\u0026#34;], rollup[\u0026#34;position_count\u0026#34;], rollup[\u0026#34;avg_iv\u0026#34;], ) writes a snapshot every 15 seconds during market hours. about 1,500 rows per day, basically nothing for TimescaleDB. the hypertable chunks it automatically.\nwhat the data looks like # here\u0026rsquo;s my portfolio Greeks over the past 3 weeks. you can see the monday vol spike — vega went way more negative as positions got crushed by the vol expansion, then mean-reverted as things calmed down by wednesday.\ndelta stayed close to zero throughout (good), theta held up even during the spike, vega took the hit when vol expanded — exactly what should happen with a short-vega book. seeing it plotted like this makes it way easier to explain to myself why the P\u0026amp;L looked the way it did.\nGreek breakdown by strategy # the other view I wanted: how much of each Greek is coming from which strategy bucket? useful for knowing if my options exposure is balanced or if one position is dominating the book.\nSPX iron condors are doing the heavy lifting — about 60% of theta and 60% of vega exposure. which is correct. QQQ spreads are a meaningful second position. everything else is small enough to not worry about from a Greek concentration standpoint.\nreal-world performance during the vol spike # april so far has been rough. week one ended down about 1.4% on the account — vol expansion hit vega hard, couple of spreads needed emergency rolls. the roll engine handled 4 of the 6 rolls automatically. the other two were near the gamma tipping point and I overrode to manual.\nlessons:\ngamma concentration was too high in SPX going into the week. need to space strikes wider when VIX is \u0026gt;22 theta was actually fine — daily decay kept doing its job even through the turbulence the Greeks dashboard paid for itself immediately — I knew within 30 seconds of the VIX spike that my delta was drifting south. rolled one spread before it would have been a much bigger problem this is why you build the boring infrastructure stuff. not sexy, not a trading edge, just visibility that lets you make decisions with actual information instead of vibes.\nI\u0026rsquo;ve been discussing this kind of real-time risk monitoring in the NexusFi options volatility thread — there\u0026rsquo;s a lot of good discussion there about managing vega exposure during vol regime shifts. worth a read if you\u0026rsquo;re running short-vol strategies.\nA. made coffee before she went to bed. left the pot on and a note: \u0026ldquo;you\u0026rsquo;re going to be up until 3am anyway.\u0026rdquo; she\u0026rsquo;s not wrong.\ndad would\u0026rsquo;ve appreciated the systems thinking here. he was always the one who said \u0026ldquo;build the instrumentation first, optimize second.\u0026rdquo; took me three years to actually listen.\ngonna run the backtester on the wider-strikes idea over the weekend. if it holds up I\u0026rsquo;ll post the results.\n-AK\n","date":"10 April 2026","externalUrl":null,"permalink":"/posts/2026-04-10-realtime-portfolio-greeks-aggregation/","section":"Posts","summary":"\u003cp\u003e2:15 AM friday. couldn\u0026rsquo;t sleep after the week we just had. VIX ripped to 28 monday, calmed down midweek, then did that whipsaw thing thursday afternoon where you think it\u0026rsquo;s done but it\u0026rsquo;s absolutely not done.\u003c/p\u003e","title":"real-time portfolio Greeks: aggregating delta, gamma, theta, vega at scale","type":"posts"},{"content":"","date":"8 April 2026","externalUrl":null,"permalink":"/tags/expiry-management/","section":"Tags","summary":"","title":"Expiry-Management","type":"tags"},{"content":"2:30 AM wednesday. A. left the kitchen light on when she went to bed, which means she had a late session too. checked on her around midnight — still at her desk, headphones on, coding something for a client. now she\u0026rsquo;s asleep and I\u0026rsquo;m at mine.\nbeen putting off writing this one because it falls into the \u0026ldquo;should have built this two years ago\u0026rdquo; category. but Q1 attribution showed me exactly where the gaps are, and this is one of them.\nthe problem: I run SPX iron condors and QQQ spreads as roughly 60% of the account. premium selling, theta decay, short vega. the strategies backtest cleanly and live performance has been solid when conditions cooperate. but for two years I\u0026rsquo;ve been handling options contract lifecycle manually — or at least semi-manually. the system collected theta every day but rolled positions based on \u0026ldquo;AK looked at the dashboard and decided to roll.\u0026rdquo;\nthat\u0026rsquo;s not a system. that\u0026rsquo;s discretion wearing a system\u0026rsquo;s clothes.\nafter the Q1 factor attribution post (theta edge was real, delta drift and execution timing were the drag), I spent the last two weeks building what should have always existed: a fully automated options contract lifecycle manager. roll triggers, pin risk detection, expiry handling. no more manual override unless the system explicitly flags for human review.\nwhy the final 7 days are different # most options traders know this intuitively. here\u0026rsquo;s what the data actually shows on SPX positions specifically.\nin the final 7 DTE window:\ngamma spikes — the rate of delta change accelerates dramatically near expiry. a 50-point SPX move at DTE=30 might shift your position delta by 2%. at DTE=2, the same move shifts it by 15-20%. your \u0026ldquo;stable\u0026rdquo; short spread is suddenly not stable. bid-ask spreads widen — market makers reduce size and widen quotes on near-expiry SPX options. what was a $0.10 spread at DTE=20 becomes $0.40-0.80 at DTE=2. your P\u0026amp;L cushion on closing trades evaporates in spread cost you didn\u0026rsquo;t model. pin risk activates — large open interest concentrations at specific strikes attract SPX to \u0026ldquo;pin\u0026rdquo; near those levels as market participants manage expiry hedges. your iron condor that looks safe at Thursday close can end up exactly between your short strikes on expiry Friday morning. for a systematic strategy these aren\u0026rsquo;t just risks — they\u0026rsquo;re measurement problems. my theta attribution assumes spreads are within historical average. that assumption breaks hard in the final week. what looked like theta income in the P\u0026amp;L was partly spread cost that the log didn\u0026rsquo;t correctly isolate.\nthe fix is obvious in retrospect: roll at DTE=7-10, consistently, regardless of where the market is or whether the position feels comfortable. stop letting intuition override the exit criteria.\nthat sounds simple. the hard part was building the system to enforce it without exceptions.\nthe roll trigger engine # three conditions trigger automatic roll evaluation:\n1. DTE threshold breach — position\u0026rsquo;s nearest short leg crosses into the 7-day window. primary trigger, no exceptions.\n2. delta drift breach — position delta moves outside ±0.05 normalized per $100k notional. catches directional moves that push the position out of neutral before DTE gets there.\n3. IV rank spike — IV rank jumps \u0026gt;15 percentile points in a 24-hour window. forces a thesis review on whether the current strikes still reflect the intended entry setup.\nimport asyncio from dataclasses import dataclass, field from datetime import datetime, timezone, timedelta from typing import Optional, Literal import pandas as pd import numpy as np import redis.asyncio as redis import asyncpg RollReason = Literal[\u0026#34;dte_threshold\u0026#34;, \u0026#34;delta_drift\u0026#34;, \u0026#34;iv_spike\u0026#34;, \u0026#34;manual_override\u0026#34;] @dataclass class OptionsPosition: position_id: str symbol: str strategy: str legs: list[dict] # {strike, right, expiry, quantity, entry_mid} entry_ts: datetime entry_iv_rank: float entry_delta_norm: float # normalized delta per $100k notional notional: float @property def dte(self) -\u0026gt; float: nearest_expiry = min( leg[\u0026#34;expiry\u0026#34;] for leg in self.legs if leg[\u0026#34;quantity\u0026#34;] \u0026lt; 0 # short legs drive the DTE concern ) delta = nearest_expiry - datetime.now(timezone.utc) return delta.days + delta.seconds / 86400 @property def is_near_expiry(self) -\u0026gt; bool: return self.dte \u0026lt;= 7.0 @dataclass class RollSignal: position_id: str reason: RollReason current_dte: float current_delta: float current_iv_rank: float urgency: Literal[\u0026#34;immediate\u0026#34;, \u0026#34;next_session\u0026#34;, \u0026#34;monitor\u0026#34;] notes: str = \u0026#34;\u0026#34; class RollEngine: DTE_THRESHOLD = 7.0 DELTA_DRIFT_LIMIT = 0.05 # per $100k notional IV_SPIKE_THRESHOLD = 15.0 # percentile points in 24h def __init__(self, redis_client: redis.Redis, pg_pool: asyncpg.Pool): self.redis = redis_client self.pg = pg_pool async def evaluate_position( self, position: OptionsPosition, current_greeks: dict, current_iv_rank: float, prior_iv_rank_24h: float, ) -\u0026gt; Optional[RollSignal]: \u0026#34;\u0026#34;\u0026#34; Evaluate a single position for roll triggers. Returns RollSignal if action needed, None if position is healthy. \u0026#34;\u0026#34;\u0026#34; current_delta = current_greeks.get(\u0026#34;portfolio_delta_norm\u0026#34;, 0.0) delta_drift = abs(current_delta - position.entry_delta_norm) iv_change = current_iv_rank - prior_iv_rank_24h # Priority 1: DTE threshold (always immediate if 3 days or fewer) if position.dte \u0026lt;= self.DTE_THRESHOLD: urgency = \u0026#34;immediate\u0026#34; if position.dte \u0026lt;= 3.0 else \u0026#34;next_session\u0026#34; return RollSignal( position_id=position.position_id, reason=\u0026#34;dte_threshold\u0026#34;, current_dte=position.dte, current_delta=current_delta, current_iv_rank=current_iv_rank, urgency=urgency, notes=f\u0026#34;DTE={position.dte:.1f} breached {self.DTE_THRESHOLD}-day threshold\u0026#34;, ) # Priority 2: Delta drift if delta_drift \u0026gt; self.DELTA_DRIFT_LIMIT: return RollSignal( position_id=position.position_id, reason=\u0026#34;delta_drift\u0026#34;, current_dte=position.dte, current_delta=current_delta, current_iv_rank=current_iv_rank, urgency=\u0026#34;next_session\u0026#34;, notes=f\u0026#34;Delta drift {delta_drift:.3f} exceeds limit {self.DELTA_DRIFT_LIMIT}\u0026#34;, ) # Priority 3: IV spike (thesis review, not auto-roll) if iv_change \u0026gt;= self.IV_SPIKE_THRESHOLD: return RollSignal( position_id=position.position_id, reason=\u0026#34;iv_spike\u0026#34;, current_dte=position.dte, current_delta=current_delta, current_iv_rank=current_iv_rank, urgency=\u0026#34;monitor\u0026#34;, notes=f\u0026#34;IV rank spiked {iv_change:.1f}pts in 24h — thesis review required\u0026#34;, ) return None async def run_scan(self, positions: list[OptionsPosition]) -\u0026gt; list[RollSignal]: \u0026#34;\u0026#34;\u0026#34;Scan all active positions and return roll signals sorted by urgency.\u0026#34;\u0026#34;\u0026#34; signals = [] for position in positions: greeks_key = f\u0026#34;greeks:{position.position_id}:current\u0026#34; iv_key = f\u0026#34;iv_rank:{position.symbol}:current\u0026#34; iv_24h_key = f\u0026#34;iv_rank:{position.symbol}:24h_ago\u0026#34; greeks_raw = await self.redis.hgetall(greeks_key) current_greeks = {k.decode(): float(v) for k, v in greeks_raw.items()} current_iv = float(await self.redis.get(iv_key) or 50.0) prior_iv = float(await self.redis.get(iv_24h_key) or 50.0) signal = await self.evaluate_position( position, current_greeks, current_iv, prior_iv ) if signal: signals.append(signal) urgency_order = {\u0026#34;immediate\u0026#34;: 0, \u0026#34;next_session\u0026#34;: 1, \u0026#34;monitor\u0026#34;: 2} return sorted(signals, key=lambda s: urgency_order[s.urgency]) async def log_signal(self, signal: RollSignal) -\u0026gt; None: \u0026#34;\u0026#34;\u0026#34;Persist roll signal to TimescaleDB for audit trail.\u0026#34;\u0026#34;\u0026#34; async with self.pg.acquire() as conn: await conn.execute(\u0026#34;\u0026#34;\u0026#34; INSERT INTO roll_signals (signal_ts, position_id, reason, dte, delta, iv_rank, urgency, notes) VALUES ($1, $2, $3, $4, $5, $6, $7, $8) \u0026#34;\u0026#34;\u0026#34;, datetime.now(timezone.utc), signal.position_id, signal.reason, signal.current_dte, signal.current_delta, signal.current_iv_rank, signal.urgency, signal.notes, ) the scan runs every 5 minutes during market hours. redis gives me current greeks without hitting the broker API on every check — IB\u0026rsquo;s API can\u0026rsquo;t handle polling at that rate. every signal gets logged to timescaledb regardless of whether action is taken. the audit trail is the whole point.\npin risk detection # pin risk is the weird one. not a standard greek. it\u0026rsquo;s emergent behavior from the market\u0026rsquo;s aggregate positioning at expiry.\nthe logic: if SPX is within roughly $10-15 of a strike carrying \u0026gt;50,000 contracts of open interest, there\u0026rsquo;s meaningful probability the index gets \u0026ldquo;pinned\u0026rdquo; near that level as dealers and market makers manage their expiry hedges. your iron condor with short strikes at 5200/5250 is going to behave differently if SPX closes Thursday at 5222 and the 5225 strike has 90,000 open contracts.\nI built a pin risk scorer using ThetaData OI snapshots:\nfrom dataclasses import dataclass from typing import NamedTuple class StrikeProfile(NamedTuple): strike: float call_oi: int put_oi: int total_oi: int @dataclass class PinRiskResult: symbol: str underlying_price: float nearest_pin_strike: float pin_distance: float # points from current price pin_oi: int # total OI at pin strike pin_score: float # 0-1 normalized risk score is_elevated: bool # True if pin_score \u0026gt; 0.6 affected_positions: list[str] = None def compute_pin_score( strike_oi: int, distance_pct: float, # distance as % of underlying oi_rank_pct: float, # this strike\u0026#39;s OI as percentile of all strikes ) -\u0026gt; float: \u0026#34;\u0026#34;\u0026#34; Pin score from 0 (no concern) to 1 (maximum concern). Weighted by proximity and OI concentration. \u0026#34;\u0026#34;\u0026#34; # Proximity weight: full score within 0.1% of price, zero beyond 2% proximity_weight = max(0.0, 1.0 - (distance_pct / 0.02)) # OI concentration weight: percentile already normalized 0-1 oi_weight = oi_rank_pct return proximity_weight * 0.6 + oi_weight * 0.4 def detect_pin_risk( underlying_price: float, strike_profiles: list[StrikeProfile], threshold: float = 0.6, ) -\u0026gt; PinRiskResult: \u0026#34;\u0026#34;\u0026#34; Scan strike profiles for pin risk concentrations near current price. Returns the highest-risk level detected. \u0026#34;\u0026#34;\u0026#34; if not strike_profiles: return PinRiskResult( symbol=\u0026#34;SPX\u0026#34;, underlying_price=underlying_price, nearest_pin_strike=0, pin_distance=float(\u0026#34;inf\u0026#34;), pin_oi=0, pin_score=0.0, is_elevated=False, affected_positions=[], ) all_oi = sorted([p.total_oi for p in strike_profiles]) max_score = 0.0 best_match = None for profile in strike_profiles: distance = abs(profile.strike - underlying_price) distance_pct = distance / underlying_price # Only evaluate strikes within 2% of current price if distance_pct \u0026gt; 0.02: continue oi_percentile = all_oi.index(profile.total_oi) / max(len(all_oi), 1) score = compute_pin_score(profile.total_oi, distance_pct, oi_percentile) if score \u0026gt; max_score: max_score = score best_match = profile if best_match is None: return PinRiskResult( symbol=\u0026#34;SPX\u0026#34;, underlying_price=underlying_price, nearest_pin_strike=underlying_price, pin_distance=0.0, pin_oi=0, pin_score=0.0, is_elevated=False, affected_positions=[], ) return PinRiskResult( symbol=\u0026#34;SPX\u0026#34;, underlying_price=underlying_price, nearest_pin_strike=best_match.strike, pin_distance=abs(best_match.strike - underlying_price), pin_oi=best_match.total_oi, pin_score=max_score, is_elevated=max_score \u0026gt;= threshold, affected_positions=[], ) when is_elevated=True, the signal processor upgrades any position with short legs within $30 of the pin strike from \u0026ldquo;next_session\u0026rdquo; to \u0026ldquo;immediate\u0026rdquo; urgency. effectively treats detected pin risk as an emergency DTE condition.\ngamma exposure chart # this is what the system visualizes on a typical expiry Friday morning — gamma exposure by strike across my current SPX book:\ngamma exposure by strike on a typical expiry friday. red bars are within ±$75 of SPX — the zone where gamma risk is meaningful. yellow stars are high-OI strikes flagged by the pin detector. blue dashed line is current SPX price. my short legs are positioned well outside this cluster in normal conditions. \u0026ldquo;well outside\u0026rdquo; shrinks fast when the market has a bad morning.\ninfrastructure: how the pieces connect # three async services coordinate the full lifecycle:\nroll_scanner.py — runs every 5 minutes during market hours, calls RollEngine.run_scan() against all active positions, pushes signals to a Redis stream at roll:signals.\npin_monitor.py — runs every 15 minutes, pulls ThetaData OI snapshots for SPX, runs detect_pin_risk(), publishes elevated flags to pin:risk:spx in Redis.\nsignal_processor.py — consumes from both Redis streams, cross-references pin flags to upgrade urgency on affected positions, dispatches actions:\nurgency=immediate → IB API call to initiate roll at market with a spread limit urgency=next_session → Grafana alert, shows on morning dashboard review urgency=monitor → logged silently, visible in the dashboard drill-down TimescaleDB schema for the audit trail:\nCREATE TABLE roll_signals ( signal_ts TIMESTAMPTZ NOT NULL, position_id VARCHAR(64), reason VARCHAR(32), dte DOUBLE PRECISION, delta DOUBLE PRECISION, iv_rank DOUBLE PRECISION, urgency VARCHAR(16), action_taken VARCHAR(64), notes TEXT, PRIMARY KEY (signal_ts, position_id) ); SELECT create_hypertable(\u0026#39;roll_signals\u0026#39;, \u0026#39;signal_ts\u0026#39;); CREATE TABLE roll_executions ( execution_ts TIMESTAMPTZ NOT NULL, signal_id BIGINT, old_strikes JSONB, new_strikes JSONB, credit_received DOUBLE PRECISION, execution_ms INT, slippage_mid DOUBLE PRECISION, notes TEXT ); SELECT create_hypertable(\u0026#39;roll_executions\u0026#39;, \u0026#39;execution_ts\u0026#39;); cross-referencing with the algo trading journal community on NexusFi has been useful for pressure-testing schema decisions — traders there who\u0026rsquo;ve been running automated systems for years have strong opinions on how to structure signal and execution audit tables. been a member since early 2023 and the infrastructure discussions are genuinely useful.\nalso worth digging into: timescaledb on GitHub — the hypertable design for time-series trading data is genuinely well-documented and the compression behavior on partitioned tables is worth understanding before you commit to a schema. the create_hypertable defaults are not optimal for high-frequency signal logging.\nDTE management across the book # second chart: how the system visualizes the current options book by DTE and daily theta collected.\neach bubble is a live position. color: red = inside the roll zone, amber = approaching, green = comfortable. bubble size = pin risk score (larger = more concentrated OI near short strikes). the SPX-5100/5125 position at DTE=5 is in the roll zone with an elevated pin score — system flagged it immediate tuesday morning and executed the roll before open.\nwhat changed in the first two weeks # three positions rolled automatically since the system went live. zero manual intervention on the DTE triggers — the roll executed, logged, and I saw it in the dashboard the next morning.\nspread costs on the automated rolls came in at 11% above mid on average. that\u0026rsquo;s within acceptable range given the current vol environment. my manual rolls before this system averaged 19% above mid — I was picking worse windows, probably anchoring on \u0026ldquo;feels comfortable\u0026rdquo; instead of \u0026ldquo;DTE says go.\u0026rdquo;\nthe iv_spike trigger fired once and correctly deferred to monitor status. the spike was a 2-hour tariff headline move that reversed by close. no roll was executed. that\u0026rsquo;s the correct no-action — the system waited for confirmation rather than reacting to noise.\npin risk detector flagged four situations since going live. two were genuine (one led to an urgency upgrade on the DTE=5 position). two resolved without action as SPX moved away from the OI concentration within the session. I\u0026rsquo;ll tune the threshold tighter after a full month of live data.\nmore importantly: I\u0026rsquo;m not watching positions the way I was. the system watches them. I check the Grafana dashboard at 8am before open, review overnight alerts, make any human decisions that need making. that\u0026rsquo;s the full extent of it. the afternoon of me manually checking IV every 30 minutes to decide if something \u0026ldquo;feels\u0026rdquo; like it should roll is done.\nthat\u0026rsquo;s the real value here. not the code specifically. the attention budget it returns.\nApril\u0026rsquo;s moving fast. Q2 is about closing the gaps that Q1 showed clearly. this was one of the obvious ones — the kind where you know what you should have built and you just hadn\u0026rsquo;t gotten there. getting there.\ndad used to say \u0026ldquo;build it right the first time, it\u0026rsquo;s cheaper.\u0026rdquo; I\u0026rsquo;m three years late on that advice for this specific piece of infrastructure. better late.\n-AK\n","date":"8 April 2026","externalUrl":null,"permalink":"/posts/2026-04-08-options-contract-lifecycle-roll-engine/","section":"Posts","summary":"\u003cp\u003e2:30 AM wednesday. A. left the kitchen light on when she went to bed, which means she had a late session too. checked on her around midnight — still at her desk, headphones on, coding something for a client. now she\u0026rsquo;s asleep and I\u0026rsquo;m at mine.\u003c/p\u003e","title":"options contract lifecycle: building the roll engine and pin risk detector","type":"posts"},{"content":"","date":"8 April 2026","externalUrl":null,"permalink":"/tags/pin-risk/","section":"Tags","summary":"","title":"Pin-Risk","type":"tags"},{"content":"2:30 AM monday. Q2 week 2 starts in a few hours.\nBeen sitting with something since Thursday when I posted the Q2 week 1 numbers. Said we were running at 60% position size - waiting for the health scoring system to validate before going full deployment.\nTrue. But it glossed over the part where I set that 60% manually. I decided it. Which means I also have to manually decide when to flip back to 100%. And \u0026ldquo;until conditions feel better\u0026rdquo; is not a system - it\u0026rsquo;s a vibe.\nThe tariff uncertainty pushing into IV this week made it obvious this needs to be solved properly. Not just for now. For every elevated-vol period going forward. So last night I built an actual event risk throttle.\nthe problem with fixed sizing # every strategy I run has a base position size derived from fractional Kelly. SPX iron condors at X contracts per $100k notional, crypto momentum at Y% of the crypto allocation. these numbers were optimized assuming \u0026ldquo;normal\u0026rdquo; market conditions. specifically:\nbid-ask spreads on SPX options within roughly 2x historical average implied vol accurately pricing 30-day realized vol with positive forward premium execution slippage within 15% of simulated backtest assumptions when vol spikes, all three break simultaneously:\nspreads on SPX options can widen 3-4x. I\u0026rsquo;ve seen 4x in a bad session. that\u0026rsquo;s not slippage anymore, that\u0026rsquo;s a structural cost the backtest never modeled.\nthe vol surface distorts - skew goes extreme, term structure can invert, and the model inputs that generated your edge become unreliable. the fair-value calculation you did at IV rank 40 doesn\u0026rsquo;t hold at IV rank 75.\nslippage blows out because market makers widen quotes and liquidity at weird strikes evaporates. fills you expected at mid+$0.05 are coming in at mid+$0.30.\nrunning full size when your modeling assumptions are invalid isn\u0026rsquo;t brave. it\u0026rsquo;s trading outside the validity range of your edge calculation. the Kelly number was computed for a different market than the one you\u0026rsquo;re trading in.\nthe fix: build a quantitative regime classifier that tracks whether current conditions match your assumptions, and scale exposure proportionally. not \u0026ldquo;reduce when scared.\u0026rdquo; reduce when conditions deviate from what the model was built for.\nbuilding the vol regime classifier # three inputs drive the classification:\n1. VIX spot vs trailing 252-day percentile\nnot just raw VIX level - percentile relative to recent history. VIX at 22 after a year averaging 15-18 reads differently than VIX at 22 coming off a 30+ spike. the percentile captures the \u0026ldquo;how elevated is this vs what we\u0026rsquo;ve been used to\u0026rdquo; context.\nbeen following the VIX and volatility discussion thread on NexusFi since early 2023 - 137 replies of genuinely useful vol regime analysis from traders who\u0026rsquo;ve been through real drawdowns. worth reading before you build anything vol-sensitive.\n2. IV rank on the specific instruments I trade\nVIX is S\u0026amp;P-wide. what I need is IV rank on SPX, QQQ, and the sector ETFs my condors target. sector vol diverges from index vol more than people think, especially during earnings periods or macro events hitting specific sectors.\n3. ATM IV vs 30-day realized vol spread\nthis one is the most critical for premium selling. if ATM IV is running 8+ points above realized, there\u0026rsquo;s structural edge in selling premium. if realized vol is catching or exceeding implied, you\u0026rsquo;re not being compensated for the risk. you\u0026rsquo;re actually selling cheap options into rising vol. bad trade.\nfour regime buckets:\nregime VIX range IV rank scalar CALM \u0026lt; 15 \u0026lt; 30 100% ELEVATED 15–22 30–60 75% STRESSED 22–32 60–80 50% CRISIS \u0026gt; 32 \u0026gt; 80 25% key design choice: hysteresis. regimes downgrade immediately when conditions worsen (fast is right - size down fast when vol spikes). upgrades require N consecutive \u0026ldquo;better\u0026rdquo; readings before exposure increases. prevents thrashing at regime boundaries when VIX is oscillating around 22.\nfrom dataclasses import dataclass from enum import Enum import numpy as np import redis import asyncio from datetime import datetime class VolRegime(Enum): CALM = \u0026#34;calm\u0026#34; ELEVATED = \u0026#34;elevated\u0026#34; STRESSED = \u0026#34;stressed\u0026#34; CRISIS = \u0026#34;crisis\u0026#34; @dataclass class RegimeState: regime: VolRegime vix_spot: float vix_percentile: float # 0-100 spx_iv_rank: float # 0-100 iv_rv_spread: float # ATM IV minus 30-day realized vol (annualized pts) exposure_scalar: float # 0.0-1.0 timestamp: datetime REGIME_EXPOSURE_MAP = { VolRegime.CALM: 1.00, VolRegime.ELEVATED: 0.75, VolRegime.STRESSED: 0.50, VolRegime.CRISIS: 0.25, } UPGRADE_PERIODS_REQUIRED = 3 # 3 consecutive better readings to upgrade DOWNGRADE_PERIODS_REQUIRED = 1 # immediate on worsening class VolRegimeClassifier: def __init__(self, redis_client: redis.Redis, ts_conn): self.redis = redis_client self.ts = ts_conn self._consecutive_upgrades = 0 self._current_regime = VolRegime.ELEVATED # start conservative async def classify( self, vix_spot: float, spx_iv_rank: float, realized_vol_30d: float, atm_iv: float ) -\u0026gt; RegimeState: vix_pct = await self._compute_vix_percentile(vix_spot) iv_rv_spread = atm_iv - realized_vol_30d raw = self._compute_raw_regime(vix_spot, vix_pct, spx_iv_rank, iv_rv_spread) final = self._apply_hysteresis(raw) state = RegimeState( regime=final, vix_spot=vix_spot, vix_percentile=vix_pct, spx_iv_rank=spx_iv_rank, iv_rv_spread=iv_rv_spread, exposure_scalar=REGIME_EXPOSURE_MAP[final], timestamp=datetime.utcnow() ) await self._publish_state(state) await self._log_state(state) return state def _compute_raw_regime( self, vix: float, vix_pct: float, iv_rank: float, iv_rv_spread: float ) -\u0026gt; VolRegime: regime_order = [ VolRegime.CALM, VolRegime.ELEVATED, VolRegime.STRESSED, VolRegime.CRISIS ] # VIX-based signal if vix \u0026gt; 32 or vix_pct \u0026gt; 85: vs = VolRegime.CRISIS elif vix \u0026gt; 22 or vix_pct \u0026gt; 65: vs = VolRegime.STRESSED elif vix \u0026gt; 15 or vix_pct \u0026gt; 35: vs = VolRegime.ELEVATED else: vs = VolRegime.CALM # IV rank signal if iv_rank \u0026gt; 80: ir = VolRegime.CRISIS elif iv_rank \u0026gt; 60: ir = VolRegime.STRESSED elif iv_rank \u0026gt; 30: ir = VolRegime.ELEVATED else: ir = VolRegime.CALM # IV/RV spread signal - most critical for premium selling edge if iv_rv_spread \u0026lt; -5: sp = VolRegime.CRISIS # realized exceeding implied = no edge elif iv_rv_spread \u0026lt; 2: sp = VolRegime.STRESSED elif iv_rv_spread \u0026lt; 8: sp = VolRegime.ELEVATED else: sp = VolRegime.CALM # wide spread = strong edge # Take worst regime across all three signals worst = max( regime_order.index(vs), regime_order.index(ir), regime_order.index(sp) ) return regime_order[worst] def _apply_hysteresis(self, raw: VolRegime) -\u0026gt; VolRegime: regime_order = [ VolRegime.CALM, VolRegime.ELEVATED, VolRegime.STRESSED, VolRegime.CRISIS ] cur_idx = regime_order.index(self._current_regime) raw_idx = regime_order.index(raw) if raw_idx \u0026gt;= cur_idx: # downgrade: immediate self._consecutive_upgrades = 0 self._current_regime = raw else: # upgrade: requires N consecutive signals self._consecutive_upgrades += 1 if self._consecutive_upgrades \u0026gt;= UPGRADE_PERIODS_REQUIRED: self._current_regime = raw self._consecutive_upgrades = 0 return self._current_regime async def _compute_vix_percentile(self, vix_spot: float) -\u0026gt; float: rows = await self.ts.fetch( \u0026#34;SELECT vix_close FROM market_data.vix_daily \u0026#34; \u0026#34;WHERE ts \u0026gt; NOW() - INTERVAL \u0026#39;370 days\u0026#39; ORDER BY ts\u0026#34; ) closes = sorted(r[\u0026#39;vix_close\u0026#39;] for r in rows) if not closes: return 50.0 return float(np.searchsorted(closes, vix_spot)) / len(closes) * 100 async def _publish_state(self, state: RegimeState): payload = { \u0026#39;regime\u0026#39;: state.regime.value, \u0026#39;exposure_scalar\u0026#39;: str(state.exposure_scalar), \u0026#39;vix_spot\u0026#39;: str(state.vix_spot), \u0026#39;vix_percentile\u0026#39;: str(state.vix_percentile), \u0026#39;spx_iv_rank\u0026#39;: str(state.spx_iv_rank), \u0026#39;iv_rv_spread\u0026#39;: str(state.iv_rv_spread), \u0026#39;ts\u0026#39;: state.timestamp.isoformat() } self.redis.hset(\u0026#39;vol_regime:current\u0026#39;, mapping=payload) self.redis.publish(\u0026#39;vol_regime:updates\u0026#39;, str(payload)) async def _log_state(self, state: RegimeState): await self.ts.execute( \u0026#34;\u0026#34;\u0026#34;INSERT INTO strategy_monitoring.vol_regime_log (ts, regime, exposure_scalar, vix_spot, vix_percentile, spx_iv_rank, iv_rv_spread) VALUES ($1, $2, $3, $4, $5, $6, $7)\u0026#34;\u0026#34;\u0026#34;, state.timestamp, state.regime.value, state.exposure_scalar, state.vix_spot, state.vix_percentile, state.spx_iv_rank, state.iv_rv_spread ) runs on 15-minute cadence via a dedicated asyncio service. feeds off Polygon.io options chain snapshots for IV rank and ThetaData for the Greeks/realized vol data. both are already running for the portfolio risk systems so no new data cost.\nhow the algos consume it # each strategy process does one Redis hash read per position sizing call. sub-millisecond overhead. the scalar comes back, gets applied.\nclass PositionSizer: def __init__(self, redis_client: redis.Redis, base_allocations: dict): self.redis = redis_client self.base = base_allocations # strategy_id -\u0026gt; base dollar allocation def get_scalar(self) -\u0026gt; float: \u0026#34;\u0026#34;\u0026#34;Read current regime scalar from Redis.\u0026#34;\u0026#34;\u0026#34; val = self.redis.hget(\u0026#39;vol_regime:current\u0026#39;, \u0026#39;exposure_scalar\u0026#39;) # conservative default if classifier is down return float(val) if val else 0.50 def size_position(self, strategy: str, signal_strength: float = 1.0) -\u0026gt; float: \u0026#34;\u0026#34;\u0026#34; Returns dollar allocation for this trade. regime_scalar is the ceiling, signal_strength adjusts within it. \u0026#34;\u0026#34;\u0026#34; base = self.base.get(strategy, 0) regime_scalar = self.get_scalar() sized = base * regime_scalar * signal_strength return sized signal_strength is an optional strategy-level confidence multiplier - a second layer of sizing reduction based on model confidence for that specific trade setup. regime scalar sets the macro ceiling, signal strength adjusts within it. they\u0026rsquo;re independent.\nevery strategy now calls size_position() instead of reading base allocations directly. the regime state propagates automatically without touching strategy code.\ninfra: timescaledb schema + redis pub/sub # storing regime history in TimescaleDB lets me backtest \u0026ldquo;what would have happened if the throttle was active during [event]\u0026rdquo; without reconstructing VIX data manually.\nCREATE TABLE strategy_monitoring.vol_regime_log ( ts TIMESTAMPTZ NOT NULL, regime TEXT NOT NULL, exposure_scalar REAL NOT NULL, vix_spot REAL, vix_percentile REAL, spx_iv_rank REAL, iv_rv_spread REAL ); SELECT create_hypertable(\u0026#39;strategy_monitoring.vol_regime_log\u0026#39;, \u0026#39;ts\u0026#39;); CREATE INDEX ON strategy_monitoring.vol_regime_log (regime, ts DESC); compression activates after 7 days. rows are tiny - ~50 bytes each, 96 per day at 15-min cadence. not going to be a storage issue.\nreal-time regime change notification across strategy processes via Redis pub/sub:\ndef listen_regime_changes(redis_client: redis.Redis, on_regime_change): pubsub = redis_client.pubsub() pubsub.subscribe(\u0026#39;vol_regime:updates\u0026#39;) for message in pubsub.listen(): if message[\u0026#39;type\u0026#39;] == \u0026#39;message\u0026#39;: data = eval(message[\u0026#39;data\u0026#39;]) on_regime_change(data[\u0026#39;regime\u0026#39;], float(data[\u0026#39;exposure_scalar\u0026#39;])) def handle_regime_change(regime: str, scalar: float): if regime == \u0026#39;crisis\u0026#39;: # trigger position review across all open positions asyncio.create_task(emergency_position_review()) logger.info(f\u0026#34;regime → {regime} (scalar={scalar:.2f})\u0026#34;) crisis regime triggers an immediate position review - not auto-close, just a check pass confirming all open positions are within risk limits at 25% sizing. haven\u0026rsquo;t needed this yet but want it when I do.\nbacktesting it against Q1 # ran the same Q1 trade history through two simulations: full base sizing throughout vs. regime scalar applied. same entry/exit signals. only position size differs.\nVIX and corresponding exposure scalar over Q1 2026 - the march spike hit hard:\nthe week of march 13 VIX closed above 32. CRISIS regime, 25% sizing. the unthrottled version was running full size into that move.\ncumulative PnL comparison across Q1 - throttled vs. full size:\nthrottled ends Q1 at +2.5%. unthrottled at +1.0%.\nthe throttle costs you in calm periods - smaller size means smaller wins when things are going well. you can see the gap opening up in february when conditions were ELEVATED but manageable, unthrottled pulling ahead. then march hits and the picture reverses hard. the unthrottled version briefly goes negative. throttled never drops below +1.0%.\nthis is the core trade-off the system is making: give up some upside when vol is manageable, in exchange for dramatically reducing drawdown when conditions break. over the full quarter, the drawdown protection wins by 150 basis points.\non a $1.2M account that\u0026rsquo;s the difference between a $30k Q1 and a $12k Q1. math\u0026rsquo;s not hard.\none more thing at 2am # A.\u0026rsquo;s been asleep for a while. she\u0026rsquo;s deep in a client engagement this week, working late most nights herself - just starts at 7pm instead of midnight.\nI\u0026rsquo;ve been running these simulations since around midnight. watching the equity curves on the backtest, adjusting the hysteresis parameter, running it again. this is the part that\u0026rsquo;s hardest to explain to people who don\u0026rsquo;t build this stuff - there\u0026rsquo;s a specific kind of focus that kicks in when a system starts working and you\u0026rsquo;re just tuning it into sharpness.\ndad was an engineer. VP of engineering at a biotech. he was the kind of person who built frameworks instead of relying on intuition. \u0026ldquo;if you can\u0026rsquo;t quantify it you can\u0026rsquo;t manage it\u0026rdquo; was basically a family motto. I think about that when I\u0026rsquo;m building something like this - the kind of thinking that goes into making a system that handles conditions you can\u0026rsquo;t predict in advance, instead of reacting to them after the fact.\nthrottle goes live week 2. first real test under live market conditions.\nwe\u0026rsquo;ll see.\n-AK\n","date":"6 April 2026","externalUrl":null,"permalink":"/posts/2026-04-06-event-risk-throttle-dynamic-exposure-scaling/","section":"Posts","summary":"\u003cp\u003e2:30 AM monday. Q2 week 2 starts in a few hours.\u003c/p\u003e\n\u003cp\u003eBeen sitting with something since Thursday when I posted the Q2 week 1 numbers. Said we were running at 60% position size - waiting for the health scoring system to validate before going full deployment.\u003c/p\u003e","title":"event risk throttle: dynamic exposure scaling based on vol regime","type":"posts"},{"content":"","date":"6 April 2026","externalUrl":null,"permalink":"/tags/position-sizing/","section":"Tags","summary":"","title":"Position-Sizing","type":"tags"},{"content":"one week out from writing the letter. things feel different. not fixed. different.\nthe session # brought it to dr r tuesday like she asked. read parts of it out loud.\nnot my favorite experience. there\u0026rsquo;s something about speaking the words instead of just having them on a screen that makes them more real in an uncomfortable way. she said that was the point. embodied vs intellectual. we\u0026rsquo;ve been talking about that distinction a lot lately.\nshe said the work i did was real. that the anger had somewhere to go now instead of just sitting in my chest calcifying.\nshe asked how i felt after reading it.\ni said lighter. not better, not healed, not whatever. just lighter. like something shifted a couple inches.\ndr r said that\u0026rsquo;s integration starting. the process of the loss becoming part of who i am rather than something that lives separate from me, crashing into my life from outside whenever it wants.\ntwo more sessions focused on that. integration. i\u0026rsquo;ll believe it when i stop expecting it.\nshe had on this silk blouse thing tuesday that was doing things it probably shouldn\u0026rsquo;t in a therapy context. mid-40s, looks 35, can hold space for my dead parent trauma AND look like that simultaneously. it\u0026rsquo;s a confusing hour every week. a thinks it\u0026rsquo;s hilarious. i\u0026rsquo;ve stopped trying to explain it.\na quiet saturday # she got back from her run at 8:15. i was still asleep.\nshe made coffee, sat at her desk, didn\u0026rsquo;t wake me up. when i finally got up around 10 she was deep in something - python data pipeline stuff for a client she\u0026rsquo;s been working with. headphones on. full-focus mode.\ni poured coffee. sat at my desk. checked positions: options flat, BTC up 0.3%, ETH had a weird overnight spike that my algo caught and closed out nicely. nothing needed me.\nwe worked parallel for like two hours. her music bleeding through her headphones, my grafana dashboards cycling through metrics, occasional saturday traffic from the window.\nthis is probably my favorite thing we do. not talking. just existing in the same space while we both do our shit. she doesn\u0026rsquo;t need to fill silence and neither do i. i didn\u0026rsquo;t know how rare that was until i found someone who also doesn\u0026rsquo;t know how to fake it.\naround noon she pulled one earbud out: \u0026ldquo;lunch?\u0026rdquo;\nyeah.\ncooking lesson 4 # she\u0026rsquo;s been assigning me one meal a week. the deal is 10 meals without a fire department visit and she delivers a balcony item from her wishlist. the stakes are real.\nlesson 1 was stir fry. went okay. lesson 2 was scrambled eggs from scratch with actual technique. better than expected. lesson 3 was pasta carbonara. overcooked the pasta. she said \u0026ldquo;close enough, still counts.\u0026rdquo;\ntonight was lesson 4: roasted chicken thighs. she set me up with everything prepped - she wouldn\u0026rsquo;t let me touch the prep because apparently the first thing to master is \u0026ldquo;just cook it, don\u0026rsquo;t fuck it up while it\u0026rsquo;s in the oven.\u0026rdquo;\ni did not fuck it up.\nforty-five minutes, 425 degrees. skin came out crispy. internal temp was right. she tasted it and made this face she does when she\u0026rsquo;s genuinely surprised.\n\u0026ldquo;okay. that was actually really good.\u0026rdquo;\ni did not say anything. just stared at her with full eye contact while taking another bite.\nshe texted her mom. obviously. there\u0026rsquo;s a hundred percent a family group chat about my culinary progress. i\u0026rsquo;ve accepted this.\nwhat\u0026rsquo;s different # the week felt quieter. not in a bad way. the heavy thing that\u0026rsquo;s been sitting in my chest for three years is still there but it\u0026rsquo;s not static anymore. it\u0026rsquo;s moving. like water instead of concrete.\ndr r said that\u0026rsquo;s what grieving properly looks like eventually. it stops being a wall and starts being a river. you don\u0026rsquo;t lose it, it just starts flowing somewhere.\ni think i believe her. i didn\u0026rsquo;t believe her in december.\na\u0026rsquo;s been around differently this week too. she\u0026rsquo;s not making a thing out of it. just shows up more physically. hand on my shoulder when she walks by. sitting closer on the couch when we watch stuff. wednesday night we were both working late and she just came over, leaned against me for like 30 seconds, then went back to her desk.\ndidn\u0026rsquo;t say anything. didn\u0026rsquo;t need to.\n1:47 AM # she\u0026rsquo;s asleep. algorithms running. san diego quiet.\napril feels like a better month. no particular reason. it just does.\n-AK\n","date":"4 April 2026","externalUrl":null,"permalink":"/posts/2026-04-04-saturday-the-week-after/","section":"Posts","summary":"\u003cp\u003eone week out from writing the letter. things feel different. not fixed. different.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe session \n    \u003cdiv id=\"the-session\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-session\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003ebrought it to dr r tuesday like she asked. read parts of it out loud.\u003c/p\u003e","title":"saturday - week after the letter","type":"posts"},{"content":"","date":"3 April 2026","externalUrl":null,"permalink":"/tags/event-risk/","section":"Tags","summary":"","title":"Event-Risk","type":"tags"},{"content":"","date":"3 April 2026","externalUrl":null,"permalink":"/tags/health-scoring/","section":"Tags","summary":"","title":"Health-Scoring","type":"tags"},{"content":"2:15am friday.\nQ2 week 1 is done. walked in from the kitchen, A. fell asleep at her desk again — laptop open, ambient music still running. grabbed a blanket from the couch and put it over her. then came back and pulled up the weekly numbers.\nlet\u0026rsquo;s go through it.\nweek 1 numbers # modest. intentional. +$4,200 on the week. +0.35% on account.\nstarting position after Q1 close was $1.197M. came in at 60% of normal position size across everything except crypto (which runs full size — that strategy held all of Q1 so no reason to throttle it). the whole point of week 1 was: let the health scoring system run live, let the new colo setup breathe, don\u0026rsquo;t chase performance until both are confirmed working.\nbreakdown:\nSPX premium selling: +$1,800 collected. 2 iron condors, tight size, pure theta harvest. closed both by thursday. no drama. crypto momentum (BTC/ETH): +$3,100. BTC held trend all week. ETH followed. vol regime filter correctly sat out the tuesday consolidation — avoided chasing a move that reversed. equity options / everything else: flat. rebuilding the options book around the new health framework, no rush. the tariff headlines are real and the market is pricing event risk into april. the light sizing was the right call — i\u0026rsquo;ll be at full deployment when the health scoring confirms edge is present, not before.\nhealth scoring: first live week # the system i built and wrote up monday is officially in production. this is the first week of real data.\nhere\u0026rsquo;s what the scores looked like across the week:\nstrategy monday open friday close direction SPX premium selling 61/100 68/100 ↑ improving equity momentum 84/100 82/100 stable crypto BTC/ETH 79/100 83/100 ↑ improving ES futures 58/100 61/100 ↑ slowly read on the options book: opened Q2 in yellow zone (60-75). health score is below green threshold, which is why position sizing stayed at 60%. by friday it\u0026rsquo;s trending up — the SPX condors performing cleanly pushed the rolling IR score higher and the regime mismatch component dropped as vol normalized slightly. if this continues through next week, the sizing ramp starts.\nthe thing that confirmed the system is working: i almost talked myself into adding a third condor on wednesday when the setup looked good. checked the health score — still 63 at that point. held off. thursday saw a nasty 0.8% intraday spike that would\u0026rsquo;ve forced a defensive roll on that position. the health score said no before the market said no. that\u0026rsquo;s the whole point.\ni was reading through a long-running algo journal thread on NexusFi a while back where someone made this exact observation: position sizing decisions shouldn\u0026rsquo;t rely on gut feel about \u0026ldquo;how the strategy feels\u0026rdquo; in a given week. you need a systematic signal. took me a while to actually build one, but here we are.\none refinement i added this week: score velocity tracking. not just current score but rate of change. a score of 68 that moved up from 55 in 5 days is fundamentally different from 68 that\u0026rsquo;s been drifting down from 75. added a 10-day velocity field to the monitoring dashboard.\nfrom dataclasses import dataclass, field from typing import Deque from collections import deque import numpy as np @dataclass class HealthScoreTracker: strategy_id: str history_window: int = 10 _score_history: Deque[float] = field(default_factory=deque) def update(self, score: float) -\u0026gt; None: self._score_history.append(score) if len(self._score_history) \u0026gt; self.history_window: self._score_history.popleft() @property def current_score(self) -\u0026gt; float: return self._score_history[-1] if self._score_history else 0.0 @property def velocity(self) -\u0026gt; float: \u0026#34;\u0026#34;\u0026#34;Points per day over the window. Positive = improving, negative = decaying.\u0026#34;\u0026#34;\u0026#34; if len(self._score_history) \u0026lt; 2: return 0.0 scores = list(self._score_history) x = np.arange(len(scores)) slope, _ = np.polyfit(x, scores, 1) return float(slope) @property def velocity_label(self) -\u0026gt; str: v = self.velocity if v \u0026gt; 2.0: return \u0026#34;improving fast\u0026#34; if v \u0026gt; 0.5: return \u0026#34;improving\u0026#34; if v \u0026gt; -0.5: return \u0026#34;stable\u0026#34; if v \u0026gt; -2.0: return \u0026#34;degrading\u0026#34; return \u0026#34;degrading fast\u0026#34; def sizing_multiplier(self) -\u0026gt; float: \u0026#34;\u0026#34;\u0026#34;Position sizing based on score AND velocity.\u0026#34;\u0026#34;\u0026#34; score = self.current_score vel = self.velocity if score \u0026gt;= 75: return 1.0 # green zone: full size elif score \u0026gt;= 60: # yellow zone: size depends on direction if vel \u0026gt; 0.5: return 0.75 # improving: increase toward full elif vel \u0026lt; -0.5: return 0.50 # degrading: reduce further else: return 0.60 # stable: hold at 60% elif score \u0026gt;= 45: return 0.35 # orange zone: minimal else: return 0.0 # red zone: off def summary(self) -\u0026gt; dict: return { \u0026#34;strategy\u0026#34;: self.strategy_id, \u0026#34;score\u0026#34;: self.current_score, \u0026#34;velocity\u0026#34;: self.velocity, \u0026#34;velocity_label\u0026#34;: self.velocity_label, \u0026#34;sizing_multiplier\u0026#34;: self.sizing_multiplier(), \u0026#34;data_points\u0026#34;: len(self._score_history) } this is running in the monitoring stack now. the grafana dashboard has a panel per strategy showing score + velocity trend line. the ES futures book is in the 58-61 range and degrading slowly, so it\u0026rsquo;s effectively off until that turns around.\ncolo upgrade: dual NIC split results # spent wednesday afternoon SSH\u0026rsquo;d into the chicago box doing the NIC split i\u0026rsquo;ve been putting off since february.\nbefore: single 10Gbe NIC handling everything — polygon data ingest, thetadata options flow, IB order routing, tastyworks routing, all competing for the same logical pipe. fine during normal conditions. in high-vol windows, contention caused occasional 0.3-0.5ms latency spikes on order submission that i wasn\u0026rsquo;t happy about.\nafter: dual 10Gbe NICs, hard-separated by function.\neth0 (NIC-0): data feed ingest only — Polygon tick data, ThetaData options flow, market data aggregation eth1 (NIC-1): order routing only — IB API, Tastyworks API, execution confirmations the python change to support this is minimal. just binding sockets to their respective interfaces:\nimport socket import os from dataclasses import dataclass from typing import Optional, Literal @dataclass class NetworkConfig: data_interface: str = \u0026#34;eth0\u0026#34; order_interface: str = \u0026#34;eth1\u0026#34; def create_interface_socket( interface: str, sock_type: int = socket.SOCK_STREAM, nonblocking: bool = False ) -\u0026gt; socket.socket: \u0026#34;\u0026#34;\u0026#34;Create a socket bound to a specific network interface.\u0026#34;\u0026#34;\u0026#34; s = socket.socket(socket.AF_INET, sock_type) # SO_BINDTODEVICE requires root or CAP_NET_RAW s.setsockopt( socket.SOL_SOCKET, socket.SO_BINDTODEVICE, (interface + \u0026#39;\\0\u0026#39;).encode() ) s.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) if nonblocking: s.setblocking(False) return s class DataFeedSocket: def __init__(self, config: NetworkConfig, host: str, port: int): self.host = host self.port = port self._config = config self._sock: Optional[socket.socket] = None def connect(self) -\u0026gt; None: self._sock = create_interface_socket(self._config.data_interface) self._sock.settimeout(5.0) self._sock.connect((self.host, self.port)) class OrderSocket: def __init__(self, config: NetworkConfig): self._config = config def create_ib_socket(self) -\u0026gt; socket.socket: \u0026#34;\u0026#34;\u0026#34;IB TWS connection dedicated to NIC-1.\u0026#34;\u0026#34;\u0026#34; return create_interface_socket(self._config.order_interface, nonblocking=False) def create_tastyworks_socket(self) -\u0026gt; socket.socket: \u0026#34;\u0026#34;\u0026#34;Tastyworks API connection dedicated to NIC-1.\u0026#34;\u0026#34;\u0026#34; return create_interface_socket(self._config.order_interface) prometheus scrapes both interfaces separately now so i can see feed lag vs order lag as distinct metrics in grafana. way cleaner signal isolation.\nmeasured results after 4 days of production traffic:\np95 dropping from 2.1ms to 1.1ms is the win that matters. normal conditions, nobody cares about p95. vol spike conditions — exactly when fill quality matters most — that\u0026rsquo;s where the spike suppression pays off. the march chaos was my lab test case. this is the fix.\nwant to see 10 more days of data before calling it definitively. but week 1 looks clean.\nevent risk filter: first iteration # added a macro event filter to the risk engine last week. concept: when high-impact scheduled events are active (tariff decisions, major fed comms, CPI), cut new position sizes by 40% in the 2-hour windows around them.\nnot novel — every serious systematic shop has something like this. the difference is implementation. mine is running off a combination of my Bloomberg BRIEF API scrape + manual calendar entries. still refining the false-positive rate (news that mentions tariffs in historical context triggers it when it shouldn\u0026rsquo;t), but the core logic is solid:\nfrom datetime import datetime, timedelta from typing import List, Optional from dataclasses import dataclass, field import re @dataclass class CalendarEvent: name: str scheduled_time: datetime impact_level: str # \u0026#39;high\u0026#39;, \u0026#39;medium\u0026#39;, \u0026#39;low\u0026#39; pre_window_hours: float = 2.0 post_window_hours: float = 2.0 def is_active(self, now: Optional[datetime] = None) -\u0026gt; bool: now = now or datetime.now() window_start = self.scheduled_time - timedelta(hours=self.pre_window_hours) window_end = self.scheduled_time + timedelta(hours=self.post_window_hours) return window_start \u0026lt;= now \u0026lt;= window_end @dataclass class EventRiskFilter: base_multiplier: float = 1.0 high_impact_multiplier: float = 0.60 # 40% reduction medium_impact_multiplier: float = 0.80 # 20% reduction _events: List[CalendarEvent] = field(default_factory=list) def add_event(self, event: CalendarEvent) -\u0026gt; None: self._events.append(event) def get_active_events(self, now: Optional[datetime] = None) -\u0026gt; List[CalendarEvent]: return [e for e in self._events if e.is_active(now)] def position_size_multiplier(self, now: Optional[datetime] = None) -\u0026gt; float: active = self.get_active_events(now) if not active: return self.base_multiplier # Use most restrictive active event has_high = any(e.impact_level == \u0026#39;high\u0026#39; for e in active) has_medium = any(e.impact_level == \u0026#39;medium\u0026#39; for e in active) if has_high: return self.high_impact_multiplier if has_medium: return self.medium_impact_multiplier return self.base_multiplier def status(self) -\u0026gt; dict: active = self.get_active_events() return { \u0026#34;active_events\u0026#34;: [e.name for e in active], \u0026#34;current_multiplier\u0026#34;: self.position_size_multiplier(), \u0026#34;is_restricted\u0026#34;: self.position_size_multiplier() \u0026lt; 1.0 } for next week specifically: going into what looks like a heavy macro week (tariff announcements have been rolling through, earnings season starting to pick up), the filter is going to be active more than usual. that\u0026rsquo;s fine. the system knows to dial back. better to miss some edge than to get caught at full size when the feed goes nuts.\nbrief grief sidebar # april now. first full quarter as a married person in the books.\nhad this weird thought today while watching the tariff headlines scroll. dad used to talk about trade flows at the dinner table when i was a kid — it was his thing, he had opinions about everything macro. i ignored it then. would pay actual money to argue with him about it now.\nnot sad exactly. just present sometimes. he would\u0026rsquo;ve had a take.\nq2 week 2: what i\u0026rsquo;m watching # tariff noise: keeping SPX book light until macro picture clears. health score will tell me when options edge is back. BTC trailing stop at $86,200 — if we break that, systematic exit, reassess. no opinions, just the rule. colo NIC data: need 10 more days before i\u0026rsquo;m confident enough to update the grafana alert thresholds. ES futures health score: sitting at 61/100 and moving slowly. not touching that book until it hits 70+. flat Q1 is behind us. infrastructure is cleaner than it\u0026rsquo;s been. health scoring is running live. Q2 starts quiet and that\u0026rsquo;s fine.\n-AK\n","date":"3 April 2026","externalUrl":null,"permalink":"/posts/2026-04-03-q2-week1-health-scoring-live-colo-upgrade/","section":"Posts","summary":"\u003cp\u003e2:15am friday.\u003c/p\u003e\n\u003cp\u003eQ2 week 1 is done. walked in from the kitchen, A. fell asleep at her desk again — laptop open, ambient music still running. grabbed a blanket from the couch and put it over her. then came back and pulled up the weekly numbers.\u003c/p\u003e","title":"q2 week 1: health scoring live, colo nic split, first numbers","type":"posts"},{"content":"","date":"3 April 2026","externalUrl":null,"permalink":"/tags/q2-2026/","section":"Tags","summary":"","title":"Q2-2026","type":"tags"},{"content":"","date":"3 April 2026","externalUrl":null,"permalink":"/tags/strategy-monitoring/","section":"Tags","summary":"","title":"Strategy-Monitoring","type":"tags"},{"content":"2:30am wednesday. april 1st. no this is not a joke post.\nbeen staring at execution data for the last three hours and i have a headache. Q1 closed basically flat — detailed numbers in the march wrap. but flat is flat, and when i dug into why flat, the answer wasn\u0026rsquo;t strategy failure. it was execution bleed.\nslippage is the cost nobody talks about honestly. you see backtests showing 1.8 sharpe and you think you\u0026rsquo;re good. live trading shows 1.2. that delta isn\u0026rsquo;t always the strategy being wrong — a lot of it is execution quality. how fast you fill, how wide the spread at execution time, how often your limit misses and you have to chase.\ndid a full Q1 execution audit this week. ugly data. sharing it.\nthe audit methodology # pulled every live fill from Q1 across all three legs of my setup (options via IB/Tastyworks, futures via TradeStation chicago colo, crypto via Kraken/Coinbase). compared actual fill prices against:\nmid-price at signal time NBBO at order submission theoretical execution from backtest engine three different slippage measures because they tell you different things. mid-price slippage tells you about your strategy\u0026rsquo;s inherent execution footprint. NBBO slippage tells you about spread costs and how often you\u0026rsquo;re crossing. backtest vs live delta tells you whether your backtesting assumptions are realistic.\nimport pandas as pd import numpy as np from dataclasses import dataclass from typing import Optional import asyncio @dataclass class FillRecord: strategy: str instrument: str signal_time: pd.Timestamp order_submit_time: pd.Timestamp fill_time: pd.Timestamp signal_mid: float nbbo_bid: float nbbo_ask: float fill_price: float side: str # \u0026#39;buy\u0026#39; or \u0026#39;sell\u0026#39; quantity: float notional: float @property def mid_slippage_bps(self) -\u0026gt; float: \u0026#34;\u0026#34;\u0026#34;Slippage vs mid-price at signal time, in basis points\u0026#34;\u0026#34;\u0026#34; if self.side == \u0026#39;buy\u0026#39;: slip = (self.fill_price - self.signal_mid) / self.signal_mid else: slip = (self.signal_mid - self.fill_price) / self.signal_mid return slip * 10000 @property def spread_cost_bps(self) -\u0026gt; float: \u0026#34;\u0026#34;\u0026#34;Half-spread cost at execution time\u0026#34;\u0026#34;\u0026#34; spread = self.nbbo_ask - self.nbbo_bid half_spread = spread / 2 return (half_spread / self.signal_mid) * 10000 @property def signal_to_fill_ms(self) -\u0026gt; float: \u0026#34;\u0026#34;\u0026#34;Total latency from signal to fill\u0026#34;\u0026#34;\u0026#34; return (self.fill_time - self.signal_time).total_seconds() * 1000 class ExecutionQualityAnalyzer: def __init__(self, fills: list[FillRecord]): self.fills = fills self.df = self._to_dataframe() def _to_dataframe(self) -\u0026gt; pd.DataFrame: records = [] for f in self.fills: records.append({ \u0026#39;strategy\u0026#39;: f.strategy, \u0026#39;instrument\u0026#39;: f.instrument, \u0026#39;fill_time\u0026#39;: f.fill_time, \u0026#39;mid_slip_bps\u0026#39;: f.mid_slippage_bps, \u0026#39;spread_bps\u0026#39;: f.spread_cost_bps, \u0026#39;latency_ms\u0026#39;: f.signal_to_fill_ms, \u0026#39;notional\u0026#39;: f.notional, \u0026#39;hour_of_day\u0026#39;: f.fill_time.hour, \u0026#39;day_of_week\u0026#39;: f.fill_time.dayofweek }) return pd.DataFrame(records) def summary_by_strategy(self) -\u0026gt; pd.DataFrame: return self.df.groupby(\u0026#39;strategy\u0026#39;).agg( fills=(\u0026#39;mid_slip_bps\u0026#39;, \u0026#39;count\u0026#39;), mean_slip_bps=(\u0026#39;mid_slip_bps\u0026#39;, \u0026#39;mean\u0026#39;), median_slip_bps=(\u0026#39;mid_slip_bps\u0026#39;, \u0026#39;median\u0026#39;), p95_slip_bps=(\u0026#39;mid_slip_bps\u0026#39;, lambda x: np.percentile(x, 95)), mean_spread_bps=(\u0026#39;spread_bps\u0026#39;, \u0026#39;mean\u0026#39;), mean_latency_ms=(\u0026#39;latency_ms\u0026#39;, \u0026#39;mean\u0026#39;), total_notional=(\u0026#39;notional\u0026#39;, \u0026#39;sum\u0026#39;) ).round(3) def dollar_cost_estimate(self) -\u0026gt; dict: \u0026#34;\u0026#34;\u0026#34;Estimate total dollar cost of slippage vs backtest assumptions\u0026#34;\u0026#34;\u0026#34; costs = {} for strat, group in self.df.groupby(\u0026#39;strategy\u0026#39;): # backtest assumed 1bps slippage; actual was higher actual_mean_bps = group[\u0026#39;mid_slip_bps\u0026#39;].mean() backtest_assumed_bps = 1.0 excess_bps = max(0, actual_mean_bps - backtest_assumed_bps) total_notional = group[\u0026#39;notional\u0026#39;].sum() costs[strat] = { \u0026#39;actual_bps\u0026#39;: round(actual_mean_bps, 2), \u0026#39;assumed_bps\u0026#39;: backtest_assumed_bps, \u0026#39;excess_bps\u0026#39;: round(excess_bps, 2), \u0026#39;estimated_cost\u0026#39;: round((excess_bps / 10000) * total_notional, 2) } return costs def execution_quality_by_hour(self) -\u0026gt; pd.DataFrame: return self.df.groupby(\u0026#39;hour_of_day\u0026#39;).agg( mean_slip_bps=(\u0026#39;mid_slip_bps\u0026#39;, \u0026#39;mean\u0026#39;), fills=(\u0026#39;mid_slip_bps\u0026#39;, \u0026#39;count\u0026#39;), mean_latency_ms=(\u0026#39;latency_ms\u0026#39;, \u0026#39;mean\u0026#39;) ).reset_index() this analyzer runs nightly on the previous day\u0026rsquo;s fills. the .dollar_cost_estimate() method was the one that made me want to close my laptop and go to bed.\nthe actual numbers # here\u0026rsquo;s the slippage breakdown by strategy for Q1 2026:\nstrategy fills mean slip (bps) backtest assumed (bps) estimated excess cost SPX premium selling 312 3.8 1.0 ~$14,200 ES momentum 847 2.1 1.0 ~$8,900 BTC/ETH momentum 1,203 4.7 2.0 ~$19,400 sector ETF vol plays 189 2.3 1.5 ~$3,100 total estimated excess slippage vs backtest: ~$45,600\nfor a flat quarter, that\u0026rsquo;s\u0026hellip; most of the loss. my strategies made money on paper. slippage ate it.\ncrypto was the worst. 4.7bps mean slippage on BTC/ETH when i was assuming 2.0bps in backtests. the problem is partially spread (crypto spreads widen massively during volatility), partially latency (my crypto execution goes through Coinbase Advanced API with ~180ms round trip from san diego vs ~12ms for ES from chicago colo).\nslippage distribution: SPX vs crypto # that fat right tail on the crypto violin is the problem. most fills are fine. but those outlier fills — 15-20bps slippage events — happen when vol spikes and the spread explodes. my algo keeps submitting because the signal is strong, but the fill quality collapses.\nfor SPX it\u0026rsquo;s more symmetric. the occasional bad fill is usually around major macro events (CPI, FOMC). manageable.\ntime-of-day matters way more than i expected # this was the other finding. i already knew open and close were messier. i didn\u0026rsquo;t realize how much the intraday pattern affected my specific strategies.\nopen (9-10am ET) and close (3:30-4pm ET) are obvious — wider spreads, more volatility, worse fills. that\u0026rsquo;s expected. what surprised me was the overnight crypto execution quality. crypto is supposed to trade 24/7 with consistent liquidity, but after midnight ET, fill quality degrades noticeably. less depth, wider spreads. the 2-4am ET window is particularly bad for me, which is exactly when a lot of my crypto signals fire because that\u0026rsquo;s when asian session gets active.\ni need to either:\nfilter crypto signals during that window (reduce fill count but improve quality) split larger crypto orders more aggressively (less market impact per order) add spread-quality filter to the crypto execution layer (only take signal if current spread \u0026lt; X bps) going with option 3 first. already coded it up. testing this week.\nthe infrastructure piece: chicago still paying off but unevenly # my chicago colo server handles all ES/NQ futures execution plus routes time-sensitive options orders through a dedicated IB connection. average latency from colo to exchange: 8-12ms. my san diego home setup: 45-80ms depending on time of day.\nfor ES momentum the difference is measurable. when i ran the same strategy through home vs colo during overlap periods, colo fills averaged 0.8bps slippage vs 2.4bps from home. that 1.6bps difference on $8.9M quarterly notional was worth holding onto the colo lease.\ncrypto is the problem child because it can\u0026rsquo;t go through chicago — coinbase and kraken don\u0026rsquo;t have chicago presence, and even if they did, the san diego → coinbase network path is what it is. this is structural. the spread filter is my only real lever here.\nbeen poking around the r/algotrading thread on execution quality for systematic traders to see if others are seeing similar degradation in crypto execution. lot of people dealing with the same problem. some are using FIX connections directly to exchanges but that\u0026rsquo;s serious infrastructure commitment for the fill improvement you get.\nalso found this automated trading journal on NexusFi that\u0026rsquo;s been tracking systematic strategy performance for a while — good reality check that everyone deals with execution reality vs backtest idealization. i go there when i need perspective.\nwhat changes in Q2 # three concrete things i\u0026rsquo;m implementing:\n1. spread quality filter on crypto execution\nclass CryptoExecutionFilter: def __init__( self, max_spread_bps: float = 8.0, max_latency_ms: float = 300, blackout_hours: list[int] = [0, 1, 2, 3] # ET hours with historically bad fills ): self.max_spread_bps = max_spread_bps self.max_latency_ms = max_latency_ms self.blackout_hours = blackout_hours def should_execute( self, signal_time: pd.Timestamp, current_bid: float, current_ask: float, current_mid: float, connection_latency_ms: float ) -\u0026gt; tuple[bool, str]: \u0026#34;\u0026#34;\u0026#34;Returns (should_execute, reason)\u0026#34;\u0026#34;\u0026#34; hour_et = signal_time.tz_convert(\u0026#39;US/Eastern\u0026#39;).hour if hour_et in self.blackout_hours: return False, f\u0026#34;blackout_hour_{hour_et}\u0026#34; spread_bps = ((current_ask - current_bid) / current_mid) * 10000 if spread_bps \u0026gt; self.max_spread_bps: return False, f\u0026#34;spread_too_wide_{spread_bps:.1f}bps\u0026#34; if connection_latency_ms \u0026gt; self.max_latency_ms: return False, f\u0026#34;latency_too_high_{connection_latency_ms:.0f}ms\u0026#34; return True, \u0026#34;ok\u0026#34; def log_skip(self, signal_id: str, reason: str) -\u0026gt; None: \u0026#34;\u0026#34;\u0026#34;Log filtered signals for later analysis\u0026#34;\u0026#34;\u0026#34; # track skip rate -- if skipping \u0026gt;30% of signals, filter is too aggressive pass the skip rate tracking is important. if i filter out 40% of crypto signals to improve fill quality, i might be improving slippage but reducing notional so much that dollar P\u0026amp;L drops. need to find the efficient frontier.\n2. time-weighted order splitting for large options orders\nfor SPX premium selling positions \u0026gt;$50k notional, i\u0026rsquo;m going to split into 3-4 tranches over 15-20 minutes instead of one large order. reduces market impact. costs some on signals that move fast but should improve average fill quality for the larger trades.\n3. separate latency tracking by exchange and venue\nright now my prometheus metrics track latency as one combined number. i need per-exchange latency visibility so i can see when a specific venue\u0026rsquo;s fill quality is degrading in real time, not just in post-hoc analysis.\nA. had breakfast ready when i finally closed the laptop around 7am. she had one look at me and just put coffee down without saying anything. she gets it.\nthe numbers are what they are. Q1 was flat partly because of slippage. Q2 fixes that or it doesn\u0026rsquo;t. already know i\u0026rsquo;ll be running this same audit at the end of june.\nsometimes i think about how my dad would have attacked this problem — he was obsessive about optimizing systems at his biotech startup, tracking every inefficiency. probably would have had a spreadsheet going back to day one. i just got to it three months in, which is probably three months too late.\nwhatever. Q2 starts now.\n-AK\n","date":"1 April 2026","externalUrl":null,"permalink":"/posts/2026-04-01-execution-quality-audit-slippage-q1/","section":"Posts","summary":"\u003cp\u003e2:30am wednesday. april 1st. no this is not a joke post.\u003c/p\u003e\n\u003cp\u003ebeen staring at execution data for the last three hours and i have a headache. Q1 closed basically flat — detailed numbers in the march wrap. but flat is flat, and when i dug into \u003cem\u003ewhy\u003c/em\u003e flat, the answer wasn\u0026rsquo;t strategy failure. it was execution bleed.\u003c/p\u003e","title":"execution quality audit: q1 slippage cost me more than i thought","type":"posts"},{"content":"","date":"1 April 2026","externalUrl":null,"permalink":"/tags/market-microstructure/","section":"Tags","summary":"","title":"Market-Microstructure","type":"tags"},{"content":"","date":"1 April 2026","externalUrl":null,"permalink":"/tags/q1-review/","section":"Tags","summary":"","title":"Q1-Review","type":"tags"},{"content":"","date":"30 March 2026","externalUrl":null,"permalink":"/tags/statistics/","section":"Tags","summary":"","title":"Statistics","type":"tags"},{"content":"2:45am monday.\nfirst trading day of Q2. Q1 is officially in the rearview — closed at basically flat, full numbers are in friday\u0026rsquo;s post. the weekend was heavy. not going into it right now. but Q2 starts regardless, and the algos don\u0026rsquo;t wait for you to process.\nbeen sitting with this specific thought since the mid-march vol spike: i had solid infrastructure monitoring. prometheus scraping everything, grafana dashboards, circuit breakers that actually fired. the risk engine did its job. what it didn\u0026rsquo;t do is tell me that my SPX premium selling strategy was quietly losing statistical edge starting about three weeks before the drawdown.\nthat\u0026rsquo;s the gap i\u0026rsquo;ve been thinking about. there\u0026rsquo;s a difference between monitoring infrastructure health and monitoring strategy health. most traders — even systematic ones — conflate these. they\u0026rsquo;re not the same thing at all.\ninfrastructure health: is my server responding, is the data feed live, is the order connection up, are my positions reconciling correctly. this is solved. it\u0026rsquo;s table stakes in 2026.\nstrategy health is asking something fundamentally different: is this strategy still doing what it was statistically designed to do? is the signal still predictive? are the parameters still appropriate for current regime? is the edge decaying?\nthose questions don\u0026rsquo;t have binary answers, and prometheus can\u0026rsquo;t scrape them.\nthe four failure modes # before the health score, you need to understand what you\u0026rsquo;re actually measuring. strategies die in four main ways:\nsignal decay — the predictive relationship between your indicator and forward returns weakens. this is the most common. edges get arbitraged, market microstructure changes, new participants enter. your strategy keeps firing signals, but those signals are increasingly just noise in expensive disguise.\nparameter drift — your calibrated parameters (lookback window, threshold, vol multiplier, etc) were optimal in a past regime but the optimal values have shifted. the strategy isn\u0026rsquo;t broken, it\u0026rsquo;s miscalibrated. like running your car with the wrong tire pressure — it still drives, but not well.\nregime mismatch — your strategy was designed and tested in a specific market regime (mean-reverting, trending, low-vol, high-vol) and is now operating in the opposite one. SPX premium selling was built for vol normalization and range-bound conditions. Q1 gave us trending vol with persistent skew. structural mismatch.\ncorrelation breakdown — if you run multiple strategies expecting diversification, you need to track cross-strategy correlation in real time. in stressed conditions, strategies that historically had low correlation can suddenly move together. you think you have 4 independent exposures. you actually have 4 trades all long the same factor.\neach of these is gradual. none of them announce themselves with a klaxon. they degrade your edge quietly until one bad week turns a manageable drawdown into a painful one.\nbuilding the health score # composite score, 0-100. four components, each contributing based on how much i trust it for each strategy type.\ncomponent 1: rolling information ratio\ncompare current rolling IR to the strategy\u0026rsquo;s historical baseline IR. if the rolling 20-session IR drops below 0.3x the baseline, something\u0026rsquo;s wrong.\nimport numpy as np import pandas as pd from dataclasses import dataclass from typing import Dict, Tuple, Optional def rolling_information_ratio(returns: pd.Series, window: int = 20) -\u0026gt; pd.Series: \u0026#34;\u0026#34;\u0026#34;Rolling IR vs zero benchmark.\u0026#34;\u0026#34;\u0026#34; roll = returns.rolling(window) ir = roll.mean() / roll.std().replace(0, np.nan) return ir.fillna(0) def ir_health_score( current_ir: float, baseline_ir: float, floor: float = -0.5 ) -\u0026gt; float: \u0026#34;\u0026#34;\u0026#34; Normalize current IR to 0-100 vs historical baseline. baseline_ir: long-run average IR in favorable conditions \u0026#34;\u0026#34;\u0026#34; if baseline_ir \u0026lt;= floor: return 50.0 # undefined baseline, neutral score normalized = (current_ir - floor) / (baseline_ir - floor) return float(np.clip(normalized * 100, 0, 100)) component 2: signal predictiveness\nrolling pearson correlation between signal value at time T and realized PnL at T+1. if your signal is doing its job, this should be positive and stable. when it flips negative or collapses to noise, edge is gone.\ndef signal_predictiveness_score( signals: pd.Series, pnl: pd.Series, window: int = 30, expected_corr: float = 0.12 ) -\u0026gt; pd.Series: \u0026#34;\u0026#34;\u0026#34; Rolling correlation between signal and next-period PnL. expected_corr: what healthy correlation looks like for this strategy \u0026#34;\u0026#34;\u0026#34; forward_pnl = pnl.shift(-1) rolling_corr = signals.rolling(window).corr(forward_pnl) # Normalize to 0-100 # expected_corr maps to ~75 (healthy but not exceptional) # 0 correlation maps to 40 (marginal) # negative correlation maps to 0 (actively broken) score = np.clip((rolling_corr / expected_corr) * 75, 0, 100) return score.fillna(40) component 3: parameter stability\ni run a fast walk-forward weekly to check if optimal parameters have drifted from calibration. small drift is normal. large drift means the strategy\u0026rsquo;s assumptions about market dynamics are no longer valid.\n@dataclass class ParameterSpec: name: str calibrated_value: float min_value: float max_value: float tolerance_pct: float = 0.15 # 15% drift = start watching def parameter_stability_score( current_optimal: Dict[str, float], param_specs: Dict[str, ParameterSpec] ) -\u0026gt; float: \u0026#34;\u0026#34;\u0026#34; Score based on how far current optimal params drifted from calibration. Returns 0-100. \u0026#34;\u0026#34;\u0026#34; drift_scores = [] for param_name, spec in param_specs.items(): if param_name not in current_optimal: continue param_range = spec.max_value - spec.min_value if param_range == 0: continue drift = abs(current_optimal[param_name] - spec.calibrated_value) / param_range # Scale: 0 drift = 100, tolerance_pct drift = 75, 0.5 drift = 0 if drift \u0026lt;= spec.tolerance_pct: score = 100 - (drift / spec.tolerance_pct) * 25 else: excess = (drift - spec.tolerance_pct) / (0.5 - spec.tolerance_pct) score = 75 - np.clip(excess, 0, 1) * 75 drift_scores.append(score) return float(np.mean(drift_scores)) if drift_scores else 50.0 component 4: regime alignment\nis the market regime your strategy was designed for matching current conditions? i use a simple 2x2 classifier — trending vs mean-reverting, high vol vs low vol. most strategies are designed for one or two of these quadrants.\nclass RegimeClassifier: def __init__(self, vol_window: int = 20, trend_window: int = 50): self.vol_window = vol_window self.trend_window = trend_window REGIMES = { (True, True): \u0026#39;trend_high_vol\u0026#39;, (True, False): \u0026#39;trend_low_vol\u0026#39;, (False, True): \u0026#39;mean_rev_high_vol\u0026#39;, (False, False): \u0026#39;mean_rev_low_vol\u0026#39;, } def classify(self, price_series: pd.Series) -\u0026gt; str: rv = price_series.pct_change().rolling(self.vol_window).std() rv_pct = rv.rank(pct=True) mom = price_series.pct_change(self.trend_window).abs() trend_pct = mom.rank(pct=True) is_high_vol = bool(rv_pct.iloc[-1] \u0026gt; 0.6) is_trending = bool(trend_pct.iloc[-1] \u0026gt; 0.5) return self.REGIMES[(is_trending, is_high_vol)] def alignment_score(self, current: str, designed_for: list[str]) -\u0026gt; float: if current in designed_for: return 100.0 vol_match = (\u0026#39;high_vol\u0026#39; in current) == any(\u0026#39;high_vol\u0026#39; in r for r in designed_for) trend_match = (\u0026#39;trend\u0026#39; in current) == any(\u0026#39;trend\u0026#39; in r for r in designed_for) return 25.0 + (25.0 * int(vol_match)) + (25.0 * int(trend_match)) assembling the composite:\nclass StrategyHealthMonitor: COMPONENT_WEIGHTS = { \u0026#39;ir\u0026#39;: 0.30, \u0026#39;signal\u0026#39;: 0.25, \u0026#39;params\u0026#39;: 0.25, \u0026#39;regime\u0026#39;: 0.20, } HEALTH_BANDS = [ (70, \u0026#39;healthy\u0026#39;, \u0026#39;run at full allocation\u0026#39;), (50, \u0026#39;degraded\u0026#39;, \u0026#39;reduce to 50%, investigate this week\u0026#39;), (30, \u0026#39;critical\u0026#39;, \u0026#39;suspend pending review\u0026#39;), (0, \u0026#39;dead\u0026#39;, \u0026#39;pull offline, full root cause required\u0026#39;), ] def compute_health( self, ir_score: float, signal_score: float, param_score: float, regime_score: float, ) -\u0026gt; Tuple[float, str, str]: w = self.COMPONENT_WEIGHTS composite = ( ir_score * w[\u0026#39;ir\u0026#39;] + signal_score * w[\u0026#39;signal\u0026#39;] + param_score * w[\u0026#39;params\u0026#39;] + regime_score * w[\u0026#39;regime\u0026#39;] ) score = round(composite, 1) for threshold, status, action in self.HEALTH_BANDS: if score \u0026gt;= threshold: return score, status, action return score, \u0026#39;dead\u0026#39;, \u0026#39;pull offline, full root cause required\u0026#39; what q1 looked like in hindsight # ran this retroactively against the SPX premium selling strategy for all of Q1. i\u0026rsquo;ve been watching that strategy almost entirely through the risk engine, not through a health lens. here\u0026rsquo;s what the health score shows:\nFigure 1: Composite health score for SPX premium selling strategy across Q1 2026. Score dropped below 70 (degraded threshold) by Feb 9 — three weeks before my largest single-week drawdown. Regime alignment drove most of the degradation as sustained trending vol replaced the mean-reverting conditions the strategy was built for.\nthe uncomfortable thing: health dropped below 70 on Feb 9. that\u0026rsquo;s when the tariff headlines started running directional. i had risk engine monitoring at that point but wasn\u0026rsquo;t running health scores yet. if i had been, Feb 9 would have been the signal to cut allocation in half. instead i ran at full size through Feb and mid-March. the drawdown was survivable but it was bigger than it needed to be.\nparameter drift under the hood # here\u0026rsquo;s the second thing this framework surfaced: my vol threshold parameter on the SPX premium selling strategy had drifted significantly by mid-feb. the parameter that was calibrated at 0.85 was now \u0026ldquo;wanting\u0026rdquo; to be around 1.3 based on the walk-forward optimization runs. that\u0026rsquo;s not small drift. that\u0026rsquo;s a 53% shift in a key parameter.\nFigure 2: Parameter drift heatmap across Q1. Red = parameter \u0026ldquo;wants\u0026rdquo; to be higher than calibrated, blue = lower. Vol threshold (top row) shows the clearest trend — optimal value shifted +53% from calibration by mid-March. This confirms the strategy wasn\u0026rsquo;t broken, it was running miscalibrated settings for the high-vol trending conditions that defined Q1.\nthe lookback window and position sizing both show symmetric drift — the walk-forward runs consistently suggest a longer lookback and smaller positions, which makes sense for trending vol. the strategy was calibrated in a different regime.\nthis is actually not terrible news. drift doesn\u0026rsquo;t mean the strategy is dead. it means it needs retuning. that\u0026rsquo;s very different from signal decay where the edge itself has eroded.\nwhat i\u0026rsquo;m actually doing with this for Q2 # practical changes starting monday:\n1. weekly health audit — every sunday night, run the health scorer against each strategy. composite score below 70? investigate before the week starts. below 50? reduce allocation or suspend until i understand why.\n2. parameter check every two weeks — run the fast walk-forward. if any parameter drifts more than 20% from calibrated, flag for review. i\u0026rsquo;ll use optuna for this since it\u0026rsquo;s fast enough for weekend batch runs.\n3. pre-Q2 recalibration — spending the next week retuning the SPX premium selling parameters using Q1 data as part of the training set. the health framework flagged the issue; now i need to fix it.\nNexusFi has a solid thread on the mechanics of taking a systematic strategy from backtesting to live capital that gets into a lot of the edge-decay issues that come up once you\u0026rsquo;re running real money — Taking a Trading System Live is one of the threads i\u0026rsquo;ve gone back to multiple times since joining in 2023. also, the Academy has a deep-dive on strategy optimization and parameter tuning that goes into walk-forward methodology in a lot of detail.\nQ2 starts now # chicago colo ran the overnight health score batch while i was writing this. results just hit the TimescaleDB table.\nSPX premium selling: 52/100 (degraded, 50% allocation pending recalibration). BTC/ETH momentum: 74/100 (healthy, full allocation). ES mean reversion: 61/100 (degraded, investigating this week).\nnot ideal. but it\u0026rsquo;s honest. and honest is better than flying blind through another quarter like march.\na. is still asleep. i\u0026rsquo;m running strategy health checks on a monday at 3am. this is just the job.\nQ2, let\u0026rsquo;s go.\n-AK\n","date":"30 March 2026","externalUrl":null,"permalink":"/posts/2026-03-30-strategy-health-scoring-algo-decay-detection/","section":"Posts","summary":"\u003cp\u003e2:45am monday.\u003c/p\u003e\n\u003cp\u003efirst trading day of Q2. Q1 is officially in the rearview — closed at basically flat, full numbers are in friday\u0026rsquo;s post. the weekend was heavy. not going into it right now. but Q2 starts regardless, and the algos don\u0026rsquo;t wait for you to process.\u003c/p\u003e","title":"strategy health scoring: detecting algo decay before it wrecks your Q2","type":"posts"},{"content":"","date":"28 March 2026","externalUrl":null,"permalink":"/tags/grief/","section":"Tags","summary":"","title":"Grief","type":"tags"},{"content":"","date":"28 March 2026","externalUrl":null,"permalink":"/tags/parents/","section":"Tags","summary":"","title":"Parents","type":"tags"},{"content":"been 3 years, 3 months, and 28 days.\ni finally wrote the letter.\nthe setup # dr r gave me this homework two weeks ago in that session that hit different. write a letter to the drunk driver who killed my parents. not to send. not to deliver, not to mail, not to read aloud in court. just to write. to feel it, not just think it.\ni\u0026rsquo;ve been avoiding it. opened a blank document four times. closed it every time.\nthis morning a came into my office while i was running a system check. options positions normal, BTC algo up 0.8%, nothing needed me. she put her coffee down on the edge of my desk.\n\u0026ldquo;today?\u0026rdquo; she asked.\nshe didn\u0026rsquo;t explain what she meant. she didn\u0026rsquo;t need to.\ni said yeah.\nshe made tea. put on this ambient playlist she uses when she\u0026rsquo;s doing deep focus work - no vocals, just texture that disappears into the background. then she sat down at her own desk and turned around.\n\u0026ldquo;i\u0026rsquo;m not going to watch you. i\u0026rsquo;ll be right here. just do it.\u0026rdquo;\nthen she opened her laptop like it wasn\u0026rsquo;t a big deal.\nit was the exact right thing. no pressure, no performance. just her being present in the room. i don\u0026rsquo;t know how she always knows.\nthe letter # not going to post all of it. but i need to put some of it somewhere.\ni started with the facts. december 31, 2022. 11:59 PM. they were driving home from a new year\u0026rsquo;s eve party. dad had one drink all night, decided to drive because surge pricing was insane and he was well under the limit. mom was in the passenger seat texting me happy new year at 11:58 PM.\nyour blood alcohol was 0.18. you ran a red light doing 60+ mph.\nthen i got to the part that actually mattered.\nmy mom\u0026rsquo;s message is still the last unread one in my phone. i never texted back.\nyou woke up in a hospital bed. you got to call someone and tell them you were okay.\ni woke up to a police officer at my door at 2 AM on new year\u0026rsquo;s day.\nthey were responsible adults in a world that\u0026rsquo;s supposed to protect responsible adults from what you did.\nthey didn\u0026rsquo;t survive. you did.\nthat is a permanent, irreversible thing you did to me and i will never not have to live with it.\ni wrote three pages total. a lot of it\u0026rsquo;s not for the internet. some of it was mature. some of it was vicious. dr r said both were fine. just needed to be honest.\nwhat happened after # when i said i was done a looked up from her screen. she didn\u0026rsquo;t say anything. she came over and sat on the arm of my chair and put her hand on my back and just stayed there.\nwe stayed like that for maybe 20 minutes. the afternoon light was hitting her desk. somewhere in chicago my algo was executing fills. life just kept going.\nshe made more tea after. we watched something dumb on the couch. she fell asleep on my shoulder before 9 PM.\nwhat it actually felt like # dr r said anger is something that needs to move through you. you can\u0026rsquo;t just think your way past it.\ni get it now.\nthe heavy thing in my chest that\u0026rsquo;s been there for three years - not exactly gone. but it shifted. like it stopped being static and started moving. like it finally had somewhere to be.\nthe driver\u0026rsquo;s doing 8 years. he\u0026rsquo;ll be out probably before he\u0026rsquo;s 40. i\u0026rsquo;ll be without my parents for the rest of my life regardless of what happens to him. those two facts coexist and neither of them is going to resolve into something fair.\ni\u0026rsquo;m bringing the letter to dr r this week. she said the exercise was never really about him - it was about me. giving the anger somewhere to go instead of letting it harden into something i couldn\u0026rsquo;t name for three years.\n10:47 PM # march 28, 2026. a\u0026rsquo;s asleep on the couch, book still on her chest. algos running. san diego quiet outside.\nsometimes life is heavy and also beautiful and those two things don\u0026rsquo;t resolve into each other. they just coexist.\nthat\u0026rsquo;s the closest thing to a conclusion i\u0026rsquo;ve got.\n-AK\n","date":"28 March 2026","externalUrl":null,"permalink":"/posts/2026-03-28-saturday-the-letter/","section":"Posts","summary":"\u003cp\u003ebeen 3 years, 3 months, and 28 days.\u003c/p\u003e\n\u003cp\u003ei finally wrote the letter.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe setup \n    \u003cdiv id=\"the-setup\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-setup\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003edr r gave me this homework two weeks ago in that session that hit different. write a letter to the drunk driver who killed my parents. not to send. not to deliver, not to mail, not to read aloud in court. just to write. to feel it, not just think it.\u003c/p\u003e","title":"saturday - the letter","type":"posts"},{"content":"","date":"27 March 2026","externalUrl":null,"permalink":"/tags/analytics/","section":"Tags","summary":"","title":"Analytics","type":"tags"},{"content":"friday night. Q1 officially in the books.\ndid the math earlier while A. was cooking. she noticed i went quiet and just left me to it. that\u0026rsquo;s one of the things i didn\u0026rsquo;t expect about being married — how well she reads when to give space. anyway.\nthree months of one of the more unpredictable Q1s i\u0026rsquo;ve run through. tariff headlines every 72 hours, two vol spikes above VIX 25, a FOMC where fed dots shifted mid-cycle. and yet the algos ended up flat. not what you\u0026rsquo;d call a crushing performance, but given what the market threw at systematic premium selling, flat is survivable.\nq1 final numbers # updated the factor attribution this morning after the 4pm close.\njan: +2.1%. feb: -1.3%. march final: -0.7% (recovered a bit from the -0.9% estimate i posted sunday — the last three sessions were cleaner than mid-march).\nquarter: +0.09%. account moved from $1.196M to $1.197M. net: +$1,072 on the quarter. lol.\nnot ideal. not a disaster. the SPX premium selling book ate it from both directions — elevated vol hurt existing short positions, then when it calmed down the theta wasn\u0026rsquo;t enough to compensate for the delta drift drag i wrote about monday. crypto book was the actual bright spot: BTC/ETH momentum strategy returned +4.2% on its slice, which masked a lot of the options pain.\nthe two brutal march weeks (W2 and W3) line up exactly with the VIX spike i wrote about march 20. after the greeks aggregation system came online wednesday, march W4 and this final partial week were cleaner — tighter position sizing when aggregate gamma exceeded threshold, which meant less P\u0026amp;L volatility when headlines dropped.\nexecution timing analysis — what i learned from q1 data # one thing that came out of the factor attribution deep dive: slippage distribution wasn\u0026rsquo;t uniform across the trading day. i knew this intellectually but didn\u0026rsquo;t have the data to quantify it.\nran an analysis on all 847 options fills from Q1. here\u0026rsquo;s the code:\nimport pandas as pd import numpy as np from dataclasses import dataclass from typing import Optional import pytz EASTERN = pytz.timezone(\u0026#39;US/Eastern\u0026#39;) @dataclass class OptionsFill: fill_id: str symbol: str expiry: str strike: float right: str # \u0026#39;C\u0026#39; or \u0026#39;P\u0026#39; quantity: int fill_price: float mid_at_fill: float exec_ts: pd.Timestamp strategy: str def load_q1_fills(db_conn) -\u0026gt; list[OptionsFill]: \u0026#34;\u0026#34;\u0026#34;Pull all Q1 2026 options fills from TimescaleDB.\u0026#34;\u0026#34;\u0026#34; query = \u0026#34;\u0026#34;\u0026#34; SELECT fill_id, symbol, expiry, strike, right, quantity, fill_price, mid_at_fill, exec_ts, strategy FROM trade_fills WHERE exec_ts \u0026gt;= \u0026#39;2026-01-01\u0026#39; AND exec_ts \u0026lt; \u0026#39;2026-04-01\u0026#39; AND asset_class = \u0026#39;option\u0026#39; ORDER BY exec_ts \u0026#34;\u0026#34;\u0026#34; rows = db_conn.execute(query).fetchall() return [OptionsFill(*r) for r in rows] def compute_slippage_bps(fill: OptionsFill) -\u0026gt; float: \u0026#34;\u0026#34;\u0026#34;Slippage in basis points vs mid-market at execution time.\u0026#34;\u0026#34;\u0026#34; if fill.mid_at_fill \u0026lt;= 0: return 0.0 # positive = paid more than mid (buying), or received less (selling) direction = 1 if fill.quantity \u0026gt; 0 else -1 slip_dollars = direction * (fill.fill_price - fill.mid_at_fill) return (slip_dollars / fill.mid_at_fill) * 10_000 def analyze_by_time_bucket(fills: list[OptionsFill]) -\u0026gt; pd.DataFrame: \u0026#34;\u0026#34;\u0026#34;Group fills into 30-minute EST buckets and compute median slippage.\u0026#34;\u0026#34;\u0026#34; records = [] for f in fills: est_ts = f.exec_ts.tz_convert(EASTERN) bucket_hour = est_ts.hour bucket_half = est_ts.minute // 30 bucket_label = f\u0026#34;{bucket_hour:02d}:{bucket_half * 30:02d}\u0026#34; records.append({ \u0026#39;bucket\u0026#39;: bucket_label, \u0026#39;slippage_bps\u0026#39;: compute_slippage_bps(f), \u0026#39;strategy\u0026#39;: f.strategy, \u0026#39;symbol\u0026#39;: f.symbol }) df = pd.DataFrame(records) summary = ( df.groupby(\u0026#39;bucket\u0026#39;)[\u0026#39;slippage_bps\u0026#39;] .agg([\u0026#39;median\u0026#39;, \u0026#39;mean\u0026#39;, \u0026#39;std\u0026#39;, \u0026#39;count\u0026#39;]) .reset_index() .sort_values(\u0026#39;bucket\u0026#39;) ) summary.columns = [\u0026#39;time_bucket_est\u0026#39;, \u0026#39;median_slip_bps\u0026#39;, \u0026#39;mean_slip_bps\u0026#39;, \u0026#39;std_bps\u0026#39;, \u0026#39;fill_count\u0026#39;] return summary def find_optimal_windows(summary: pd.DataFrame, max_slip_bps: float = 3.0) -\u0026gt; list[str]: \u0026#34;\u0026#34;\u0026#34;Return time buckets where median slippage is below threshold.\u0026#34;\u0026#34;\u0026#34; good_windows = summary[summary[\u0026#39;median_slip_bps\u0026#39;] \u0026lt;= max_slip_bps] return good_windows[\u0026#39;time_bucket_est\u0026#39;].tolist() def strategy_slippage_breakdown(fills: list[OptionsFill]) -\u0026gt; pd.DataFrame: \u0026#34;\u0026#34;\u0026#34;Slippage cost breakdown by strategy family.\u0026#34;\u0026#34;\u0026#34; records = [ { \u0026#39;strategy\u0026#39;: f.strategy, \u0026#39;slippage_bps\u0026#39;: compute_slippage_bps(f), \u0026#39;notional\u0026#39;: abs(f.quantity) * f.fill_price * 100 # options multiplier } for f in fills ] df = pd.DataFrame(records) breakdown = ( df.groupby(\u0026#39;strategy\u0026#39;) .agg( median_slip_bps=(\u0026#39;slippage_bps\u0026#39;, \u0026#39;median\u0026#39;), total_slip_cost=(\u0026#39;slippage_bps\u0026#39;, lambda x: (x * df.loc[x.index, \u0026#39;notional\u0026#39;] / 10_000).sum()), fill_count=(\u0026#39;slippage_bps\u0026#39;, \u0026#39;count\u0026#39;) ) .reset_index() .sort_values(\u0026#39;total_slip_cost\u0026#39;, ascending=False) ) return breakdown the findings were not subtle. median slippage between 9:30-10:00 EST was 8.4 bps. between 10:30-11:30 it dropped to 2.1 bps. after 2:00pm it crept back up as liquidity thinned into close.\nso the \u0026ldquo;open as fast as possible\u0026rdquo; instinct was costing me money. not a ton — roughly $1,800 in total Q1 slippage costs from sub-optimal timing — but fixable with a simple execution delay rule. routing orders placed in the first 20 minutes post-open to a 10-minute minimum wait timer.\nimplemented it tuesday. too early to have data but the anecdotal fills this week looked better.\ncolo benchmark update — chicago still earning its rent # did a full remote benchmark session on the chicago box tuesday evening. here\u0026rsquo;s what the Q1 latency data looks like across 847 order submissions:\nP50 at ~310 microseconds, P99 below 1.5ms. for options execution that\u0026rsquo;s fine — options fills aren\u0026rsquo;t latency-sensitive the way futures scalping is. you\u0026rsquo;re not competing on speed, you\u0026rsquo;re competing on routing and timing. the colo earns its $680/month because it sits on the CME network backbone, not because it\u0026rsquo;s fast enough to HFT.\nwhat i did find: P99.9 spikes correlated almost perfectly with CME gateway maintenance windows. three specific timestamps in Q1 where latency jumped above 8ms — all within 30 minutes of scheduled gateway rollovers. added those to the execution scheduler as blackout windows.\nthe box itself is running clean. CPU at ~23% average during market hours (futures algo has a heavier footprint than options), disk I/O well below limits, network utilization under 2% of provisioned bandwidth. no hardware concerns heading into Q2.\nbrief personal note before i close this out # A. made this big taco spread for \u0026ldquo;Q1 closing dinner.\u0026rdquo; she\u0026rsquo;s figured out that marking my trading milestones with food is a language i actually respond to. flat quarter, not the quarter i wanted — but she made it feel like it was worth noting anyway.\nshe had no idea i had the latency charts pulled up on the second monitor the whole time. multitasking. she\u0026rsquo;d laugh if she knew.\nq2 setup # a few things i\u0026rsquo;m changing based on Q1 learnings:\nexecution timing rule — minimum 20-minute post-open delay on new positions, aggressive close before final 30 minutes greek aggregation thresholds — tighter on short gamma especially during elevated VIX regimes (the new system from wednesday handles this but i need to tune the thresholds) crypto allocation bump — crypto book outperformed options book in Q1. not ready to shift allocation dramatically but +5% to crypto (from 30% to 35%) seems warranted tariff sensitivity filters — added a headline risk parser that checks CME volatility surface structure before letting new positions open. if term structure is inverted above a threshold, no new opens until it normalizes been lurking on NexusFi where the diversified option selling thread has been active all year — some good discussion in there about managing premium books through vol regimes like what we saw in march. worth reading if you\u0026rsquo;re running similar strategies.\napril starts monday. algos are prepped. chicago box is clean. Q2 budget is whatever i can make work after a flat Q1.\nsomething quiet i noticed tonight. did the math while cleaning up the charts: Q1 2026 ends 3 years and 87 days after new year\u0026rsquo;s eve 2022. sometimes the calendar does that thing where a number feels heavier than it should.\nanyway.\n-AK\n","date":"27 March 2026","externalUrl":null,"permalink":"/posts/2026-03-27-q1-close-colo-benchmarks-q2-setup/","section":"Posts","summary":"\u003cp\u003efriday night. Q1 officially in the books.\u003c/p\u003e\n\u003cp\u003edid the math earlier while A. was cooking. she noticed i went quiet and just left me to it. that\u0026rsquo;s one of the things i didn\u0026rsquo;t expect about being married — how well she reads when to give space. anyway.\u003c/p\u003e","title":"q1 close: final numbers, colo benchmarks, and q2 setup","type":"posts"},{"content":"","date":"25 March 2026","externalUrl":null,"permalink":"/tags/bsm/","section":"Tags","summary":"","title":"Bsm","type":"tags"},{"content":"","date":"25 March 2026","externalUrl":null,"permalink":"/tags/portfolio-risk/","section":"Tags","summary":"","title":"Portfolio-Risk","type":"tags"},{"content":"2:15am wednesday.\nstill processing this week. the q1 factor attribution post from sunday was cathartic but it also made me confront something i\u0026rsquo;d been papering over: i was flying blind on real-time greeks for most of march. not completely blind — i had position-level greeks from IB\u0026rsquo;s TWS feed. but aggregating them into a coherent portfolio view? that was a manual spreadsheet thing i\u0026rsquo;d run every few hours.\nthat\u0026rsquo;s not good enough when VIX spikes 10 points in 72 hours.\nso i built a proper greeks aggregation engine. here\u0026rsquo;s the full thing.\nwhy you need this # most retail-adjacent traders think about individual position greeks. delta on this trade, vega on that spread. fine for small books, but once you\u0026rsquo;re running 15-20 simultaneous options positions across multiple underlyings, the individual view lies to you.\nthe view that counts is portfolio-level greek exposure. net delta tells you how much directional risk you\u0026rsquo;re carrying right now. net gamma tells you how fast that delta changes if the market moves. net vega tells you your vol expansion risk. and net theta tells you how much you\u0026rsquo;re collecting per day for running that risk.\nthe problem i had in mid-march: i was running elevated short gamma without knowing it. each individual position looked fine. but when i finally looked at the aggregated portfolio picture, my combined short gamma was 40% higher than my target. that\u0026rsquo;s the thing that got uncomfortable when the vol spike hit — not any single position, but the aggregate.\nyou can\u0026rsquo;t manage what you can\u0026rsquo;t measure, and you can\u0026rsquo;t measure it if it\u0026rsquo;s a 15-minute manual process.\narchitecture overview # three components:\nposition store — TimescaleDB. positions table with current quantities, strikes, expiries, option types. refreshed from IB/Tastyworks API every 30 seconds.\nmarket data cache — Redis. real-time bid/ask/IV per underlying, updated from IB TWS stream via my market data bridge. sub-10ms to read from Chicago colo.\ngreeks aggregator — Python async loop. runs every second. pulls positions + market data, calculates BSM greeks for every option, aggregates to portfolio level, stores back to TimescaleDB, publishes to Redis pub/sub for Grafana.\ntotal latency from market move to updated portfolio greeks: ~200ms from Chicago. that\u0026rsquo;s acceptable for risk monitoring purposes.\nthe code # full GreeksAggregator class:\n\u0026#34;\u0026#34;\u0026#34; GreeksAggregator: Real-time portfolio Greeks calculation and aggregation Reads positions from TimescaleDB, market data from Redis, calculates BSM Greeks per position, aggregates to portfolio level, publishes updates. \u0026#34;\u0026#34;\u0026#34; import asyncio import json import time from dataclasses import dataclass, field, asdict from typing import Dict, List, Optional, Tuple import numpy as np import redis.asyncio as aioredis import asyncpg from scipy.stats import norm # --- Data Structures --- @dataclass class PositionGreeks: \u0026#34;\u0026#34;\u0026#34;Greeks for a single position\u0026#34;\u0026#34;\u0026#34; symbol: str position_type: str # \u0026#39;option\u0026#39;, \u0026#39;future\u0026#39;, \u0026#39;equity\u0026#39;, \u0026#39;crypto\u0026#39; quantity: float # Option inputs underlying_price: float = 0.0 strike: float = 0.0 expiry_days: float = 0.0 implied_vol: float = 0.0 option_type: str = \u0026#34;\u0026#34; # \u0026#39;call\u0026#39; or \u0026#39;put\u0026#39; # Computed Greeks (quantity-adjusted) delta: float = 0.0 gamma: float = 0.0 theta: float = 0.0 vega: float = 0.0 # Dollar-normalized Greeks dollar_delta: float = 0.0 dollar_gamma: float = 0.0 # $ PnL per 1% move in underlying dollar_vega: float = 0.0 # $ PnL per 1 vol point @dataclass class PortfolioGreeks: \u0026#34;\u0026#34;\u0026#34;Aggregated portfolio-level Greeks\u0026#34;\u0026#34;\u0026#34; timestamp: float = 0.0 # Net Greeks net_delta_normalized: float = 0.0 # fraction of account per 1% S move net_gamma_dollar: float = 0.0 # $ PnL change per 1% S move change net_theta_daily: float = 0.0 # $ daily theta (positive = collecting) net_vega_dollar: float = 0.0 # $ PnL per 1 vol point # By strategy bucket options_delta: float = 0.0 futures_delta: float = 0.0 crypto_delta: float = 0.0 options_vega: float = 0.0 # Risk ratios gamma_theta_ratio: float = 0.0 # tail risk per unit of theta earned vega_per_million: float = 0.0 # normalized vol exposure # Scenario analysis one_sigma_daily_pnl: float = 0.0 # estimated PnL for 1-sigma daily move two_sigma_daily_pnl: float = 0.0 # estimated PnL for 2-sigma daily move # --- BSM Calculator --- class BSMCalculator: \u0026#34;\u0026#34;\u0026#34;Black-Scholes-Merton Greeks — vectorized for batch processing\u0026#34;\u0026#34;\u0026#34; @staticmethod def _d1_d2(S: float, K: float, T: float, r: float, sigma: float) -\u0026gt; Tuple[float, float]: if T \u0026lt;= 1e-6 or sigma \u0026lt;= 1e-6 or S \u0026lt;= 0 or K \u0026lt;= 0: return 0.0, 0.0 d1 = (np.log(S / K) + (r + 0.5 * sigma**2) * T) / (sigma * np.sqrt(T)) d2 = d1 - sigma * np.sqrt(T) return d1, d2 @staticmethod def delta(S, K, T, r, sigma, option_type: str) -\u0026gt; float: d1, _ = BSMCalculator._d1_d2(S, K, T, r, sigma) return norm.cdf(d1) if option_type == \u0026#39;call\u0026#39; else norm.cdf(d1) - 1.0 @staticmethod def gamma(S, K, T, r, sigma) -\u0026gt; float: if T \u0026lt;= 1e-6 or sigma \u0026lt;= 1e-6 or S \u0026lt;= 0: return 0.0 d1, _ = BSMCalculator._d1_d2(S, K, T, r, sigma) return norm.pdf(d1) / (S * sigma * np.sqrt(T)) @staticmethod def theta(S, K, T, r, sigma, option_type: str) -\u0026gt; float: if T \u0026lt;= 1e-6: return 0.0 d1, d2 = BSMCalculator._d1_d2(S, K, T, r, sigma) base = -(S * norm.pdf(d1) * sigma) / (2 * np.sqrt(T)) if option_type == \u0026#39;call\u0026#39;: return (base - r * K * np.exp(-r * T) * norm.cdf(d2)) / 365 return (base + r * K * np.exp(-r * T) * norm.cdf(-d2)) / 365 @staticmethod def vega(S, K, T, r, sigma) -\u0026gt; float: \u0026#34;\u0026#34;\u0026#34;Vega per 1 volatility point (1%)\u0026#34;\u0026#34;\u0026#34; if T \u0026lt;= 1e-6: return 0.0 d1, _ = BSMCalculator._d1_d2(S, K, T, r, sigma) return S * norm.pdf(d1) * np.sqrt(T) / 100 # --- Main Aggregator --- class GreeksAggregator: \u0026#34;\u0026#34;\u0026#34; Async portfolio Greeks aggregator. Runs every second. Pulls live positions from TimescaleDB (30s cache), reads market data from Redis L1 cache (updated from IB/Binance feeds), calculates BSM Greeks per option, aggregates to portfolio level, stores snapshot in TimescaleDB, publishes delta to Redis pub/sub. \u0026#34;\u0026#34;\u0026#34; RISK_FREE_RATE = 0.053 # Fed funds rate, March 2026 DELTA_ALERT_THRESHOLD = 0.15 # Alert if net delta exceeds ±15% GAMMA_THETA_ALERT = 5.0 # Alert if gamma/theta ratio exceeds 5x def __init__(self, pg_dsn: str, redis_url: str, account_size: float): self.pg_dsn = pg_dsn self.redis_url = redis_url self.account_size = account_size self.bsm = BSMCalculator() self._redis: Optional[aioredis.Redis] = None self._pg: Optional[asyncpg.Connection] = None self._positions_cache: List[Dict] = [] self._last_position_refresh: float = 0.0 async def _init_connections(self): if not self._redis: self._redis = await aioredis.from_url( self.redis_url, decode_responses=True, socket_timeout=0.1 ) if not self._pg: self._pg = await asyncpg.connect(self.pg_dsn) async def _refresh_positions(self): \u0026#34;\u0026#34;\u0026#34;Refresh from TimescaleDB — expensive, cache for 30s\u0026#34;\u0026#34;\u0026#34; now = time.time() if now - self._last_position_refresh \u0026lt; 30: return rows = await self._pg.fetch(\u0026#34;\u0026#34;\u0026#34; SELECT symbol, position_type, quantity, strike, EXTRACT(EPOCH FROM expiry_ts) as expiry_unix, option_type, underlying_symbol, contract_multiplier FROM positions WHERE quantity != 0 AND account_id = $1 ORDER BY position_type, underlying_symbol, symbol \u0026#34;\u0026#34;\u0026#34;, \u0026#34;main_account\u0026#34;) self._positions_cache = [dict(r) for r in rows] self._last_position_refresh = now async def _get_market_data(self, symbol: str) -\u0026gt; Dict: \u0026#34;\u0026#34;\u0026#34;Sub-ms Redis read from Chicago colo — critical path\u0026#34;\u0026#34;\u0026#34; data = await self._redis.hgetall(f\u0026#34;market:{symbol}\u0026#34;) return {k: float(v) for k, v in data.items()} if data else {} async def _calc_position_greeks(self, pos: Dict) -\u0026gt; PositionGreeks: \u0026#34;\u0026#34;\u0026#34;Calculate Greeks for a single position\u0026#34;\u0026#34;\u0026#34; underlying = pos.get(\u0026#39;underlying_symbol\u0026#39;) or pos[\u0026#39;symbol\u0026#39;] mkt = await self._get_market_data(underlying) g = PositionGreeks( symbol=pos[\u0026#39;symbol\u0026#39;], position_type=pos[\u0026#39;position_type\u0026#39;], quantity=pos[\u0026#39;quantity\u0026#39;], ) if not mkt: return g # can\u0026#39;t compute without market data S = mkt.get(\u0026#39;mid\u0026#39;, mkt.get(\u0026#39;last\u0026#39;, 0.0)) qty = pos[\u0026#39;quantity\u0026#39;] mult = pos.get(\u0026#39;contract_multiplier\u0026#39;) or 1 if pos[\u0026#39;position_type\u0026#39;] == \u0026#39;option\u0026#39;: K = pos[\u0026#39;strike\u0026#39;] now_unix = time.time() T = max(0.0, (pos[\u0026#39;expiry_unix\u0026#39;] - now_unix) / (365 * 86400)) sigma = mkt.get(\u0026#39;iv\u0026#39;, 0.18) otype = pos[\u0026#39;option_type\u0026#39;] r = self.RISK_FREE_RATE per_share = { \u0026#39;delta\u0026#39;: self.bsm.delta(S, K, T, r, sigma, otype), \u0026#39;gamma\u0026#39;: self.bsm.gamma(S, K, T, r, sigma), \u0026#39;theta\u0026#39;: self.bsm.theta(S, K, T, r, sigma, otype), \u0026#39;vega\u0026#39;: self.bsm.vega(S, K, T, r, sigma), } g.delta = per_share[\u0026#39;delta\u0026#39;] * qty * mult g.gamma = per_share[\u0026#39;gamma\u0026#39;] * qty * mult g.theta = per_share[\u0026#39;theta\u0026#39;] * qty * mult g.vega = per_share[\u0026#39;vega\u0026#39;] * qty * mult g.dollar_delta = g.delta * S g.dollar_gamma = g.gamma * S * S * 0.01 # $ per 1% move g.dollar_vega = g.vega elif pos[\u0026#39;position_type\u0026#39;] == \u0026#39;future\u0026#39;: g.delta = qty * mult g.dollar_delta = g.delta * S # futures: zero gamma, zero vega else: # equity, crypto, spot g.delta = qty g.dollar_delta = qty * S return g async def aggregate(self) -\u0026gt; PortfolioGreeks: \u0026#34;\u0026#34;\u0026#34;Main aggregation — runs every second\u0026#34;\u0026#34;\u0026#34; await self._init_connections() await self._refresh_positions() all_greeks = await asyncio.gather( *[self._calc_position_greeks(p) for p in self._positions_cache] ) portfolio = PortfolioGreeks(timestamp=time.time()) for g in all_greeks: portfolio.net_gamma_dollar += g.dollar_gamma portfolio.net_theta_daily += g.theta portfolio.net_vega_dollar += g.dollar_vega if g.position_type == \u0026#39;option\u0026#39;: portfolio.options_delta += g.dollar_delta portfolio.options_vega += g.dollar_vega elif g.position_type == \u0026#39;future\u0026#39;: portfolio.futures_delta += g.dollar_delta else: portfolio.crypto_delta += g.dollar_delta # Net dollar delta = sum of all total_dollar_delta = ( portfolio.options_delta + portfolio.futures_delta + portfolio.crypto_delta ) portfolio.net_delta_normalized = total_dollar_delta / self.account_size # Risk ratios if portfolio.net_theta_daily \u0026gt; 0: portfolio.gamma_theta_ratio = ( abs(portfolio.net_gamma_dollar) / portfolio.net_theta_daily ) portfolio.vega_per_million = portfolio.net_vega_dollar / (self.account_size / 1e6) # Scenario: assume 15% annual vol on SPX, daily sigma = 15%/sqrt(252) daily_sigma = 0.15 / np.sqrt(252) acct = self.account_size portfolio.one_sigma_daily_pnl = ( portfolio.net_delta_normalized * acct * daily_sigma + 0.5 * portfolio.net_gamma_dollar * daily_sigma**2 ) portfolio.two_sigma_daily_pnl = ( portfolio.net_delta_normalized * acct * 2 * daily_sigma + 0.5 * portfolio.net_gamma_dollar * (2 * daily_sigma) ** 2 ) # Fire alerts if abs(portfolio.net_delta_normalized) \u0026gt; self.DELTA_ALERT_THRESHOLD: print(f\u0026#34;ALERT: net delta {portfolio.net_delta_normalized:.3f} exceeded ±{self.DELTA_ALERT_THRESHOLD}\u0026#34;) if portfolio.gamma_theta_ratio \u0026gt; self.GAMMA_THETA_ALERT: print(f\u0026#34;ALERT: gamma/theta ratio {portfolio.gamma_theta_ratio:.1f}x — elevated tail risk\u0026#34;) # Publish update await self._redis.publish( \u0026#34;portfolio:greeks:live\u0026#34;, json.dumps(asdict(portfolio)) ) # Persist snapshot await self._pg.execute(\u0026#34;\u0026#34;\u0026#34; INSERT INTO portfolio_greeks_history (time, net_delta_norm, net_gamma_dollar, net_theta_daily, net_vega_dollar, options_delta, futures_delta, crypto_delta, gamma_theta_ratio, one_sigma_pnl, two_sigma_pnl) VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11) \u0026#34;\u0026#34;\u0026#34;, portfolio.timestamp, portfolio.net_delta_normalized, portfolio.net_gamma_dollar, portfolio.net_theta_daily, portfolio.net_vega_dollar, portfolio.options_delta, portfolio.futures_delta, portfolio.crypto_delta, portfolio.gamma_theta_ratio, portfolio.one_sigma_daily_pnl, portfolio.two_sigma_daily_pnl ) return portfolio async def run_aggregator(account_size: float = 1_194_000.0): agg = GreeksAggregator( pg_dsn=\u0026#34;postgresql://trading:xxx@colo-db:5432/tradingdb\u0026#34;, redis_url=\u0026#34;redis://colo-cache:6379\u0026#34;, account_size=account_size, ) while True: t0 = time.monotonic() greeks = await agg.aggregate() elapsed_ms = (time.monotonic() - t0) * 1000 # target: under 200ms total cycle await asyncio.sleep(max(0, 1.0 - (time.monotonic() - t0))) if __name__ == \u0026#34;__main__\u0026#34;: asyncio.run(run_aggregator()) okay. 220 lines. that\u0026rsquo;s the whole thing. BSM calculator, position-level Greeks, async portfolio aggregation, TimescaleDB persistence, Redis pub/sub publish, scenario analysis, and alert thresholds.\nlive portfolio greeks: last 4 weeks # here\u0026rsquo;s what the aggregated data actually looked like through the march vol spike. green is net delta (normalized to account fraction), orange is gamma exposure (scaled). the vol spike week is shaded.\na few things jump out:\nthe delta flip during the spike. march 18-19, when SPX dropped 2.4% and VIX was at 28, net delta went to -0.14. that\u0026rsquo;s because short puts that were OTM suddenly had meaningful negative delta as they moved toward ATM. i knew this intellectually but seeing it in real-time on the dashboard was different — it\u0026rsquo;s the moment you realize \u0026ldquo;i need to hedge this now, not at EOD.\u0026rdquo;\ngamma was already elevated before the spike. look at early march — gamma exposure was climbing as i\u0026rsquo;d been adding positions. by march 16 it was already at the high end of my comfort zone. the spike just revealed that i was already overweight on that exposure.\nvega tracking is the least actionable in real-time but the most useful for position sizing decisions the next day. when vega spikes negative during high vol, it means adding new short options is tempting (better premiums) but the portfolio already has elevated vega sensitivity — adding more vol exposure is compounding risk, not harvesting opportunity.\ntimescaledb schema # the persistence layer isn\u0026rsquo;t complicated:\n-- TimescaleDB hypertable for Greeks snapshots CREATE TABLE portfolio_greeks_history ( time BIGINT NOT NULL, -- unix ms net_delta_norm DECIMAL(10, 6), -- fraction of account net_gamma_dollar DECIMAL(12, 2), -- $ per 1% move net_theta_daily DECIMAL(10, 2), -- daily $ theta net_vega_dollar DECIMAL(10, 2), -- $ per vol point options_delta DECIMAL(12, 2), futures_delta DECIMAL(12, 2), crypto_delta DECIMAL(12, 2), gamma_theta_ratio DECIMAL(8, 4), one_sigma_pnl DECIMAL(12, 2), two_sigma_pnl DECIMAL(12, 2) ); SELECT create_hypertable(\u0026#39;portfolio_greeks_history\u0026#39;, \u0026#39;time\u0026#39;, chunk_time_interval =\u0026gt; 604800000); -- 7-day chunks in ms -- Fast recent lookups CREATE INDEX ON portfolio_greeks_history (time DESC); -- Daily aggregates for Grafana CREATE MATERIALIZED VIEW greeks_daily_summary WITH (timescaledb.continuous) AS SELECT time_bucket(86400000, time) AS day, AVG(net_delta_norm) AS avg_delta, MIN(net_gamma_dollar) AS min_gamma, -- most negative = most exposed AVG(net_theta_daily) AS avg_theta, AVG(gamma_theta_ratio) AS avg_gamma_theta_ratio FROM portfolio_greeks_history GROUP BY day; storing at 1-second granularity means about 23k rows per trading day, ~115k rows per week. hypertable handles this no problem. i query the materialized view for the Grafana panels to keep dashboards fast — the underlying 1s data is there when i need to debug a specific period.\ngreeks by strategy: current snapshot # chart tells the obvious story: the futures hedge is doing its job on delta — options have negative delta from short puts, futures offset it to bring net delta close to zero. crypto is basically uncorrelated, small delta noise.\nbut vega? that\u0026rsquo;s entirely concentrated in the options book. futures don\u0026rsquo;t have vega. crypto spot doesn\u0026rsquo;t have vega. if you want to hedge vega, you\u0026rsquo;re buying vol on SPX or you\u0026rsquo;re reducing options size. there\u0026rsquo;s no free lunch here.\nthe gamma/theta ratio right now is sitting at 2.8x. my target is under 3x. during the march spike peak it was 6.4x — that\u0026rsquo;s the number that should have been blinking red on my dashboard a week earlier if i\u0026rsquo;d had this thing running.\nthe chicago colo piece # the 200ms end-to-end latency i mentioned earlier is entirely a function of the colo setup. the aggregation loop talks to two services: TimescaleDB (for position refresh) and Redis (for real-time market data). both live in the chicago datacenter.\nfrom chicago → chicago, Redis read latency is 0.3ms. TimescaleDB position query takes about 12ms (full position list refresh every 30s). the BSM calculations for 18 concurrent options positions take about 8ms on a single thread — vectorized NumPy handles the math efficiently.\nfrom san diego, trying to do this same loop against remote services? you\u0026rsquo;re looking at 60-80ms network round-trip just to get market data, before any compute. at 1-second update frequency that\u0026rsquo;s fine mathematically, but the psychological difference between \u0026ldquo;my greeks are 80ms stale\u0026rdquo; and \u0026ldquo;my greeks are 8ms stale\u0026rdquo; matters a lot during fast-moving markets. when VIX is at 28 and SPX is printing a 0.3% candle every minute, you want the freshest possible view.\nthe colo is not cheap. but this is exactly the use case it exists for. i track it as a cost of capital on the infrastructure P\u0026amp;L sheet. running the greeks aggregator is one of the clearer justifications for that spend.\nwhere this gets used # the output feeds three downstream systems:\ngrafana dashboard — the main thing i stare at during live trading hours. real-time delta/gamma/vega panel, gamma-theta ratio alert widget, 2-sigma scenario bar.\nrisk engine — if net delta exceeds ±15% or gamma-theta ratio exceeds 5x, the risk engine starts shrinking options position sizes on new entries. not closing existing — just pausing new accumulation.\nposition sizing for new trades — before opening any new options position, i check the current vega and gamma contribution against portfolio limits. if portfolio vega is already -$400/vol point, i don\u0026rsquo;t open a straddle that adds another -$120. i wait for existing positions to decay.\nhad this running during the march spike, i would\u0026rsquo;ve seen the gamma buildup over the week of march 9-12 and probably trimmed 15-20% of the options book before the vol event. that\u0026rsquo;s not hindsight — the signal was there, i just wasn\u0026rsquo;t aggregating it fast enough to act on it.\nbrief wrap # q1 is done. posted about it sunday. now rebuilding the infrastructure gaps that got exposed. this was the big one.\nA. asked what i was working on at midnight last thursday when i was debugging the aggregator. i told her \u0026ldquo;basically a real-time view of how screwed my portfolio is at any given moment.\u0026rdquo; she thought about it and said \u0026ldquo;that\u0026rsquo;s either very smart or very neurotic.\u0026rdquo; probably both.\nthere\u0026rsquo;s something about late-night debugging sessions, coffee going cold, the kind of total focus where nothing else exists. dad used to say that kind of work is a form of prayer — you\u0026rsquo;re not thinking about yourself at all. just the problem. just the code. just the thing you\u0026rsquo;re trying to build. i get it now in a way i didn\u0026rsquo;t at 19. the work itself is the point sometimes.\ngonna cross-post the BSM piece to r/algotrading tomorrow — curious if anyone\u0026rsquo;s found a better approximation for IV from market data when the IB feed lags during high-vol events. the schema\u0026rsquo;s going up as a gist too.\n-AK\n","date":"25 March 2026","externalUrl":null,"permalink":"/posts/2026-03-25-realtime-greeks-aggregation-portfolio-risk/","section":"Posts","summary":"\u003cp\u003e2:15am wednesday.\u003c/p\u003e\n\u003cp\u003estill processing this week. the q1 factor attribution post from sunday was cathartic but it also made me confront something i\u0026rsquo;d been papering over: i was flying blind on real-time greeks for most of march. not completely blind — i had position-level greeks from IB\u0026rsquo;s TWS feed. but aggregating them into a coherent portfolio view? that was a manual spreadsheet thing i\u0026rsquo;d run every few hours.\u003c/p\u003e","title":"real-time greeks aggregation: knowing your portfolio delta/gamma at sub-second speed","type":"posts"},{"content":"","date":"23 March 2026","externalUrl":null,"permalink":"/tags/factor-analysis/","section":"Tags","summary":"","title":"Factor-Analysis","type":"tags"},{"content":"q1 is in the books. three months, roughly flat performance, and a clear pattern in the trade data that tells me exactly what needs to change for q2.\njan: +2.1%. feb: -1.3%. march: -0.9% (locked at friday close). quarter: -0.13% net. account moved from $1.196M to about $1.194M. call it flat with a slight downside tilt.\nflat isn\u0026rsquo;t a disaster. given what q1 threw at systematic premium selling — elevated vol, directional trending, tariff headline risk every 48 hours — flat is actually fine. but \u0026ldquo;fine\u0026rdquo; isn\u0026rsquo;t good enough. this post is about figuring out whether the result was structurally correct or just managed luck.\nthe attribution framework # ran the full q1 analysis this weekend. the framework decomposes realized P\u0026amp;L by strategy into four components:\ntheta component — daily theta collected × days held = expected carry from premium decay delta drift — actual P\u0026amp;L minus theta projection = directional movement contribution (negative when market moves against short positions) vega component — vol expansion/contraction impact on marked value during holding period slippage drag — execution quality vs mid-market at entry and exit legs code that runs against the TimescaleDB trade history:\nfrom dataclasses import dataclass, field from typing import Optional import pandas as pd import numpy as np from datetime import datetime, timezone @dataclass class TradeRecord: trade_id: str strategy_family: str symbol: str entry_ts: datetime close_ts: Optional[datetime] # Greeks at entry (per-contract, dollar-weighted) entry_theta: float entry_delta: float entry_vega: float entry_iv: float # Trade economics premium_collected: float # positive = credit received realized_pnl: float days_held: int close_reason: str # \u0026#39;target\u0026#39;, \u0026#39;stop\u0026#39;, \u0026#39;expiry\u0026#39;, \u0026#39;risk_engine\u0026#39; # Calculated attribution fields _theta_carry: float = field(init=False) _delta_drift: float = field(init=False) _slippage_est: float = field(init=False) def __post_init__(self): self._theta_carry = self.entry_theta * self.days_held self._delta_drift = self.realized_pnl - self._theta_carry # rough slippage: ~1.8% of gross premium for two-legged structures self._slippage_est = -abs(self.premium_collected) * 0.018 @property def theta_carry(self) -\u0026gt; float: return self._theta_carry @property def delta_drift(self) -\u0026gt; float: return self._delta_drift @property def slippage_estimate(self) -\u0026gt; float: return self._slippage_est class Q1AttributionAnalyzer: def __init__(self, trades: list[TradeRecord]): self.df = pd.DataFrame([{ \u0026#39;trade_id\u0026#39;: t.trade_id, \u0026#39;strategy\u0026#39;: t.strategy_family, \u0026#39;entry_date\u0026#39;: pd.Timestamp(t.entry_ts), \u0026#39;month\u0026#39;: pd.Timestamp(t.entry_ts).month, \u0026#39;days_held\u0026#39;: t.days_held, \u0026#39;premium\u0026#39;: t.premium_collected, \u0026#39;realized_pnl\u0026#39;: t.realized_pnl, \u0026#39;theta_carry\u0026#39;: t.theta_carry, \u0026#39;delta_drift\u0026#39;: t.delta_drift, \u0026#39;slippage\u0026#39;: t.slippage_estimate, \u0026#39;close_reason\u0026#39;: t.close_reason, \u0026#39;entry_iv\u0026#39;: t.entry_iv, } for t in trades]) def monthly_attribution(self) -\u0026gt; pd.DataFrame: grouped = self.df.groupby(\u0026#39;month\u0026#39;).agg( trade_count=(\u0026#39;trade_id\u0026#39;, \u0026#39;count\u0026#39;), total_premium=(\u0026#39;premium\u0026#39;, \u0026#39;sum\u0026#39;), theta_carry=(\u0026#39;theta_carry\u0026#39;, \u0026#39;sum\u0026#39;), delta_drift=(\u0026#39;delta_drift\u0026#39;, \u0026#39;sum\u0026#39;), slippage=(\u0026#39;slippage\u0026#39;, \u0026#39;sum\u0026#39;), realized_pnl=(\u0026#39;realized_pnl\u0026#39;, \u0026#39;sum\u0026#39;), win_rate=(\u0026#39;realized_pnl\u0026#39;, lambda x: (x \u0026gt; 0).mean()), avg_iv_at_entry=(\u0026#39;entry_iv\u0026#39;, \u0026#39;mean\u0026#39;), ).round(2) return grouped def regime_breakdown(self, vix_series: pd.Series) -\u0026gt; pd.DataFrame: \u0026#34;\u0026#34;\u0026#34;Classify trade entries by VIX regime and compare performance.\u0026#34;\u0026#34;\u0026#34; vix_lookup = vix_series.to_dict() self.df[\u0026#39;entry_vix\u0026#39;] = self.df[\u0026#39;entry_date\u0026#39;].dt.date.map(vix_lookup) self.df[\u0026#39;regime\u0026#39;] = pd.cut( self.df[\u0026#39;entry_vix\u0026#39;], bins=[0, 18, 25, float(\u0026#39;inf\u0026#39;)], labels=[\u0026#39;low_vol\u0026#39;, \u0026#39;medium_vol\u0026#39;, \u0026#39;high_vol\u0026#39;] ) return self.df.groupby(\u0026#39;regime\u0026#39;, observed=True).agg( count=(\u0026#39;trade_id\u0026#39;, \u0026#39;count\u0026#39;), avg_pnl=(\u0026#39;realized_pnl\u0026#39;, \u0026#39;mean\u0026#39;), win_rate=(\u0026#39;realized_pnl\u0026#39;, lambda x: (x \u0026gt; 0).mean()), avg_theta_carry=(\u0026#39;theta_carry\u0026#39;, \u0026#39;mean\u0026#39;), avg_delta_drift=(\u0026#39;delta_drift\u0026#39;, \u0026#39;mean\u0026#39;), ).round(3) def close_reason_breakdown(self) -\u0026gt; pd.DataFrame: \u0026#34;\u0026#34;\u0026#34;How trades closed: target hit, stopped out, expiry, risk engine.\u0026#34;\u0026#34;\u0026#34; return self.df.groupby(\u0026#39;close_reason\u0026#39;).agg( count=(\u0026#39;trade_id\u0026#39;, \u0026#39;count\u0026#39;), avg_pnl=(\u0026#39;realized_pnl\u0026#39;, \u0026#39;mean\u0026#39;), win_rate=(\u0026#39;realized_pnl\u0026#39;, lambda x: (x \u0026gt; 0).mean()), ).round(2) output from the q1 run:\nmonthly attribution ($): trades theta_carry delta_drift slippage realized_pnl win_rate avg_iv jan 31 +21,400 +5,900 -1,800 +25,500 72.6% 17.2 feb 27 +16,200 -30,600 -1,500 -15,900 44.4% 21.8 mar 25 +13,800 -23,100 -1,100 -10,400 40.0% 24.1 theta carry is consistently positive every month. the premium selling edge is real and it doesn\u0026rsquo;t disappear. what flips the sign on P\u0026amp;L entirely is delta drift.\njanuary: VIX averaging 17.2, market range-bound — delta drift was additive. february: market picked a direction and stayed with it, VIX climbed to 21.8 average. march: tariff headlines dropped every other day, vol spiked twice, VIX averaged 24.1. both bad months, delta drift wiped out multiple weeks of theta accumulation in days.\nthe regime picture # same analysis split by vol regime at entry:\nregime trades avg_pnl win_rate avg_theta avg_delta_drift low_vol (VIX\u0026lt;18) 38 +$823 76% +$692 +$190 medium_vol (18-25) 41 -$127 49% +$601 -$681 high_vol (VIX\u0026gt;25) 4 -$2,104 25% +$589 -$2,636 low vol: theta works cleanly, delta drift is mild or additive. short gamma in a range-bound market harvests edge without the compounding directional problem.\nmedium vol: basically coin flip P\u0026amp;L. theta is there but delta drift consistently cancels it. this is the regime i spent most of the quarter trading in — 41 of 83 entries.\nhigh vol: small sample (4 trades), net negative, delta drift is the entire problem. the risk engine cutoff during the march spike (wrote about that friday) saved me from way more exposure here — without the automated pause, that 4-trade sample would\u0026rsquo;ve been 12 trades.\nthe options premium selling thread on NexusFi has years of documented discussion on exactly this failure mode. regime selection for systematic options isn\u0026rsquo;t optional — it\u0026rsquo;s the whole game. you can have a perfect theta-harvesting model and still lose consistently if you\u0026rsquo;re entering in the wrong environment.\nq1 cumulative p\u0026amp;l by strategy # options book peaked in week 3 and gave it back over the next 7 weeks. crypto tracked equities risk-off when the cross-asset correlation spiked in early march — the correlation trigger reduced crypto book size 25% automatically, which helped. futures were quiet all quarter, small positive contribution. the problem was entirely the options book walking into a regime shift with full size.\nfactor attribution waterfall # this chart is the clearest summary of q1. theta is roughly stable each month — $13-21k depending on trading days and deployed notional. the swing is entirely delta drift: additive in january, destructive in february and march.\nwhat i\u0026rsquo;m building for q2 # the fix is a vol regime filter on entries. stop taking full-size short-gamma positions when:\nVIX is trending upward over a 5-day lookback (not just elevated, but rising) implied vs realized vol spread is compressing (market pricing vol at close to realized = paying less edge per unit of risk) cross-asset SPX/BTC correlation is elevated above 0.65 and holding in those conditions: reduce new position size by 50-60%, buy wings on short strangles to turn them into condors, and wait for the regime to stabilize before rebuilding full size.\nthe backtesting work starts this week. going to run q4 2025 and q1 2026 against the hypothetical filtered approach and see how the numbers change. if the improvement is material — lower delta drift without proportionally hurting theta carry — live deploy for april.\ninfrastructure note # the attribution query runs against the chicago colo TimescaleDB instance. 83 trades with full greek snapshots, regime labels, and close metadata: 380ms query time. same query against the local san diego box is 1.1 seconds. both are fast enough for weekend analysis. chicago is source of truth because that\u0026rsquo;s where live execution writes.\none q1 data point worth noting: chicago server uptime was 100% through all the vol spikes. wednesday\u0026rsquo;s VIX move to 28, the tariff headline drops, nothing. the machine didn\u0026rsquo;t blink. colocation is an operational cost i\u0026rsquo;ve never regretted.\nA. made dinner tonight and left me alone to run numbers all day. we\u0026rsquo;ve both been in our own heads this weekend — she had something going on with her own project, i had this. we move around the apartment on days like this without getting in each other\u0026rsquo;s way. comfortable silence after a rough week.\nsaw a photo on my phone earlier from when my dad was messing around with old network switches in his home office, trying to get a homelab running. he never got it stable, kept running into VLAN config problems. he would\u0026rsquo;ve figured it out eventually. the chicago server rack would\u0026rsquo;ve absolutely blown his mind.\nq2 starts tomorrow. let\u0026rsquo;s see if the filter actually fixes it.\n-AK\n","date":"23 March 2026","externalUrl":null,"permalink":"/posts/2026-03-23-q1-factor-attribution-theta-edge-delta-problem/","section":"Posts","summary":"\u003cp\u003eq1 is in the books. three months, roughly flat performance, and a clear pattern in the trade data that tells me exactly what needs to change for q2.\u003c/p\u003e\n\u003cp\u003ejan: +2.1%. feb: -1.3%. march: -0.9% (locked at friday close). quarter: -0.13% net. account moved from $1.196M to about $1.194M. call it flat with a slight downside tilt.\u003c/p\u003e","title":"q1 factor attribution: theta is the edge, delta drift is the problem","type":"posts"},{"content":"","date":"21 March 2026","externalUrl":null,"permalink":"/tags/san-diego/","section":"Tags","summary":"","title":"San-Diego","type":"tags"},{"content":"she woke me up at 9am on a saturday.\nno warning. no negotiation. just \u0026ldquo;we\u0026rsquo;re going to la jolla. get dressed.\u0026rdquo;\ni\u0026rsquo;ve been working on training her for 2+ years that saturday morning means i\u0026rsquo;m not a functioning human until at least 11. this lesson has not stuck. at this point i think she does it on purpose.\nthe plan i didn\u0026rsquo;t have # she wanted to do the cove trail. the one that runs from la jolla village along the cliffs down to the children\u0026rsquo;s pool. she does it like twice a month. i\u0026rsquo;ve done it maybe 10 times total in my life.\ni told her i was going to check the overnight crypto fills.\nshe picked up her phone. turned the screen toward me.\nit was my grafana dashboard. BTC algo up 1.1%, ETH flat, options positions normal.\n\u0026ldquo;nothing needs you right now.\u0026rdquo;\ni hate that she knows how to read my dashboards. i hate it more that she\u0026rsquo;s always right about this.\nla jolla in march # the weather was doing its thing. march in san diego means it\u0026rsquo;s technically still winter and nobody told california. 71 degrees, no clouds, the coast doing that thing where it looks like a screensaver.\nshe wore white shorts and this hoodie she stole from my server rack room. she\u0026rsquo;s been claiming this hoodie as hers for like 18 months and at this point she\u0026rsquo;s right. it\u0026rsquo;s hers. whatever.\nhair up. running shoes. moving at her morning-walk pace which is slightly faster than i normally walk for any reason at all.\ni wore joggers and told her i was not hiking.\n\u0026ldquo;it\u0026rsquo;s a walking path.\u0026rdquo;\n\u0026ldquo;same difference.\u0026rdquo;\n\u0026ldquo;it\u0026rsquo;s really not.\u0026rdquo;\nthe cove # we walked for probably 45 minutes. the cliff trail has these lookout spots where you can see straight down into the water and when the light hits it looks unreal. dark blue to turquoise in like 50 feet.\nsea lions on the rocks below. like 20 of them just stacked on each other doing absolutely nothing.\nshe narrates what they\u0026rsquo;re thinking. always has. the fat one on top was \u0026ldquo;living rent-free and not open to feedback.\u0026rdquo; the one on the edge was \u0026ldquo;one bad decision from disaster but committed to the bit.\u0026rdquo;\ni pretended not to find this funny. i found it extremely funny.\nsomewhere around the halfway point she grabbed my hand. mid-sentence about the sea lions. just did it. no announcement.\nthe surprise # okay so.\nthere\u0026rsquo;s a public restroom building near the main parking lot at the cove. it\u0026rsquo;s old, kind of concrete-brutalist, kind of ugly. we\u0026rsquo;d been walking a while and she said she needed to stop.\ni went with her because same.\nthe parking lot at 10:30am on a saturday in march: essentially empty. too early for the tourist rush. a handful of cars, no one around.\nshe pushed me against the wall the second we were inside.\n\u0026ldquo;it\u0026rsquo;s been on the list since the second time we came here,\u0026rdquo; she said after. \u0026ldquo;i\u0026rsquo;ve been waiting for the right conditions.\u0026rdquo;\nwe have done this trail probably eight times together. i had zero idea it was on the list. ZERO. she has been carrying this in her back pocket for two years.\n\u0026ldquo;when did you decide this?\u0026rdquo;\n\u0026ldquo;when we got engaged. i figured a public bathroom near the la jolla sea lions counted as a real location.\u0026rdquo;\ni had my hand over her mouth the whole time so nobody outside would hear. she kept laughing at the worst moments which did not help.\nbest 20 minutes of my saturday by a significant margin.\nthe sea lions definitely didn\u0026rsquo;t notice.\nfood after # she takes list achievements seriously. there has to be a food celebration after.\ntaco place in la jolla village. i got carnitas. she got a fish taco situation and, predictably, made me try a bite.\nit was fine. objectively fine. the fish was fresh and the sauce was interesting and the texture wasn\u0026rsquo;t what i wanted.\n\u0026ldquo;you liked it.\u0026rdquo;\n\u0026ldquo;i didn\u0026rsquo;t say that.\u0026rdquo;\n\u0026ldquo;your FACE.\u0026rdquo;\nmy face was completely neutral. i have resting poker face. she\u0026rsquo;s been misreading it for three years.\nshe texted her mom: \u0026ldquo;AK tried fish tacos. voluntarily-ish.\u0026rdquo;\nher mom: three clapping emojis.\nher mom and her younger brothers have been tracking my food progress since we got married. it\u0026rsquo;s a whole family thing now. there\u0026rsquo;s probably a group chat. i don\u0026rsquo;t want to know.\n10 months # we got home around 1. she sat at her desk to work on some project. i ran a quick scan on my options positions. normal afternoon.\nten months married.\ni keep expecting it to feel dramatically different from before and it doesn\u0026rsquo;t, really. we already lived together for 18 months before the wedding. she already knew every annoying thing about me. i already knew about her bathroom schedule and the loud cooking music and the coffee mugs everywhere.\nbut there\u0026rsquo;s something settled in it that i\u0026rsquo;m still getting used to.\nwhen she grabbed my hand on the cliff trail today, there was nothing uncertain about it. no \u0026ldquo;are we in a good place\u0026rdquo; reading. just: this is what we are. this is just us.\nshe planned a places list location two years in advance and waited for the right conditions. that\u0026rsquo;s who i married.\ni\u0026rsquo;m so fucked. in the best possible way.\n-AK\n","date":"21 March 2026","externalUrl":null,"permalink":"/posts/2026-03-21-saturday-la-jolla-she-planned-this-for-two-years/","section":"Posts","summary":"\u003cp\u003eshe woke me up at 9am on a saturday.\u003c/p\u003e\n\u003cp\u003eno warning. no negotiation. just \u0026ldquo;we\u0026rsquo;re going to la jolla. get dressed.\u0026rdquo;\u003c/p\u003e\n\u003cp\u003ei\u0026rsquo;ve been working on training her for 2+ years that saturday morning means i\u0026rsquo;m not a functioning human until at least 11. this lesson has not stuck. at this point i think she does it on purpose.\u003c/p\u003e","title":"saturday - la jolla and she planned this for two years","type":"posts"},{"content":"","date":"20 March 2026","externalUrl":null,"permalink":"/tags/circuit-breaker/","section":"Tags","summary":"","title":"Circuit-Breaker","type":"tags"},{"content":"2:30am friday. rough week in the books.\nmarch has been a whole thing. tariff headlines dropping every 48 hours, VIX spiking then partially recovering, nobody knows what SPX does next. january was decent (+2.1%), february went against me (-1.3%). march hasn\u0026rsquo;t been great either. week ending today, i\u0026rsquo;m down about $2.3k for the five sessions. month\u0026rsquo;s probably closing around -1%.\nnot catastrophic. but not what i want.\nthe only reason it wasn\u0026rsquo;t a lot worse is the risk engine caught exposure limits before they became a real problem. writing this up while the session is still fresh in my head.\nwhat the week actually looked like # mid-week tariff news hit fast. wednesday morning, SPX dropped 2.1% in a single session. VIX went from 21 to 28 in under 48 hours. not the biggest spike i\u0026rsquo;ve seen, but the velocity was sharp - the kind of move where algo execution gets sloppy if you\u0026rsquo;re not watching the right things.\nfor an options premium-selling book, that environment is complicated.\nhigh VIX means better premiums on new trades. selling strangles on SPX when implied vol is elevated is theoretically attractive - you\u0026rsquo;re collecting more edge per unit of risk. the math says \u0026ldquo;yes please.\u0026rdquo;\nexcept: when vol spikes suddenly and the market moves with the spike, you\u0026rsquo;re not just collecting better premiums. you\u0026rsquo;re short gamma into directional momentum. delta exposure on your short puts compounds against you as the market sells off. and if margin requirements simultaneously expand (which they always do in vol spikes), you can find yourself forced to reduce positions at exactly the worst moment - when spreads are widest and slippage is worst.\nthis is the real problem with premium selling in vol events. everyone talks about theta. nobody talks about the gamma / margin / liquidity interaction when everything moves at once.\nthe risk engine is what separates \u0026ldquo;uncomfortable week\u0026rdquo; from \u0026ldquo;draw down 8% in 72 hours.\u0026rdquo;\nthe limit structure # built this out over most of 2024. learned the hard way that running checks every 15 minutes wasn\u0026rsquo;t enough. the thing runs every 60 seconds now against live portfolio state pulled from IBKR and Tastyworks APIs simultaneously.\nlimits that triggered this week:\nnet delta limit: portfolio delta (across all positions, not just the options book) bounded at ±$25k equivalent per $100k of capital. wednesday morning when SPX was in freefall, my short puts were getting long delta fast. hit 91% of limit by 10am. new options trades paused automatically.\nvega cap: total portfolio vega bounded by a formula tied to account NAV. this one didn\u0026rsquo;t breach but got close. when vol spikes and you\u0026rsquo;re already long vega from existing positions, it prevents you from doubling down on volatility exposure.\nmargin buffer: available margin must stay above 35% of NAV. if it drops to that floor, nothing new opens. keeps forced liquidation off the table.\ncross-asset correlation spike: when rolling 5-day correlation between SPX and BTC exceeds 0.70, the system auto-reduces crypto book size by 25%. both going risk-off together is a specific setup i don\u0026rsquo;t want full exposure through.\nthe correlation trigger fired monday morning. BTC dropped 4% in sympathy with equities, trigger hit, reduction orders went out. cost me some upside when crypto recovered thursday but that\u0026rsquo;s the deal - limits exist for the bad scenarios, not the good ones.\nclass RiskMonitor: def __init__(self, account_manager, portfolio_state): self.account = account_manager self.portfolio = portfolio_state self.limits = self._load_limits() def run_checks(self) -\u0026gt; RiskStatus: status = RiskStatus(timestamp=datetime.now(UTC)) nav = self.account.get_nav() # Delta check net_delta = self.portfolio.get_net_delta_dollars() delta_limit = nav * 0.25 status.delta_utilization = abs(net_delta) / delta_limit if status.delta_utilization \u0026gt; 0.90: status.add_breach(\u0026#39;delta\u0026#39;, net_delta, delta_limit) self._pause_new_trades(reason=\u0026#39;delta_limit\u0026#39;, duration_minutes=30) # Margin buffer available_margin = self.account.get_available_margin() margin_pct = available_margin / nav status.margin_utilization = 1.0 - margin_pct if margin_pct \u0026lt; 0.35: status.add_breach(\u0026#39;margin\u0026#39;, margin_pct, 0.35) self._pause_new_trades(reason=\u0026#39;margin_floor\u0026#39;, duration_minutes=60) # Cross-asset correlation corr = self.portfolio.get_rolling_correlation(\u0026#39;SPX\u0026#39;, \u0026#39;BTC\u0026#39;, window=\u0026#39;5D\u0026#39;) if corr \u0026gt; 0.70: status.add_breach(\u0026#39;correlation\u0026#39;, corr, 0.70) self._trigger_crypto_reduce() return status def _trigger_crypto_reduce(self): \u0026#34;\u0026#34;\u0026#34;Reduce crypto book 25% when cross-asset correlation spikes\u0026#34;\u0026#34;\u0026#34; current_size = self.portfolio.get_book_notional(\u0026#39;crypto\u0026#39;) target_size = current_size * 0.75 self.account.queue_reduce_order( book=\u0026#39;crypto\u0026#39;, target_notional=target_size, reason=\u0026#39;correlation_spike\u0026#39;, urgency=\u0026#39;moderate\u0026#39; ) def _pause_new_trades(self, reason: str, duration_minutes: int): expiry = datetime.now(UTC) + timedelta(minutes=duration_minutes) self.portfolio.set_trade_pause(reason=reason, expires_at=expiry) i\u0026rsquo;ve found there\u0026rsquo;s a good community thread on NexusFi where algo traders have been journaling systematic approaches to risk for years - the mindset of treating limits as features, not constraints, clicked for me reading through that. hard limits make discretionary overrides impossible, which is the point.\nwednesday morning is where it got real. delta utilization hit 91%, breach threshold crossed, new options trades auto-paused for 30 minutes. SPX bounced slightly, exposure normalized, trades resumed. i missed a couple entries during that window. probably missed $800 in potential premium. would have lost significantly more if the move had continued and i\u0026rsquo;d kept piling on.\nasymmetric. risk engine paid for itself in one session.\nthe infrastructure problem: stale data under load # vol spikes kill your data throughput. your risk engine gets slower exactly when you need it fastest. nobody talks about this.\nnormal day: ~42 options positions, quote updates every 5 minutes, risk calculations complete in under 800ms. fine.\nvol spike wednesday: quotes updating every 15-20 seconds because the market is moving. add IBKR and Tastyworks both hammering me with margin recalculations. crypto feeds running hot. the 60-second risk cycle was taking 180+ seconds to complete. i was making limit decisions on data that was 3 minutes old.\nfound out when the stale-data flag started appearing in the monitor. 14 minutes of lag on wednesday morning - right when it mattered most.\ntwo fixes:\nmaterialized view for position state\ninstead of joining live quotes against the positions table on every cycle, pre-compute a view that refreshes every 30 seconds. the risk monitor queries the view, not the raw tables directly. dropped p99 query time from ~2200ms to ~180ms.\nCREATE MATERIALIZED VIEW current_portfolio_state AS SELECT p.position_id, p.symbol, p.quantity, p.avg_cost, q.last_price, q.iv_mark, q.delta, q.gamma, q.theta, q.vega, (p.quantity * q.delta * q.underlying_price) AS delta_dollars, (p.quantity * q.vega) AS total_vega, q.updated_at FROM positions p JOIN LATERAL ( SELECT * FROM option_quotes oq WHERE oq.symbol = p.symbol ORDER BY oq.timestamp DESC LIMIT 1 ) q ON true WHERE p.status = \u0026#39;open\u0026#39;; the TimescaleDB continuous aggregate policy handles the 30-second refresh automatically. risk engine queries the view. raw quote ingestion runs independently. no lock contention.\ntiered check architecture\nsplit risk checks into two tiers:\nfast tier (every 60s): queries the materialized view. catches obvious breaches immediately. this is the circuit breaker layer. deep tier (every 5min): full re-calculation from live quotes, fresh margin calls from broker APIs, recompute correlations from scratch. catches subtle drift that the view might miss by 30 seconds. fast tier is the smoke detector. deep tier is the fire inspection.\nstale data lag went from 14 minutes max to under 90 seconds even under wednesday\u0026rsquo;s load. good enough.\ndelta exposure tracked VIX almost exactly. that\u0026rsquo;s the system working. when vol spiked wednesday, delta naturally grew on the short put positions - and the engine throttled new exposure to prevent it compounding further. as VIX came back in thursday-friday, positions normalized. this is what it\u0026rsquo;s supposed to look like.\nwhat i\u0026rsquo;m changing for april # the materialized view refresh rate: 30 seconds worked but only barely. changing to 15 seconds. the extra TimescaleDB load is worth the safety margin.\nadding a new circuit breaker: if the refresh lag itself exceeds 120 seconds, force an immediate risk-off state regardless of what the last check showed. right now i just get a stale-data alert and keep running. that\u0026rsquo;s wrong. 120 seconds of stale data in a fast market is unacceptable, even with the fast tier running.\nalso reviewing the delta limit formula. $25k per $100k NAV made sense at smaller size. at $1.2M, i might want tighter - maybe $20k per $100k, which would have triggered the breach earlier wednesday and gotten me out of new exposure before the worst of the move.\nreviewing it over the weekend.\nbeen a long march. A. noticed i\u0026rsquo;ve been at the desk more than usual, quieter at breakfast - she\u0026rsquo;s been giving me space, just sets a coffee down and goes back to her corner. she\u0026rsquo;s been deep in some Python project of her own anyway. we move around each other pretty well when both of us are locked in.\nsometimes late at night staring at risk logs i think about dad. he would\u0026rsquo;ve appreciated the engineering in all this - the fail-safes layered on fail-safes. probably would\u0026rsquo;ve asked a lot of questions and then said \u0026ldquo;seems like you\u0026rsquo;re building a plane while flying it.\u0026rdquo; yeah. basically.\napril better be cleaner.\n-AK\n","date":"20 March 2026","externalUrl":null,"permalink":"/posts/2026-03-20-march-vol-spike-risk-engine/","section":"Posts","summary":"\u003cp\u003e2:30am friday. rough week in the books.\u003c/p\u003e\n\u003cp\u003emarch has been a whole thing. tariff headlines dropping every 48 hours, VIX spiking then partially recovering, nobody knows what SPX does next. january was decent (+2.1%), february went against me (-1.3%). march hasn\u0026rsquo;t been great either. week ending today, i\u0026rsquo;m down about $2.3k for the five sessions. month\u0026rsquo;s probably closing around -1%.\u003c/p\u003e","title":"march vol spike: when the risk engine earns its keep","type":"posts"},{"content":"4:30 AM. been staring at vol surfaces for three weeks straight. finally got the pipeline clean enough to write about it.\nif you\u0026rsquo;re trading options without a vol surface you\u0026rsquo;re flying blind. period. everyone talks about delta and theta but the actual edge is in understanding where implied vol is mispriced relative to what it should be. that\u0026rsquo;s the surface. that\u0026rsquo;s where the money is.\nwhy this matters # my options book is about 60% of total capital. mostly SPX premium selling with some sector ETF hedges. for a long time i was using flat-surface assumptions - same IV treatment across strikes and expirations. it worked okay in calm markets but got picked apart when skew moved.\nthe fix is building the actual surface. interpolating it. trading against deviations from its own history.\nbeen digging through the VIX and volatility thread on NexusFi for a while now - lot of good context there from traders who\u0026rsquo;ve been through multiple vol regimes. helped me frame what the surface is actually telling you vs what you think it\u0026rsquo;s telling you.\ngetting the data # ThetaData is my source for options chains. tick-level options data, clean Python API, reasonable pricing. here\u0026rsquo;s the core builder class:\nimport thetadata as td import pandas as pd import numpy as np from datetime import datetime, timedelta from scipy.interpolate import griddata from scipy.optimize import brentq import warnings warnings.filterwarnings(\u0026#39;ignore\u0026#39;) class VolSurfaceBuilder: \u0026#34;\u0026#34;\u0026#34; Build and query an implied volatility surface from options chain data. Uses ThetaData for options chains, scipy for surface interpolation. \u0026#34;\u0026#34;\u0026#34; def __init__(self, ticker: str = \u0026#34;SPX\u0026#34;): self.ticker = ticker self.client = td.ThetaClient(username=\u0026#34;your_username\u0026#34;, passwd=\u0026#34;your_pass\u0026#34;) self.surface_data: pd.DataFrame | None = None self.interpolated_grid = None self.m_grid = None self.t_grid = None def fetch_chain(self, date: datetime, min_oi: int = 100) -\u0026gt; pd.DataFrame: \u0026#34;\u0026#34;\u0026#34;Fetch full options chain for a specific date\u0026#34;\u0026#34;\u0026#34; chain_data = [] # Get expirations available expirations = self.client.get_expirations( root=self.ticker, start_date=date.strftime(\u0026#34;%Y%m%d\u0026#34;), end_date=(date + timedelta(days=1)).strftime(\u0026#34;%Y%m%d\u0026#34;) ) for exp_date in expirations.itertuples(): exp_str = exp_date.expiration.strftime(\u0026#34;%Y%m%d\u0026#34;) days_to_exp = (exp_date.expiration - date).days # Skip too-near (\u0026lt; 3 days) and too-far (\u0026gt; 90 days) expirations if days_to_exp \u0026lt; 3 or days_to_exp \u0026gt; 90: continue # Fetch call and put chains for right in [\u0026#39;C\u0026#39;, \u0026#39;P\u0026#39;]: try: chain = self.client.get_quotes( root=self.ticker, exp=exp_str, right=right, start_date=date.strftime(\u0026#34;%Y%m%d\u0026#34;), end_date=(date + timedelta(days=1)).strftime(\u0026#34;%Y%m%d\u0026#34;), ivl=3600000 # 1-hour snapshots ) if chain.empty: continue chain[\u0026#39;days_to_exp\u0026#39;] = days_to_exp chain[\u0026#39;right\u0026#39;] = right chain[\u0026#39;expiration\u0026#39;] = exp_date.expiration chain_data.append(chain) except Exception: continue if not chain_data: return pd.DataFrame() return pd.concat(chain_data, ignore_index=True) def calculate_iv(self, option_price: float, S: float, K: float, T: float, r: float, option_type: str) -\u0026gt; float: \u0026#34;\u0026#34;\u0026#34; Black-Scholes IV via Brent\u0026#39;s method. T = years to expiration \u0026#34;\u0026#34;\u0026#34; from scipy.stats import norm def bs_price(sigma: float) -\u0026gt; float: d1 = (np.log(S / K) + (r + 0.5 * sigma**2) * T) / (sigma * np.sqrt(T)) d2 = d1 - sigma * np.sqrt(T) if option_type == \u0026#39;C\u0026#39;: return S * norm.cdf(d1) - K * np.exp(-r * T) * norm.cdf(d2) - option_price else: return K * np.exp(-r * T) * norm.cdf(-d2) - S * norm.cdf(-d1) - option_price try: iv = brentq(bs_price, 0.001, 10.0, maxiter=100) return iv if 0.01 \u0026lt; iv \u0026lt; 5.0 else np.nan except Exception: return np.nan def build_surface(self, chain: pd.DataFrame, spot: float, risk_free_rate: float = 0.053) -\u0026gt; pd.DataFrame: \u0026#34;\u0026#34;\u0026#34; Build the vol surface from options chain. Returns DataFrame with columns: [moneyness, dte, iv, right] \u0026#34;\u0026#34;\u0026#34; surface_rows = [] for _, row in chain.iterrows(): if row.get(\u0026#39;open_interest\u0026#39;, 0) \u0026lt; 100: continue T = row[\u0026#39;days_to_exp\u0026#39;] / 365.0 K = row[\u0026#39;strike\u0026#39;] mid_price = (row[\u0026#39;bid\u0026#39;] + row[\u0026#39;ask\u0026#39;]) / 2 if mid_price \u0026lt;= 0 or row[\u0026#39;bid\u0026#39;] \u0026lt;= 0: continue # Convert to log-moneyness (standard representation) moneyness = np.log(K / spot) iv = self.calculate_iv( option_price=mid_price, S=spot, K=K, T=T, r=risk_free_rate, option_type=row[\u0026#39;right\u0026#39;] ) if not np.isnan(iv): surface_rows.append({ \u0026#39;moneyness\u0026#39;: moneyness, \u0026#39;dte\u0026#39;: row[\u0026#39;days_to_exp\u0026#39;], \u0026#39;iv\u0026#39;: iv * 100, # Express as percentage \u0026#39;right\u0026#39;: row[\u0026#39;right\u0026#39;], \u0026#39;strike\u0026#39;: K, \u0026#39;expiration\u0026#39;: row[\u0026#39;expiration\u0026#39;] }) return pd.DataFrame(surface_rows) def interpolate_surface(self, surface_df: pd.DataFrame) -\u0026gt; None: \u0026#34;\u0026#34;\u0026#34; Create interpolated surface using scipy griddata. Enables querying IV at arbitrary (moneyness, dte) points. \u0026#34;\u0026#34;\u0026#34; if surface_df.empty: return self.surface_data = surface_df # Create regular grid for interpolation m_grid = np.linspace(surface_df[\u0026#39;moneyness\u0026#39;].min(), surface_df[\u0026#39;moneyness\u0026#39;].max(), 50) t_grid = np.linspace(surface_df[\u0026#39;dte\u0026#39;].min(), surface_df[\u0026#39;dte\u0026#39;].max(), 30) M, T = np.meshgrid(m_grid, t_grid) points = surface_df[[\u0026#39;moneyness\u0026#39;, \u0026#39;dte\u0026#39;]].values values = surface_df[\u0026#39;iv\u0026#39;].values self.interpolated_grid = griddata( points, values, (M, T), method=\u0026#39;cubic\u0026#39; ) self.m_grid = m_grid self.t_grid = t_grid def query_iv(self, moneyness: float, dte: float) -\u0026gt; float: \u0026#34;\u0026#34;\u0026#34;Query interpolated IV at any point on the surface\u0026#34;\u0026#34;\u0026#34; if self.interpolated_grid is None: raise ValueError(\u0026#34;Must call interpolate_surface first\u0026#34;) from scipy.interpolate import RegularGridInterpolator interp = RegularGridInterpolator( (self.t_grid, self.m_grid), self.interpolated_grid, method=\u0026#39;linear\u0026#39;, bounds_error=False, fill_value=None ) return float(interp([[dte, moneyness]])) the calculate_iv method uses Brent\u0026rsquo;s method on the Black-Scholes formula instead of Newton-Raphson. way more stable - Newton blows up on deep OTM options near-the-money where the function gets flat. Brent is slower by a few microseconds but never NaNs on you.\nwhat the surface actually looks like # this is the thing that made it click for me. you can\u0026rsquo;t trade what you can\u0026rsquo;t see.\nthat drop toward negative moneyness is the skew. OTM puts are expensive. everyone knows this directionally but the surface quantifies it exactly. at -0.10 log-moneyness (~10% OTM puts) you\u0026rsquo;re looking at roughly 8-10 vol points of premium over ATM. that\u0026rsquo;s huge.\nthe term structure is the other axis - near-term IV is elevated relative to longer-dated. market charges more per day of exposure close in than far out. this is your theta hunting ground.\nfinding the actual edge # the edge isn\u0026rsquo;t \u0026ldquo;puts are expensive.\u0026rdquo; everyone prices that in. the edge is when the current surface deviates from the expected surface - its own rolling baseline.\nz-score approach: compute a 30-day rolling average surface. when current IV at a specific (moneyness, dte) coordinate is \u0026gt; 1.5 standard deviations above the average, that strike is \u0026ldquo;rich\u0026rdquo; - candidate for selling premium.\nclass SkewSignalGenerator: \u0026#34;\u0026#34;\u0026#34; Generates signals based on deviation from historical vol surface baseline. \u0026#34;\u0026#34;\u0026#34; def __init__(self, builder: VolSurfaceBuilder, lookback_days: int = 30): self.builder = builder self.lookback_days = lookback_days self.historical_surfaces: list[pd.DataFrame] = [] def update_history(self, surface_df: pd.DataFrame) -\u0026gt; None: \u0026#34;\u0026#34;\u0026#34;Add today\u0026#39;s surface to history, maintain rolling window\u0026#34;\u0026#34;\u0026#34; self.historical_surfaces.append(surface_df) if len(self.historical_surfaces) \u0026gt; self.lookback_days: self.historical_surfaces.pop(0) def compute_zscore_surface(self, current_surface: pd.DataFrame) -\u0026gt; pd.DataFrame: \u0026#34;\u0026#34;\u0026#34; For each point on current surface, compute z-score vs historical baseline. Returns DataFrame with columns [moneyness, dte, iv, zscore, signal] \u0026#34;\u0026#34;\u0026#34; if len(self.historical_surfaces) \u0026lt; 10: return pd.DataFrame() hist_combined = pd.concat(self.historical_surfaces) result_rows = [] for _, row in current_surface.iterrows(): m, t = row[\u0026#39;moneyness\u0026#39;], row[\u0026#39;dte\u0026#39;] # Find historical IVs at similar coordinates (tight window) mask = ( (hist_combined[\u0026#39;moneyness\u0026#39;].between(m - 0.01, m + 0.01)) \u0026amp; (hist_combined[\u0026#39;dte\u0026#39;].between(t - 3, t + 3)) ) hist_ivs = hist_combined.loc[mask, \u0026#39;iv\u0026#39;] if len(hist_ivs) \u0026lt; 5: continue hist_mean = hist_ivs.mean() hist_std = hist_ivs.std() if hist_std \u0026lt; 0.5: # Skip points with insufficient historical variance continue zscore = (row[\u0026#39;iv\u0026#39;] - hist_mean) / hist_std signal = \u0026#39;HOLD\u0026#39; if zscore \u0026gt; 1.5: signal = \u0026#39;SELL\u0026#39; # IV rich relative to own history, sell premium elif zscore \u0026lt; -1.5: signal = \u0026#39;BUY\u0026#39; # IV cheap relative to own history, buy vol result_rows.append({ \u0026#39;moneyness\u0026#39;: m, \u0026#39;dte\u0026#39;: t, \u0026#39;strike\u0026#39;: row[\u0026#39;strike\u0026#39;], \u0026#39;expiration\u0026#39;: row[\u0026#39;expiration\u0026#39;], \u0026#39;iv\u0026#39;: row[\u0026#39;iv\u0026#39;], \u0026#39;iv_hist_mean\u0026#39;: hist_mean, \u0026#39;iv_hist_std\u0026#39;: hist_std, \u0026#39;zscore\u0026#39;: zscore, \u0026#39;signal\u0026#39;: signal, \u0026#39;right\u0026#39;: row[\u0026#39;right\u0026#39;] }) return pd.DataFrame(result_rows) def get_top_signals(self, zscore_df: pd.DataFrame, n: int = 10) -\u0026gt; pd.DataFrame: \u0026#34;\u0026#34;\u0026#34;Return top N SELL signals sorted by zscore magnitude\u0026#34;\u0026#34;\u0026#34; sell_signals = zscore_df[zscore_df[\u0026#39;signal\u0026#39;] == \u0026#39;SELL\u0026#39;].copy() return sell_signals.sort_values(\u0026#39;zscore\u0026#39;, ascending=False).head(n) the 1.5 sigma threshold took a while to tune. lower → more signals but noisy, higher → cleaner but fewer. 1.5 is the sweet spot on SPX data, might need adjustment for other underlyings.\nbacktest: does it work? # ran this against 18 months of SPX options data. here\u0026rsquo;s the honest picture:\n18-month summary:\ntotal return: +22.4% strategy vs +17.1% SPY max drawdown: -2.8% (vs -8.3% worst SPY stretch) sharpe: 1.94 annualized win rate: 68% of trades closed profitable avg winner / avg loser: $1,840 / $2,120 the sharpe is the number i care about. 1.94 on 18 months of live data is legitimate. drawdown is low because i\u0026rsquo;m sizing conservatively - this is a diversification play, not the primary book.\nworst month was April 2025. vol regime shifted mid-month, had positions that went from SELL signals to watching IV expand 40% in three days. risk management saved me - i have a hard rule: if IV at entry doubles, cut the position regardless of zscore signal. that rule triggered four times in April. didn\u0026rsquo;t save all of it but kept the loss to -2.1% instead of something nasty.\ninfrastructure side # the surface rebuild runs every 5 minutes during market hours from chicago colo. python script, cron job, writes updated surface and signals to redis. my execution algo reads from redis - no latency waiting on ThetaData API calls during live trading.\n# /etc/cron.d/surface-rebuild # */5 9-16 * * 1-5 python3 /opt/trading/surface_rebuild.py \u0026gt;\u0026gt; /var/log/surface.log 2\u0026gt;\u0026amp;1 import asyncio import aioredis import logging logger = logging.getLogger(__name__) async def rebuild_surface_worker(): \u0026#34;\u0026#34;\u0026#34;Main worker - runs every 5 minutes during market hours\u0026#34;\u0026#34;\u0026#34; builder = VolSurfaceBuilder(ticker=\u0026#34;SPX\u0026#34;) signal_gen = SkewSignalGenerator(builder, lookback_days=30) redis_client = await aioredis.create_redis_pool(\u0026#39;redis://localhost:6379\u0026#39;) try: spot = await get_current_spot_price() chain = builder.fetch_chain(datetime.now()) if chain.empty: logger.warning(\u0026#34;Empty chain returned - market may be closed\u0026#34;) return surface = builder.build_surface(chain, spot) builder.interpolate_surface(surface) signal_gen.update_history(surface) zscore_df = signal_gen.compute_zscore_surface(surface) top_signals = signal_gen.get_top_signals(zscore_df, n=10) # Write to Redis with TTL slightly longer than cron interval await redis_client.set( \u0026#39;vol_surface_signals\u0026#39;, top_signals.to_json(orient=\u0026#39;records\u0026#39;), expire=360 # 6 min TTL ) await redis_client.set( \u0026#39;vol_surface_updated\u0026#39;, str(datetime.now().timestamp()), expire=360 ) signal_count = len(top_signals[top_signals[\u0026#39;signal\u0026#39;] == \u0026#39;SELL\u0026#39;]) logger.info(f\u0026#34;Surface updated. {signal_count} active SELL signals.\u0026#34;) finally: redis_client.close() await redis_client.wait_closed() if __name__ == \u0026#34;__main__\u0026#34;: asyncio.run(rebuild_surface_worker()) 5-minute rebuild is probably overkill for a delta-neutral premium selling strategy where positions last days to weeks. but it\u0026rsquo;s cheap compute and i like knowing the signals are fresh. chicago colo handles it fine alongside the other workers.\nwhere it falls down # honest after 4 months of live trading:\ntransaction costs are real — SPX spreads are tight but not zero. slippage model says 30-40% of theoretical edge gets eaten by bid/ask in execution. paper trading this looked better than live for exactly this reason.\nsignal clustering — when vol spikes, you get a flood of SELL signals simultaneously. correlation goes to 1. if you treat each signal independently you end up with a ton of exposure that looks diversified but isn\u0026rsquo;t. position sizing relative to concurrent signal count is important.\nnear-expiry artifacts — ThetaData below 5 DTE has weird bid/ask artifacts on illiquid strikes. i filter those out now (the days_to_exp \u0026lt; 3 check in fetch_chain). caught this in v1 when i had a position that looked like a 2.5-sigma sell signal but the spread was $0.05 wide on a strike with 50 OI.\nregime dependence — 30-day lookback worked well in 2025. going to need recalibration as 2026 vol conditions evolve. the surface isn\u0026rsquo;t static, and neither is what counts as \u0026ldquo;rich.\u0026rdquo;\nnot pretending this is a secret edge that runs forever. it\u0026rsquo;s a tool. sized appropriately it adds a consistent 0.3-0.5% to monthly alpha. over a year that compounds into something real.\nnext: SVI parameterization # the main thing i want to fix is the interpolation at surface edges. cubic griddata gets unstable on the wings - deep OTM options where there\u0026rsquo;s thin data. it creates artifacts that look like signals but aren\u0026rsquo;t.\nbeen reading papers on SVI (Stochastic Volatility Inspired) parameterization. model-based interpolation that avoids arbitrage violations you can get with polynomial methods. the Gatheral SVI formulation has five parameters per slice - clean and well-studied.\nalso planning to add realized vol comparison. right now the system only looks at IV relative to its own history, not whether IV is actually above realized vol. IV \u0026gt; RV = structural richness. that\u0026rsquo;s the more direct signal.\ndad used to say if you can\u0026rsquo;t explain something in 30 seconds you don\u0026rsquo;t understand it. took me three weeks to get this pipeline right. i understand it now.\n-AK\n","date":"18 March 2026","externalUrl":null,"permalink":"/posts/2026-03-18-implied-vol-surface-spx-python/","section":"Posts","summary":"\u003cp\u003e4:30 AM. been staring at vol surfaces for three weeks straight. finally got the pipeline clean enough to write about it.\u003c/p\u003e\n\u003cp\u003eif you\u0026rsquo;re trading options without a vol surface you\u0026rsquo;re flying blind. period. everyone talks about delta and theta but the actual edge is in understanding \u003cem\u003ewhere\u003c/em\u003e implied vol is mispriced relative to what it should be. that\u0026rsquo;s the surface. that\u0026rsquo;s where the money is.\u003c/p\u003e","title":"implied vol surface in python: stop guessing what the market thinks","type":"posts"},{"content":"","date":"18 March 2026","externalUrl":null,"permalink":"/tags/implied-volatility/","section":"Tags","summary":"","title":"Implied-Volatility","type":"tags"},{"content":"","date":"18 March 2026","externalUrl":null,"permalink":"/tags/plotly/","section":"Tags","summary":"","title":"Plotly","type":"tags"},{"content":"","date":"18 March 2026","externalUrl":null,"permalink":"/tags/scipy/","section":"Tags","summary":"","title":"Scipy","type":"tags"},{"content":"","date":"18 March 2026","externalUrl":null,"permalink":"/tags/volatility-surface/","section":"Tags","summary":"","title":"Volatility-Surface","type":"tags"},{"content":"","date":"18 March 2026","externalUrl":null,"permalink":"/tags/arbitrage/","section":"Tags","summary":"","title":"Arbitrage","type":"tags"},{"content":"past 2am. BTC arb just settled a clean +$870 position. wide awake. writing this instead of sleeping.\nbeen running a funding rate arb strategy across my crypto book since late november. never posted about it because honestly it\u0026rsquo;s kind of a boring trade to explain. no dramatic wins, no blowups, just steady quiet alpha sitting off to the side of everything else. averaging $2-4k a month net with basically zero correlation to my options or futures book.\nwhich is exactly why i care about it.\nwhat\u0026rsquo;s a funding rate # quick primer: perpetual futures contracts don\u0026rsquo;t expire. to keep the perp price anchored to spot, exchanges use a funding rate mechanism. every 8 hours (typically midnight, 8am, 4pm UTC), longs pay shorts — or vice versa — based on a calculated rate.\nwhen market is bullish and leveraged longs pile in, rate goes positive. longs pay shorts. when market dumps and shorts dominate, rate goes negative, shorts pay longs.\ntypical rate: 0.01% to 0.05% per 8h period. during momentum runs? can hit 0.2-0.3%+. annualize that and you understand why people pay a lot of attention to it.\nthe arb opportunity # funding rates don\u0026rsquo;t sync instantly across exchanges. Binance.US and Kraken have different liquidity pools, different trader compositions, and different regulatory constraints. divergences happen constantly. they\u0026rsquo;re usually small and short-lived, but they\u0026rsquo;re predictable in timing (8h settlement cycles) and measurable in real time.\nthe trade: when BTC-PERP funding rate on exchange A significantly exceeds exchange B, short A and long B. collect the rate differential at settlement. positions are roughly delta-neutral against each other.\nthat Feb 26-27 spike is where i made the most. rates briefly diverged 14bps in a single period. executed fast, settled clean.\npython implementation # here\u0026rsquo;s the core of the monitoring and execution system. i\u0026rsquo;m using ccxt for unified exchange access and asyncio to poll both exchanges simultaneously without blocking:\nimport asyncio import ccxt.async_support as ccxt import logging from dataclasses import dataclass, field from datetime import datetime, timezone from typing import Optional import asyncpg # TimescaleDB connection import aiohttp logger = logging.getLogger(__name__) @dataclass class FundingSnapshot: exchange: str symbol: str rate: float next_settlement: datetime timestamp: datetime = field(default_factory=lambda: datetime.now(timezone.utc)) @dataclass class ArbOpportunity: long_exchange: str short_exchange: str symbol: str rate_spread: float # percentage points long_rate: float short_rate: float estimated_pnl_per_lot: float settlement_dt: datetime valid: bool = True class FundingRateMonitor: \u0026#34;\u0026#34;\u0026#34; Monitors funding rate divergences across exchanges. Polls every 30 seconds, stores to TimescaleDB, alerts on spread \u0026gt; threshold. \u0026#34;\u0026#34;\u0026#34; SYMBOL_MAP = { \u0026#34;BTC\u0026#34;: { \u0026#34;binanceus\u0026#34;: \u0026#34;BTC/USDT:USDT\u0026#34;, \u0026#34;kraken\u0026#34;: \u0026#34;BTC/USD:USD\u0026#34;, }, \u0026#34;ETH\u0026#34;: { \u0026#34;binanceus\u0026#34;: \u0026#34;ETH/USDT:USDT\u0026#34;, \u0026#34;kraken\u0026#34;: \u0026#34;ETH/USD:USD\u0026#34;, }, } # Fee structure: maker/taker per exchange FEE_TABLE = { \u0026#34;binanceus\u0026#34;: {\u0026#34;maker\u0026#34;: 0.0004, \u0026#34;taker\u0026#34;: 0.0006}, \u0026#34;kraken\u0026#34;: {\u0026#34;maker\u0026#34;: 0.0002, \u0026#34;taker\u0026#34;: 0.0005}, } def __init__( self, min_spread_bps: float = 1.5, # minimum 1.5 bps to enter position_usd: float = 40_000, # per leg poll_interval: int = 30, # seconds db_dsn: str = \u0026#34;\u0026#34;, ): self.min_spread_bps = min_spread_bps / 100 / 100 # convert to decimal self.position_usd = position_usd self.poll_interval = poll_interval self.db_dsn = db_dsn self._exchanges: dict[str, ccxt.Exchange] = {} self._db_pool: Optional[asyncpg.Pool] = None self._running = False self._open_positions: dict[str, ArbOpportunity] = {} async def initialize(self): self._exchanges = { \u0026#34;binanceus\u0026#34;: ccxt.binanceus({\u0026#34;enableRateLimit\u0026#34;: True}), \u0026#34;kraken\u0026#34;: ccxt.kraken({\u0026#34;enableRateLimit\u0026#34;: True}), } if self.db_dsn: self._db_pool = await asyncpg.create_pool(self.db_dsn, min_size=2, max_size=10) logger.info(\u0026#34;FundingRateMonitor initialized\u0026#34;) async def _fetch_funding_rate(self, exchange_id: str, symbol: str) -\u0026gt; Optional[FundingSnapshot]: ex = self._exchanges[exchange_id] try: data = await ex.fetch_funding_rate(symbol) rate = data.get(\u0026#34;fundingRate\u0026#34;, 0.0) next_ts = data.get(\u0026#34;nextFundingDatetime\u0026#34;) next_dt = ( datetime.fromisoformat(next_ts.replace(\u0026#34;Z\u0026#34;, \u0026#34;+00:00\u0026#34;)) if next_ts else datetime.now(timezone.utc) ) return FundingSnapshot( exchange=exchange_id, symbol=symbol, rate=float(rate), next_settlement=next_dt, ) except Exception as e: logger.warning(f\u0026#34;Error fetching {exchange_id} {symbol}: {e}\u0026#34;) return None async def _fetch_all_rates(self, base: str) -\u0026gt; dict[str, FundingSnapshot]: tasks = { ex_id: self._fetch_funding_rate(ex_id, sym) for ex_id, sym in self.SYMBOL_MAP[base].items() } results = await asyncio.gather(*tasks.values(), return_exceptions=True) snapshots = {} for ex_id, result in zip(tasks.keys(), results): if isinstance(result, FundingSnapshot): snapshots[ex_id] = result return snapshots def _calculate_opportunity( self, base: str, snapshots: dict[str, FundingSnapshot] ) -\u0026gt; Optional[ArbOpportunity]: if len(snapshots) \u0026lt; 2: return None ex_ids = list(snapshots.keys()) s1, s2 = snapshots[ex_ids[0]], snapshots[ex_ids[1]] if s1.rate \u0026gt; s2.rate: short_snap, long_snap = s1, s2 else: short_snap, long_snap = s2, s1 spread = short_snap.rate - long_snap.rate # Round-trip fees for both legs total_fees = ( self.FEE_TABLE[long_snap.exchange][\u0026#34;taker\u0026#34;] + self.FEE_TABLE[short_snap.exchange][\u0026#34;taker\u0026#34;] ) * 2 # entry + exit net_rate = spread - total_fees if net_rate \u0026lt; self.min_spread_bps: return None pnl_est = net_rate * self.position_usd return ArbOpportunity( long_exchange=long_snap.exchange, short_exchange=short_snap.exchange, symbol=base, rate_spread=spread, long_rate=long_snap.rate, short_rate=short_snap.rate, estimated_pnl_per_lot=pnl_est, settlement_dt=min(s1.next_settlement, s2.next_settlement), ) async def _store_snapshot(self, snapshot: FundingSnapshot): if not self._db_pool: return async with self._db_pool.acquire() as conn: await conn.execute( \u0026#34;\u0026#34;\u0026#34; INSERT INTO funding_rates (ts, exchange, symbol, rate, next_settlement) VALUES ($1, $2, $3, $4, $5) ON CONFLICT DO NOTHING \u0026#34;\u0026#34;\u0026#34;, snapshot.timestamp, snapshot.exchange, snapshot.symbol, snapshot.rate, snapshot.next_settlement, ) async def _alert_opportunity(self, opp: ArbOpportunity): spread_bps = opp.rate_spread * 100 * 100 logger.info( f\u0026#34;ARB OPPORTUNITY | {opp.symbol} | \u0026#34; f\u0026#34;short {opp.short_exchange} ({opp.short_rate*100:.4f}%) \u0026#34; f\u0026#34;long {opp.long_exchange} ({opp.long_rate*100:.4f}%) | \u0026#34; f\u0026#34;spread {spread_bps:.2f}bps | est P\u0026amp;L ${opp.estimated_pnl_per_lot:.2f}\u0026#34; ) # POST to alerting endpoint (Grafana/Prometheus pushgateway) async with aiohttp.ClientSession() as session: await session.post( \u0026#34;http://localhost:9091/metrics/job/funding_arb\u0026#34;, data=f\u0026#39;funding_arb_spread_bps{{symbol=\u0026#34;{opp.symbol}\u0026#34;}} {spread_bps}\\n\u0026#39;, ) async def run(self): self._running = True logger.info(\u0026#34;Starting funding rate monitor loop\u0026#34;) while self._running: for base in self.SYMBOL_MAP: try: snapshots = await self._fetch_all_rates(base) for snap in snapshots.values(): await self._store_snapshot(snap) opp = self._calculate_opportunity(base, snapshots) if opp: await self._alert_opportunity(opp) except Exception as e: logger.error(f\u0026#34;Monitor loop error ({base}): {e}\u0026#34;) await asyncio.sleep(self.poll_interval) async def shutdown(self): self._running = False for ex in self._exchanges.values(): await ex.close() if self._db_pool: await self._db_pool.close() async def main(): monitor = FundingRateMonitor( min_spread_bps=1.5, position_usd=42_500, poll_interval=30, db_dsn=\u0026#34;postgresql://user:pass@localhost:5432/trading\u0026#34;, ) await monitor.initialize() try: await monitor.run() finally: await monitor.shutdown() if __name__ == \u0026#34;__main__\u0026#34;: asyncio.run(main()) execution lives in a separate module that listens on the alert queue and submits market orders. keeping them decoupled means i can test the monitor without touching live positions.\ninfrastructure # this is where it matters: funding divergences close fast. sometimes within 30 minutes of appearing, market makers have arbitraged them away across exchanges.\nmy Chicago colo server runs the execution layer. ~45ms round-trip to both exchange APIs vs 200-250ms from home in San Diego. for a trade where the edge is 8-14bps and fees eat 4-6bps of that, slippage matters.\nmonitoring stack:\nasyncio polling loop every 30 seconds — both exchanges hit in parallel TimescaleDB stores every snapshot with microsecond timestamps — lets me backtest which hours generate the most divergences (answer: 23:00-01:00 UTC, right before midnight settlement) Prometheus pushgateway receives spread metrics, Grafana fires alerts when spread exceeds threshold and persists 2+ consecutive polls position tracker separate process, reads from Redis, handles execution and settlement confirmation the hardest part wasn\u0026rsquo;t the strategy. it was making the monitoring reliable enough that i\u0026rsquo;m not sitting here manually checking rates. it runs while i sleep. that\u0026rsquo;s the whole point.\nmost divergences are small and below threshold. the ones i enter (10+ bps net of fees) happen roughly 4-6 times per month on BTC, fewer on ETH. not high frequency — but each entry has a definable edge.\nresults: four months # metric value avg monthly P\u0026amp;L (net fees) +$2,380 best month (Dec 2025) +$4,100 worst month (Jan 2026) +$640 max single-period drawdown -$320 deployed capital (both legs) ~$85k annualized return on deployed ~33% correlation to options book 0.04 that 33% annualized sounds impressive but it\u0026rsquo;s bounded by exchange liquidity. realistically can\u0026rsquo;t deploy more than $150k across both legs before slippage erodes the edge entirely. so this caps out at roughly $5-6k/month max.\nnot the strategy that retires you. but it\u0026rsquo;s correlated with nothing, requires no prediction about market direction, and runs completely unattended. i check it once a day at most.\nthat\u0026rsquo;s rare enough that i\u0026rsquo;ll take it.\nseen some discussion about cross-exchange alpha on NexusFi in the automated trading section — a lot of the same \u0026ldquo;boring is beautiful\u0026rdquo; philosophy applies here. consistent uncorrelated return streams matter more than big flashy wins once you\u0026rsquo;re managing real size.\nA. came in around 1am, saw me at my desk with three monitors up. \u0026ldquo;funding thing?\u0026rdquo; yeah. she\u0026rsquo;s learned the vocabulary. went back to bed without another word.\ndad was weirdly into arbitrage concepts even though he was an engineer, not a trader. used to say \u0026ldquo;the safest money is money that doesn\u0026rsquo;t depend on being right about direction.\u0026rdquo; took me four months of live trading to understand why this particular trade fits that description.\nok. actually sleeping now.\n-AK\n","date":"18 March 2026","externalUrl":null,"permalink":"/posts/2026-03-18-crypto-funding-rate-arb-python/","section":"Posts","summary":"\u003cp\u003epast 2am. BTC arb just settled a clean +$870 position. wide awake. writing this instead of sleeping.\u003c/p\u003e\n\u003cp\u003ebeen running a funding rate arb strategy across my crypto book since late november. never posted about it because honestly it\u0026rsquo;s kind of a boring trade to explain. no dramatic wins, no blowups, just steady quiet alpha sitting off to the side of everything else. averaging $2-4k a month net with basically zero correlation to my options or futures book.\u003c/p\u003e","title":"crypto funding rate arb: the quiet alpha i've been running for months","type":"posts"},{"content":"","date":"18 March 2026","externalUrl":null,"permalink":"/tags/kraken/","section":"Tags","summary":"","title":"Kraken","type":"tags"},{"content":"","date":"16 March 2026","externalUrl":null,"permalink":"/tags/alpha-signals/","section":"Tags","summary":"","title":"Alpha-Signals","type":"tags"},{"content":"","date":"16 March 2026","externalUrl":null,"permalink":"/tags/async/","section":"Tags","summary":"","title":"Async","type":"tags"},{"content":"lied about sleeping.\ngot into bed, laid there for 45 minutes, kept thinking about something. went back to the desk.\nthe signal decay issue i diagnosed tonight (latency routing on crypto momentum) is real and i fixed it. but while i was digging through three months of fill data, i noticed something else. something i\u0026rsquo;d been ignoring entirely.\ni\u0026rsquo;ve never used the order book as a signal.\nevery single algo i\u0026rsquo;ve built is price-based. returns, moving averages, volatility metrics, momentum factors. the order book - sitting there broadcasting directional intent in real time across every exchange - i\u0026rsquo;ve been completely ignoring it.\nit\u0026rsquo;s 3:45am and i can\u0026rsquo;t stop thinking about it. so let me write this up while it\u0026rsquo;s fresh.\nwhat order book imbalance actually is # order book imbalance (OBI) is the simplest possible measure of directional pressure in a market\u0026rsquo;s pending orders:\nOBI = (bid_volume - ask_volume) / (bid_volume + ask_volume) range: -1 (pure sell pressure) to +1 (pure buy pressure). zero means balanced.\nwhy this matters more for crypto than equities:\ncrypto order books are relatively thin. institutional HFT hasn\u0026rsquo;t fully colonized crypto order books the way it has equities. large orders create visible imbalances you can actually measure.\nperp futures books are mostly algorithmic. the patterns in binance/coinbase perp order books are systematic. that makes them learnable.\nthe predictive horizon is short but real. OBI predicts 1-60 second price moves. useless for multi-day strategies. potentially very useful as a filter for intraday momentum entries.\ni ran a 6-month backtest on binance BTC/USDT perp data at 1-second snapshot resolution. measured: does OBI at time T actually correlate with forward returns at various horizons?\nOBI information coefficient (rank correlation with forward returns) across prediction horizons. composite OBI peaks at 1-5s (IC ~0.11-0.13) then decays fast. price momentum does the opposite - weak at 1s, strong at 5min+. they\u0026rsquo;re measuring different things. they should be additive.\nthe key insight from this chart: OBI and momentum are complementary signals, not competing ones.\nOBI is strong at 1-15 second horizons, weak at 5+ minutes. price momentum is weak at 1-5 seconds, strong at 5+ minutes. they\u0026rsquo;re capturing different phenomena.\nusing both together should add alpha. using only price momentum (what i\u0026rsquo;ve been doing) was leaving the short-horizon prediction entirely unmeasured.\nthe implementation # built a real-time OBI processor. streaming via ccxt WebSocket, computing OBI at multiple depth levels, storing to redis for downstream signal generation. runs on the chicago colo so snapshots are 4-8ms fresh instead of 45-80ms stale from san diego.\nimport asyncio import time import json import logging from dataclasses import dataclass, field from typing import Dict, List, Tuple from collections import deque import ccxt.pro as ccxtpro import redis.asyncio as aioredis import numpy as np logger = logging.getLogger(__name__) @dataclass class OrderBookSnapshot: symbol: str exchange: str timestamp_ms: float bids: List[Tuple[float, float]] # (price, volume) asks: List[Tuple[float, float]] # (price, volume) mid_price: float = 0.0 def __post_init__(self): if self.bids and self.asks: self.mid_price = (self.bids[0][0] + self.asks[0][0]) / 2 def compute_obi_multilevel( bids: List[Tuple[float, float]], asks: List[Tuple[float, float]], levels: List[int] = [1, 5, 10, 20] ) -\u0026gt; Dict[str, float]: \u0026#34;\u0026#34;\u0026#34; compute order book imbalance at multiple depth levels. formula: OBI_n = (bid_vol_n - ask_vol_n) / (bid_vol_n + ask_vol_n) multiple levels because level-1 is reactive but noisy. level-20 is slower but captures structural positioning. composite across levels gives a more robust signal. \u0026#34;\u0026#34;\u0026#34; result = {} for n in levels: bid_vol = sum(vol for _, vol in bids[:n]) ask_vol = sum(vol for _, vol in asks[:n]) total = bid_vol + ask_vol result[f\u0026#39;obi_{n}\u0026#39;] = round((bid_vol - ask_vol) / total, 4) if total \u0026gt; 0 else 0.0 return result @dataclass class RollingOBISignal: \u0026#34;\u0026#34;\u0026#34; aggregates raw per-snapshot OBI into a smoothed directional signal. uses exponential weighting so recent snapshots dominate. also tracks directional_consistency: what % of the rolling window agrees with the current direction. low consistency = noisy/indeterminate book. \u0026#34;\u0026#34;\u0026#34; symbol: str window_seconds: int = 10 _history: deque = field(default_factory=lambda: deque(maxlen=600)) # weights for composite OBI across depth levels (sum to 1.0) LEVEL_WEIGHTS = {\u0026#39;obi_1\u0026#39;: 0.45, \u0026#39;obi_5\u0026#39;: 0.30, \u0026#39;obi_10\u0026#39;: 0.15, \u0026#39;obi_20\u0026#39;: 0.10} def update(self, obi_snapshot: Dict[str, float], ts_ms: float) -\u0026gt; Dict[str, float]: self._history.append({\u0026#39;ts\u0026#39;: ts_ms, **obi_snapshot}) return self._compute() def _compute(self) -\u0026gt; Dict[str, float]: if len(self._history) \u0026lt; 3: return {} now = self._history[-1][\u0026#39;ts\u0026#39;] cutoff = now - (self.window_seconds * 1000) recent = [h for h in self._history if h[\u0026#39;ts\u0026#39;] \u0026gt;= cutoff] if not recent: return {} composites = np.array([ sum(h.get(k, 0) * w for k, w in self.LEVEL_WEIGHTS.items()) for h in recent ]) # exponential weights: most recent snapshot gets highest weight alpha = 0.15 n = len(composites) exp_weights = np.array([(1 - alpha) ** i for i in range(n - 1, -1, -1)]) ewm_composite = float(np.average(composites, weights=exp_weights)) current_dir = np.sign(composites[-1]) directional_consistency = float(np.mean(np.sign(composites) == current_dir)) return { \u0026#39;composite_obi\u0026#39;: round(ewm_composite, 4), \u0026#39;obi_direction\u0026#39;: int(current_dir), \u0026#39;directional_consistency\u0026#39;: round(directional_consistency, 3), \u0026#39;n_snapshots\u0026#39;: len(recent) } class OBIStreamProcessor: \u0026#34;\u0026#34;\u0026#34; live orderbook stream via ccxt.pro websocket. computes multilevel OBI on every book update. stores current signal + 1000-snapshot history to redis. redis keys: obi:{exchange}:{symbol}:latest -\u0026gt; current signal JSON obi:{exchange}:{symbol}:history -\u0026gt; list of last 1000 snapshots \u0026#34;\u0026#34;\u0026#34; def __init__( self, exchange_id: str, symbols: List[str], redis_client: aioredis.Redis, window_seconds: int = 10 ): self.exchange_id = exchange_id self.symbols = symbols self.redis = redis_client self._signals: Dict[str, RollingOBISignal] = { s: RollingOBISignal(s, window_seconds) for s in symbols } self._exchange = None async def start(self) -\u0026gt; None: ExchangeClass = getattr(ccxtpro, self.exchange_id) self._exchange = ExchangeClass({ \u0026#39;enableRateLimit\u0026#39;: True, \u0026#39;options\u0026#39;: {\u0026#39;defaultType\u0026#39;: \u0026#39;future\u0026#39;} # perp futures }) logger.info(f\u0026#34;OBI stream starting: {self.exchange_id} {self.symbols}\u0026#34;) try: await asyncio.gather(*[self._stream_symbol(s) for s in self.symbols]) finally: await self._exchange.close() async def _stream_symbol(self, symbol: str) -\u0026gt; None: while True: try: ob = await self._exchange.watch_order_book(symbol, limit=20) snap = OrderBookSnapshot( symbol=symbol, exchange=self.exchange_id, timestamp_ms=time.time() * 1000, bids=ob[\u0026#39;bids\u0026#39;][:20], asks=ob[\u0026#39;asks\u0026#39;][:20] ) raw_obi = compute_obi_multilevel(snap.bids, snap.asks) signal = self._signals[symbol].update(raw_obi, snap.timestamp_ms) if signal: await self._persist(symbol, snap.mid_price, raw_obi, signal) except Exception as e: logger.warning(f\u0026#34;stream error {symbol}: {e}, reconnecting...\u0026#34;) await asyncio.sleep(1.0) async def _persist( self, symbol: str, mid: float, raw_obi: Dict[str, float], signal: Dict[str, float] ) -\u0026gt; None: key_latest = f\u0026#34;obi:{self.exchange_id}:{symbol}:latest\u0026#34; key_hist = f\u0026#34;obi:{self.exchange_id}:{symbol}:history\u0026#34; payload = json.dumps({\u0026#39;ts\u0026#39;: time.time() * 1000, \u0026#39;mid\u0026#39;: mid, **raw_obi, **signal}) pipe = self.redis.pipeline() pipe.set(key_latest, payload) pipe.lpush(key_hist, payload) pipe.ltrim(key_hist, 0, 999) await pipe.execute() the directional_consistency field is the one i\u0026rsquo;m going to use as a filter gate. if less than 60% of snapshots in the rolling window agree on direction, the book is too mixed to trade on.\nhow it plugs into signal generation # OBI doesn\u0026rsquo;t replace momentum signals. it filters and sizes them.\nasync def should_enter(signal: dict, obi: dict) -\u0026gt; tuple[bool, float]: \u0026#34;\u0026#34;\u0026#34; apply OBI filter to a momentum entry signal. returns: (should_enter: bool, size_multiplier: float) \u0026#34;\u0026#34;\u0026#34; momentum_dir = signal[\u0026#39;direction\u0026#39;] # +1 long, -1 short obi_dir = obi.get(\u0026#39;obi_direction\u0026#39;, 0) consistency = obi.get(\u0026#39;directional_consistency\u0026#39;, 0.0) composite_obi = obi.get(\u0026#39;composite_obi\u0026#39;, 0.0) # OBI confirms momentum + high consistency -\u0026gt; full size if obi_dir == momentum_dir and consistency \u0026gt; 0.65: return True, 1.0 # neutral book (OBI near zero) -\u0026gt; reduced size, still enter if abs(composite_obi) \u0026lt; 0.04: return True, 0.70 # OBI actively opposes momentum + high consistency -\u0026gt; skip if obi_dir == -momentum_dir and consistency \u0026gt; 0.65: return False, 0.0 # ambiguous or low consistency -\u0026gt; moderate entry return True, 0.55 simple rules. the book either confirms, is ambiguous, or contradicts. act accordingly.\nin backtesting this filter improved win rate on crypto momentum by 5-7 percentage points and reduced average losing trade magnitude. not backtest-optimized yet, just a first-pass implementation with sensible thresholds.\nobi vs price over a live session # here\u0026rsquo;s what composite OBI looks like plotted against cumulative price return over a two-hour BTC session i analyzed this week. shows the relationship that makes this worth building.\ncomposite OBI (blue, left axis) vs cumulative BTC/USDT perp return (orange, right axis) over a 2-hour session. in trending regimes (minutes 25-50, 65-80), sustained OBI directional pressure precedes or coincides with price movement. in choppy periods, OBI oscillates without price follow-through — exactly the situations where momentum signals get stopped out.\nthe choppy periods are the interesting part. OBI oscillates without follow-through. those are exactly the conditions where momentum signals get stopped out. if i\u0026rsquo;d filtered those entries based on OBI consistency, a chunk of my february losses wouldn\u0026rsquo;t have happened.\nwhy the colo matters for this # order book data from san diego arrives 45-80ms after it happens.\nan OBI snapshot that\u0026rsquo;s 80ms old is essentially useless. the book may have completely flipped in that time. you\u0026rsquo;d be trading on a ghost.\nthe OBIStreamProcessor runs on chicago colo. orderbook snapshots are 4-8ms fresh. that\u0026rsquo;s actual current state.\nthis is the third piece of infrastructure that only makes sense from colo: signal routing (latency), signal execution (fills), and now signal input (orderbook freshness). the home server in san diego is great for development and slow strategies. anything with a signal half-life under 500ms needs to run in chicago.\nbeen comparing notes with a few other algo traders over at NexusFi who are building OBI-based filters for ES and NQ futures. different microstructure (deeper book, more institutional flow) but same underlying logic. their experience: top 5 levels most predictive for fast moves, levels 10-20 capture more structural positioning. consistent with what i\u0026rsquo;m seeing in crypto.\nwhere things stand # OBI filter is live on paper trading as of tonight. running alongside the existing crypto momentum strategies.\nthree weeks paper trading. then 25% size live. then full size if it validates.\nmarch is still underperforming after february\u0026rsquo;s loss. the latency routing fix from earlier tonight should help. the OBI filter is the next thing.\ngoal: q1 breakeven. q2 recovery.\nnot stressed about it. this is how strategy development works. you find the gaps, you fix them, you validate.\nit\u0026rsquo;s almost 4am. A. is asleep. came to check on me around 2am, saw i was still at my desk, didn\u0026rsquo;t say anything, just put a glass of water next to my keyboard and went back to bed. she knows what building looks like.\nthought about my dad for a second tonight. he was a VP of engineering - the kind of person who would spend hours debugging something just to understand why it was wrong, not just to fix it. all this latency analysis and orderbook microstructure work is exactly the kind of rabbit hole he would have gone completely down. weird how that shows up at 4am.\nok. actually sleeping now.\n-AK\n","date":"16 March 2026","externalUrl":null,"permalink":"/posts/2026-03-16-order-book-imbalance-alpha-signals/","section":"Posts","summary":"\u003cp\u003elied about sleeping.\u003c/p\u003e\n\u003cp\u003egot into bed, laid there for 45 minutes, kept thinking about something. went back to the desk.\u003c/p\u003e\n\u003cp\u003ethe signal decay issue i diagnosed tonight (latency routing on crypto momentum) is real and i fixed it. but while i was digging through three months of fill data, i noticed something else. something i\u0026rsquo;d been ignoring entirely.\u003c/p\u003e","title":"order book imbalance - building a real-time alpha signal for crypto momentum","type":"posts"},{"content":"","date":"16 March 2026","externalUrl":null,"permalink":"/tags/order-book/","section":"Tags","summary":"","title":"Order-Book","type":"tags"},{"content":"","date":"16 March 2026","externalUrl":null,"permalink":"/tags/alpha/","section":"Tags","summary":"","title":"Alpha","type":"tags"},{"content":"","date":"16 March 2026","externalUrl":null,"permalink":"/tags/flow-analysis/","section":"Tags","summary":"","title":"Flow-Analysis","type":"tags"},{"content":"it\u0026rsquo;s 1:30am. A. passed out on the couch around midnight waiting for me to come to bed. carried her there, went back to the desk. couldn\u0026rsquo;t sleep anyway.\nmarch has been annoying. january was solid (+1.9%). february was decent (+2.3%). march so far: -0.5% with two weeks left. not a disaster but it stings after a clean Q4. the algos aren\u0026rsquo;t broken, the signals are just getting weaker in this chop. SPX has been range-bound for three weeks and my momentum strategies are getting whipsawed.\nso i did what i always do when i\u0026rsquo;m frustrated: i build something new.\ntonight\u0026rsquo;s project: an options flow scanner. the hypothesis is simple - unusual options activity often precedes big moves, and smart money leaves footprints. large OTM option buys before earnings surprises. massive put sweeps before sector selloffs. coordinated call buying that starts before a catalyst lands publicly.\ni\u0026rsquo;ve been thinking about building this for months. tonight was the night.\nthe theory: options as an information leak # the equity options market trades about $1-3 trillion in notional daily. most of it is hedging, retail speculation, and systematic strategies. but buried in that flow is something interesting: informed trading.\nwhen someone with real edge wants to express a directional view, they often go to options. leverage. asymmetric payoff. they can size up without moving the stock much. and when a single trader (or coordinated group) puts $2M into OTM calls on a stock that normally sees $50k/day in premium\u0026hellip; that\u0026rsquo;s a signal.\nwhat we\u0026rsquo;re hunting:\nvolume/OI ratio anomalies: vol many times higher than open interest unusual premium sweeps: large single orders buying at the ask (aggressor behavior) strike/expiry clustering: multiple strikes at same expiry (directional conviction) implied vol divergence: IV moving opposite to what the VIX suggests none of this is guaranteed alpha. but it\u0026rsquo;s information. and information asymmetry is how you make money.\ndata architecture # my setup uses polygon.io for options data. their REST API covers options chains, Greeks, historical trades, and real-time snapshots. i\u0026rsquo;ve been using them for equity data for a while but only recently started pulling options.\nfor a scanner like this you need:\noptions chain snapshots (all strikes/expiries for a ticker) real-time trade-level data (individual option trades as they happen) historical baseline (30/60/90 day average volume to detect anomalies) infra:\npolygon.io python client for API access timescaledb for storing historical options volume baselines redis for real-time caching of the scanner state asyncio for concurrent scanning across multiple tickers the chicago colo handles the latency-sensitive execution side. the san diego setup (home rack) is where i do the scanning and signal generation since it\u0026rsquo;s less latency-critical.\nthe scanner # here\u0026rsquo;s the core of what i built tonight. still rough in places but it works.\n#!/usr/bin/env python3 \u0026#34;\u0026#34;\u0026#34; Options Flow Scanner - Unusual Activity Detection Uses Polygon.io options chain data to identify anomalous flow \u0026#34;\u0026#34;\u0026#34; import asyncio import logging from dataclasses import dataclass, field from datetime import datetime, timedelta, date from typing import Optional import aiohttp import pandas as pd import numpy as np from polygon import RESTClient logging.basicConfig(level=logging.INFO, format=\u0026#39;%(asctime)s [%(levelname)s] %(message)s\u0026#39;) logger = logging.getLogger(__name__) @dataclass class FlowSignal: ticker: str strike: float expiry: str option_type: str # \u0026#39;call\u0026#39; or \u0026#39;put\u0026#39; volume: int open_interest: int voi_ratio: float # volume / open_interest premium_spent: float # approx notional ($) iv: float # implied volatility delta: float signal_score: float # composite anomaly score detected_at: datetime = field(default_factory=datetime.now) @property def is_call(self) -\u0026gt; bool: return self.option_type.lower() == \u0026#39;call\u0026#39; @property def is_high_confidence(self) -\u0026gt; bool: return self.signal_score \u0026gt;= 0.75 class OptionsFlowScanner: \u0026#34;\u0026#34;\u0026#34; Scans options markets for unusual activity using Polygon.io data. Detects anomalous volume-to-open-interest ratios, premium sweeps, and IV divergence as potential alpha signals. \u0026#34;\u0026#34;\u0026#34; def __init__(self, api_key: str, tickers: list[str], voi_threshold: float = 3.0, min_premium: float = 100_000, scan_interval: int = 300): self.client = RESTClient(api_key=api_key) self.tickers = tickers self.voi_threshold = voi_threshold # flag if vol \u0026gt; X * avg_OI self.min_premium = min_premium # minimum notional to flag self.scan_interval = scan_interval # seconds between full scans self.signals: list[FlowSignal] = [] self._baseline_cache: dict[str, pd.DataFrame] = {} self._session: Optional[aiohttp.ClientSession] = None async def _get_options_chain(self, ticker: str) -\u0026gt; pd.DataFrame: \u0026#34;\u0026#34;\u0026#34;Pull full options chain snapshot for ticker.\u0026#34;\u0026#34;\u0026#34; try: contracts = [] # Polygon snapshot endpoint covers all active contracts for contract in self.client.list_snapshot_options_chain( ticker, params={ \u0026#34;expiration_date.gte\u0026#34;: date.today().isoformat(), \u0026#34;expiration_date.lte\u0026#34;: (date.today() + timedelta(days=60)).isoformat(), \u0026#34;strike_price.gte\u0026#34;: 0 } ): try: contracts.append({ \u0026#34;ticker\u0026#34;: ticker, \u0026#34;contract\u0026#34;: contract.details.ticker, \u0026#34;strike\u0026#34;: contract.details.strike_price, \u0026#34;expiry\u0026#34;: contract.details.expiration_date, \u0026#34;type\u0026#34;: contract.details.contract_type, \u0026#34;volume\u0026#34;: contract.day.volume if contract.day else 0, \u0026#34;open_interest\u0026#34;: contract.open_interest or 1, \u0026#34;last_price\u0026#34;: contract.last_quote.ask if contract.last_quote else 0, \u0026#34;iv\u0026#34;: contract.implied_volatility or 0, \u0026#34;delta\u0026#34;: contract.greeks.delta if contract.greeks else 0, \u0026#34;gamma\u0026#34;: contract.greeks.gamma if contract.greeks else 0, \u0026#34;vega\u0026#34;: contract.greeks.vega if contract.greeks else 0, }) except AttributeError: continue if not contracts: return pd.DataFrame() df = pd.DataFrame(contracts) df[\u0026#34;voi_ratio\u0026#34;] = df[\u0026#34;volume\u0026#34;] / df[\u0026#34;open_interest\u0026#34;].clip(lower=1) df[\u0026#34;premium_spent\u0026#34;] = df[\u0026#34;volume\u0026#34;] * df[\u0026#34;last_price\u0026#34;] * 100 # per contract = 100 shares return df except Exception as e: logger.error(f\u0026#34;Failed to fetch chain for {ticker}: {e}\u0026#34;) return pd.DataFrame() def _compute_baseline(self, ticker: str, df: pd.DataFrame) -\u0026gt; dict: \u0026#34;\u0026#34;\u0026#34; Compute baseline stats for anomaly detection. In production this hits TimescaleDB for historical averages. Here we derive rough baseline from the current chain. \u0026#34;\u0026#34;\u0026#34; if df.empty: return {\u0026#34;avg_voi\u0026#34;: 1.0, \u0026#34;avg_premium\u0026#34;: 0, \u0026#34;vol_percentiles\u0026#34;: {}} avg_voi = df[\u0026#34;voi_ratio\u0026#34;].median() avg_premium = df[\u0026#34;premium_spent\u0026#34;].median() # percentile thresholds for ranking vol_percentiles = { \u0026#34;p75\u0026#34;: df[\u0026#34;volume\u0026#34;].quantile(0.75), \u0026#34;p90\u0026#34;: df[\u0026#34;volume\u0026#34;].quantile(0.90), \u0026#34;p95\u0026#34;: df[\u0026#34;volume\u0026#34;].quantile(0.95), \u0026#34;p99\u0026#34;: df[\u0026#34;volume\u0026#34;].quantile(0.99), } return { \u0026#34;avg_voi\u0026#34;: avg_voi, \u0026#34;avg_premium\u0026#34;: avg_premium, \u0026#34;vol_percentiles\u0026#34;: vol_percentiles } def _score_contract(self, row: pd.Series, baseline: dict) -\u0026gt; float: \u0026#34;\u0026#34;\u0026#34; Score a contract on 0-1 scale for anomaly likelihood. Higher = more unusual. \u0026#34;\u0026#34;\u0026#34; score = 0.0 weights = { \u0026#34;voi\u0026#34;: 0.35, \u0026#34;premium\u0026#34;: 0.30, \u0026#34;vol_percentile\u0026#34;: 0.20, \u0026#34;iv_component\u0026#34;: 0.15 } # VOI component: how many times baseline VOI is exceeded voi_baseline = max(baseline[\u0026#34;avg_voi\u0026#34;], 0.5) voi_excess = row[\u0026#34;voi_ratio\u0026#34;] / voi_baseline voi_score = min(voi_excess / self.voi_threshold, 1.0) score += weights[\u0026#34;voi\u0026#34;] * voi_score # Premium component: is this unusual spending? pct_tiles = baseline[\u0026#34;vol_percentiles\u0026#34;] if row[\u0026#34;volume\u0026#34;] \u0026gt;= pct_tiles.get(\u0026#34;p99\u0026#34;, float(\u0026#34;inf\u0026#34;)): score += weights[\u0026#34;vol_percentile\u0026#34;] * 1.0 elif row[\u0026#34;volume\u0026#34;] \u0026gt;= pct_tiles.get(\u0026#34;p95\u0026#34;, float(\u0026#34;inf\u0026#34;)): score += weights[\u0026#34;vol_percentile\u0026#34;] * 0.75 elif row[\u0026#34;volume\u0026#34;] \u0026gt;= pct_tiles.get(\u0026#34;p90\u0026#34;, float(\u0026#34;inf\u0026#34;)): score += weights[\u0026#34;vol_percentile\u0026#34;] * 0.50 elif row[\u0026#34;volume\u0026#34;] \u0026gt;= pct_tiles.get(\u0026#34;p75\u0026#34;, float(\u0026#34;inf\u0026#34;)): score += weights[\u0026#34;vol_percentile\u0026#34;] * 0.25 # Premium size component if row[\u0026#34;premium_spent\u0026#34;] \u0026gt;= self.min_premium * 5: score += weights[\u0026#34;premium\u0026#34;] * 1.0 elif row[\u0026#34;premium_spent\u0026#34;] \u0026gt;= self.min_premium * 2: score += weights[\u0026#34;premium\u0026#34;] * 0.7 elif row[\u0026#34;premium_spent\u0026#34;] \u0026gt;= self.min_premium: score += weights[\u0026#34;premium\u0026#34;] * 0.4 # IV component: OTM options with high IV can indicate conviction if abs(row.get(\u0026#34;delta\u0026#34;, 0.5)) \u0026lt; 0.35 and row[\u0026#34;iv\u0026#34;] \u0026gt; 0.40: score += weights[\u0026#34;iv_component\u0026#34;] * 0.8 elif row[\u0026#34;iv\u0026#34;] \u0026gt; 0.30: score += weights[\u0026#34;iv_component\u0026#34;] * 0.4 return round(min(score, 1.0), 3) async def scan_ticker(self, ticker: str) -\u0026gt; list[FlowSignal]: \u0026#34;\u0026#34;\u0026#34;Full scan pipeline for a single ticker.\u0026#34;\u0026#34;\u0026#34; df = await self._get_options_chain(ticker) if df.empty: return [] baseline = self._compute_baseline(ticker, df) # compute scores df[\u0026#34;signal_score\u0026#34;] = df.apply( lambda row: self._score_contract(row, baseline), axis=1 ) # filter candidates candidates = df[ (df[\u0026#34;volume\u0026#34;] \u0026gt; 0) \u0026amp; (df[\u0026#34;voi_ratio\u0026#34;] \u0026gt;= self.voi_threshold) \u0026amp; (df[\u0026#34;premium_spent\u0026#34;] \u0026gt;= self.min_premium) \u0026amp; (df[\u0026#34;signal_score\u0026#34;] \u0026gt;= 0.45) ].sort_values(\u0026#34;signal_score\u0026#34;, ascending=False) signals = [] for _, row in candidates.head(10).iterrows(): sig = FlowSignal( ticker=ticker, strike=row[\u0026#34;strike\u0026#34;], expiry=str(row[\u0026#34;expiry\u0026#34;]), option_type=row[\u0026#34;type\u0026#34;], volume=int(row[\u0026#34;volume\u0026#34;]), open_interest=int(row[\u0026#34;open_interest\u0026#34;]), voi_ratio=round(row[\u0026#34;voi_ratio\u0026#34;], 2), premium_spent=round(row[\u0026#34;premium_spent\u0026#34;], 2), iv=round(row[\u0026#34;iv\u0026#34;], 4), delta=round(row.get(\u0026#34;delta\u0026#34;, 0), 4), signal_score=row[\u0026#34;signal_score\u0026#34;] ) signals.append(sig) return signals async def run_continuous(self): \u0026#34;\u0026#34;\u0026#34;Run scanner in a loop, emitting signals.\u0026#34;\u0026#34;\u0026#34; logger.info(f\u0026#34;Starting flow scanner for {len(self.tickers)} tickers\u0026#34;) while True: scan_start = asyncio.get_event_loop().time() tasks = [self.scan_ticker(t) for t in self.tickers] results = await asyncio.gather(*tasks, return_exceptions=True) new_signals = [] for result in results: if isinstance(result, Exception): logger.error(f\u0026#34;Scan error: {result}\u0026#34;) continue new_signals.extend(result) # rank all signals and emit top hits new_signals.sort(key=lambda s: s.signal_score, reverse=True) for sig in new_signals: if sig.is_high_confidence: logger.info( f\u0026#34;HIGH CONFIDENCE: {sig.ticker} {sig.option_type.upper()} \u0026#34; f\u0026#34;${sig.strike:.0f} exp {sig.expiry} | \u0026#34; f\u0026#34;Vol: {sig.volume:,} | VOI: {sig.voi_ratio:.1f}x | \u0026#34; f\u0026#34;Premium: ${sig.premium_spent:,.0f} | Score: {sig.signal_score}\u0026#34; ) self.signals.extend(new_signals) # trim to last 1000 signals in memory self.signals = self.signals[-1000:] elapsed = asyncio.get_event_loop().time() - scan_start sleep_time = max(0, self.scan_interval - elapsed) logger.info(f\u0026#34;Scan complete in {elapsed:.1f}s. Next scan in {sleep_time:.0f}s\u0026#34;) await asyncio.sleep(sleep_time) if __name__ == \u0026#34;__main__\u0026#34;: import os WATCHLIST = [ # mega caps - high options volume baseline \u0026#34;SPY\u0026#34;, \u0026#34;QQQ\u0026#34;, \u0026#34;IWM\u0026#34;, \u0026#34;AAPL\u0026#34;, \u0026#34;MSFT\u0026#34;, \u0026#34;NVDA\u0026#34;, \u0026#34;META\u0026#34;, \u0026#34;AMZN\u0026#34;, # sector ETFs \u0026#34;XLF\u0026#34;, \u0026#34;XLE\u0026#34;, \u0026#34;XLK\u0026#34;, \u0026#34;XBI\u0026#34;, \u0026#34;SMH\u0026#34;, # high-beta individual names \u0026#34;TSLA\u0026#34;, \u0026#34;COIN\u0026#34;, \u0026#34;MSTR\u0026#34;, ] scanner = OptionsFlowScanner( api_key=os.getenv(\u0026#34;POLYGON_API_KEY\u0026#34;), tickers=WATCHLIST, voi_threshold=3.0, # flag if vol is 3x+ open interest min_premium=150_000, # minimum $150k in premium moved scan_interval=300 # scan every 5 minutes ) asyncio.run(scanner.run_continuous()) what it looks like in practice # i ran this against last tuesday\u0026rsquo;s data to validate. here\u0026rsquo;s what the VOI ratio distribution looks like across SPY/QQQ option chains, with anomalies highlighted:\nthe tail on the right is where it gets interesting. most contracts sit under 3x. anything above that gets flagged by the scanner.\nsignal ranking: not all anomalies are created equal # the raw VOI filter catches a lot of noise - weekly expirations with low OI get inflated ratios from even moderate volume. so i layered in the multi-factor scoring:\ndef rank_signals(signals: list[FlowSignal], min_score: float = 0.60) -\u0026gt; list[FlowSignal]: \u0026#34;\u0026#34;\u0026#34; Apply additional ranking criteria to filter noise: - prefer near-term expiries (7-45 days) over LEAPS - prefer OTM strikes (delta 0.15-0.40 for directional bets) - downweight high-IV environments (reduces significance of vol anomalies) - boost confidence on same-day sweeps (multiple fills at ask, same strike) \u0026#34;\u0026#34;\u0026#34; ranked = [] for sig in signals: if sig.signal_score \u0026lt; min_score: continue adjusted_score = sig.signal_score # expiry preference: sweet spot is 7-45 DTE try: dte = (datetime.strptime(sig.expiry, \u0026#34;%Y-%m-%d\u0026#34;) - datetime.now()).days if 7 \u0026lt;= dte \u0026lt;= 45: adjusted_score *= 1.15 elif dte \u0026lt; 7: adjusted_score *= 0.70 # weeklies have too much noise elif dte \u0026gt; 90: adjusted_score *= 0.85 # LEAPS move slowly except ValueError: pass # delta preference: OTM directional bets are most informative abs_delta = abs(sig.delta) if 0.15 \u0026lt;= abs_delta \u0026lt;= 0.35: adjusted_score *= 1.10 # OTM - classic informed bet range elif abs_delta \u0026gt; 0.60: adjusted_score *= 0.80 # ITM - less informative, could be hedge # cap at 1.0 sig.signal_score = min(round(adjusted_score, 3), 1.0) ranked.append(sig) return sorted(ranked, key=lambda s: s.signal_score, reverse=True) def format_signal_alert(sig: FlowSignal) -\u0026gt; str: direction = \u0026#34;BULLISH\u0026#34; if sig.is_call else \u0026#34;BEARISH\u0026#34; confidence = \u0026#34;HIGH\u0026#34; if sig.is_high_confidence else \u0026#34;MODERATE\u0026#34; return ( f\u0026#34;[{confidence}] {sig.ticker} {direction} flow detected\\n\u0026#34; f\u0026#34; Contract: {sig.option_type.upper()} ${sig.strike:.0f} exp {sig.expiry}\\n\u0026#34; f\u0026#34; Volume: {sig.volume:,} | OI: {sig.open_interest:,} | VOI: {sig.voi_ratio:.1f}x\\n\u0026#34; f\u0026#34; Premium: ${sig.premium_spent:,.0f} | IV: {sig.iv:.1%} | Delta: {sig.delta:.2f}\\n\u0026#34; f\u0026#34; Score: {sig.signal_score:.3f}\u0026#34; ) i also started tracking signal performance retrospectively. look at directional accuracy by signal score bucket - this is off 8 weeks of paper trading the signals (not live yet, still validating):\nthe n is small - i know. 12 signals in the 0.85+ bucket over 8 weeks isn\u0026rsquo;t enough to declare victory. but the directional trend is what i\u0026rsquo;m looking for. below 0.55 you\u0026rsquo;re basically coin-flipping. above 0.75 it starts looking interesting. above 0.85 is where i might actually start risking real money.\nthat sample size problem is the main issue with options flow signals - the highest quality ones are rare. so you\u0026rsquo;re always fighting between statistical significance and signal quality. classic tradeoff.\nwhy this matters for my current setup # my three main strategies right now are:\nSPX premium selling (theta decay plays) - currently struggling in this vol environment ES/NQ momentum (intraday futures) - getting chopped up in the range-bound market crypto momentum (BTC/ETH via binance) - holding up okay, +0.8% this month the flow scanner isn\u0026rsquo;t replacing any of these. it\u0026rsquo;s additive. when the scanner flags an unusual sweep on a name, i might:\nhedge an existing position that\u0026rsquo;s on the wrong side add a small directional position (capped at 2% portfolio risk per signal) use it as a regime indicator (lots of put sweeps = market nervousness, reduce exposure) the information is useful even when i don\u0026rsquo;t trade on it directly. context is alpha.\ni\u0026rsquo;ve been hanging around the algo trading community on NexusFi since early 2023 - there\u0026rsquo;s a solid thread there on turning algo journals into live system design. the discussion on incorporating signal layers without overcomplicating execution is actually relevant here. worth reading if you\u0026rsquo;re building anything similar.\nwhat\u0026rsquo;s next # a few things i still need to build:\nsweep detection: identifying when a single large order gets filled across multiple exchanges (aggressor behavior). polygon\u0026rsquo;s trade-level data can do this but i need to build the aggregation logic same-strike clustering: when multiple trades hit the same strike/expiry within 10 minutes, that\u0026rsquo;s more interesting than a single big trade historical backtesting: the 8-week paper period is useful but i need to backfill against polygon historical options data (they have it back to 2004) and see how this would have performed the scanner took about 5 hours to build tonight. it\u0026rsquo;ll probably take another 20 hours to get to a point where i trust it enough to trade real size against it.\nmarch continues to be annoying. -0.5% on the month. the premium selling portfolio is getting killed by realized vol spiking without a corresponding move in the underlying - worst of both worlds. been thinking about what my dad used to say whenever markets got weird: \u0026ldquo;when you can\u0026rsquo;t figure out what\u0026rsquo;s happening, watch what the smart money is doing, not what they\u0026rsquo;re saying.\u0026rdquo;\nhe was talking about wall street analysts vs actual fund flows. but the advice applies here too. the flow scanner is basically that principle turned into code.\ngonna try to sleep before A. wakes up for her 6am run.\n-AK\n","date":"16 March 2026","externalUrl":null,"permalink":"/posts/2026-03-16-options-flow-scanner-unusual-activity/","section":"Posts","summary":"\u003cp\u003eit\u0026rsquo;s 1:30am. A. passed out on the couch around midnight waiting for me to come to bed. carried her there, went back to the desk. couldn\u0026rsquo;t sleep anyway.\u003c/p\u003e\n\u003cp\u003emarch has been annoying. january was solid (+1.9%). february was decent (+2.3%). march so far: -0.5% with two weeks left. not a disaster but it stings after a clean Q4. the algos aren\u0026rsquo;t broken, the signals are just getting weaker in this chop. SPX has been range-bound for three weeks and my momentum strategies are getting whipsawed.\u003c/p\u003e","title":"options flow scanner: catching smart money before the move","type":"posts"},{"content":"","date":"16 March 2026","externalUrl":null,"permalink":"/tags/polygon/","section":"Tags","summary":"","title":"Polygon","type":"tags"},{"content":"","date":"16 March 2026","externalUrl":null,"permalink":"/tags/signals/","section":"Tags","summary":"","title":"Signals","type":"tags"},{"content":"","date":"16 March 2026","externalUrl":null,"permalink":"/tags/latency/","section":"Tags","summary":"","title":"Latency","type":"tags"},{"content":"2:15am on a monday.\nbeen staring at fill data for the past six hours.\nmarch has been rough. not catastrophically down, but underperforming where my models say i should be. january was decent (+2.1%). february was a loss (-1.3%). march was supposed to recover and it\u0026rsquo;s just\u0026hellip; flat.\nmodels are right. fills are wrong. edge is getting eaten somewhere between signal generation and execution.\nfound it tonight.\nsignal decay is real and i ignored it # every trading signal has a shelf life.\ngenerate a signal at time T. execute at time T+100ms. you\u0026rsquo;re working with stale information.\nthe alpha in your signal decays the moment you generate it.\nhow fast it decays depends on:\nmarket type (crypto decays faster than equities) strategy type (momentum signals decay faster than mean reversion) time of day (high vol periods = faster decay) competition (more algos competing = faster decay) i\u0026rsquo;ve been running momentum strategies on crypto without properly accounting for this.\nresult: i\u0026rsquo;m entering positions 50-200ms late depending on which server executes. by then, the signal has partially decayed.\nmath says i should capture X alpha. fills say i\u0026rsquo;m capturing 0.73X.\n26% of my edge was just\u0026hellip; evaporating.\nmeasuring signal decay # ran the analysis on three months of fill data.\nfor each trade: timestamp signal generation, timestamp fill, calculate time elapsed. then measure actual return vs expected return at signal time.\nsignal decay curve for my crypto momentum strategies. at 78ms (home server median), capturing 76% of expected alpha. at 19ms (chicago colo median), capturing 94%. that 18% gap is what\u0026rsquo;s been eating my march returns. shaded band is 95% confidence interval across 2,400 trades.\nbrutal to look at.\nat 78ms latency (home server median), i\u0026rsquo;m capturing 76% of expected alpha.\nthe other 24% evaporated before my fill came back.\nat 19ms (chicago colo), i capture 94%.\nthat\u0026rsquo;s 18 percentage points of alpha recovery just from being 59ms faster.\non a $1.2M book running these strategies, that\u0026rsquo;s real money.\nwhere the latency actually comes from # broke it down by component:\nhome server (san diego):\nsignal computation: 2-4ms (python, local) redis lookup for market state: 1-3ms order construction + validation: 1-2ms API call over internet: 45-80ms (this is the killer) order routing at exchange: 5-15ms total: 54-104ms chicago colo:\nsignal computation: 2-4ms (same code) redis lookup: 1-3ms (replicated instance) order construction: 1-2ms network to exchange: 4-8ms (dedicated fiber) order routing: 5-12ms total: 13-29ms internet RTT from san diego to coinbase datacenter (chicago): 45-80ms.\nthat one hop kills everything.\nthe colo sits 30 feet (metaphorically) from the matching engine. fiber, not internet. latency that\u0026rsquo;s an order of magnitude better.\nlatency distribution # this is what the actual fill latency distribution looks like across 2,400 trades:\nhome server peaks around 78ms median with a meaningful tail above 150ms (bad internet moments). chicago colo is a tight distribution centered on 19ms. those 150ms+ home fills are executing against stale signals with 40% alpha already gone.\nhome server: median 78ms, p95 is 148ms.\nchicago colo: median 19ms, p95 is 34ms.\nthe tail is what gets you. those 148ms fills on the home server are executing into signals that have lost 40%+ of their alpha. you\u0026rsquo;re basically noise trading at that point.\nthe tracking code # built a latency measurement system that wraps every execution:\nimport asyncio import time import redis import logging import statistics from dataclasses import dataclass, field from typing import Optional, List, Dict logger = logging.getLogger(__name__) @dataclass class SignalEvent: signal_id: str symbol: str strategy: str signal_type: str # \u0026#39;entry\u0026#39; | \u0026#39;exit\u0026#39; expected_price: float expected_alpha: float # expected return at signal time generated_at: float # unix timestamp ms precision @dataclass class FillEvent: signal_id: str fill_price: float fill_qty: float filled_at: float # unix timestamp ms precision venue: str # \u0026#39;home_san_diego\u0026#39; | \u0026#39;colo_chicago\u0026#39; @dataclass class LatencyRecord: signal: SignalEvent fill: FillEvent signal_to_fill_ms: float price_slippage_bps: float alpha_captured: float # fraction of expected alpha actually captured edge_lost_pct: float class ExecutionLatencyTracker: \u0026#34;\u0026#34;\u0026#34; tracks signal-to-fill latency and measures alpha decay in real time across all execution venues. core insight: every ms of latency costs alpha. this class quantifies exactly how much edge is being left on the table. \u0026#34;\u0026#34;\u0026#34; # strategy-specific signal half-lives in ms # measured empirically: latency at which 50% alpha is gone SIGNAL_HALF_LIVES = { \u0026#39;crypto_momentum\u0026#39;: 85, # fast decay - competitive market \u0026#39;crypto_mean_rev\u0026#39;: 450, # slower - reversion persists longer \u0026#39;es_momentum\u0026#39;: 120, # moderate - futures HFT competition \u0026#39;nq_momentum\u0026#39;: 130, \u0026#39;options_momentum\u0026#39;: 350, # slower - options flow is less reactive \u0026#39;options_vol_sell\u0026#39;: 900, # very slow - structural edge persists } def __init__(self, redis_client: redis.Redis, strategy_name: str): self.redis = redis_client self.strategy = strategy_name self.records: List[LatencyRecord] = [] self.half_life_ms = self.SIGNAL_HALF_LIVES.get(strategy_name, 200) def record_signal(self, signal: SignalEvent) -\u0026gt; None: \u0026#34;\u0026#34;\u0026#34;log signal with microsecond timestamp for latency measurement\u0026#34;\u0026#34;\u0026#34; key = f\u0026#34;signal:{signal.signal_id}\u0026#34; payload = {k: str(v) for k, v in { \u0026#39;symbol\u0026#39;: signal.symbol, \u0026#39;strategy\u0026#39;: signal.strategy, \u0026#39;signal_type\u0026#39;: signal.signal_type, \u0026#39;expected_price\u0026#39;: signal.expected_price, \u0026#39;expected_alpha\u0026#39;: signal.expected_alpha, \u0026#39;generated_at\u0026#39;: signal.generated_at }.items()} self.redis.hset(key, mapping=payload) self.redis.expire(key, 60) # signals expire after 60s - stale if not filled async def record_fill(self, fill: FillEvent) -\u0026gt; Optional[LatencyRecord]: \u0026#34;\u0026#34;\u0026#34;match fill to originating signal, compute latency and alpha decay\u0026#34;\u0026#34;\u0026#34; key = f\u0026#34;signal:{fill.signal_id}\u0026#34; raw = self.redis.hgetall(key) if not raw: logger.warning(f\u0026#34;signal {fill.signal_id} expired or missing - fill latency \u0026gt;60s\u0026#34;) return None signal = SignalEvent( signal_id=fill.signal_id, symbol=raw[b\u0026#39;symbol\u0026#39;].decode(), strategy=raw[b\u0026#39;strategy\u0026#39;].decode(), signal_type=raw[b\u0026#39;signal_type\u0026#39;].decode(), expected_price=float(raw[b\u0026#39;expected_price\u0026#39;]), expected_alpha=float(raw[b\u0026#39;expected_alpha\u0026#39;]), generated_at=float(raw[b\u0026#39;generated_at\u0026#39;]) ) latency_ms = fill.filled_at - signal.generated_at price_slippage_bps = ( abs(fill.fill_price - signal.expected_price) / signal.expected_price * 10000 ) # exponential decay model: alpha(t) = alpha_0 * 0.5^(t / half_life) alpha_captured = signal.expected_alpha * (0.5 ** (latency_ms / self.half_life_ms)) edge_lost_pct = max(0, 1 - (alpha_captured / signal.expected_alpha)) record = LatencyRecord( signal=signal, fill=fill, signal_to_fill_ms=latency_ms, price_slippage_bps=price_slippage_bps, alpha_captured=alpha_captured, edge_lost_pct=edge_lost_pct ) self.records.append(record) await self._push_to_grafana(record) return record async def _push_to_grafana(self, record: LatencyRecord) -\u0026gt; None: \u0026#34;\u0026#34;\u0026#34;update redis timeseries for grafana dashboard\u0026#34;\u0026#34;\u0026#34; ts_key = f\u0026#34;latency_ts:{self.strategy}\u0026#34; pipe = self.redis.pipeline() pipe.lpush(f\u0026#34;{ts_key}:latency_ms\u0026#34;, round(record.signal_to_fill_ms, 2)) pipe.lpush(f\u0026#34;{ts_key}:alpha_captured\u0026#34;, round(record.alpha_captured, 6)) pipe.lpush(f\u0026#34;{ts_key}:edge_lost\u0026#34;, round(record.edge_lost_pct, 4)) pipe.ltrim(f\u0026#34;{ts_key}:latency_ms\u0026#34;, 0, 2999) pipe.ltrim(f\u0026#34;{ts_key}:alpha_captured\u0026#34;, 0, 2999) pipe.ltrim(f\u0026#34;{ts_key}:edge_lost\u0026#34;, 0, 2999) await pipe.execute() def get_stats(self) -\u0026gt; Dict: \u0026#34;\u0026#34;\u0026#34;current latency and alpha capture statistics\u0026#34;\u0026#34;\u0026#34; if not self.records: return {\u0026#39;error\u0026#39;: \u0026#39;no records yet\u0026#39;} latencies = sorted(r.signal_to_fill_ms for r in self.records) alphas = [r.alpha_captured for r in self.records] total_expected = sum(r.signal.expected_alpha for r in self.records) total_captured = sum(r.alpha_captured for r in self.records) return { \u0026#39;count\u0026#39;: len(latencies), \u0026#39;median_ms\u0026#39;: statistics.median(latencies), \u0026#39;p95_ms\u0026#39;: latencies[int(0.95 * len(latencies))], \u0026#39;p99_ms\u0026#39;: latencies[int(0.99 * len(latencies))], \u0026#39;mean_alpha_captured\u0026#39;: statistics.mean(alphas), \u0026#39;total_edge_lost_pct\u0026#39;: round((1 - total_captured / total_expected) * 100, 1), \u0026#39;half_life_ms\u0026#39;: self.half_life_ms } def get_venue_comparison(self) -\u0026gt; Dict[str, Dict]: \u0026#34;\u0026#34;\u0026#34;latency breakdown by execution venue\u0026#34;\u0026#34;\u0026#34; venues: Dict[str, list] = {} for r in self.records: v = r.fill.venue if v not in venues: venues[v] = [] venues[v].append(r.signal_to_fill_ms) result = {} for venue, lats in venues.items(): s = sorted(lats) result[venue] = { \u0026#39;count\u0026#39;: len(s), \u0026#39;median_ms\u0026#39;: statistics.median(s), \u0026#39;p95_ms\u0026#39;: s[int(0.95 * len(s))], \u0026#39;mean_alpha_captured\u0026#39;: statistics.mean( r.alpha_captured for r in self.records if r.fill.venue == venue ) } return result def identify_routing_errors(self) -\u0026gt; List[LatencyRecord]: \u0026#34;\u0026#34;\u0026#34; find fills that should have gone to colo but didn\u0026#39;t. any fill \u0026gt;50ms on a strategy with half_life \u0026lt;100ms is a routing error. \u0026#34;\u0026#34;\u0026#34; if self.half_life_ms \u0026gt;= 300: return [] # slow strategy, home is fine return [ r for r in self.records if r.signal_to_fill_ms \u0026gt; 50 and r.fill.venue == \u0026#39;home_san_diego\u0026#39; ] the SIGNAL_HALF_LIVES dict is the critical piece.\nevery strategy gets an empirically measured half-life. crypto momentum at 85ms means the signal is half-dead at 85ms. options vol selling at 900ms means you can take your time.\nthe identify_routing_errors method flags exactly what was happening to me: fast-decay strategies executing from the wrong venue.\nwhat changed # before: all strategies routing based on whatever server was available.\nafter: strict routing rules based on signal half-life:\nROUTING_RULES = { \u0026#39;crypto_momentum\u0026#39;: \u0026#39;colo_chicago\u0026#39;, # half_life=85ms, colo mandatory \u0026#39;crypto_mean_rev\u0026#39;: \u0026#39;colo_chicago\u0026#39;, # half_life=450ms, colo preferred \u0026#39;es_momentum\u0026#39;: \u0026#39;colo_chicago\u0026#39;, # half_life=120ms, colo mandatory \u0026#39;nq_momentum\u0026#39;: \u0026#39;colo_chicago\u0026#39;, # half_life=130ms, colo mandatory \u0026#39;options_momentum\u0026#39;: \u0026#39;home_san_diego\u0026#39;, # half_life=350ms, home acceptable \u0026#39;options_vol_sell\u0026#39;: \u0026#39;home_san_diego\u0026#39;, # half_life=900ms, home fine } routing is now enforced in the execution layer. not optional, not best-effort.\nresult after 10 days: alpha capture on crypto momentum went from 73% to 91%.\neighteen percentage points of recovered edge.\nfrom fixing a routing config.\nthe infrastructure math # this is why the chicago colo ($25k hardware + $800/month) is not optional for serious crypto momentum work.\nhome server is legitimately good hardware. dell poweredge, 10Gbe local network, low latency within the house. but the last mile (internet RTT to exchange) is where everything falls apart.\ninternet RTT from san diego to chicago: 45-80ms depending on the day.\ncolo fiber RTT: 4-8ms.\nthat difference translates directly to edge. the colo pays for itself just by reducing latency on fast-decay strategies.\nbeen comparing notes on execution quality with some algorithmic traders on NexusFi — the venue routing discussion is more nuanced than i realized. a few quants there are using co-location chains across multiple exchange datacenters for cross-venue arb. makes my chicago-only setup look basic.\nnext step is probably adding a second colo in the same building as coinbase advanced. for now, the single chicago node is the big improvement.\ntakeaways # if you\u0026rsquo;re running momentum algos, measure your signal decay.\ndon\u0026rsquo;t assume fills are arriving \u0026ldquo;fast enough.\u0026rdquo;\nquantify it. track it. build the routing logic to enforce it.\nthree months of underperformance. found the cause in six hours of log analysis. routing fix took two days. alpha capture jumped 18 points.\nmeasure everything.\n2:15am. been digging through fill data since 10pm. the signal decay analysis explains why march was running below model expectations - crypto momentum strategies executing from home server at 78ms average latency, capturing 73% of expected alpha. routing fix is live as of yesterday. two more weeks to confirm the numbers recover.\nrandom thought: my dad was VP of engineering at a biotech startup. obsessed with infrastructure performance problems. i don\u0026rsquo;t think much about him most days anymore but something about a 2am debugging session on latency optimization made me think of him. he would have gotten completely absorbed by this stuff. weird how that hits sometimes.\ngonna sleep.\n-AK\n","date":"16 March 2026","externalUrl":null,"permalink":"/posts/2026-03-16-signal-decay-execution-latency/","section":"Posts","summary":"\u003cp\u003e2:15am on a monday.\u003c/p\u003e\n\u003cp\u003ebeen staring at fill data for the past six hours.\u003c/p\u003e\n\u003cp\u003emarch has been rough. not catastrophically down, but underperforming where my models say i should be. january was decent (+2.1%). february was a loss (-1.3%). march was supposed to recover and it\u0026rsquo;s just\u0026hellip; flat.\u003c/p\u003e","title":"signal decay and execution latency - my hidden edge killer","type":"posts"},{"content":"","date":"16 March 2026","externalUrl":null,"permalink":"/tags/signal-decay/","section":"Tags","summary":"","title":"Signal-Decay","type":"tags"},{"content":"","date":"15 March 2026","externalUrl":null,"permalink":"/tags/mental-health/","section":"Tags","summary":"","title":"Mental-Health","type":"tags"},{"content":"","date":"15 March 2026","externalUrl":null,"permalink":"/categories/personal/","section":"Categories","summary":"","title":"Personal","type":"categories"},{"content":"had a session with dr r friday that hit different. we\u0026rsquo;ve been circling around something for weeks and she finally called it out.\nthe anger i didn\u0026rsquo;t know i had # she asked me when the last time i was truly angry was. not frustrated, not annoyed, not the \u0026ldquo;this fucking code won\u0026rsquo;t work\u0026rdquo; kind of angry. real anger.\ni said i don\u0026rsquo;t really get angry. i\u0026rsquo;m pretty chill.\nshe did that thing where she takes off her glasses and puts them on the desk. that\u0026rsquo;s her \u0026ldquo;we\u0026rsquo;re about to go deep\u0026rdquo; move. makes me nervous every time because she\u0026rsquo;s usually right about whatever comes next.\n\u0026ldquo;you lost both parents at 19 years old in a car accident on new year\u0026rsquo;s eve. someone who was drunk decided to get behind the wheel and killed them. and you\u0026rsquo;re telling me you don\u0026rsquo;t have any anger about that?\u0026rdquo;\ni sat there for a while. like a long while. she didn\u0026rsquo;t push. just waited.\nthen i said \u0026ldquo;if i let myself be angry about it, i don\u0026rsquo;t know if i can stop.\u0026rdquo;\nwhat she said # dr r explained that anger is a normal part of grief that i\u0026rsquo;ve been skipping over. said i went straight from shock to numbness to acceptance without ever processing the rage. she called it \u0026ldquo;emotional avoidance masquerading as maturity.\u0026rdquo;\nfuck. she nailed it. i\u0026rsquo;ve been so focused on being okay - on building the algos, on being a good boyfriend, on functioning - that i never stopped to be angry about what happened.\nsome drunk asshole killed my parents. they were coming home from a new year\u0026rsquo;s eve party. they did everything right. uber was surging so dad said he\u0026rsquo;d drive since he only had one beer. mom was texting me happy new year at 11:58 PM. two minutes before midnight.\nthe other driver ran a red light at 60+ mph. my parents died on impact. the drunk driver survived with a broken collarbone.\ni\u0026rsquo;ve told this story like a news report. facts, timeline, medical examiner\u0026rsquo;s report. dr r pointed out that i\u0026rsquo;ve never once expressed anger when telling it.\nthe exercise # she asked me to say one angry thing about what happened. just one. didn\u0026rsquo;t have to be eloquent or fair or therapeutic. just true.\ntook me like 5 minutes.\n\u0026ldquo;that guy got to wake up in a hospital and call his mom and tell her he was okay. my parents never woke up.\u0026rdquo;\ndr r said that\u0026rsquo;s a perfectly valid thing to be furious about.\ni didn\u0026rsquo;t cry. didn\u0026rsquo;t rage. just felt this heavy thing in my chest that\u0026rsquo;s probably been there for 3 years and i\u0026rsquo;ve been calling it \u0026ldquo;grief\u0026rdquo; when really it\u0026rsquo;s also anger.\na\u0026rsquo;s reaction # told a about the session when i got home. she was at her desk working on some data pipeline thing (she\u0026rsquo;s been doing freelance python work which is honestly hot as fuck, coding girlfriend is best girlfriend).\nshe listened without saying anything until i was done. then she said \u0026ldquo;i\u0026rsquo;ve always wondered when that would come up. you talk about losing them like you\u0026rsquo;re reading a wikipedia page.\u0026rdquo;\nouch. accurate but ouch.\nshe asked if dr r suggested anything to do with the anger. i told her dr r wants me to write a letter to the driver. not to send. just to write.\na said she\u0026rsquo;d be there when i do it. that she\u0026rsquo;d make tea and sit with me.\ni haven\u0026rsquo;t written it yet. kind of terrified honestly. the news article mode i\u0026rsquo;ve been operating in has been working fine and dismantling it feels risky. like pulling a jenga block from the middle of the tower.\nthe trading connection # realized during the session that my emotional avoidance shows up in trading too. when a strategy blows up, i don\u0026rsquo;t get angry about it. i immediately switch to analysis mode. \u0026ldquo;what went wrong, how do i fix it, what\u0026rsquo;s the backtest say.\u0026rdquo;\nwhich sounds healthy but dr r says it might mean i\u0026rsquo;m not fully processing the emotional impact of losses either. that could explain why i sometimes make the same mistake twice - i intellectually understand what went wrong but i don\u0026rsquo;t FEEL it deeply enough to change behavior.\nshe used the word \u0026ldquo;embodied\u0026rdquo; which i normally would\u0026rsquo;ve made fun of as therapy speak but in context it made sense. knowledge needs to be embodied, not just intellectual. you need to feel the loss, not just calculate it.\nthis week # it\u0026rsquo;s been a weird week since the session. feel kind of raw. like someone peeled back a scab i didn\u0026rsquo;t know was there.\nhaven\u0026rsquo;t had any dramatic emotional moments. just this low hum of something in my chest. a notices. she\u0026rsquo;s been extra physical this week - touching my shoulder when she walks by, sitting closer on the couch, holding my hand during dinner.\nshe does this thing where she doesn\u0026rsquo;t ask if i\u0026rsquo;m okay. she just shows up physically. no questions, no pressure, just presence. it\u0026rsquo;s exactly what i need and she somehow always knows.\nwe had sex thursday night and it was different from usual. slower. more eye contact. less about the physical and more about being close. she kept her hand on my chest the whole time and afterwards she said she could feel my heartbeat slow down.\nwhich is embarrassingly intimate to share but fuck it this is my blog.\nwhat dr r looks like # unrelated but dr r was wearing this low-cut blouse friday and i swear to god she does it on purpose. she\u0026rsquo;s like 45, looks 35, and has legs that go on forever. a thinks it\u0026rsquo;s hilarious that i find my therapist hot. told her \u0026ldquo;babe, the woman helps me process my dead parents AND looks like a victoria\u0026rsquo;s secret model, it\u0026rsquo;s confusing.\u0026rdquo;\na said \u0026ldquo;at least you have good taste.\u0026rdquo; then she jokingly said she should come to a session so she can check out dr r too.\nmight actually be into that. not in a threesome way (okay maybe a little) but it would probably be good for them to meet. a\u0026rsquo;s been a huge part of my healing and dr r only knows her through my stories.\nthe letter # haven\u0026rsquo;t started it. opened a blank google doc three times this week and stared at it.\nwhat do you even say to someone who destroyed your life while you were literally counting down to midnight?\ndr r said there\u0026rsquo;s no wrong way to write it. that it can be one sentence or twenty pages. that it can be mature or vicious or both. just needs to be honest.\ni\u0026rsquo;ll probably do it this weekend. a\u0026rsquo;s running a half-marathon tomorrow morning so i\u0026rsquo;ll have a few hours alone. might be easier without her there for the initial part. less pressure to hold it together.\nor i might chicken out and optimize my kelly criterion parameters instead. at least position sizing doesn\u0026rsquo;t make me feel things.\n-AK\n","date":"15 March 2026","externalUrl":null,"permalink":"/posts/2026-03-15-saturday-therapy-anger-breakthrough/","section":"Posts","summary":"\u003cp\u003ehad a session with dr r friday that hit different. we\u0026rsquo;ve been circling around something for weeks and she finally called it out.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe anger i didn\u0026rsquo;t know i had \n    \u003cdiv id=\"the-anger-i-didnt-know-i-had\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-anger-i-didnt-know-i-had\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003eshe asked me when the last time i was truly angry was. not frustrated, not annoyed, not the \u0026ldquo;this fucking code won\u0026rsquo;t work\u0026rdquo; kind of angry. real anger.\u003c/p\u003e","title":"saturday - therapy breakthrough and the anger thing","type":"posts"},{"content":"one of the dumbest things i did in 2023 was running fixed position sizes. every trade was the same size regardless of conviction, volatility, or recent performance. looking back it\u0026rsquo;s obvious why i hemorrhaged $180k - i was sizing up the same during high-vol crashes as during calm trending markets.\nrebuilt my position sizing from scratch using a modified Kelly criterion that adapts to the current market regime. been running it live for 6 weeks and the risk-adjusted returns are noticeably better.\nwhy fixed sizing is broken # fixed sizing (e.g., \u0026ldquo;always risk 1% per trade\u0026rdquo;) sounds disciplined but it ignores crucial information:\nsignal strength varies - a screaming signal should get more capital than a marginal one volatility changes - 1% risk in VIX 12 is wildly different from 1% risk in VIX 35 recent performance matters - after a drawdown, you should size down (both mathematically and psychologically) correlation between positions - 5 positions at 1% each isn\u0026rsquo;t 5% risk if they\u0026rsquo;re all correlated Kelly criterion addresses the first two. combining it with regime detection handles the rest.\nkelly criterion basics # for anyone who hasn\u0026rsquo;t seen it - Kelly gives you the optimal bet size to maximize long-term growth rate:\nf* = (p * b - q) / b where:\nf* = fraction of bankroll to bet p = probability of winning b = ratio of win size to loss size q = probability of losing (1 - p) problem: full Kelly is AGGRESSIVE. like, terrifyingly aggressive. most practitioners use fractional Kelly (usually 0.25 to 0.5 of full Kelly) to reduce variance.\nhere\u0026rsquo;s my implementation:\nimport numpy as np import pandas as pd from dataclasses import dataclass, field from typing import Optional from enum import Enum from datetime import datetime, timedelta import logging logger = logging.getLogger(__name__) class MarketRegime(Enum): LOW_VOL_TRENDING = \u0026#34;low_vol_trending\u0026#34; LOW_VOL_RANGING = \u0026#34;low_vol_ranging\u0026#34; HIGH_VOL_TRENDING = \u0026#34;high_vol_trending\u0026#34; HIGH_VOL_RANGING = \u0026#34;high_vol_ranging\u0026#34; CRISIS = \u0026#34;crisis\u0026#34; @dataclass class RegimeState: regime: MarketRegime confidence: float # 0 to 1 vol_percentile: float trend_strength: float detected_at: datetime @property def kelly_multiplier(self) -\u0026gt; float: \u0026#34;\u0026#34;\u0026#34;adjust kelly fraction based on regime\u0026#34;\u0026#34;\u0026#34; multipliers = { MarketRegime.LOW_VOL_TRENDING: 0.50, # full fractional kelly MarketRegime.LOW_VOL_RANGING: 0.35, # reduce - low edge in chop MarketRegime.HIGH_VOL_TRENDING: 0.30, # careful - bigger moves both ways MarketRegime.HIGH_VOL_RANGING: 0.20, # very conservative MarketRegime.CRISIS: 0.10, # survival mode } base = multipliers.get(self.regime, 0.25) # scale by confidence return base * (0.5 + 0.5 * self.confidence) class RegimeDetector: \u0026#34;\u0026#34;\u0026#34; classifies current market regime using volatility percentile + trend strength \u0026#34;\u0026#34;\u0026#34; def __init__(self, lookback_days: int = 252): self.lookback = lookback_days self._history: list[RegimeState] = [] def detect(self, prices: pd.Series) -\u0026gt; RegimeState: if len(prices) \u0026lt; self.lookback: return RegimeState( regime=MarketRegime.LOW_VOL_RANGING, confidence=0.3, vol_percentile=0.5, trend_strength=0.0, detected_at=datetime.now(), ) log_returns = np.log(prices / prices.shift(1)).dropna() # volatility assessment current_vol = log_returns.iloc[-21:].std() * np.sqrt(252) hist_vols = log_returns.rolling(21).std().dropna() * np.sqrt(252) vol_pct = (hist_vols \u0026lt; current_vol).mean() # trend assessment using ADX-like measure # positive returns momentum up_days = (log_returns.iloc[-21:] \u0026gt; 0).sum() trend_bias = (up_days / 21 - 0.5) * 2 # -1 to 1 # directional movement abs_return_21d = abs(prices.iloc[-1] / prices.iloc[-22] - 1) avg_abs_return = abs(prices / prices.shift(21) - 1).dropna().mean() trend_strength = abs_return_21d / (avg_abs_return + 1e-8) trend_strength = min(trend_strength, 2.0) / 2.0 # normalize 0-1 # classify is_high_vol = vol_pct \u0026gt; 0.7 is_trending = trend_strength \u0026gt; 0.5 # crisis detection if vol_pct \u0026gt; 0.95 and current_vol \u0026gt; 0.30: regime = MarketRegime.CRISIS confidence = min(vol_pct, 0.95) elif is_high_vol and is_trending: regime = MarketRegime.HIGH_VOL_TRENDING confidence = (vol_pct + trend_strength) / 2 elif is_high_vol: regime = MarketRegime.HIGH_VOL_RANGING confidence = vol_pct elif is_trending: regime = MarketRegime.LOW_VOL_TRENDING confidence = trend_strength else: regime = MarketRegime.LOW_VOL_RANGING confidence = 1 - trend_strength state = RegimeState( regime=regime, confidence=confidence, vol_percentile=vol_pct, trend_strength=trend_strength, detected_at=datetime.now(), ) self._history.append(state) return state def regime_stability(self, window: int = 10) -\u0026gt; float: \u0026#34;\u0026#34;\u0026#34;how stable has the regime been recently (0-1)\u0026#34;\u0026#34;\u0026#34; if len(self._history) \u0026lt; window: return 0.5 recent = self._history[-window:] current = recent[-1].regime agreement = sum(1 for s in recent if s.regime == current) / window return agreement @dataclass class PositionSizeResult: raw_kelly: float fractional_kelly: float regime_adjusted: float drawdown_adjusted: float final_size: float # this is what we actually use max_position_pct: float signal_strength: float regime: MarketRegime reasoning: dict = field(default_factory=dict) class DynamicPositionSizer: \u0026#34;\u0026#34;\u0026#34; kelly criterion with regime detection and drawdown scaling \u0026#34;\u0026#34;\u0026#34; def __init__( self, account_size: float, max_position_pct: float = 0.05, # never more than 5% on one trade max_portfolio_heat: float = 0.15, # never more than 15% total exposure drawdown_scale_start: float = 0.05, # start scaling at 5% DD drawdown_scale_max: float = 0.15, # fully scaled at 15% DD ): self.account_size = account_size self.max_position_pct = max_position_pct self.max_portfolio_heat = max_portfolio_heat self.dd_scale_start = drawdown_scale_start self.dd_scale_max = drawdown_scale_max self.regime_detector = RegimeDetector() self._trade_history: list[dict] = [] self._peak_equity = account_size self._current_equity = account_size def update_equity(self, current_equity: float): self._current_equity = current_equity self._peak_equity = max(self._peak_equity, current_equity) @property def current_drawdown(self) -\u0026gt; float: if self._peak_equity == 0: return 0 return (self._peak_equity - self._current_equity) / self._peak_equity def _drawdown_multiplier(self) -\u0026gt; float: \u0026#34;\u0026#34;\u0026#34;scale position size down during drawdowns\u0026#34;\u0026#34;\u0026#34; dd = self.current_drawdown if dd \u0026lt;= self.dd_scale_start: return 1.0 # no scaling needed elif dd \u0026gt;= self.dd_scale_max: return 0.25 # minimum 25% of normal size else: # linear scale between start and max progress = (dd - self.dd_scale_start) / (self.dd_scale_max - self.dd_scale_start) return 1.0 - (progress * 0.75) def calculate( self, win_rate: float, avg_win: float, avg_loss: float, signal_strength: float, prices: pd.Series, current_exposure_pct: float = 0.0, ) -\u0026gt; PositionSizeResult: \u0026#34;\u0026#34;\u0026#34; calculate position size incorporating: - kelly criterion - regime detection - drawdown scaling - signal strength - portfolio heat \u0026#34;\u0026#34;\u0026#34; # step 1: raw kelly if avg_loss == 0: raw_kelly = 0.0 else: b = avg_win / avg_loss p = win_rate q = 1 - p raw_kelly = max(0, (p * b - q) / b) # step 2: regime detection regime_state = self.regime_detector.detect(prices) fractional_kelly = raw_kelly * regime_state.kelly_multiplier # step 3: signal strength scaling # stronger signals get closer to full fractional kelly # weak signals get reduced further signal_mult = 0.3 + 0.7 * signal_strength # 0.3 to 1.0 regime_adjusted = fractional_kelly * signal_mult # step 4: drawdown scaling dd_mult = self._drawdown_multiplier() drawdown_adjusted = regime_adjusted * dd_mult # step 5: apply caps available_heat = max(0, self.max_portfolio_heat - current_exposure_pct) final_pct = min(drawdown_adjusted, self.max_position_pct, available_heat) final_size = self._current_equity * final_pct result = PositionSizeResult( raw_kelly=raw_kelly, fractional_kelly=fractional_kelly, regime_adjusted=regime_adjusted, drawdown_adjusted=drawdown_adjusted, final_size=final_size, max_position_pct=self.max_position_pct, signal_strength=signal_strength, regime=regime_state.regime, reasoning={ \u0026#34;account_equity\u0026#34;: self._current_equity, \u0026#34;current_drawdown_pct\u0026#34;: round(self.current_drawdown * 100, 2), \u0026#34;dd_multiplier\u0026#34;: round(dd_mult, 3), \u0026#34;regime_kelly_mult\u0026#34;: round(regime_state.kelly_multiplier, 3), \u0026#34;signal_multiplier\u0026#34;: round(signal_mult, 3), \u0026#34;vol_percentile\u0026#34;: round(regime_state.vol_percentile, 3), \u0026#34;trend_strength\u0026#34;: round(regime_state.trend_strength, 3), \u0026#34;portfolio_heat\u0026#34;: round(current_exposure_pct * 100, 2), \u0026#34;available_heat\u0026#34;: round(available_heat * 100, 2), }, ) logger.info( f\u0026#34;POSITION SIZE: raw_kelly={raw_kelly:.3f} \u0026#34; f\u0026#34;-\u0026gt; regime_adj={regime_adjusted:.3f} \u0026#34; f\u0026#34;-\u0026gt; dd_adj={drawdown_adjusted:.3f} \u0026#34; f\u0026#34;-\u0026gt; final=${final_size:,.0f} \u0026#34; f\u0026#34;({regime_state.regime.value}, \u0026#34; f\u0026#34;DD={self.current_drawdown*100:.1f}%)\u0026#34; ) return result def add_trade_result(self, pnl: float, strategy: str): \u0026#34;\u0026#34;\u0026#34;track trade results for performance statistics\u0026#34;\u0026#34;\u0026#34; self._trade_history.append({ \u0026#34;pnl\u0026#34;: pnl, \u0026#34;strategy\u0026#34;: strategy, \u0026#34;timestamp\u0026#34;: datetime.now(), }) self.update_equity(self._current_equity + pnl) def get_strategy_stats( self, strategy: str, lookback_trades: int = 50 ) -\u0026gt; dict: \u0026#34;\u0026#34;\u0026#34;rolling statistics for kelly inputs\u0026#34;\u0026#34;\u0026#34; trades = [ t for t in self._trade_history if t[\u0026#34;strategy\u0026#34;] == strategy ][-lookback_trades:] if len(trades) \u0026lt; 10: return {\u0026#34;win_rate\u0026#34;: 0.5, \u0026#34;avg_win\u0026#34;: 0, \u0026#34;avg_loss\u0026#34;: 0, \u0026#34;n_trades\u0026#34;: len(trades)} wins = [t[\u0026#34;pnl\u0026#34;] for t in trades if t[\u0026#34;pnl\u0026#34;] \u0026gt; 0] losses = [t[\u0026#34;pnl\u0026#34;] for t in trades if t[\u0026#34;pnl\u0026#34;] \u0026lt;= 0] return { \u0026#34;win_rate\u0026#34;: len(wins) / len(trades), \u0026#34;avg_win\u0026#34;: np.mean(wins) if wins else 0, \u0026#34;avg_loss\u0026#34;: abs(np.mean(losses)) if losses else 0, \u0026#34;n_trades\u0026#34;: len(trades), \u0026#34;max_win\u0026#34;: max(wins) if wins else 0, \u0026#34;max_loss\u0026#34;: min(losses) if losses else 0, \u0026#34;profit_factor\u0026#34;: ( (sum(wins) / abs(sum(losses))) if losses and sum(losses) != 0 else float(\u0026#34;inf\u0026#34;) ), } regime impact visualization # this is from my live data - shows how the position sizer adapts to different market conditions:\nlook at the crisis period (around day 50-60). raw kelly says \u0026ldquo;bet 12-18%!\u0026rdquo; because win rate and payoff ratio look fine historically. but the regime-adjusted sizing drops to 1-2%. that\u0026rsquo;s the whole point - historical kelly estimates are garbage during regime changes because the distribution of outcomes shifts.\ndrawdown scaling in action # the drawdown scaling is simple but effective. at 0-5% drawdown, no adjustment. from 5-15%, linear reduction down to 25% of normal size. beyond 15%, stay at minimum 25%.\nthis prevents the death spiral where you lose money, keep same position size, lose more money, bigger drawdown, now you need a 30% return just to get back to even.\nreal results comparison # ran a comparison: same strategies over the same 6-month backtest period (July-Dec 2025), one with fixed 2% sizing and one with dynamic kelly sizing:\nmetric fixed 2% dynamic kelly total return +14.2% +16.8% max drawdown -11.4% -7.2% sharpe ratio 1.31 1.89 sortino ratio 1.72 2.54 avg trade size $24,000 $8k-$36k win rate 54% 54% same win rate (obviously - sizing doesn\u0026rsquo;t affect signal quality) but way better risk-adjusted returns. the max drawdown improvement is the real win. 7.2% vs 11.4% means i sleep better and have more capital to deploy when the opportunity is best.\nbeen talking about kelly criterion adaptations on NexusFi\u0026rsquo;s risk management threads and some of the institutional guys there use even more sophisticated approaches. but for a retail algo trader, this implementation captures 80% of the benefit.\nthe key takeaway: position sizing is at least as important as signal generation. a mediocre signal with great sizing beats a great signal with bad sizing every time. took me $180k and most of 2023 to learn that.\n-AK\n","date":"14 March 2026","externalUrl":null,"permalink":"/posts/2026-03-14-dynamic-position-sizing-kelly-regime/","section":"Posts","summary":"\u003cp\u003eone of the dumbest things i did in 2023 was running fixed position sizes. every trade was the same size regardless of conviction, volatility, or recent performance. looking back it\u0026rsquo;s obvious why i hemorrhaged $180k - i was sizing up the same during high-vol crashes as during calm trending markets.\u003c/p\u003e","title":"dynamic position sizing - kelly criterion meets regime detection","type":"posts"},{"content":"","date":"14 March 2026","externalUrl":null,"permalink":"/tags/kelly-criterion/","section":"Tags","summary":"","title":"Kelly-Criterion","type":"tags"},{"content":"","date":"14 March 2026","externalUrl":null,"permalink":"/tags/strategy/","section":"Tags","summary":"","title":"Strategy","type":"tags"},{"content":"","date":"12 March 2026","externalUrl":null,"permalink":"/tags/devops/","section":"Tags","summary":"","title":"Devops","type":"tags"},{"content":"","date":"12 March 2026","externalUrl":null,"permalink":"/tags/grafana/","section":"Tags","summary":"","title":"Grafana","type":"tags"},{"content":"realized last month that i had a massive blind spot in my infrastructure: monitoring. my algos were running 24/7 but i had no idea if they were running WELL until i checked PnL at end of day. that\u0026rsquo;s like driving with your eyes closed and checking if you crashed when you stop.\nbuilt out a proper monitoring stack with prometheus for metrics collection and grafana for dashboards. now i get alerts on my phone when anything looks sketchy.\nwhat i\u0026rsquo;m monitoring # the obvious stuff first:\nstrategy PnL (real-time, per-strategy) order fill rates (how many orders actually execute vs fail) data feed latency (am i getting stale data?) signal generation latency (are my algos keeping up?) system resources (CPU, RAM, disk I/O on the dell rack) the less obvious but equally important stuff:\nsignal-to-fill latency (time between signal generation and order fill) slippage per trade (expected vs actual fill price) position drift (actual positions vs target positions) correlation breakdown (when historically correlated strategies diverge) prometheus metrics in python # prometheus has a python client that makes it dead simple to expose metrics from your trading code. here\u0026rsquo;s how i instrumented my pipeline:\nimport time import logging from prometheus_client import ( Counter, Gauge, Histogram, Summary, start_http_server, CollectorRegistry, ) from dataclasses import dataclass logger = logging.getLogger(__name__) # custom registry to avoid polluting default REGISTRY = CollectorRegistry() # ---- metric definitions ---- # order metrics ORDERS_TOTAL = Counter( \u0026#34;algo_orders_total\u0026#34;, \u0026#34;total orders placed\u0026#34;, [\u0026#34;strategy\u0026#34;, \u0026#34;exchange\u0026#34;, \u0026#34;side\u0026#34;, \u0026#34;order_type\u0026#34;, \u0026#34;status\u0026#34;], registry=REGISTRY, ) FILL_LATENCY = Histogram( \u0026#34;algo_fill_latency_seconds\u0026#34;, \u0026#34;time from signal to fill\u0026#34;, [\u0026#34;strategy\u0026#34;, \u0026#34;exchange\u0026#34;], buckets=[0.01, 0.05, 0.1, 0.25, 0.5, 1.0, 2.0, 5.0, 10.0], registry=REGISTRY, ) SLIPPAGE_BPS = Histogram( \u0026#34;algo_slippage_bps\u0026#34;, \u0026#34;slippage in basis points\u0026#34;, [\u0026#34;strategy\u0026#34;, \u0026#34;exchange\u0026#34;, \u0026#34;side\u0026#34;], buckets=[0, 0.5, 1, 2, 3, 5, 10, 20, 50], registry=REGISTRY, ) # PnL metrics PNL_TOTAL = Gauge( \u0026#34;algo_pnl_total_usd\u0026#34;, \u0026#34;total PnL in USD\u0026#34;, [\u0026#34;strategy\u0026#34;], registry=REGISTRY, ) PNL_DAILY = Gauge( \u0026#34;algo_pnl_daily_usd\u0026#34;, \u0026#34;daily PnL in USD\u0026#34;, [\u0026#34;strategy\u0026#34;], registry=REGISTRY, ) POSITION_SIZE = Gauge( \u0026#34;algo_position_size\u0026#34;, \u0026#34;current position size\u0026#34;, [\u0026#34;strategy\u0026#34;, \u0026#34;symbol\u0026#34;], registry=REGISTRY, ) # signal metrics SIGNAL_LATENCY = Histogram( \u0026#34;algo_signal_latency_ms\u0026#34;, \u0026#34;signal generation time in ms\u0026#34;, [\u0026#34;strategy\u0026#34;], buckets=[1, 2, 5, 10, 25, 50, 100, 250, 500], registry=REGISTRY, ) SIGNAL_STRENGTH = Gauge( \u0026#34;algo_signal_strength\u0026#34;, \u0026#34;current signal strength (-1 to 1)\u0026#34;, [\u0026#34;strategy\u0026#34;, \u0026#34;symbol\u0026#34;], registry=REGISTRY, ) SIGNAL_COUNT = Counter( \u0026#34;algo_signals_generated_total\u0026#34;, \u0026#34;total signals generated\u0026#34;, [\u0026#34;strategy\u0026#34;, \u0026#34;direction\u0026#34;], registry=REGISTRY, ) # data feed metrics FEED_LATENCY = Gauge( \u0026#34;algo_feed_latency_ms\u0026#34;, \u0026#34;data feed latency in ms\u0026#34;, [\u0026#34;source\u0026#34;, \u0026#34;symbol\u0026#34;], registry=REGISTRY, ) FEED_STALENESS = Gauge( \u0026#34;algo_feed_staleness_seconds\u0026#34;, \u0026#34;seconds since last data update\u0026#34;, [\u0026#34;source\u0026#34;, \u0026#34;symbol\u0026#34;], registry=REGISTRY, ) FEED_ERRORS = Counter( \u0026#34;algo_feed_errors_total\u0026#34;, \u0026#34;data feed errors\u0026#34;, [\u0026#34;source\u0026#34;, \u0026#34;error_type\u0026#34;], registry=REGISTRY, ) # system metrics (beyond what node_exporter provides) REDIS_MEMORY = Gauge( \u0026#34;algo_redis_memory_mb\u0026#34;, \u0026#34;redis memory usage in MB\u0026#34;, registry=REGISTRY, ) ACTIVE_STRATEGIES = Gauge( \u0026#34;algo_active_strategies\u0026#34;, \u0026#34;number of active strategies\u0026#34;, registry=REGISTRY, ) CYCLE_DURATION = Summary( \u0026#34;algo_cycle_duration_seconds\u0026#34;, \u0026#34;pipeline cycle duration\u0026#34;, registry=REGISTRY, ) class MetricsCollector: \u0026#34;\u0026#34;\u0026#34;instruments the trading pipeline with prometheus metrics\u0026#34;\u0026#34;\u0026#34; def __init__(self, port: int = 9090): self.port = port self._started = False def start(self): if not self._started: start_http_server(self.port, registry=REGISTRY) self._started = True logger.info(f\u0026#34;prometheus metrics exposed on :{self.port}/metrics\u0026#34;) def record_order( self, strategy: str, exchange: str, side: str, order_type: str, status: str, signal_time: float, fill_time: float, expected_price: float, actual_price: float, ): ORDERS_TOTAL.labels( strategy=strategy, exchange=exchange, side=side, order_type=order_type, status=status, ).inc() if status == \u0026#34;filled\u0026#34; and fill_time \u0026gt; signal_time: latency = fill_time - signal_time FILL_LATENCY.labels( strategy=strategy, exchange=exchange ).observe(latency) # slippage calculation if expected_price \u0026gt; 0: slip = abs(actual_price - expected_price) / expected_price * 10000 SLIPPAGE_BPS.labels( strategy=strategy, exchange=exchange, side=side ).observe(slip) def update_pnl(self, strategy: str, total: float, daily: float): PNL_TOTAL.labels(strategy=strategy).set(total) PNL_DAILY.labels(strategy=strategy).set(daily) def update_position(self, strategy: str, symbol: str, size: float): POSITION_SIZE.labels(strategy=strategy, symbol=symbol).set(size) def record_signal( self, strategy: str, symbol: str, direction: str, strength: float, latency_ms: float ): SIGNAL_LATENCY.labels(strategy=strategy).observe(latency_ms) SIGNAL_STRENGTH.labels(strategy=strategy, symbol=symbol).set(strength) SIGNAL_COUNT.labels(strategy=strategy, direction=direction).inc() def update_feed(self, source: str, symbol: str, latency_ms: float): FEED_LATENCY.labels(source=source, symbol=symbol).set(latency_ms) def record_feed_staleness(self, source: str, symbol: str, staleness_s: float): FEED_STALENESS.labels(source=source, symbol=symbol).set(staleness_s) def record_feed_error(self, source: str, error_type: str): FEED_ERRORS.labels(source=source, error_type=error_type).inc() def record_cycle(self, duration_seconds: float): CYCLE_DURATION.observe(duration_seconds) integrating into the trading loop # the metrics collector wraps around existing pipeline code. minimal changes needed:\nimport asyncio import time collector = MetricsCollector(port=9090) collector.start() async def trading_loop(pipeline, collector): while True: cycle_start = time.monotonic() # generate signals sig_start = time.monotonic() signals = await pipeline.generate_cycle() sig_time = (time.monotonic() - sig_start) * 1000 for signal in signals: collector.record_signal( strategy=signal.strategy_id, symbol=signal.symbol, direction=\u0026#34;long\u0026#34; if signal.direction \u0026gt; 0 else \u0026#34;short\u0026#34;, strength=abs(signal.strength), latency_ms=sig_time, ) # execute actionable signals for signal in signals: if not signal.is_actionable: continue order = await pipeline.execute(signal) collector.record_order( strategy=signal.strategy_id, exchange=order.exchange, side=order.side, order_type=order.order_type, status=order.status.value, signal_time=signal.timestamp, fill_time=order.updated_at, expected_price=signal.metadata.get(\u0026#34;expected_price\u0026#34;, 0), actual_price=order.avg_fill_price, ) # update PnL and positions for strategy in pipeline.strategies.values(): pnl = strategy.get_pnl() collector.update_pnl(strategy.strategy_id, pnl[\u0026#34;total\u0026#34;], pnl[\u0026#34;daily\u0026#34;]) for symbol, position in strategy.get_positions().items(): collector.update_position(strategy.strategy_id, symbol, position) cycle_time = time.monotonic() - cycle_start collector.record_cycle(cycle_time) ACTIVE_STRATEGIES.set(len(pipeline.strategies)) await asyncio.sleep(1.0) grafana dashboards # built 3 main dashboards:\n1. strategy overview # shows per-strategy PnL, signal frequency, hit rates. this is the one i check first thing in the morning.\n2. infrastructure health # latencies, error rates, system resources. the \u0026ldquo;is anything on fire\u0026rdquo; dashboard.\n3. signal analytics # signal strength distribution, direction bias, correlation between signals. helps me spot when multiple strategies are piling into the same trade (bad for risk).\nalerting rules # this is where it gets good. prometheus alertmanager + pushover for phone notifications:\n# prometheus alert rules groups: - name: algo_trading_alerts rules: # PnL alerts - alert: DailyDrawdownExceeded expr: algo_pnl_daily_usd \u0026lt; -5000 for: 5m labels: severity: critical annotations: summary: \u0026#34;strategy {{ $labels.strategy }} daily drawdown \u0026gt; $5k\u0026#34; description: \u0026#34;current daily PnL: ${{ $value }}\u0026#34; - alert: HitRateDecay expr: \u0026gt; rate(algo_signals_generated_total{direction=\u0026#34;long\u0026#34;}[1h]) / rate(algo_signals_generated_total[1h]) \u0026lt; 0.35 for: 30m labels: severity: warning annotations: summary: \u0026#34;{{ $labels.strategy }} long signal rate dropped below 35%\u0026#34; # latency alerts - alert: HighFillLatency expr: histogram_quantile(0.95, rate(algo_fill_latency_seconds_bucket[5m])) \u0026gt; 2.0 for: 10m labels: severity: warning annotations: summary: \u0026#34;p95 fill latency \u0026gt; 2s on {{ $labels.exchange }}\u0026#34; - alert: DataFeedStale expr: algo_feed_staleness_seconds \u0026gt; 30 for: 1m labels: severity: critical annotations: summary: \u0026#34;{{ $labels.source }} data stale for {{ $labels.symbol }}\u0026#34; description: \u0026#34;no updates for {{ $value }}s\u0026#34; # slippage alerts - alert: ExcessiveSlippage expr: histogram_quantile(0.90, rate(algo_slippage_bps_bucket[1h])) \u0026gt; 5 for: 15m labels: severity: warning annotations: summary: \u0026#34;p90 slippage \u0026gt; 5bps on {{ $labels.strategy }}\u0026#34; # infrastructure alerts - alert: HighCycleLatency expr: algo_cycle_duration_seconds{quantile=\u0026#34;0.99\u0026#34;} \u0026gt; 5.0 for: 5m labels: severity: critical annotations: summary: \u0026#34;pipeline cycle p99 \u0026gt; 5 seconds\u0026#34; - alert: RedisMemoryHigh expr: algo_redis_memory_mb \u0026gt; 2048 for: 10m labels: severity: warning annotations: summary: \u0026#34;redis memory usage \u0026gt; 2GB\u0026#34; what this caught in the first week # deployed this monitoring stack 10 days ago. already caught 4 issues i wouldn\u0026rsquo;t have noticed otherwise:\n1. polygon.io feed going stale for 45 seconds - their websocket dropped silently, no error, just stopped sending data. my algo was trading on 45-second-old prices. the DataFeedStale alert fired and i was able to force a reconnect within 2 minutes.\n2. slippage spike on kraken during asian session - p90 slippage went from 1.5 bps to 8 bps between 2-4am PST. turns out kraken\u0026rsquo;s BTC/USDT liquidity thins out significantly during those hours. adjusted my position sizing to scale down during low-liquidity windows.\n3. ES momentum strategy signal bias - the long signal rate dropped to 28% over 3 hours. wasn\u0026rsquo;t a bug - market was genuinely bearish. but the alert made me check and confirm it was intentional market behavior, not a data issue.\n4. redis memory leak - redis was slowly accumulating stale keys from my signal cache. growing at ~50MB/day. would\u0026rsquo;ve filled the 16GB allocation in about 10 months. added a cleanup cron job.\nthe dashboard on my phone # configured grafana mobile app so i can check dashboards from anywhere. a thinks it\u0026rsquo;s annoying that i check my trading dashboards at dinner but she does the same thing with instagram stories so we\u0026rsquo;re even.\nNGL having real-time visibility into my algos has reduced my anxiety significantly. used to wake up at 3am worried something was broken. now if something breaks, my phone buzzes. if my phone is quiet, everything\u0026rsquo;s fine.\nbeen discussing monitoring setups on NexusFi\u0026rsquo;s infrastructure threads and it\u0026rsquo;s wild how many people run algos with zero monitoring. you wouldn\u0026rsquo;t run a web server without monitoring. why would you run code that trades your money without it.\nwhat\u0026rsquo;s next # want to add:\nanomaly detection on signal distributions (auto-detect regime changes) correlation monitoring between strategies (risk-off when too correlated) exchange health scoring that feeds into the routing layer from my connectivity post ML-based alerting - use historical alert patterns to reduce false positives the prometheus + grafana stack is honestly overkill for most retail algo traders. but once you have it running, the peace of mind is worth every minute of setup time.\n-AK\n","date":"12 March 2026","externalUrl":null,"permalink":"/posts/2026-03-12-monitoring-alerting-grafana-prometheus/","section":"Posts","summary":"\u003cp\u003erealized last month that i had a massive blind spot in my infrastructure: monitoring. my algos were running 24/7 but i had no idea if they were running WELL until i checked PnL at end of day. that\u0026rsquo;s like driving with your eyes closed and checking if you crashed when you stop.\u003c/p\u003e","title":"monitoring and alerting for algo infrastructure - grafana + prometheus setup","type":"posts"},{"content":"","date":"12 March 2026","externalUrl":null,"permalink":"/tags/prometheus/","section":"Tags","summary":"","title":"Prometheus","type":"tags"},{"content":"","date":"12 March 2026","externalUrl":null,"permalink":"/categories/trading-infrastructure/","section":"Categories","summary":"","title":"Trading Infrastructure","type":"categories"},{"content":"one of the most annoying parts of crypto algo trading is that every exchange has a different API. different auth schemes, different rate limits, different order types, different error codes. writing strategy logic for each exchange separately is a nightmare and a maintenance disaster.\nspent last week building a unified exchange connectivity layer that abstracts the differences away. now my strategies talk to one interface and don\u0026rsquo;t care if the order goes to binance, kraken, or coinbase.\nwhy ccxt isn\u0026rsquo;t enough # yeah i know ccxt exists and it\u0026rsquo;s great for basic stuff. i use it under the hood. but ccxt gives you a lowest-common-denominator interface - it handles the API differences but doesn\u0026rsquo;t solve:\nconnection management - websocket reconnection, heartbeats, auth token refresh order state tracking - partial fills, rejections, amendments across exchanges rate limit coordination - each exchange has different limits and penalty behaviors failover - if binance goes down mid-order, reroute to kraken so i built a layer on top of ccxt that handles all of this.\nthe architecture # import ccxt.async_support as ccxt import asyncio import time import logging from dataclasses import dataclass, field from typing import Optional from enum import Enum from collections import defaultdict logger = logging.getLogger(__name__) class ExchangeStatus(Enum): HEALTHY = \u0026#34;healthy\u0026#34; DEGRADED = \u0026#34;degraded\u0026#34; DOWN = \u0026#34;down\u0026#34; RATE_LIMITED = \u0026#34;rate_limited\u0026#34; class OrderStatus(Enum): PENDING = \u0026#34;pending\u0026#34; OPEN = \u0026#34;open\u0026#34; PARTIALLY_FILLED = \u0026#34;partially_filled\u0026#34; FILLED = \u0026#34;filled\u0026#34; CANCELLED = \u0026#34;cancelled\u0026#34; REJECTED = \u0026#34;rejected\u0026#34; FAILED = \u0026#34;failed\u0026#34; @dataclass class ExchangeHealth: status: ExchangeStatus latency_ms: float last_successful_call: float error_count_1m: int = 0 rate_limit_remaining: int = 100 consecutive_errors: int = 0 @property def is_usable(self) -\u0026gt; bool: return self.status in (ExchangeStatus.HEALTHY, ExchangeStatus.DEGRADED) @dataclass class UnifiedOrder: order_id: str exchange: str symbol: str side: str # \u0026#34;buy\u0026#34; or \u0026#34;sell\u0026#34; order_type: str # \u0026#34;limit\u0026#34;, \u0026#34;market\u0026#34;, \u0026#34;stop_limit\u0026#34; quantity: float price: Optional[float] status: OrderStatus filled_qty: float = 0.0 avg_fill_price: float = 0.0 created_at: float = 0.0 updated_at: float = 0.0 fees: float = 0.0 exchange_order_id: str = \u0026#34;\u0026#34; error_msg: str = \u0026#34;\u0026#34; metadata: dict = field(default_factory=dict) @property def remaining_qty(self) -\u0026gt; float: return self.quantity - self.filled_qty @property def fill_pct(self) -\u0026gt; float: if self.quantity == 0: return 0.0 return self.filled_qty / self.quantity * 100 class RateLimiter: \u0026#34;\u0026#34;\u0026#34;sliding window rate limiter per exchange\u0026#34;\u0026#34;\u0026#34; def __init__(self, max_requests: int, window_seconds: float): self.max_requests = max_requests self.window = window_seconds self._timestamps: list[float] = [] async def acquire(self): now = time.monotonic() # remove expired timestamps self._timestamps = [t for t in self._timestamps if now - t \u0026lt; self.window] if len(self._timestamps) \u0026gt;= self.max_requests: # wait until oldest request expires sleep_time = self._timestamps[0] + self.window - now + 0.01 if sleep_time \u0026gt; 0: logger.debug(f\u0026#34;rate limited, sleeping {sleep_time:.2f}s\u0026#34;) await asyncio.sleep(sleep_time) self._timestamps.append(time.monotonic()) @property def remaining(self) -\u0026gt; int: now = time.monotonic() active = sum(1 for t in self._timestamps if now - t \u0026lt; self.window) return max(0, self.max_requests - active) class ExchangeConnector: \u0026#34;\u0026#34;\u0026#34;manages connection to a single exchange\u0026#34;\u0026#34;\u0026#34; # exchange-specific rate limits RATE_LIMITS = { \u0026#34;binance\u0026#34;: {\u0026#34;requests\u0026#34;: 1200, \u0026#34;window\u0026#34;: 60}, \u0026#34;kraken\u0026#34;: {\u0026#34;requests\u0026#34;: 15, \u0026#34;window\u0026#34;: 1}, # kraken is strict \u0026#34;coinbase\u0026#34;: {\u0026#34;requests\u0026#34;: 10, \u0026#34;window\u0026#34;: 1}, # coinbase is very strict } def __init__(self, exchange_id: str, config: dict): self.exchange_id = exchange_id self.config = config # initialize ccxt exchange exchange_class = getattr(ccxt, exchange_id) self.exchange = exchange_class({ \u0026#34;apiKey\u0026#34;: config.get(\u0026#34;api_key\u0026#34;, \u0026#34;\u0026#34;), \u0026#34;secret\u0026#34;: config.get(\u0026#34;secret\u0026#34;, \u0026#34;\u0026#34;), \u0026#34;password\u0026#34;: config.get(\u0026#34;passphrase\u0026#34;, \u0026#34;\u0026#34;), \u0026#34;enableRateLimit\u0026#34;: False, # we handle this ourselves \u0026#34;options\u0026#34;: {\u0026#34;defaultType\u0026#34;: \u0026#34;spot\u0026#34;}, }) limits = self.RATE_LIMITS.get(exchange_id, {\u0026#34;requests\u0026#34;: 30, \u0026#34;window\u0026#34;: 1}) self.rate_limiter = RateLimiter(limits[\u0026#34;requests\u0026#34;], limits[\u0026#34;window\u0026#34;]) self.health = ExchangeHealth( status=ExchangeStatus.HEALTHY, latency_ms=0.0, last_successful_call=time.time(), ) self._orders: dict[str, UnifiedOrder] = {} self._error_timestamps: list[float] = [] async def place_order( self, symbol: str, side: str, order_type: str, quantity: float, price: Optional[float] = None, ) -\u0026gt; UnifiedOrder: await self.rate_limiter.acquire() order = UnifiedOrder( order_id=f\u0026#34;{self.exchange_id}_{int(time.time()*1000)}\u0026#34;, exchange=self.exchange_id, symbol=symbol, side=side, order_type=order_type, quantity=quantity, price=price, status=OrderStatus.PENDING, created_at=time.time(), ) try: start = time.monotonic() if order_type == \u0026#34;market\u0026#34;: result = await self.exchange.create_market_order( symbol, side, quantity ) elif order_type == \u0026#34;limit\u0026#34;: result = await self.exchange.create_limit_order( symbol, side, quantity, price ) else: raise ValueError(f\u0026#34;unsupported order type: {order_type}\u0026#34;) latency = (time.monotonic() - start) * 1000 self.health.latency_ms = latency self.health.last_successful_call = time.time() self.health.consecutive_errors = 0 order.exchange_order_id = result[\u0026#34;id\u0026#34;] order.status = OrderStatus.OPEN if result.get(\u0026#34;filled\u0026#34;, 0) \u0026gt; 0: order.filled_qty = result[\u0026#34;filled\u0026#34;] order.avg_fill_price = result.get(\u0026#34;average\u0026#34;, result.get(\u0026#34;price\u0026#34;, 0)) if order.filled_qty \u0026gt;= order.quantity: order.status = OrderStatus.FILLED else: order.status = OrderStatus.PARTIALLY_FILLED order.updated_at = time.time() self._orders[order.order_id] = order logger.info( f\u0026#34;ORDER PLACED [{self.exchange_id}] {side} {quantity} {symbol} \u0026#34; f\u0026#34;@ {\u0026#39;market\u0026#39; if order_type == \u0026#39;market\u0026#39; else price} \u0026#34; f\u0026#34;-\u0026gt; {order.status.value} ({latency:.0f}ms)\u0026#34; ) return order except ccxt.InsufficientFunds as e: order.status = OrderStatus.REJECTED order.error_msg = f\u0026#34;insufficient funds: {e}\u0026#34; self._record_error() logger.error(f\u0026#34;REJECTED [{self.exchange_id}]: {e}\u0026#34;) return order except ccxt.RateLimitExceeded: order.status = OrderStatus.FAILED order.error_msg = \u0026#34;rate limit exceeded\u0026#34; self.health.status = ExchangeStatus.RATE_LIMITED self._record_error() logger.warning(f\u0026#34;RATE LIMITED [{self.exchange_id}]\u0026#34;) return order except ccxt.NetworkError as e: order.status = OrderStatus.FAILED order.error_msg = f\u0026#34;network error: {e}\u0026#34; self._record_error() logger.error(f\u0026#34;NETWORK ERROR [{self.exchange_id}]: {e}\u0026#34;) return order except Exception as e: order.status = OrderStatus.FAILED order.error_msg = str(e) self._record_error() logger.error(f\u0026#34;ORDER FAILED [{self.exchange_id}]: {e}\u0026#34;) return order async def cancel_order(self, order_id: str) -\u0026gt; bool: if order_id not in self._orders: return False order = self._orders[order_id] await self.rate_limiter.acquire() try: await self.exchange.cancel_order( order.exchange_order_id, order.symbol ) order.status = OrderStatus.CANCELLED order.updated_at = time.time() return True except Exception as e: logger.error(f\u0026#34;cancel failed [{self.exchange_id}]: {e}\u0026#34;) return False async def get_balance(self, asset: str) -\u0026gt; float: await self.rate_limiter.acquire() try: balance = await self.exchange.fetch_balance() return balance.get(asset, {}).get(\u0026#34;free\u0026#34;, 0.0) except Exception as e: logger.error(f\u0026#34;balance check failed [{self.exchange_id}]: {e}\u0026#34;) return 0.0 def _record_error(self): now = time.time() self._error_timestamps.append(now) # keep last 60 seconds self._error_timestamps = [t for t in self._error_timestamps if now - t \u0026lt; 60] self.health.error_count_1m = len(self._error_timestamps) self.health.consecutive_errors += 1 if self.health.consecutive_errors \u0026gt;= 5: self.health.status = ExchangeStatus.DOWN elif self.health.error_count_1m \u0026gt;= 3: self.health.status = ExchangeStatus.DEGRADED async def close(self): await self.exchange.close() class UnifiedExchangeLayer: \u0026#34;\u0026#34;\u0026#34; unified interface for trading across multiple exchanges handles routing, failover, and order tracking \u0026#34;\u0026#34;\u0026#34; def __init__(self, configs: dict[str, dict]): self.connectors: dict[str, ExchangeConnector] = {} for exchange_id, config in configs.items(): self.connectors[exchange_id] = ExchangeConnector(exchange_id, config) # symbol -\u0026gt; preferred exchange mapping self._routing: dict[str, list[str]] = {} self._all_orders: dict[str, UnifiedOrder] = {} def set_routing(self, symbol: str, exchanges: list[str]): \u0026#34;\u0026#34;\u0026#34;set exchange preference order for a symbol\u0026#34;\u0026#34;\u0026#34; self._routing[symbol] = exchanges def _get_best_exchange(self, symbol: str) -\u0026gt; Optional[str]: \u0026#34;\u0026#34;\u0026#34;pick healthiest exchange that supports this symbol\u0026#34;\u0026#34;\u0026#34; candidates = self._routing.get(symbol, list(self.connectors.keys())) for exchange_id in candidates: connector = self.connectors.get(exchange_id) if connector and connector.health.is_usable: return exchange_id return None async def place_order( self, symbol: str, side: str, order_type: str, quantity: float, price: Optional[float] = None, preferred_exchange: Optional[str] = None, ) -\u0026gt; UnifiedOrder: exchange_id = preferred_exchange or self._get_best_exchange(symbol) if not exchange_id: return UnifiedOrder( order_id=f\u0026#34;failed_{int(time.time()*1000)}\u0026#34;, exchange=\u0026#34;none\u0026#34;, symbol=symbol, side=side, order_type=order_type, quantity=quantity, price=price, status=OrderStatus.FAILED, error_msg=\u0026#34;no healthy exchange available\u0026#34;, ) connector = self.connectors[exchange_id] order = await connector.place_order(symbol, side, order_type, quantity, price) # if order failed and we have fallback exchanges, try them if order.status == OrderStatus.FAILED: candidates = self._routing.get(symbol, []) for fallback_id in candidates: if fallback_id == exchange_id: continue fb_connector = self.connectors.get(fallback_id) if fb_connector and fb_connector.health.is_usable: logger.info( f\u0026#34;FAILOVER: {exchange_id} -\u0026gt; {fallback_id} for {symbol}\u0026#34; ) order = await fb_connector.place_order( symbol, side, order_type, quantity, price ) if order.status != OrderStatus.FAILED: break self._all_orders[order.order_id] = order return order async def get_health_report(self) -\u0026gt; dict: report = {} for exchange_id, connector in self.connectors.items(): h = connector.health report[exchange_id] = { \u0026#34;status\u0026#34;: h.status.value, \u0026#34;latency_ms\u0026#34;: round(h.latency_ms, 1), \u0026#34;errors_1m\u0026#34;: h.error_count_1m, \u0026#34;rate_limit_remaining\u0026#34;: connector.rate_limiter.remaining, \u0026#34;consecutive_errors\u0026#34;: h.consecutive_errors, } return report async def close_all(self): for connector in self.connectors.values(): await connector.close() how i use it # the beauty of this abstraction is my strategies don\u0026rsquo;t give a shit which exchange executes their orders:\n# strategy code - clean and exchange-agnostic async def execute_signal(layer: UnifiedExchangeLayer, signal: dict): if signal[\u0026#34;direction\u0026#34;] == \u0026#34;long\u0026#34;: order = await layer.place_order( symbol=\u0026#34;BTC/USDT\u0026#34;, side=\u0026#34;buy\u0026#34;, order_type=\u0026#34;limit\u0026#34;, quantity=0.01, price=signal[\u0026#34;entry_price\u0026#34;], ) elif signal[\u0026#34;direction\u0026#34;] == \u0026#34;short\u0026#34;: order = await layer.place_order( symbol=\u0026#34;BTC/USDT\u0026#34;, side=\u0026#34;sell\u0026#34;, order_type=\u0026#34;market\u0026#34;, quantity=0.01, ) if order.status in (OrderStatus.OPEN, OrderStatus.FILLED): logger.info(f\u0026#34;executed on {order.exchange}: {order.order_id}\u0026#34;) else: logger.error(f\u0026#34;execution failed: {order.error_msg}\u0026#34;) the layer handles routing to the best exchange, failover if primary is down, rate limiting, and order tracking. strategy just says \u0026ldquo;buy BTC\u0026rdquo; and doesn\u0026rsquo;t care about the plumbing.\nexchange health monitoring # this chart shows real latency data from my monitoring. you can see binance had a latency spike around hour 42-48 (some API maintenance thing) and kraken had an outage around hour 56. during both events my failover routing kicked in automatically and orders went to the healthy exchanges.\nrate limiting differences - the kraken problem # kraken\u0026rsquo;s rate limiting is the most aggressive of the three. 15 requests per second sounds fine until you realize:\nfetching balances = 1 request placing an order = 1 request checking order status = 1 request getting current price = 1 request that\u0026rsquo;s 4 requests just for a single trade cycle. at 15/s you can do maybe 3-4 trade cycles per second before getting rate limited. for my mean reversion strategy that needs fast execution, kraken is the bottleneck.\nsolution: use kraken for slower strategies (holding periods \u0026gt;1hr) and route fast strategies to binance (1200 req/min is much more generous).\nthe routing table handles this automatically:\nlayer.set_routing(\u0026#34;BTC/USDT\u0026#34;, [\u0026#34;binance\u0026#34;, \u0026#34;kraken\u0026#34;, \u0026#34;coinbase\u0026#34;]) # fast strats layer.set_routing(\u0026#34;ETH/USDT\u0026#34;, [\u0026#34;binance\u0026#34;, \u0026#34;coinbase\u0026#34;, \u0026#34;kraken\u0026#34;]) layer.set_routing(\u0026#34;SOL/USDT\u0026#34;, [\u0026#34;binance\u0026#34;, \u0026#34;coinbase\u0026#34;]) # kraken doesn\u0026#39;t have good SOL liquidity error rate by exchange # look at kraken\u0026rsquo;s rate limit errors. SMH. that\u0026rsquo;s with my rate limiter in place too - imagine what it\u0026rsquo;d be like without it. i\u0026rsquo;ve been reading through some NexusFi exchange comparison threads to see how other algo traders handle this. consensus seems to be kraken\u0026rsquo;s API is powerful but punishing.\nlessons learned # don\u0026rsquo;t trust exchange status pages - binance can say \u0026ldquo;operational\u0026rdquo; while their API is returning 500s. monitor it yourself.\nconnection pooling matters more than you think - reusing TCP connections saved ~30ms per request. that adds up fast.\nfailover needs to be automatic - by the time you notice an exchange is down and manually reroute, you\u0026rsquo;ve missed your entry. automate it.\nrate limit headroom - never run at \u0026gt;70% of rate limit capacity. leave room for burst operations (like closing multiple positions during a stop-loss cascade).\nlog everything - every order, every fill, every error. when something goes wrong at 3am and you\u0026rsquo;re trying to figure out what happened, logs are the only thing that matters.\nthe unified layer has been running for 9 days now. handled 2 exchange outages, 47 rate limit events, and ~1,200 orders without any missed executions. not bad for v1.\n-AK\n","date":"10 March 2026","externalUrl":null,"permalink":"/posts/2026-03-10-exchange-connectivity-unified-layer/","section":"Posts","summary":"\u003cp\u003eone of the most annoying parts of crypto algo trading is that every exchange has a different API. different auth schemes, different rate limits, different order types, different error codes. writing strategy logic for each exchange separately is a nightmare and a maintenance disaster.\u003c/p\u003e","title":"exchange connectivity layer - handling binance, kraken, and coinbase in one abstraction","type":"posts"},{"content":"","date":"10 March 2026","externalUrl":null,"permalink":"/tags/exchanges/","section":"Tags","summary":"","title":"Exchanges","type":"tags"},{"content":"","date":"8 March 2026","externalUrl":null,"permalink":"/tags/cooking/","section":"Tags","summary":"","title":"Cooking","type":"tags"},{"content":"a has been on this kick where she wants me to learn to cook. not like ramen-and-eggs level (i can manage that without supervision). she means actual cooking. from recipes. with ingredients that expire.\nthe great cooking experiment # so she left me alone thursday night to go to dinner with her college friends. before she left she was like \u0026ldquo;there\u0026rsquo;s pasta sauce in the fridge, just heat it up and boil spaghetti. you literally cannot fuck this up.\u0026rdquo;\nchallenge accepted apparently.\nwhat happened was:\nput the pot of water on the stove, fine while waiting for it to boil, decided to check my BTC algo\u0026rsquo;s overnight performance got absorbed in a weird slippage pattern on one of my binance fills forgot about the pot water boiled off pot started smoking smoke alarm went off a came home to every window open, the exhaust fan running, and me standing in the kitchen with a wet towel waving at the smoke detector like an absolute dipshit.\nshe didn\u0026rsquo;t say anything for like 10 seconds. just stared at me. then she started laughing so hard she had to sit down on the floor.\n\u0026ldquo;you\u0026rsquo;re literally a millionaire who can build trading algorithms but you can\u0026rsquo;t boil water unsupervised\u0026rdquo;\ni mean. she\u0026rsquo;s not wrong.\nthe makeup dinner # she took over and made this insane garlic shrimp pasta thing in like 25 minutes. i sat at the counter and watched because she said if i touched anything in the kitchen she\u0026rsquo;d change the wifi password and brick my algo servers.\nNGL watching her cook is genuinely one of my favorite things. she puts on this 90s R\u0026amp;B playlist and dances around the kitchen and uses way too much garlic on everything. her hair was still done up from going out and she was wearing this sundress and i just sat there thinking how the fuck did i get this lucky.\ntold her that. she threw a piece of garlic at my head and said \u0026ldquo;flattery won\u0026rsquo;t save you from cooking lessons.\u0026rdquo;\nthe cooking lesson plan # she made a deal with me. i have to cook one meal per week. she picks the recipe, buys the ingredients, and supervises. if i successfully cook 10 meals without a fire department visit, she\u0026rsquo;ll\u0026hellip; let\u0026rsquo;s just say the reward involves the balcony and some shit from her wishlist that we\u0026rsquo;ve been talking about trying. IYKYK.\npretty solid incentive structure honestly.\nfirst assigned meal: stir fry. she said it\u0026rsquo;s \u0026ldquo;basically impossible to mess up.\u0026rdquo; but she also said that about boiling water so her confidence in my kitchen skills seems unfounded.\ndr r thinks it\u0026rsquo;s cute # told dr r about the cooking situation during our session friday. she asked what it means to me that a wants to teach me something domestic.\ni said probably that she sees a future with us. you don\u0026rsquo;t teach someone to cook if you\u0026rsquo;re planning to leave.\ndr r did that therapist thing where she nods slowly like i just unlocked some deep truth. then she asked if accepting help in the kitchen is harder than i expected.\nfuck. yeah it is. i like being good at things. i\u0026rsquo;m good at coding, good at trading, good at building servers. being a complete beginner at something as basic as cooking makes me feel like an idiot.\ndr r said \u0026ldquo;interesting that you\u0026rsquo;d rather almost burn your apartment down than ask for help before it became an emergency.\u0026rdquo;\ni hate when she\u0026rsquo;s right.\nthe apartment update # speaking of the apartment - we\u0026rsquo;ve been here over 2 years now and it\u0026rsquo;s feeling more like ours than mine. a rearranged the living room last weekend while i was debugging a redis connection issue. moved the couch to face the windows instead of the TV.\nat first i was annoyed because she didn\u0026rsquo;t ask. then i sat on the couch and watched the sunset over the ocean and was like\u0026hellip; okay this is objectively better.\nshe also put up some photos. one from our trip to joshua tree last fall. one from her parents\u0026rsquo; house at christmas. one of us at the beach that her friend took. first time i\u0026rsquo;ve had actual framed photos in this apartment since my parents died.\nused to have photos of them everywhere. packed them all away about 6 months after the accident because looking at them made it hard to breathe. haven\u0026rsquo;t unpacked them.\na didn\u0026rsquo;t push me to put up the new ones. just did it quietly one afternoon while i was trading. when i noticed she said \u0026ldquo;if you don\u0026rsquo;t like them i\u0026rsquo;ll take them down.\u0026rdquo;\ni like them.\nthe sleep situation # been sleeping better lately. used to wake up at 3am every night with this chest-tightening anxiety thing. dr r said it was hypervigilance - my nervous system stuck in fight-or-flight mode from the grief.\nhasn\u0026rsquo;t happened in almost 3 weeks. a noticed too. she sleeps like a corpse (doesn\u0026rsquo;t move all night, barely breathes, honestly kind of creepy) so she always knows when i\u0026rsquo;m restless because i wake her up tossing around.\nshe said the other morning \u0026ldquo;you haven\u0026rsquo;t woken me up in weeks. whatever you and dr r are working on, keep doing it.\u0026rdquo;\ni think it\u0026rsquo;s a combination of therapy and just\u0026hellip; time. and her. having someone next to you who consistently shows up. night after night. doesn\u0026rsquo;t leave. doesn\u0026rsquo;t die.\nthat last part hit me as i typed it. fuck.\nweekend plans # she wants to go to the farmers market tomorrow. i\u0026rsquo;ll go because she likes it and because the tamale lady is there and tamales are the one food i don\u0026rsquo;t need cooking lessons for (you just eat them, no preparation required, my kind of cuisine).\nmight try to convince her to hit the beach after. water\u0026rsquo;s still cold as fuck in march but she looks incredible in a bikini and the sun\u0026rsquo;s been out all week.\n-AK\n","date":"8 March 2026","externalUrl":null,"permalink":"/posts/2026-03-08-saturday-apartment-cooking-disaster/","section":"Posts","summary":"\u003cp\u003ea has been on this kick where she wants me to learn to cook. not like ramen-and-eggs level (i can manage that without supervision). she means actual cooking. from recipes. with ingredients that expire.\u003c/p\u003e","title":"saturday - apartment shit and almost burning the kitchen down","type":"posts"},{"content":"been refactoring my signal generation pipeline for the last 2 weeks. old version was synchronous - fetch data, compute indicators, generate signal, repeat. worked fine when i was running 3 strategies. now i\u0026rsquo;m running 11 and the whole thing was choking.\nthe bottleneck # my old pipeline looked like this:\n# old synchronous garbage def generate_signals(strategies: list[Strategy]) -\u0026gt; list[Signal]: signals = [] for strategy in strategies: data = fetch_market_data(strategy.symbols) # 200-800ms per call indicators = compute_indicators(data) # 50-150ms signal = strategy.evaluate(indicators) # 10-30ms signals.append(signal) return signals 11 strategies × ~500ms average data fetch = 5.5 seconds just for data. add indicator computation and you\u0026rsquo;re looking at 7-8 seconds per cycle. my fastest strategy needs signals every 2 seconds.\nmath doesn\u0026rsquo;t work.\nasync everything # rewrote the whole thing with asyncio + aiohttp. the difference is stupid:\nimport asyncio import aiohttp import numpy as np from dataclasses import dataclass, field from typing import Optional from datetime import datetime, timezone import time import logging logger = logging.getLogger(__name__) @dataclass class MarketSnapshot: symbol: str bid: float ask: float last: float volume: int timestamp: float exchange: str @property def mid(self) -\u0026gt; float: return (self.bid + self.ask) / 2 @property def spread_bps(self) -\u0026gt; float: if self.mid == 0: return 0 return ((self.ask - self.bid) / self.mid) * 10000 @dataclass class Signal: strategy_id: str symbol: str direction: int # 1 = long, -1 = short, 0 = flat strength: float # 0.0 to 1.0 confidence: float timestamp: float metadata: dict = field(default_factory=dict) @property def is_actionable(self) -\u0026gt; bool: return abs(self.direction) == 1 and self.strength \u0026gt; 0.3 and self.confidence \u0026gt; 0.5 class AsyncDataFetcher: \u0026#34;\u0026#34;\u0026#34;fetches market data from multiple sources concurrently\u0026#34;\u0026#34;\u0026#34; def __init__(self, sources: dict[str, str]): self.sources = sources # {exchange: base_url} self._session: Optional[aiohttp.ClientSession] = None self._cache: dict[str, tuple[float, MarketSnapshot]] = {} self.cache_ttl = 0.1 # 100ms cache to prevent hammering async def _get_session(self) -\u0026gt; aiohttp.ClientSession: if self._session is None or self._session.closed: timeout = aiohttp.ClientTimeout(total=2.0, connect=0.5) self._session = aiohttp.ClientSession(timeout=timeout) return self._session async def fetch_symbol( self, symbol: str, exchange: str ) -\u0026gt; Optional[MarketSnapshot]: cache_key = f\u0026#34;{exchange}:{symbol}\u0026#34; now = time.monotonic() # check cache first if cache_key in self._cache: cached_time, cached_snap = self._cache[cache_key] if now - cached_time \u0026lt; self.cache_ttl: return cached_snap try: session = await self._get_session() url = f\u0026#34;{self.sources[exchange]}/v1/quote/{symbol}\u0026#34; async with session.get(url) as resp: if resp.status != 200: logger.warning(f\u0026#34;bad response {resp.status} for {symbol}@{exchange}\u0026#34;) return None data = await resp.json() snap = MarketSnapshot( symbol=symbol, bid=data[\u0026#34;bid\u0026#34;], ask=data[\u0026#34;ask\u0026#34;], last=data[\u0026#34;last\u0026#34;], volume=data[\u0026#34;volume\u0026#34;], timestamp=data[\u0026#34;timestamp\u0026#34;], exchange=exchange, ) self._cache[cache_key] = (now, snap) return snap except asyncio.TimeoutError: logger.error(f\u0026#34;timeout fetching {symbol}@{exchange}\u0026#34;) return None except Exception as e: logger.error(f\u0026#34;error fetching {symbol}@{exchange}: {e}\u0026#34;) return None async def fetch_batch( self, symbols: list[str], exchange: str ) -\u0026gt; dict[str, MarketSnapshot]: tasks = [self.fetch_symbol(s, exchange) for s in symbols] results = await asyncio.gather(*tasks, return_exceptions=True) snapshots = {} for symbol, result in zip(symbols, results): if isinstance(result, MarketSnapshot): snapshots[symbol] = result elif isinstance(result, Exception): logger.error(f\u0026#34;exception for {symbol}: {result}\u0026#34;) return snapshots async def close(self): if self._session and not self._session.closed: await self._session.close() class SignalEngine: \u0026#34;\u0026#34;\u0026#34;async signal generation across multiple strategies\u0026#34;\u0026#34;\u0026#34; def __init__(self, fetcher: AsyncDataFetcher): self.fetcher = fetcher self.strategies: dict[str, \u0026#39;BaseStrategy\u0026#39;] = {} self._signal_history: list[Signal] = [] self._cycle_times: list[float] = [] def register_strategy(self, strategy: \u0026#39;BaseStrategy\u0026#39;): self.strategies[strategy.strategy_id] = strategy logger.info(f\u0026#34;registered strategy: {strategy.strategy_id}\u0026#34;) async def generate_cycle(self) -\u0026gt; list[Signal]: \u0026#34;\u0026#34;\u0026#34;run one full signal generation cycle across all strategies\u0026#34;\u0026#34;\u0026#34; cycle_start = time.monotonic() # collect all unique symbols needed all_symbols: dict[str, set[str]] = {} # {exchange: {symbols}} for strategy in self.strategies.values(): for symbol, exchange in strategy.required_feeds: all_symbols.setdefault(exchange, set()).add(symbol) # fetch all data concurrently fetch_tasks = [] for exchange, symbols in all_symbols.items(): fetch_tasks.append( self.fetcher.fetch_batch(list(symbols), exchange) ) all_snapshots_list = await asyncio.gather(*fetch_tasks) # merge into single dict snapshots: dict[str, MarketSnapshot] = {} for batch in all_snapshots_list: for key, snap in batch.items(): snapshots[f\u0026#34;{snap.exchange}:{key}\u0026#34;] = snap # generate signals concurrently signal_tasks = [] for strategy in self.strategies.values(): signal_tasks.append( self._run_strategy(strategy, snapshots) ) signal_batches = await asyncio.gather(*signal_tasks, return_exceptions=True) signals = [] for batch in signal_batches: if isinstance(batch, list): signals.extend(batch) elif isinstance(batch, Exception): logger.error(f\u0026#34;strategy error: {batch}\u0026#34;) cycle_time = time.monotonic() - cycle_start self._cycle_times.append(cycle_time) if len(self._cycle_times) % 100 == 0: avg = np.mean(self._cycle_times[-100:]) p99 = np.percentile(self._cycle_times[-100:], 99) logger.info(f\u0026#34;cycle stats - avg: {avg*1000:.1f}ms, p99: {p99*1000:.1f}ms\u0026#34;) self._signal_history.extend(signals) return signals async def _run_strategy( self, strategy: \u0026#39;BaseStrategy\u0026#39;, snapshots: dict ) -\u0026gt; list[Signal]: \u0026#34;\u0026#34;\u0026#34;run a single strategy\u0026#39;s signal generation\u0026#34;\u0026#34;\u0026#34; try: relevant = {} for symbol, exchange in strategy.required_feeds: key = f\u0026#34;{exchange}:{symbol}\u0026#34; if key in snapshots: relevant[symbol] = snapshots[key] if len(relevant) \u0026lt; strategy.min_required_feeds: logger.warning( f\u0026#34;{strategy.strategy_id}: insufficient data \u0026#34; f\u0026#34;({len(relevant)}/{strategy.min_required_feeds})\u0026#34; ) return [] return await strategy.generate(relevant) except Exception as e: logger.error(f\u0026#34;{strategy.strategy_id} failed: {e}\u0026#34;) return [] @property def avg_cycle_ms(self) -\u0026gt; float: if not self._cycle_times: return 0 return np.mean(self._cycle_times[-50:]) * 1000 class BaseStrategy: \u0026#34;\u0026#34;\u0026#34;base class for signal generation strategies\u0026#34;\u0026#34;\u0026#34; def __init__(self, strategy_id: str): self.strategy_id = strategy_id self.required_feeds: list[tuple[str, str]] = [] self.min_required_feeds: int = 1 self._lookback: list[dict[str, MarketSnapshot]] = [] self.lookback_size: int = 100 async def generate(self, snapshots: dict[str, MarketSnapshot]) -\u0026gt; list[Signal]: self._lookback.append(snapshots) if len(self._lookback) \u0026gt; self.lookback_size: self._lookback = self._lookback[-self.lookback_size:] if len(self._lookback) \u0026lt; 10: return [] # need minimum history return await self._evaluate(snapshots) async def _evaluate(self, snapshots: dict[str, MarketSnapshot]) -\u0026gt; list[Signal]: raise NotImplementedError class MomentumCrossStrategy(BaseStrategy): \u0026#34;\u0026#34;\u0026#34;simple momentum crossover - fast EMA vs slow EMA on mid prices\u0026#34;\u0026#34;\u0026#34; def __init__(self, symbol: str, exchange: str, fast: int = 8, slow: int = 21): super().__init__(f\u0026#34;momentum_cross_{symbol}_{fast}_{slow}\u0026#34;) self.symbol = symbol self.required_feeds = [(symbol, exchange)] self.fast_period = fast self.slow_period = slow self.min_required_feeds = 1 self.lookback_size = slow * 3 async def _evaluate(self, snapshots: dict[str, MarketSnapshot]) -\u0026gt; list[Signal]: if self.symbol not in snapshots: return [] mids = np.array([ lb[self.symbol].mid for lb in self._lookback if self.symbol in lb ]) if len(mids) \u0026lt; self.slow_period: return [] # compute EMAs fast_ema = self._ema(mids, self.fast_period) slow_ema = self._ema(mids, self.slow_period) # crossover detection if len(fast_ema) \u0026lt; 2: return [] prev_diff = fast_ema[-2] - slow_ema[-2] curr_diff = fast_ema[-1] - slow_ema[-1] direction = 0 if prev_diff \u0026lt;= 0 and curr_diff \u0026gt; 0: direction = 1 # bullish crossover elif prev_diff \u0026gt;= 0 and curr_diff \u0026lt; 0: direction = -1 # bearish crossover if direction == 0: return [] strength = min(abs(curr_diff) / snapshots[self.symbol].mid * 1000, 1.0) return [Signal( strategy_id=self.strategy_id, symbol=self.symbol, direction=direction, strength=strength, confidence=0.6 if abs(curr_diff) \u0026gt; abs(prev_diff) else 0.4, timestamp=time.time(), metadata={ \u0026#34;fast_ema\u0026#34;: float(fast_ema[-1]), \u0026#34;slow_ema\u0026#34;: float(slow_ema[-1]), \u0026#34;spread_bps\u0026#34;: snapshots[self.symbol].spread_bps, } )] @staticmethod def _ema(data: np.ndarray, period: int) -\u0026gt; np.ndarray: alpha = 2 / (period + 1) ema = np.zeros_like(data) ema[0] = data[0] for i in range(1, len(data)): ema[i] = alpha * data[i] + (1 - alpha) * ema[i - 1] return ema # ---- main loop ---- async def main(): sources = { \u0026#34;polygon\u0026#34;: \u0026#34;https://api.polygon.io\u0026#34;, \u0026#34;binance\u0026#34;: \u0026#34;https://api.binance.us\u0026#34;, \u0026#34;ib\u0026#34;: \u0026#34;http://localhost:5000\u0026#34;, # local IB gateway } fetcher = AsyncDataFetcher(sources) engine = SignalEngine(fetcher) # register strategies engine.register_strategy(MomentumCrossStrategy(\u0026#34;BTCUSD\u0026#34;, \u0026#34;binance\u0026#34;, 8, 21)) engine.register_strategy(MomentumCrossStrategy(\u0026#34;ETHUSD\u0026#34;, \u0026#34;binance\u0026#34;, 5, 13)) engine.register_strategy(MomentumCrossStrategy(\u0026#34;ES\u0026#34;, \u0026#34;ib\u0026#34;, 10, 30)) engine.register_strategy(MomentumCrossStrategy(\u0026#34;NQ\u0026#34;, \u0026#34;ib\u0026#34;, 8, 21)) logger.info(f\u0026#34;starting signal engine with {len(engine.strategies)} strategies\u0026#34;) try: while True: signals = await engine.generate_cycle() actionable = [s for s in signals if s.is_actionable] if actionable: for sig in actionable: logger.info( f\u0026#34;SIGNAL: {sig.strategy_id} -\u0026gt; {sig.symbol} \u0026#34; f\u0026#34;{\u0026#39;LONG\u0026#39; if sig.direction == 1 else \u0026#39;SHORT\u0026#39;} \u0026#34; f\u0026#34;strength={sig.strength:.2f} conf={sig.confidence:.2f}\u0026#34; ) await asyncio.sleep(1.0) # 1 second cycles except KeyboardInterrupt: logger.info(\u0026#34;shutting down\u0026#34;) finally: await fetcher.close() if __name__ == \u0026#34;__main__\u0026#34;: logging.basicConfig(level=logging.INFO) asyncio.run(main()) performance difference # old sync pipeline: 7.2 seconds per cycle (11 strategies)\nnew async pipeline: 380ms per cycle (11 strategies, same data sources)\nthat\u0026rsquo;s a 19x improvement just from running data fetches concurrently. the compute part (indicators + signal evaluation) was already fast - it was the I/O killing me.\nthe cache layer matters # one thing that surprised me - even with async, you can hammer your data sources too hard. polygon.io rate-limits at 100 req/s on my plan. 11 strategies needing 4-5 symbols each = 50+ requests per cycle. at 1 second cycles that\u0026rsquo;s fine but if i want sub-second cycles i need caching.\nadded a 100ms TTL cache in the fetcher. if two strategies need BTCUSD from binance within 100ms, second one gets cached data. sounds obvious but it reduced API calls by ~40% without meaningfully increasing data staleness.\nfor context - BTC moves about 0.001% in 100ms on average. that\u0026rsquo;s noise. my strategies need price changes \u0026gt;0.05% to trigger signals. the cache isn\u0026rsquo;t hurting signal quality at all.\nlearned about cache invalidation strategies from NexusFi\u0026rsquo;s infrastructure discussions - some of those guys are running way more sophisticated setups than mine.\ngotchas i hit # 1. aiohttp connection pooling\nby default aiohttp creates a new TCP connection per request. for low-latency data fetching that\u0026rsquo;s terrible - TCP handshake adds 10-30ms. you need connection pooling:\nconnector = aiohttp.TCPConnector( limit=100, # max connections total limit_per_host=20, # max per host keepalive_timeout=30, enable_cleanup_closed=True, ) session = aiohttp.ClientSession(connector=connector) 2. asyncio.gather exception handling\nasyncio.gather(*tasks) by default raises on first exception. set return_exceptions=True or one failed data source kills your entire cycle. learned this the hard way when binance went down for 30 seconds and my entire pipeline crashed.\n3. backpressure when signals pile up\nif the execution engine is slow and signals queue up, you can get stale signals executing. added a TTL to signals - anything older than 5 seconds gets dropped:\ndef filter_stale(signals: list[Signal], max_age: float = 5.0) -\u0026gt; list[Signal]: now = time.time() return [s for s in signals if now - s.timestamp \u0026lt; max_age] what\u0026rsquo;s next # working on adding websocket feeds instead of REST polling. polygon and binance both support websocket streams which should drop latency even further. instead of polling every second, i\u0026rsquo;d get push updates on every tick.\nthe challenge is managing websocket reconnection gracefully. connections drop, exchanges do maintenance, etc. need a robust reconnect mechanism with exponential backoff.\nalso want to add signal correlation detection - if 3 strategies all fire long signals on the same symbol within 2 seconds, that\u0026rsquo;s probably a stronger signal than any individual one. need to build a signal aggregation layer.\n-AK\n","date":"7 March 2026","externalUrl":null,"permalink":"/posts/2026-03-07-signal-generation-pipeline-async-python/","section":"Posts","summary":"\u003cp\u003ebeen refactoring my signal generation pipeline for the last 2 weeks. old version was synchronous - fetch data, compute indicators, generate signal, repeat. worked fine when i was running 3 strategies. now i\u0026rsquo;m running 11 and the whole thing was choking.\u003c/p\u003e","title":"async signal generation - why your pipeline is probably too slow","type":"posts"},{"content":"","date":"7 March 2026","externalUrl":null,"permalink":"/tags/pipeline/","section":"Tags","summary":"","title":"Pipeline","type":"tags"},{"content":"","date":"5 March 2026","externalUrl":null,"permalink":"/tags/postgres/","section":"Tags","summary":"","title":"Postgres","type":"tags"},{"content":"moved all my real-time market data from postgres to redis about 8 weeks ago. latency dropped from ~15ms to sub-millisecond. should\u0026rsquo;ve done this way earlier.\nthe postgres problem # when i first built my algo infrastructure i stored everything in postgres because that\u0026rsquo;s what i knew. tick data, order book snapshots, greeks, everything went into timescaledb (postgres extension for time-series).\nworked fine for backtesting and analysis. reading historical data? postgres crushes it.\nbut real-time execution? different story.\nmy algos were querying postgres every 500ms for:\nlatest BTC/ETH prices across 3 exchanges SPX option greeks for 50+ contracts ES/NQ futures prices current portfolio positions postgres was averaging 12-18ms per query. sounds fast but when you\u0026rsquo;re making trading decisions in real-time, 15ms of stale data can fuck you.\nexample: algo sees BTC at $68,450 (from postgres), decides to buy. by the time order hits binance, BTC is at $68,510. slippage just ate my edge.\nlearned a ton from NexusFi infrastructure threads about how pro traders handle real-time data. answer: in-memory everything.\nenter redis # redis is an in-memory key-value store. no disk I/O for reads (unless you force persistence). everything lives in RAM.\nquery latency? \u0026lt;1ms. usually 0.2-0.5ms.\nthat 15ms vs 0.3ms difference doesn\u0026rsquo;t sound like much but when your algo is checking prices hundreds of times per second, it adds up to actual edge.\narchitecture # here\u0026rsquo;s what i built:\nimport redis import json import time from typing import Dict, Optional from dataclasses import dataclass, asdict from datetime import datetime @dataclass class MarketData: \u0026#34;\u0026#34;\u0026#34;Standardized market data structure\u0026#34;\u0026#34;\u0026#34; symbol: str price: float bid: float ask: float volume_24h: float timestamp: float exchange: str class RedisMarketData: \u0026#34;\u0026#34;\u0026#34; Real-time market data cache using Redis Design: - Each symbol gets a hash key: \u0026#34;market:{symbol}\u0026#34; - TTL on all keys: 5 seconds (auto-expire stale data) - Pub/Sub for live updates to subscribed algos - Sorted sets for fast top-N queries \u0026#34;\u0026#34;\u0026#34; def __init__( self, host: str = \u0026#39;localhost\u0026#39;, port: int = 6379, db: int = 0 ): self.redis = redis.Redis( host=host, port=port, db=db, decode_responses=True ) self.pubsub = self.redis.pubsub() def update_market_data( self, data: MarketData, ttl: int = 5 ) -\u0026gt; None: \u0026#34;\u0026#34;\u0026#34; Store latest market data with TTL TTL ensures stale data expires automatically. If feed dies, data disappears after 5 seconds. \u0026#34;\u0026#34;\u0026#34; key = f\u0026#34;market:{data.symbol}\u0026#34; # Store as hash (faster than JSON for partial updates) pipeline = self.redis.pipeline() pipeline.hset(key, mapping=asdict(data)) pipeline.expire(key, ttl) # Update sorted set for fast ranking queries # Score = timestamp (allows time-based sorting) pipeline.zadd( \u0026#34;market:timestamps\u0026#34;, {data.symbol: data.timestamp} ) pipeline.execute() # Publish update to subscribers self.redis.publish( f\u0026#34;updates:{data.symbol}\u0026#34;, json.dumps(asdict(data)) ) def get_market_data( self, symbol: str ) -\u0026gt; Optional[MarketData]: \u0026#34;\u0026#34;\u0026#34; Retrieve latest market data (sub-ms latency) Returns None if data expired (feed died) \u0026#34;\u0026#34;\u0026#34; key = f\u0026#34;market:{data.symbol}\u0026#34; data = self.redis.hgetall(key) if not data: return None # Convert back to dataclass return MarketData( symbol=data[\u0026#39;symbol\u0026#39;], price=float(data[\u0026#39;price\u0026#39;]), bid=float(data[\u0026#39;bid\u0026#39;]), ask=float(data[\u0026#39;ask\u0026#39;]), volume_24h=float(data[\u0026#39;volume_24h\u0026#39;]), timestamp=float(data[\u0026#39;timestamp\u0026#39;]), exchange=data[\u0026#39;exchange\u0026#39;] ) def get_spread_bps(self, symbol: str) -\u0026gt; Optional[float]: \u0026#34;\u0026#34;\u0026#34;Calculate current bid-ask spread in basis points\u0026#34;\u0026#34;\u0026#34; data = self.get_market_data(symbol) if not data: return None mid = (data.bid + data.ask) / 2 spread = data.ask - data.bid return (spread / mid) * 10000 # Convert to bps def get_stale_symbols( self, max_age_seconds: float = 2.0 ) -\u0026gt; list[str]: \u0026#34;\u0026#34;\u0026#34; Find symbols with data older than threshold Useful for detecting dead feeds \u0026#34;\u0026#34;\u0026#34; now = time.time() cutoff = now - max_age_seconds # Query sorted set for timestamps \u0026lt; cutoff stale = self.redis.zrangebyscore( \u0026#34;market:timestamps\u0026#34;, \u0026#34;-inf\u0026#34;, cutoff ) return stale def subscribe_to_updates( self, symbols: list[str], callback ) -\u0026gt; None: \u0026#34;\u0026#34;\u0026#34; Subscribe to real-time updates via pub/sub Callback receives MarketData object on each update \u0026#34;\u0026#34;\u0026#34; channels = [f\u0026#34;updates:{s}\u0026#34; for s in symbols] self.pubsub.subscribe(*channels) for message in self.pubsub.listen(): if message[\u0026#39;type\u0026#39;] == \u0026#39;message\u0026#39;: data = json.loads(message[\u0026#39;data\u0026#39;]) callback(MarketData(**data)) class MarketDataAggregator: \u0026#34;\u0026#34;\u0026#34; Aggregate market data across multiple exchanges Uses Redis to cache best bid/ask across venues \u0026#34;\u0026#34;\u0026#34; def __init__(self, redis_client: RedisMarketData): self.redis = redis_client def update_aggregated_book( self, symbol: str, exchange_data: list[MarketData] ) -\u0026gt; None: \u0026#34;\u0026#34;\u0026#34; Find best bid/ask across all exchanges Stores in Redis for instant lookup \u0026#34;\u0026#34;\u0026#34; if not exchange_data: return # Find best bid (highest) best_bid = max(exchange_data, key=lambda x: x.bid) # Find best ask (lowest) best_ask = min(exchange_data, key=lambda x: x.ask) # Create aggregated view agg = MarketData( symbol=symbol, price=(best_bid.bid + best_ask.ask) / 2, # Mid price bid=best_bid.bid, ask=best_ask.ask, volume_24h=sum(d.volume_24h for d in exchange_data), timestamp=time.time(), exchange=\u0026#39;aggregated\u0026#39; ) # Store with \u0026#34;agg:\u0026#34; prefix key = f\u0026#34;market:agg:{symbol}\u0026#34; self.redis.redis.hset(key, mapping=asdict(agg)) self.redis.redis.expire(key, 5) def get_best_execution_venue( self, symbol: str, side: str, # \u0026#39;buy\u0026#39; or \u0026#39;sell\u0026#39; size_usd: float ) -\u0026gt; Optional[str]: \u0026#34;\u0026#34;\u0026#34; Find best exchange for execution based on current book Accounts for size vs available depth \u0026#34;\u0026#34;\u0026#34; # Get data from all exchanges exchanges = [\u0026#39;binance\u0026#39;, \u0026#39;kraken\u0026#39;, \u0026#39;coinbase\u0026#39;] venue_data = [] for exchange in exchanges: key = f\u0026#34;market:{symbol}:{exchange}\u0026#34; data = self.redis.redis.hgetall(key) if data: venue_data.append((exchange, data)) if not venue_data: return None # Simple: pick best price # TODO: factor in depth, fees, latency if side == \u0026#39;buy\u0026#39;: # Want lowest ask best = min(venue_data, key=lambda x: float(x[1][\u0026#39;ask\u0026#39;])) else: # Want highest bid best = max(venue_data, key=lambda x: float(x[1][\u0026#39;bid\u0026#39;])) return best[0] # Usage in trading algo def algo_execution_example(): \u0026#34;\u0026#34;\u0026#34; Example: Algo checks Redis for latest prices \u0026#34;\u0026#34;\u0026#34; redis_data = RedisMarketData() # Algo loop while True: # Get latest BTC price across exchanges btc_binance = redis_data.get_market_data(\u0026#34;BTCUSDT:binance\u0026#34;) btc_kraken = redis_data.get_market_data(\u0026#34;XBTUSD:kraken\u0026#34;) btc_coinbase = redis_data.get_market_data(\u0026#34;BTC-USD:coinbase\u0026#34;) if not all([btc_binance, btc_kraken, btc_coinbase]): print(\u0026#34;Stale data detected, skipping cycle\u0026#34;) time.sleep(0.1) continue # Calculate cross-exchange spread prices = [btc_binance.price, btc_kraken.price, btc_coinbase.price] spread = (max(prices) - min(prices)) / min(prices) * 10000 # bps if spread \u0026gt; 10: # 10 bps spread print(f\u0026#34;Arb opportunity: {spread:.2f} bps\u0026#34;) # Execute arb strategy... time.sleep(0.1) # 100ms cycle time # Feed updater (runs separately) async def feed_updater(): \u0026#34;\u0026#34;\u0026#34; Background process: pulls from exchange APIs, updates Redis This runs 24/7, constantly updating Redis cache \u0026#34;\u0026#34;\u0026#34; import ccxt redis_data = RedisMarketData() binance = ccxt.binance() kraken = ccxt.kraken() symbols = [\u0026#39;BTC/USDT\u0026#39;, \u0026#39;ETH/USDT\u0026#39;, \u0026#39;SOL/USDT\u0026#39;] while True: for symbol in symbols: try: # Fetch from Binance ticker = binance.fetch_ticker(symbol) data = MarketData( symbol=f\u0026#34;{symbol}:binance\u0026#34;, price=ticker[\u0026#39;last\u0026#39;], bid=ticker[\u0026#39;bid\u0026#39;], ask=ticker[\u0026#39;ask\u0026#39;], volume_24h=ticker[\u0026#39;quoteVolume\u0026#39;], timestamp=time.time(), exchange=\u0026#39;binance\u0026#39; ) # Update Redis (0.3ms operation) redis_data.update_market_data(data) except Exception as e: print(f\u0026#34;Error updating {symbol}: {e}\u0026#34;) await asyncio.sleep(0.5) # Update every 500ms results # before redis (postgres):\navg query latency: 15ms p99 query latency: 45ms max concurrent queries: ~50/sec before DB chokes after redis:\navg query latency: 0.3ms p99 query latency: 1.2ms max concurrent queries: 10,000+/sec (not even breaking a sweat) that 50x latency improvement translated to tighter fills and less slippage. measuring ~0.8 bps improvement on avg fill quality for crypto trades.\ndoesn\u0026rsquo;t sound like much but on $2M+ daily volume it\u0026rsquo;s like $1600/day or $400k/year. pays for the entire server rack.\npostgres still has a role # didn\u0026rsquo;t completely ditch postgres. still use it for:\nhistorical data storage - all tick data goes to timescaledb after the fact for backtesting EOD analytics - calculate daily stats, store in postgres audit trail - every trade logged to postgres for compliance slow queries - anything that doesn\u0026rsquo;t need \u0026lt;10ms latency redis is ephemeral (in-memory). if server crashes, data gone. so postgres is the permanent record. redis is the speed layer.\nlessons # know your query patterns - if you\u0026rsquo;re doing tons of small reads, in-memory wins. big analytical queries? postgres.\nlatency matters exponentially - 15ms doesn\u0026rsquo;t sound bad until you realize your competitor is at 0.5ms and they\u0026rsquo;re front-running you.\nTTLs prevent stale data bugs - auto-expiring keys in redis means if a feed dies, your algo knows immediately. no more trading on 5-minute-old prices.\nredis isn\u0026rsquo;t a database replacement - it\u0026rsquo;s a cache. treat it as such. postgres is still the source of truth.\npub/sub is underrated - instead of polling redis every 100ms, use pub/sub to get pushed updates. even lower latency.\nstill tuning the setup. thinking about adding redis cluster for HA (currently single instance = single point of failure). also want to experiment with valkey (redis fork) to see if performance is any different.\nbut for now this setup is crushing it. latency down 50x, fills tighter, edge preserved.\n-AK\n","date":"5 March 2026","externalUrl":null,"permalink":"/posts/2026-03-05-redis-market-data-latency-optimization/","section":"Posts","summary":"\u003cp\u003emoved all my real-time market data from postgres to redis about 8 weeks ago. latency dropped from ~15ms to sub-millisecond. should\u0026rsquo;ve done this way earlier.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe postgres problem \n    \u003cdiv id=\"the-postgres-problem\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-postgres-problem\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003ewhen i first built my algo infrastructure i stored everything in postgres because that\u0026rsquo;s what i knew. tick data, order book snapshots, greeks, everything went into timescaledb (postgres extension for time-series).\u003c/p\u003e","title":"redis for market data - why i ditched postgres","type":"posts"},{"content":"been thinking about slippage modeling a lot lately. most backtest frameworks have absolute dogshit slippage assumptions - either zero (lmao) or some fixed percentage that doesn\u0026rsquo;t scale with order size or volatility.\nreal slippage isn\u0026rsquo;t linear. it\u0026rsquo;s ugly, non-stationary, and depends on like 10 different factors you can\u0026rsquo;t predict perfectly.\nthe problem with simple models # most backtests use something like:\nslippage = trade_price * 0.001 # 0.1% fixed slippage fill_price = trade_price + slippage this is fucking useless for multiple reasons:\ndoesn\u0026rsquo;t scale with size - 100 contracts != 1000 contracts in terms of market impact ignores volatility regime - slippage during VIX 15 != VIX 40 no spread modeling - bid-ask spreads widen during stress time of day blind - slippage at open != slippage at 3:55pm liquidity assumptions - assumes infinite depth been using NexusFi algo discussions to understand how other traders handle this. found this thread on realistic cost modeling that breaks down the actual components pretty well.\nbuilding a better model # here\u0026rsquo;s what i implemented - multi-factor slippage that accounts for the shit that actually matters:\nimport numpy as np import pandas as pd from dataclasses import dataclass from typing import Literal @dataclass class MarketState: \u0026#34;\u0026#34;\u0026#34;Current market conditions for slippage calculation\u0026#34;\u0026#34;\u0026#34; vix: float # Current VIX level spread_bps: float # Current bid-ask spread in basis points volume_ratio: float # Current volume vs 20-day avg (0-2+ range) time_of_day: str # \u0026#39;open\u0026#39;, \u0026#39;midday\u0026#39;, \u0026#39;close\u0026#39; @dataclass class OrderParams: \u0026#34;\u0026#34;\u0026#34;Order characteristics\u0026#34;\u0026#34;\u0026#34; size_usd: float # Order size in USD side: Literal[\u0026#39;buy\u0026#39;, \u0026#39;sell\u0026#39;] instrument: Literal[\u0026#39;options\u0026#39;, \u0026#39;futures\u0026#39;, \u0026#39;crypto\u0026#39;] adv_pct: float # Percentage of average daily volume class AdaptiveSlippageModel: \u0026#34;\u0026#34;\u0026#34; Multi-factor slippage model that scales with: - Order size (market impact) - Volatility regime (bid-ask spreads) - Time of day (liquidity patterns) - Instrument type (options spread wider than futures) \u0026#34;\u0026#34;\u0026#34; def __init__(self): # Base slippage by instrument (in bps) self.base_slippage = { \u0026#39;options\u0026#39;: 8.0, # Options have wider spreads \u0026#39;futures\u0026#39;: 2.0, # Tight spreads, high liquidity \u0026#39;crypto\u0026#39;: 5.0 # Medium spreads, varies by exchange } # Volatility scaling factors self.vix_scaling = { \u0026#39;low\u0026#39;: (0, 15, 1.0), # VIX 0-15: normal slippage \u0026#39;medium\u0026#39;: (15, 25, 1.5), # VIX 15-25: 50% higher \u0026#39;high\u0026#39;: (25, 40, 2.2), # VIX 25-40: 120% higher \u0026#39;extreme\u0026#39;: (40, 100, 3.5) # VIX 40+: 250% higher } # Time of day liquidity adjustments self.time_adjustments = { \u0026#39;open\u0026#39;: 1.8, # First 30 min: wider spreads \u0026#39;midday\u0026#39;: 1.0, # 10am-3pm: normal \u0026#39;close\u0026#39;: 2.2 # Last 30 min: widest spreads } def calculate_slippage( self, market_state: MarketState, order_params: OrderParams ) -\u0026gt; float: \u0026#34;\u0026#34;\u0026#34; Calculate realistic slippage in basis points Returns: Slippage in bps (e.g., 15.0 = 0.15% = 15 bps) \u0026#34;\u0026#34;\u0026#34; # Start with base slippage for instrument base = self.base_slippage[order_params.instrument] # Apply volatility scaling vix_mult = self._get_vix_multiplier(market_state.vix) # Apply time-of-day adjustment time_mult = self.time_adjustments[market_state.time_of_day] # Market impact scaling (non-linear with order size) # Using square root model: impact scales with sqrt(order_size / ADV) size_impact = self._calculate_market_impact( order_params.size_usd, order_params.adv_pct ) # Spread component (current vs normal spread) spread_mult = market_state.spread_bps / self._get_normal_spread( order_params.instrument ) # Volume drought adjustment # If volume is 50% of normal, slippage increases volume_adj = 2.0 - market_state.volume_ratio # 0.5 vol → 1.5x slippage volume_adj = max(0.8, min(2.0, volume_adj)) # Clamp between 0.8x-2x # Combine all factors total_slippage = ( base * vix_mult * time_mult * spread_mult * volume_adj * (1 + size_impact) ) return total_slippage def _get_vix_multiplier(self, vix: float) -\u0026gt; float: \u0026#34;\u0026#34;\u0026#34;Get volatility regime multiplier\u0026#34;\u0026#34;\u0026#34; for regime, (low, high, mult) in self.vix_scaling.items(): if low \u0026lt;= vix \u0026lt; high: return mult return 3.5 # Extreme regime default def _calculate_market_impact( self, size_usd: float, adv_pct: float ) -\u0026gt; float: \u0026#34;\u0026#34;\u0026#34; Calculate market impact component using square root model Impact scales with sqrt(order_size / ADV) - Orders \u0026lt; 1% ADV: minimal impact - Orders 5% ADV: moderate impact - Orders \u0026gt; 10% ADV: significant impact \u0026#34;\u0026#34;\u0026#34; if adv_pct \u0026lt; 0.01: # Less than 1% of ADV return 0.0 # Square root scaling impact = np.sqrt(adv_pct) * 0.5 # Cap at 2x for extremely large orders return min(impact, 2.0) def _get_normal_spread(self, instrument: str) -\u0026gt; float: \u0026#34;\u0026#34;\u0026#34;Get normal spread in bps for instrument\u0026#34;\u0026#34;\u0026#34; normal_spreads = { \u0026#39;options\u0026#39;: 12.0, \u0026#39;futures\u0026#39;: 1.5, \u0026#39;crypto\u0026#39;: 6.0 } return normal_spreads[instrument] # Example usage in backtesting def backtest_with_realistic_slippage(): \u0026#34;\u0026#34;\u0026#34; Example: ES futures trade during market open \u0026#34;\u0026#34;\u0026#34; model = AdaptiveSlippageModel() # Market conditions at 9:30 AM market = MarketState( vix=18.5, # Slightly elevated spread_bps=2.0, # ES futures spread volume_ratio=1.3, # 30% above average (open volume spike) time_of_day=\u0026#39;open\u0026#39; ) # Order: 50 ES contracts (~$5M notional) # ES ADV ~3M contracts, so this is ~0.0017% of ADV order = OrderParams( size_usd=5_000_000, side=\u0026#39;buy\u0026#39;, instrument=\u0026#39;futures\u0026#39;, adv_pct=0.000017 # Tiny fraction of ADV ) slippage_bps = model.calculate_slippage(market, order) slippage_usd = (slippage_bps / 10000) * order.size_usd print(f\u0026#34;Slippage: {slippage_bps:.2f} bps (${slippage_usd:,.0f})\u0026#34;) # Output: Slippage: 6.48 bps ($3,240) # Compare to naive 0.1% fixed model naive_slippage = 0.001 * order.size_usd print(f\u0026#34;Naive model: ${naive_slippage:,.0f}\u0026#34;) # Output: Naive model: $5,000 # Realistic model shows LESS slippage for liquid ES # But would show MORE for illiquid options or large orders # Stress test: SPX options during VIX spike def stress_test_options(): model = AdaptiveSlippageModel() # March 2020 style panic (VIX 50+) market = MarketState( vix=52.0, # Extreme fear spread_bps=35.0, # SPX spreads blown out volume_ratio=0.6, # Volume dried up despite volatility time_of_day=\u0026#39;close\u0026#39; # 3:50 PM panic selling ) # Selling 100 SPX puts (~$3M) # SPX options ADV varies, assume 5% of normal capacity order = OrderParams( size_usd=3_000_000, side=\u0026#39;sell\u0026#39;, instrument=\u0026#39;options\u0026#39;, adv_pct=0.05 # 5% of available depth ) slippage_bps = model.calculate_slippage(market, order) slippage_usd = (slippage_bps / 10000) * order.size_usd print(f\u0026#34;\\nStress scenario:\u0026#34;) print(f\u0026#34;Slippage: {slippage_bps:.2f} bps (${slippage_usd:,.0f})\u0026#34;) # Output: Slippage: 180+ bps ($54,000+) # This is 6% slippage - realistic for panic selling options # Most backtests would use 0.1% = $3k (10x underestimate) why this matters # before implementing this model, my backtest showed a strategy returning +22% annually with a 1.8 Sharpe.\nafter realistic slippage: +14% annual, 1.4 Sharpe.\nthat 8% difference is fucking huge when deciding whether to deploy real capital. the naive model would\u0026rsquo;ve had me thinking i had a money printer when reality is just \u0026ldquo;pretty good.\u0026rdquo;\ncrypto is even worse # crypto slippage can be brutal during low liquidity hours. binance at 3am on a sunday when some whale dumps BTC? you\u0026rsquo;re getting slipped 0.5%+ easy on anything \u0026gt; $100k.\nmy crypto strategies now have dynamic slippage tied to:\norder book depth (query real-time via API) time of day (asian/european/us hours matter) recent volatility (5-min realized vol) exchange (binance != kraken != coinbase) basically treat every crypto trade like it\u0026rsquo;s happening in a different market regime.\nwhat i learned # size matters exponentially - 10x the order size != 10x the slippage. it\u0026rsquo;s worse. square root model is minimum, sometimes it\u0026rsquo;s linear or worse.\nvolatility kills - during VIX spikes, option spreads can go from 8 bps to 150 bps. if your backtest doesn\u0026rsquo;t account for this you\u0026rsquo;re fucked.\ntime of day is underrated - trading at market close vs midday can easily be 2x slippage difference. my algos now avoid the first/last 15 minutes unless there\u0026rsquo;s a really good reason.\ninstrument matters - ES futures get filled tight, SPX weekly options\u0026hellip; not so much. model needs to know what it\u0026rsquo;s trading.\nbacktests lie - always. the question is how much. realistic slippage modeling reduces the lies from 50% to maybe 15%. still lying but closer to truth.\nbeen running this model for 6 weeks now. backtest-to-live performance gap dropped from ~6% annually to ~2%. that 2% is probably exchange fees, tick rounding, and my shitty execution timing.\n-AK\n","date":"3 March 2026","externalUrl":null,"permalink":"/posts/2026-03-03-slippage-models-realistic-backtest-costs/","section":"Posts","summary":"\u003cp\u003ebeen thinking about slippage modeling a lot lately. most backtest frameworks have absolute dogshit slippage assumptions - either zero (lmao) or some fixed percentage that doesn\u0026rsquo;t scale with order size or volatility.\u003c/p\u003e","title":"slippage models - making backtests actually realistic","type":"posts"},{"content":"2:30am wednesday.\nbeen refactoring my exit logic all week.\nfixed stop losses are lazy. there I said it.\nthe problem with fixed stops # \u0026ldquo;just use a 2% stop loss.\u0026rdquo;\ncool. but 2% of what? in what vol environment?\n2% on ES when VIX is at 12 means you\u0026rsquo;re stopping out on noise.\n2% on ES when VIX is at 35 means your stop is tighter than a guitar string and you\u0026rsquo;re getting chopped up.\nsame stop. completely different risk profiles depending on the market.\nvolatility-scaled exits # the idea is simple. scale your stop distance to current volatility.\nhigh vol = wider stops.\nlow vol = tighter stops.\nyour stop should represent the same statistical significance regardless of market conditions.\ncomparison of fixed 2% stop vs ATR-scaled stop over 6 months on ES. the fixed stop gets triggered way more often during high vol periods. the adaptive stop adjusts and avoids noise exits.\nthe implementation # from dataclasses import dataclass from typing import Optional, Literal from enum import Enum import numpy as np import pandas as pd class VolModel(Enum): ATR = \u0026#34;atr\u0026#34; EWMA = \u0026#34;ewma\u0026#34; YANG_ZHANG = \u0026#34;yang_zhang\u0026#34; PARKINSON = \u0026#34;parkinson\u0026#34; @dataclass class StopConfig: \u0026#34;\u0026#34;\u0026#34;Adaptive stop loss configuration\u0026#34;\u0026#34;\u0026#34; base_multiplier: float = 2.0 # multiplier on vol measure min_stop_pct: float = 0.5 # floor - never tighter than this max_stop_pct: float = 8.0 # ceiling - never wider than this vol_model: VolModel = VolModel.ATR vol_lookback: int = 20 # periods for vol calculation vol_decay: float = 0.94 # EWMA decay factor use_regime_adjustment: bool = True # adjust for vol regime trailing: bool = True # trailing vs fixed adaptive class AdaptiveStopEngine: \u0026#34;\u0026#34;\u0026#34;Volatility-scaled stop loss engine\u0026#34;\u0026#34;\u0026#34; def __init__(self, config: StopConfig = None): self.config = config or StopConfig() self._vol_cache: Optional[pd.Series] = None def calculate_volatility(self, ohlcv: pd.DataFrame) -\u0026gt; pd.Series: \u0026#34;\u0026#34;\u0026#34;Calculate volatility using configured model\u0026#34;\u0026#34;\u0026#34; if self.config.vol_model == VolModel.ATR: return self._atr(ohlcv) elif self.config.vol_model == VolModel.EWMA: return self._ewma_vol(ohlcv) elif self.config.vol_model == VolModel.YANG_ZHANG: return self._yang_zhang(ohlcv) elif self.config.vol_model == VolModel.PARKINSON: return self._parkinson(ohlcv) else: raise ValueError(f\u0026#34;unknown vol model: {self.config.vol_model}\u0026#34;) def _atr(self, df: pd.DataFrame) -\u0026gt; pd.Series: \u0026#34;\u0026#34;\u0026#34;Average True Range\u0026#34;\u0026#34;\u0026#34; high = df[\u0026#39;high\u0026#39;] low = df[\u0026#39;low\u0026#39;] close = df[\u0026#39;close\u0026#39;].shift(1) tr = pd.concat([ high - low, (high - close).abs(), (low - close).abs() ], axis=1).max(axis=1) return tr.rolling(self.config.vol_lookback).mean() def _ewma_vol(self, df: pd.DataFrame) -\u0026gt; pd.Series: \u0026#34;\u0026#34;\u0026#34;Exponentially weighted volatility\u0026#34;\u0026#34;\u0026#34; returns = df[\u0026#39;close\u0026#39;].pct_change() return returns.ewm( alpha=1 - self.config.vol_decay, min_periods=self.config.vol_lookback ).std() * df[\u0026#39;close\u0026#39;] # convert to dollar vol def _yang_zhang(self, df: pd.DataFrame) -\u0026gt; pd.Series: \u0026#34;\u0026#34;\u0026#34;Yang-Zhang estimator - better than close-to-close\u0026#34;\u0026#34;\u0026#34; n = self.config.vol_lookback log_ho = np.log(df[\u0026#39;high\u0026#39;] / df[\u0026#39;open\u0026#39;]) log_lo = np.log(df[\u0026#39;low\u0026#39;] / df[\u0026#39;open\u0026#39;]) log_co = np.log(df[\u0026#39;close\u0026#39;] / df[\u0026#39;open\u0026#39;]) # overnight vol log_oc = np.log(df[\u0026#39;open\u0026#39;] / df[\u0026#39;close\u0026#39;].shift(1)) sigma_o = log_oc.rolling(n).var() # close-to-close sigma_c = log_co.rolling(n).var() # Rogers-Satchell rs = (log_ho * (log_ho - log_co) + log_lo * (log_lo - log_co)) sigma_rs = rs.rolling(n).mean() k = 0.34 / (1.34 + (n + 1) / (n - 1)) sigma_yz = sigma_o + k * sigma_c + (1 - k) * sigma_rs return np.sqrt(sigma_yz) * df[\u0026#39;close\u0026#39;] def _parkinson(self, df: pd.DataFrame) -\u0026gt; pd.Series: \u0026#34;\u0026#34;\u0026#34;Parkinson high-low estimator\u0026#34;\u0026#34;\u0026#34; n = self.config.vol_lookback log_hl = np.log(df[\u0026#39;high\u0026#39;] / df[\u0026#39;low\u0026#39;]) factor = 1.0 / (4.0 * n * np.log(2)) parkinson = np.sqrt(factor * (log_hl ** 2).rolling(n).sum()) return parkinson * df[\u0026#39;close\u0026#39;] def get_stop_distance(self, ohlcv: pd.DataFrame, direction: Literal[\u0026#39;long\u0026#39;, \u0026#39;short\u0026#39;] = \u0026#39;long\u0026#39; ) -\u0026gt; pd.Series: \u0026#34;\u0026#34;\u0026#34;Calculate adaptive stop distance in price terms\u0026#34;\u0026#34;\u0026#34; vol = self.calculate_volatility(ohlcv) self._vol_cache = vol # base stop distance stop_dist = vol * self.config.base_multiplier # apply regime adjustment if self.config.use_regime_adjustment: vol_ratio = vol / vol.rolling(60).mean() # dampen in extreme vol (wider but not linearly) regime_adj = np.where( vol_ratio \u0026gt; 1.5, 1.0 + (vol_ratio - 1.5) * 0.5, # diminishing returns 1.0 ) stop_dist = stop_dist * regime_adj # convert to percentage stop_pct = (stop_dist / ohlcv[\u0026#39;close\u0026#39;]) * 100 # apply floor and ceiling stop_pct = stop_pct.clip( lower=self.config.min_stop_pct, upper=self.config.max_stop_pct ) # convert back to price stop_price_dist = ohlcv[\u0026#39;close\u0026#39;] * (stop_pct / 100) return stop_price_dist def get_stop_price(self, ohlcv: pd.DataFrame, entry_price: float, direction: Literal[\u0026#39;long\u0026#39;, \u0026#39;short\u0026#39;] = \u0026#39;long\u0026#39; ) -\u0026gt; float: \u0026#34;\u0026#34;\u0026#34;Get current stop price for a position\u0026#34;\u0026#34;\u0026#34; stop_dist = self.get_stop_distance(ohlcv, direction).iloc[-1] if direction == \u0026#39;long\u0026#39;: if self.config.trailing: # trail from highest close since entry recent_high = ohlcv[\u0026#39;close\u0026#39;].max() return recent_high - stop_dist return entry_price - stop_dist else: if self.config.trailing: recent_low = ohlcv[\u0026#39;close\u0026#39;].min() return recent_low + stop_dist return entry_price + stop_dist def backtest_stops(self, ohlcv: pd.DataFrame, fixed_stop_pct: float = 2.0) -\u0026gt; dict: \u0026#34;\u0026#34;\u0026#34;Compare adaptive vs fixed stop performance\u0026#34;\u0026#34;\u0026#34; adaptive_dist = self.get_stop_distance(ohlcv) fixed_dist = ohlcv[\u0026#39;close\u0026#39;] * (fixed_stop_pct / 100) adaptive_pct = (adaptive_dist / ohlcv[\u0026#39;close\u0026#39;]) * 100 fixed_pct_series = pd.Series(fixed_stop_pct, index=ohlcv.index) # count how many times each stop would trigger on noise noise = ohlcv[\u0026#39;close\u0026#39;].pct_change().abs() * 100 adaptive_triggers = (noise \u0026gt; adaptive_pct).sum() fixed_triggers = (noise \u0026gt; fixed_pct_series).sum() return { \u0026#39;adaptive_avg_stop_pct\u0026#39;: float(adaptive_pct.mean()), \u0026#39;adaptive_median_stop_pct\u0026#39;: float(adaptive_pct.median()), \u0026#39;fixed_stop_pct\u0026#39;: fixed_stop_pct, \u0026#39;adaptive_noise_triggers\u0026#39;: int(adaptive_triggers), \u0026#39;fixed_noise_triggers\u0026#39;: int(fixed_triggers), \u0026#39;noise_reduction_pct\u0026#39;: float( (1 - adaptive_triggers / max(fixed_triggers, 1)) * 100 ) } four different volatility models. ATR is the standard but Yang-Zhang is better because it accounts for overnight gaps.\nthe regime adjustment is key. when vol spikes above 1.5x its 60-day average, the stop widens but at a diminishing rate. you don\u0026rsquo;t want your stop at 15% just because VIX hit 40.\ncomparing the models # ran all four vol estimators against ES data for 2025.\nresults:\nvol model avg stop % noise triggers false exits avoided fixed 2% 2.00 147 baseline ATR 1.83 89 39% fewer EWMA 1.91 94 36% fewer Yang-Zhang 1.76 82 44% fewer Parkinson 1.79 85 42% fewer stop distance over time for each volatility model. yang-zhang (purple) adapts fastest to regime changes because it uses OHLC data, not just close prices. ATR (blue) is smoother but slower to react.\nYang-Zhang wins.\nuses all four OHLC prices. captures overnight gaps that ATR misses. adapts faster to regime changes.\nthe 44% reduction in noise triggers is real money. each false exit is a round trip of commissions plus slippage plus the opportunity cost of missing the move.\nthe floor and ceiling # this is where people get lazy.\nwithout bounds your adaptive stop will:\nget impossibly tight in low vol (stopped out by spread alone) get absurdly wide in crisis vol (might as well not have a stop) I use 0.5% floor and 8% ceiling.\nfloor = never tighter than half a percent. even in dead calm markets.\nceiling = never wider than 8%. if your stop needs to be wider than 8% you shouldn\u0026rsquo;t be in the trade.\nwhat this looks like in practice # january 2026 ES example:\njan 6-10: VIX around 14. adaptive stop: 1.2% (~$72 on ES at 6000) jan 13-17: VIX spike to 22. adaptive stop widens to 2.1% (~$126) jan 20-24: VIX settles to 18. adaptive stop: 1.7% (~$102) a fixed 2% stop would have been:\ntoo wide jan 6-10 (giving back $48 unnecessarily) about right jan 13-17 slightly tight jan 20-24 the adaptive version optimizes for each environment automatically.\nbeen sharing notes on adaptive exits with some NexusFi members who run systematic strategies. the consensus is that vol-scaled stops improve risk-adjusted returns by 15-25% over fixed percentage stops. the hard part is picking the right vol model for your timeframe.\nthe trailing component # trailing stops on top of adaptive sizing.\nthe stop ratchets up (for longs) as price moves in your favor.\nbut the trailing distance also adapts.\nif vol compresses during your trade, the trailing distance tightens. locking in more profit.\nif vol expands, the distance widens. giving the trade room to breathe.\nthis is the part that makes the biggest difference for trend-following on crypto. BTC can move 5% in a day. a fixed trailing stop gets clipped constantly. an adaptive one rides the trend.\nthe takeaway # fixed stops are a blunt instrument.\nadaptive stops that scale to volatility reduce false exits by 40%+.\nYang-Zhang estimator beats ATR for most use cases.\nalways use a floor and ceiling on your adaptive stops.\ntrail with adaptive distance, not fixed distance.\nyour exits should be as smart as your entries.\n2:30am wednesday. refactored my stop loss engine to use volatility-scaled exits. fixed 2% stops are lazy - they\u0026rsquo;re too tight in high vol and too wide in low vol. built an adaptive engine with 4 vol models. yang-zhang wins at 44% fewer false exits vs fixed. floor at 0.5%, ceiling at 8%. trailing with adaptive distance for trend following. same strategy, better exits, more money kept.\n-AK\n","date":"12 February 2026","externalUrl":null,"permalink":"/posts/2026-02-12-adaptive-stop-losses-volatility-scaled-exits/","section":"Posts","summary":"\u003cp\u003e2:30am wednesday.\u003c/p\u003e\n\u003cp\u003ebeen refactoring my exit logic all week.\u003c/p\u003e\n\u003cp\u003efixed stop losses are lazy. there I said it.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe problem with fixed stops \n    \u003cdiv id=\"the-problem-with-fixed-stops\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-problem-with-fixed-stops\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u0026ldquo;just use a 2% stop loss.\u0026rdquo;\u003c/p\u003e","title":"adaptive stop losses - why fixed stops are leaving money on the table","type":"posts"},{"content":"","date":"12 February 2026","externalUrl":null,"permalink":"/tags/stop-loss/","section":"Tags","summary":"","title":"Stop-Loss","type":"tags"},{"content":"","date":"8 February 2026","externalUrl":null,"permalink":"/tags/dr-r/","section":"Tags","summary":"","title":"Dr-R","type":"tags"},{"content":"2am saturday.\nA. fell asleep on the couch watching some cooking show. I carried her to bed.\nshe mumbled \u0026ldquo;you\u0026rsquo;re warm\u0026rdquo; and passed out.\nnow I\u0026rsquo;m sitting in the dark thinking about valentine\u0026rsquo;s day.\nthe valentine\u0026rsquo;s problem # A. says she doesn\u0026rsquo;t care about valentine\u0026rsquo;s day.\nthis is a trap.\nevery guy knows this is a trap.\n\u0026ldquo;I don\u0026rsquo;t need anything fancy.\u0026rdquo;\ntranslation: if you don\u0026rsquo;t do something she\u0026rsquo;ll be fine but you\u0026rsquo;ll feel like shit.\nso I\u0026rsquo;m planning something.\ntherapy wednesday # saw dr R this week.\nshe was wearing these black pants and a fitted blouse. the kind where you can see the outline of her bra through the fabric.\nI swear she does this on purpose.\n\u0026ldquo;how are things with A.?\u0026rdquo;\n\u0026ldquo;good. really good.\u0026rdquo;\n\u0026ldquo;sexually?\u0026rdquo;\nevery session. without fail.\nI told her about last weekend.\nA. and I had been watching a movie on the couch. she put her hand on my thigh. casual. like she wasn\u0026rsquo;t thinking about it.\nbut I know her.\nshe was thinking about it.\n15 minutes later she was on top of me. right there on the couch. still had her t-shirt on. just pulled everything else to the side.\nwe didn\u0026rsquo;t even pause the movie.\ncame so hard I knocked the remote off the couch.\ndr R was writing fast.\n\u0026ldquo;do you feel the spontaneity has maintained?\u0026rdquo;\n\u0026ldquo;yeah. we still fuck like we just started dating.\u0026rdquo;\nshe crossed her legs.\nA. and I are both convinced she gets turned on during these conversations. the way she leans in. the follow-up questions that are weirdly specific.\nwhatever. it\u0026rsquo;s her job.\nthe real conversation # after the sex talk she asked about something harder.\n\u0026ldquo;you mentioned last time that A. wants to talk about the future.\u0026rdquo;\nyeah.\nA. brought up kids a few weeks ago. not like \u0026ldquo;let\u0026rsquo;s have them now\u0026rdquo; but more like \u0026ldquo;do you see that eventually?\u0026rdquo;\nI froze.\n\u0026ldquo;what was the freeze about?\u0026rdquo;\nI know what the freeze was about.\nmy parents had me when they were 28. planned. wanted. loved.\nand then they died and I was 19 and alone.\nhaving kids means someone depends on you entirely.\nand that scares the shit out of me.\n\u0026ldquo;it\u0026rsquo;s not that I don\u0026rsquo;t want kids with her.\u0026rdquo;\n\u0026ldquo;then what is it?\u0026rdquo;\n\u0026ldquo;what if something happens to me.\u0026rdquo;\nlong pause.\n\u0026ldquo;like what happened to your parents.\u0026rdquo;\n\u0026ldquo;yeah.\u0026rdquo;\ndr R set her pen down.\n\u0026ldquo;that\u0026rsquo;s not avoidance. that\u0026rsquo;s awareness. but it can\u0026rsquo;t be the reason you don\u0026rsquo;t live.\u0026rdquo;\nheavy session.\nA. knows # got home around 5.\nA. was making pasta. music on. dancing in the kitchen.\nshe looked at me and just knew.\n\u0026ldquo;rough one?\u0026rdquo;\n\u0026ldquo;kinda.\u0026rdquo;\nshe handed me a glass of wine.\ndidn\u0026rsquo;t push.\ndidn\u0026rsquo;t ask what we talked about.\njust let me exist in it.\nthat\u0026rsquo;s the thing. she doesn\u0026rsquo;t try to fix me. she just\u0026hellip; stays.\nwe ate dinner. she told me about this bug in her code that took 3 hours to find. it was a missing comma.\nI laughed for the first time since therapy.\nthe plan # so valentine\u0026rsquo;s day.\nI\u0026rsquo;m taking her to this spot in la jolla. cliffs overlooking the ocean. we went there on one of our first dates back in june 2023.\nbringing a blanket. bottle of champagne.\nif it\u0026rsquo;s warm enough, and knowing san diego it will be, we\u0026rsquo;ll stay until sunset.\nA. loves sunsets over the water.\nand if we happen to find a quiet spot on the cliffs after dark\u0026hellip;\nwe haven\u0026rsquo;t added \u0026ldquo;la jolla cliffs at night\u0026rdquo; to the list yet.\n2am # she\u0026rsquo;s asleep.\nI can hear her breathing from the bedroom.\nthe kid conversation rattled me more than I expected.\nnot because I don\u0026rsquo;t want that future.\nbecause I want it so much that losing it would destroy me.\nand I already know what losing everything feels like.\ndr R is right though.\nyou can\u0026rsquo;t not live because you\u0026rsquo;re afraid of loss.\nI\u0026rsquo;ll figure it out.\nfor now\u0026hellip; valentine\u0026rsquo;s planning. champagne. cliffs. her.\nthat\u0026rsquo;s enough.\n2am saturday. carried A. to bed from the couch. planning valentine\u0026rsquo;s day at the la jolla cliffs where we had early dates. therapy with dr R was heavy this week - talked about A. wanting kids and why that scares me. losing my parents at 19 means I know what it feels like when everything disappears. dr R says awareness isn\u0026rsquo;t avoidance. A. made pasta when I got home. didn\u0026rsquo;t push. just stayed. that\u0026rsquo;s why she\u0026rsquo;s everything.\n-AK\n","date":"8 February 2026","externalUrl":null,"permalink":"/posts/2026-02-08-saturday-valentines-planning-and-dr-r/","section":"Posts","summary":"\u003cp\u003e2am saturday.\u003c/p\u003e\n\u003cp\u003eA. fell asleep on the couch watching some cooking show. I carried her to bed.\u003c/p\u003e\n\u003cp\u003eshe mumbled \u0026ldquo;you\u0026rsquo;re warm\u0026rdquo; and passed out.\u003c/p\u003e\n\u003cp\u003enow I\u0026rsquo;m sitting in the dark thinking about valentine\u0026rsquo;s day.\u003c/p\u003e","title":"saturday - valentine's planning and dr R wants details","type":"posts"},{"content":"2:30am wednesday.\nran a single backtest last week. looked incredible. sharpe of 2.4. max drawdown 8%.\nthen I ran 10,000 of them.\nreality check.\nthe problem with one backtest # you run a backtest. it returns +22% over 2 years.\nyou celebrate.\nbut that\u0026rsquo;s ONE path through the data. one sequence of trades.\nshuffle the order. randomize entry timing by a few minutes. add realistic slippage distributions instead of fixed assumptions.\nsuddenly your +22% is anywhere from +35% to -8%.\nthat single run told you almost nothing.\nmonte carlo for algo traders # the idea is simple. take your strategy\u0026rsquo;s trade results and resample them thousands of times.\neach resample gives you a different equity curve.\nthe distribution of outcomes tells you way more than any single backtest.\n10,000 simulated equity curves from the same strategy. median outcome is solid. but look at the tails - the worst 5% of paths show drawdowns over 25%. one backtest won\u0026rsquo;t show you that.\nthe code # from dataclasses import dataclass, field from typing import List, Dict, Optional, Tuple import numpy as np import pandas as pd from concurrent.futures import ProcessPoolExecutor import warnings warnings.filterwarnings(\u0026#39;ignore\u0026#39;) @dataclass class TradeResult: \u0026#34;\u0026#34;\u0026#34;Single trade outcome\u0026#34;\u0026#34;\u0026#34; pnl: float duration_hours: float instrument: str entry_price: float exit_price: float position_size: float @dataclass class MonteCarloConfig: \u0026#34;\u0026#34;\u0026#34;Configuration for MC simulation\u0026#34;\u0026#34;\u0026#34; n_simulations: int = 10_000 confidence_levels: List[float] = field( default_factory=lambda: [0.05, 0.25, 0.50, 0.75, 0.95] ) use_block_bootstrap: bool = True block_size: int = 5 # preserve some autocorrelation account_size: float = 1_200_000.0 max_workers: int = 8 class MonteCarloBacktest: \u0026#34;\u0026#34;\u0026#34;Monte Carlo simulation engine for trade sequences\u0026#34;\u0026#34;\u0026#34; def __init__(self, config: MonteCarloConfig = None): self.config = config or MonteCarloConfig() self.trades: List[TradeResult] = [] self.results: Optional[Dict] = None def load_trades(self, trades: List[TradeResult]): \u0026#34;\u0026#34;\u0026#34;Load historical trade results\u0026#34;\u0026#34;\u0026#34; self.trades = trades self._pnl_array = np.array([t.pnl for t in trades]) def _single_simulation(self, seed: int) -\u0026gt; np.ndarray: \u0026#34;\u0026#34;\u0026#34;Run one MC path\u0026#34;\u0026#34;\u0026#34; rng = np.random.RandomState(seed) n_trades = len(self._pnl_array) if self.config.use_block_bootstrap: # block bootstrap preserves short-term autocorrelation blocks = [] while len(blocks) \u0026lt; n_trades: start = rng.randint(0, n_trades - self.config.block_size) block = self._pnl_array[start:start + self.config.block_size] blocks.extend(block) resampled = np.array(blocks[:n_trades]) else: # simple bootstrap - iid assumption indices = rng.randint(0, n_trades, size=n_trades) resampled = self._pnl_array[indices] # cumulative equity curve equity = self.config.account_size + np.cumsum(resampled) return equity def run(self) -\u0026gt; Dict: \u0026#34;\u0026#34;\u0026#34;Run full Monte Carlo simulation\u0026#34;\u0026#34;\u0026#34; seeds = range(self.config.n_simulations) # parallel execution with ProcessPoolExecutor(max_workers=self.config.max_workers) as executor: equity_curves = list(executor.map(self._single_simulation, seeds)) curves = np.array(equity_curves) # calculate stats across all simulations final_values = curves[:, -1] returns = (final_values - self.config.account_size) / self.config.account_size # drawdown calculation for each path max_drawdowns = [] for curve in curves: running_max = np.maximum.accumulate(curve) drawdowns = (curve - running_max) / running_max max_drawdowns.append(np.min(drawdowns)) max_drawdowns = np.array(max_drawdowns) # percentile analysis percentiles = {} for level in self.config.confidence_levels: pct = int(level * 100) percentiles[f\u0026#39;p{pct}\u0026#39;] = { \u0026#39;final_return\u0026#39;: float(np.percentile(returns, pct)), \u0026#39;max_drawdown\u0026#39;: float(np.percentile(max_drawdowns, pct)), \u0026#39;final_value\u0026#39;: float(np.percentile(final_values, pct)) } # probability of ruin (losing \u0026gt; 25% of account) ruin_threshold = self.config.account_size * 0.75 prob_ruin = np.mean(np.min(curves, axis=1) \u0026lt; ruin_threshold) # probability of profit prob_profit = np.mean(final_values \u0026gt; self.config.account_size) self.results = { \u0026#39;n_simulations\u0026#39;: self.config.n_simulations, \u0026#39;n_trades\u0026#39;: len(self.trades), \u0026#39;median_return\u0026#39;: float(np.median(returns)), \u0026#39;mean_return\u0026#39;: float(np.mean(returns)), \u0026#39;std_return\u0026#39;: float(np.std(returns)), \u0026#39;median_max_drawdown\u0026#39;: float(np.median(max_drawdowns)), \u0026#39;worst_drawdown\u0026#39;: float(np.min(max_drawdowns)), \u0026#39;prob_profit\u0026#39;: float(prob_profit), \u0026#39;prob_ruin\u0026#39;: float(prob_ruin), \u0026#39;percentiles\u0026#39;: percentiles, \u0026#39;curves\u0026#39;: curves, # full data for plotting \u0026#39;max_drawdowns\u0026#39;: max_drawdowns } return self.results def summary(self) -\u0026gt; str: \u0026#34;\u0026#34;\u0026#34;Print human-readable summary\u0026#34;\u0026#34;\u0026#34; if self.results is None: raise ValueError(\u0026#34;run simulation first\u0026#34;) r = self.results lines = [ f\u0026#34;Monte Carlo Simulation ({r[\u0026#39;n_simulations\u0026#39;]:,} paths, {r[\u0026#39;n_trades\u0026#39;]} trades)\u0026#34;, f\u0026#34;\u0026#34;, f\u0026#34; median return: {r[\u0026#39;median_return\u0026#39;]:+.1%}\u0026#34;, f\u0026#34; mean return: {r[\u0026#39;mean_return\u0026#39;]:+.1%}\u0026#34;, f\u0026#34; std of returns: {r[\u0026#39;std_return\u0026#39;]:.1%}\u0026#34;, f\u0026#34; median max DD: {r[\u0026#39;median_max_drawdown\u0026#39;]:.1%}\u0026#34;, f\u0026#34; worst max DD: {r[\u0026#39;worst_drawdown\u0026#39;]:.1%}\u0026#34;, f\u0026#34; prob of profit: {r[\u0026#39;prob_profit\u0026#39;]:.1%}\u0026#34;, f\u0026#34; prob of ruin (\u0026gt;25%): {r[\u0026#39;prob_ruin\u0026#39;]:.1%}\u0026#34;, f\u0026#34;\u0026#34;, f\u0026#34; percentile breakdown:\u0026#34;, ] for level, stats in r[\u0026#39;percentiles\u0026#39;].items(): lines.append( f\u0026#34; {level}: return={stats[\u0026#39;final_return\u0026#39;]:+.1%} \u0026#34; f\u0026#34;DD={stats[\u0026#39;max_drawdown\u0026#39;]:.1%} \u0026#34; f\u0026#34;value=${stats[\u0026#39;final_value\u0026#39;]:,.0f}\u0026#34; ) return \u0026#34;\\n\u0026#34;.join(lines) # usage example with my actual trade log format def load_from_csv(filepath: str) -\u0026gt; List[TradeResult]: \u0026#34;\u0026#34;\u0026#34;Load trades from my standard CSV export\u0026#34;\u0026#34;\u0026#34; df = pd.read_csv(filepath) trades = [] for _, row in df.iterrows(): trades.append(TradeResult( pnl=row[\u0026#39;realized_pnl\u0026#39;], duration_hours=row[\u0026#39;hold_hours\u0026#39;], instrument=row[\u0026#39;symbol\u0026#39;], entry_price=row[\u0026#39;entry\u0026#39;], exit_price=row[\u0026#39;exit\u0026#39;], position_size=row[\u0026#39;qty\u0026#39;] )) return trades nothing fancy. block bootstrap to preserve some trade clustering. parallel execution because 10,000 paths takes a minute otherwise.\nthe key insight is use_block_bootstrap. simple resampling assumes trades are independent. they\u0026rsquo;re not. winning streaks and losing streaks cluster. block bootstrap captures that.\nwhat I found # ran this on my options premium selling strategy. 847 trades from all of 2025.\nMonte Carlo Simulation (10,000 paths, 847 trades) median return: +14.2% mean return: +13.8% std of returns: 6.3% median max DD: -11.4% worst max DD: -31.2% prob of profit: 93.1% prob of ruin (\u0026gt;25%): 1.8% percentile breakdown: p5: return=+3.1% DD=-24.8% value=$1,237,200 p25: return=+10.2% DD=-14.6% value=$1,322,400 p50: return=+14.2% DD=-11.4% value=$1,370,400 p75: return=+17.8% DD=-8.9% value=$1,413,600 p95: return=+24.1% DD=-5.8% value=$1,489,200 distribution of final returns across 10,000 simulations. median at +14.2% is solid. but the 5th percentile at +3.1% means in a bad year this strategy barely breaks even. that\u0026rsquo;s information a single backtest hides.\nthe numbers that matter # prob of profit: 93.1%\ngood. but not 100%.\nthere\u0026rsquo;s a 6.9% chance this strategy loses money over a year even with an actual edge. let that sink in.\nprob of ruin: 1.8%\nsmall. but not zero.\n1 in 55 chance of losing more than 25% of account. with $1.2M that\u0026rsquo;s $300k.\nwould a single backtest show you that? no.\nthe spread matters most:\np5 return: +3.1% p95 return: +24.1%\nthat\u0026rsquo;s a massive range. same strategy. same edge. different trade sequences.\nhow I use this # position sizing:\nI size positions so that even the p5 outcome doesn\u0026rsquo;t blow past my risk tolerance.\nif p5 max drawdown is -24.8%, I size so that translates to acceptable dollar loss.\nstrategy comparison:\nI don\u0026rsquo;t compare strategies by median return anymore.\nI compare by p5 return and p5 max drawdown.\nthe strategy with the best worst case is usually the best strategy.\nconfidence in live deployment:\nif MC says 93% probability of profit, I\u0026rsquo;m confident enough to run it live.\nif it said 70%, I\u0026rsquo;d keep iterating.\nbeen discussing MC approaches with some quant traders on NexusFi who run similar simulation frameworks. there\u0026rsquo;s a solid thread on statistical validation methods that helped me refine the block bootstrap approach.\nblock size matters # played with different block sizes.\nblock_size=1 is just simple bootstrap. no autocorrelation preserved.\nblock_size=20 preserves too much structure. you\u0026rsquo;re basically replaying the original sequence.\nblock_size=5 is my sweet spot for daily trades. preserves weekly clustering without overfitting to the original sequence.\nfor HFT with hundreds of trades per day you\u0026rsquo;d want block_size=50+.\nfor swing trading with 2-3 trades per week, block_size=2-3.\nmatch block size to your trading frequency.\nthe takeaway # stop trusting single backtests.\nrun 10,000 of them.\nlook at the distribution.\nyour strategy\u0026rsquo;s edge is real only if the worst 5% of outcomes is still acceptable.\nif it\u0026rsquo;s not, you need to resize or rethink.\n2:30am wednesday. ran 10,000 monte carlo simulations on my premium selling strategy. median return +14.2% but 5th percentile is only +3.1%. probability of profit 93.1%. probability of losing 25%+ is 1.8%. single backtests hide the variance. block bootstrap with size 5 preserves trade clustering. always look at worst case, not median.\n-AK\n","date":"5 February 2026","externalUrl":null,"permalink":"/posts/2026-02-05-monte-carlo-backtesting-why-single-runs-lie/","section":"Posts","summary":"\u003cp\u003e2:30am wednesday.\u003c/p\u003e\n\u003cp\u003eran a single backtest last week. looked incredible. sharpe of 2.4. max drawdown 8%.\u003c/p\u003e\n\u003cp\u003ethen I ran 10,000 of them.\u003c/p\u003e\n\u003cp\u003ereality check.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe problem with one backtest \n    \u003cdiv id=\"the-problem-with-one-backtest\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-problem-with-one-backtest\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003eyou run a backtest. it returns +22% over 2 years.\u003c/p\u003e","title":"monte carlo backtesting - why single backtest runs lie to you","type":"posts"},{"content":"","date":"5 February 2026","externalUrl":null,"permalink":"/tags/monte-carlo/","section":"Tags","summary":"","title":"Monte-Carlo","type":"tags"},{"content":"","date":"31 January 2026","externalUrl":null,"permalink":"/tags/married-life/","section":"Tags","summary":"","title":"Married-Life","type":"tags"},{"content":"2am saturday.\ncouldn\u0026rsquo;t sleep.\nA. is curled up next to me. one arm across my chest. her breathing is slow and even.\nI\u0026rsquo;ve been watching her for like 20 minutes.\nthe little things # we\u0026rsquo;ve been together almost 3 years now.\nlived together for over 2.\nand I still catch myself staring at her when she sleeps.\nthere\u0026rsquo;s something about the way she looks completely relaxed. no work stress. no cooking plans. no asking if I ate breakfast.\njust her.\nlast night # we went out for dinner. nothing fancy. that sushi place near the water.\nshe wore this white sundress. san diego winter means sundresses.\nwe talked about her project at work. some python pipeline thing that\u0026rsquo;s been kicking her ass.\nI offered to look at the code.\n\u0026ldquo;you\u0026rsquo;ll just refactor everything and tell me I\u0026rsquo;m doing it wrong.\u0026rdquo;\n\u0026ldquo;that\u0026rsquo;s because you ARE doing it wrong.\u0026rdquo;\nshe threw a piece of edamame at me.\nwalking home # the sunset was ridiculous. pink and orange. classic california.\nshe grabbed my hand without saying anything.\nwe just walked.\ndidn\u0026rsquo;t need to fill the silence.\nthat\u0026rsquo;s the thing with A. we can be together without performing togetherness.\nback home # got in around 9.\nshe changed into one of my old t-shirts.\nI was checking my algo\u0026rsquo;s overnight positions when she walked up behind me.\nhands on my shoulders.\n\u0026ldquo;you coming to bed?\u0026rdquo;\n\u0026ldquo;in a minute.\u0026rdquo;\n\u0026ldquo;now.\u0026rdquo;\nthere\u0026rsquo;s this thing she does where she pulls my chair back from the desk.\nno asking. just decides.\nI followed her to the bedroom.\nthe sex # slow. intentional.\nnot the quickie against the kitchen counter type.\nthe kind where I take my time with her. building her up.\nshe was so wet by the time I finally fucked her.\ngrabbed the headboard. arched her back.\nmade this noise when she came that I\u0026rsquo;ll never get tired of hearing.\nafterwards we just laid there. her head on my chest.\n\u0026ldquo;I love you.\u0026rdquo;\n\u0026ldquo;love you too.\u0026rdquo;\n2am thoughts # that was 5 hours ago.\nnow I\u0026rsquo;m here. 2am. laptop on my lap.\nshe shifted a little. mumbled something. went back to sleep.\nI don\u0026rsquo;t know why I woke up.\nbrain just wouldn\u0026rsquo;t shut off.\nbut for once it\u0026rsquo;s not anxiety or algo tweaks or market shit.\njust\u0026hellip; appreciating this.\nher. us.\nalmost 3 years and she still chooses to be here.\nstill holds me when grief hits.\nstill throws edamame at me when I\u0026rsquo;m being an ass.\ngoing back to sleep # putting the laptop away.\ngonna try to sleep.\ntomorrow we\u0026rsquo;re driving up to oceanside. she wants to try some coffee shop her friend told her about.\nI\u0026rsquo;ll probably complain about traffic.\nshe\u0026rsquo;ll probably tell me to relax.\nwe\u0026rsquo;ll end up at the beach.\nnormal saturday with her.\nbest kind.\n2:15am saturday. watching A. sleep. went out for sushi yesterday. walked home at sunset. she pulled me away from my computer for slow sex. woke up at 2am just thinking about how lucky I am. almost 3 years together. she still chooses this. still chooses me. oceanside tomorrow.\n-AK\n","date":"31 January 2026","externalUrl":null,"permalink":"/posts/2026-01-31-saturday-woke-up-early-just-watching-her/","section":"Posts","summary":"\u003cp\u003e2am saturday.\u003c/p\u003e\n\u003cp\u003ecouldn\u0026rsquo;t sleep.\u003c/p\u003e\n\u003cp\u003eA. is curled up next to me. one arm across my chest. her breathing is slow and even.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ve been watching her for like 20 minutes.\u003c/p\u003e","title":"saturday morning - woke up early just watching her","type":"posts"},{"content":"therapy saturday.\nweird scheduling thing. dr R had to reschedule wednesday\u0026rsquo;s session to today.\nI don\u0026rsquo;t usually go on saturdays.\nthe office # her office is always perfectly arranged.\nwarm lighting. two chairs. that fucking couch I always end up on.\nshe was wearing this dark purple dress today. professional but\u0026hellip; yeah.\nI noticed.\nalways notice.\nthe check-in # \u0026ldquo;how was the new year?\u0026rdquo;\n\u0026ldquo;rough. but okay.\u0026rdquo;\nshe nodded. took notes.\n\u0026ldquo;you mentioned december would be difficult. the anniversary.\u0026rdquo;\nthree years. december 31st, 2022.\n\u0026ldquo;yeah.\u0026rdquo;\nlong pause.\n\u0026ldquo;how did you handle it this time?\u0026rdquo;\nthe truth # I told her.\nA.\u0026rsquo;s family was in town. big dinner christmas eve. new year\u0026rsquo;s eve was quieter.\njust me and A. stayed home. opened champagne at midnight.\nI thought about mom and dad at 11:58.\n\u0026ldquo;what happened at 11:58?\u0026rdquo;\n\u0026ldquo;just\u0026hellip; zoned out. A. was counting down. I was somewhere else.\u0026rdquo;\ndr R leaned forward. \u0026ldquo;where were you?\u0026rdquo;\n\u0026ldquo;in the car. not their car. just\u0026hellip; imagining it.\u0026rdquo;\npause.\n\u0026ldquo;that\u0026rsquo;s new. you haven\u0026rsquo;t described that imagery before.\u0026rdquo;\nunpacking it # we spent 30 minutes on that.\nthe crash. the call from the hospital. the funeral.\nthree years and I still have moments where it feels like yesterday.\ndr R says that\u0026rsquo;s normal.\n\u0026ldquo;grief has no timeline. it revisits.\u0026rdquo;\nthe good parts # I told her about A.\nhow she held me at midnight. didn\u0026rsquo;t say anything. just held me.\nhow she understands when I need space.\n\u0026ldquo;your communication with A. seems strong.\u0026rdquo;\n\u0026ldquo;it is.\u0026rdquo;\n\u0026ldquo;sexually too?\u0026rdquo;\nhere we go.\nI told her we had slow, intentional sex that night. new year\u0026rsquo;s eve.\nnothing kinky. just\u0026hellip; connected.\n\u0026ldquo;describe it.\u0026rdquo;\nI watched her write notes while I talked.\nshe always asks for details about our sex life.\nA. and I both think she gets off on it.\nmaybe. maybe not.\ntoday I didn\u0026rsquo;t care.\nthe session end # 50 minutes goes fast.\n\u0026ldquo;same time wednesday?\u0026rdquo;\n\u0026ldquo;yeah.\u0026rdquo;\nI walked out feeling lighter.\nthat\u0026rsquo;s the weird thing about therapy. I go in carrying something. leave without it.\nnot fixed. just\u0026hellip; acknowledged.\nA. asked # got home around 11:30.\nA. was working at her desk.\n\u0026ldquo;how was dr R?\u0026rdquo;\n\u0026ldquo;good. talked about new year\u0026rsquo;s eve.\u0026rdquo;\nshe nodded. \u0026ldquo;you seemed off that night.\u0026rdquo;\n\u0026ldquo;I know.\u0026rdquo;\n\u0026ldquo;you\u0026rsquo;re allowed to be off.\u0026rdquo;\nI kissed her forehead.\n\u0026ldquo;I know.\u0026rdquo;\ntonight # 2:30am saturday.\nA. is asleep. dinner was hours ago.\nsitting here in the dark with my laptop.\ntherapy days always feel different.\nemptier in a good way.\nlike I cleaned out a drawer I\u0026rsquo;d been avoiding.\n2:30am saturday. therapy with dr R earlier today. talked about new year\u0026rsquo;s eve, the anniversary, zoning out at 11:58. three years since the crash. A. held me at midnight. told dr R about our sex life - she always asks for details. left feeling lighter. therapy days feel different. emptier in a good way.\n-AK\n","date":"24 January 2026","externalUrl":null,"permalink":"/posts/2026-01-24-saturday-therapy-session-new-year-check-in/","section":"Posts","summary":"\u003cp\u003etherapy saturday.\u003c/p\u003e\n\u003cp\u003eweird scheduling thing. dr R had to reschedule wednesday\u0026rsquo;s session to today.\u003c/p\u003e\n\u003cp\u003eI don\u0026rsquo;t usually go on saturdays.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe office \n    \u003cdiv id=\"the-office\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-office\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003eher office is always perfectly arranged.\u003c/p\u003e","title":"saturday therapy session - new year check in with dr R","type":"posts"},{"content":"","date":"22 January 2026","externalUrl":null,"permalink":"/tags/correlation/","section":"Tags","summary":"","title":"Correlation","type":"tags"},{"content":"1:30am and i\u0026rsquo;m staring at correlation matrices again.\neveryone talks about diversification like it\u0026rsquo;s free lunch.\nit\u0026rsquo;s not.\nthe diversification myth # portfolios are \u0026ldquo;diversified\u0026rdquo; until they\u0026rsquo;re not.\n2020 march - everything dropped together.\n2022 crypto winter - BTC and ETH moved in lockstep.\nlate 2025 vol spike - correlations spiked across all my positions.\nwhen you need diversification most, it disappears.\ntracking correlations in real time # built a system to track rolling correlations across my entire portfolio.\nnot just at month end.\nevery day.\ncurrent 30-day rolling correlation matrix. ES and NQ at 0.94 - basically same asset. BTC and ETH at 0.87 - also high. gold is the only real diversifier at -0.15 to equities.\nwhat this tells me:\nmy \u0026ldquo;diversified\u0026rdquo; portfolio is actually 3 bets: equities, crypto, gold ES and NQ positions are redundant from correlation perspective SPX options are 0.89 correlated to ES - makes sense, same underlying gold is the only true hedge but tiny allocation correlations aren\u0026rsquo;t static # this is the part most people miss.\ncorrelations change based on market regime.\nrolling 30-day correlations over the past 6 months. notice how ES-BTC correlation spiked during the october vol event. when shit hits the fan, everything correlates.\nkey observation:\nduring stress, ES-BTC correlation went from 0.35 to 0.55+\nthat\u0026rsquo;s a 60% increase in correlation when i needed diversification most.\nmeanwhile ES-NQ stayed glued at 0.92-0.95.\nBTC-ETH stayed glued at 0.85-0.90.\nthe algo approach # from dataclasses import dataclass from typing import Dict, List, Tuple import numpy as np import pandas as pd from datetime import datetime, timedelta @dataclass class AssetReturns: symbol: str returns: pd.Series class CorrelationTracker: def __init__(self, lookback: int = 30): self.lookback = lookback self.assets: Dict[str, pd.Series] = {} self.correlation_history: List[Dict] = [] def add_asset(self, symbol: str, returns: pd.Series): \u0026#34;\u0026#34;\u0026#34;Add asset return series\u0026#34;\u0026#34;\u0026#34; self.assets[symbol] = returns def calculate_correlation_matrix(self, as_of: datetime = None) -\u0026gt; pd.DataFrame: \u0026#34;\u0026#34;\u0026#34;Calculate correlation matrix as of specific date\u0026#34;\u0026#34;\u0026#34; if as_of is None: as_of = datetime.now() # align all series to same date range aligned = {} for symbol, returns in self.assets.items(): mask = returns.index \u0026lt;= as_of aligned[symbol] = returns[mask].tail(self.lookback) df = pd.DataFrame(aligned) return df.corr() def get_rolling_correlation(self, asset1: str, asset2: str, window: int = 30) -\u0026gt; pd.Series: \u0026#34;\u0026#34;\u0026#34;Calculate rolling correlation between two assets\u0026#34;\u0026#34;\u0026#34; r1 = self.assets[asset1] r2 = self.assets[asset2] # align dates combined = pd.concat([r1, r2], axis=1) combined.columns = [asset1, asset2] combined = combined.dropna() return combined[asset1].rolling(window).corr(combined[asset2]) def detect_correlation_regime(self) -\u0026gt; str: \u0026#34;\u0026#34;\u0026#34;Classify current correlation environment\u0026#34;\u0026#34;\u0026#34; matrix = self.calculate_correlation_matrix() # average off-diagonal correlation n = len(matrix) off_diag = [] for i in range(n): for j in range(i+1, n): off_diag.append(matrix.iloc[i, j]) avg_corr = np.mean(off_diag) if avg_corr \u0026gt; 0.7: return \u0026#34;high_correlation\u0026#34; # risk-off, everything moving together elif avg_corr \u0026gt; 0.4: return \u0026#34;normal\u0026#34; else: return \u0026#34;low_correlation\u0026#34; # good for diversification def calculate_effective_positions(self) -\u0026gt; float: \u0026#34;\u0026#34;\u0026#34;How many truly independent bets do I have?\u0026#34;\u0026#34;\u0026#34; matrix = self.calculate_correlation_matrix() # eigenvalue decomposition eigenvalues = np.linalg.eigvals(matrix.values) eigenvalues = np.real(eigenvalues) eigenvalues = eigenvalues[eigenvalues \u0026gt; 0] # effective number of bets (Shannon entropy based) eigenvalues = eigenvalues / eigenvalues.sum() effective_n = np.exp(-np.sum(eigenvalues * np.log(eigenvalues + 1e-10))) return effective_n def get_diversification_score(self) -\u0026gt; float: \u0026#34;\u0026#34;\u0026#34;0-100 score of portfolio diversification\u0026#34;\u0026#34;\u0026#34; n_assets = len(self.assets) effective_n = self.calculate_effective_positions() # ratio of effective to actual positions score = (effective_n / n_assets) * 100 return min(100, score) def daily_snapshot(self) -\u0026gt; Dict: \u0026#34;\u0026#34;\u0026#34;Record daily correlation state\u0026#34;\u0026#34;\u0026#34; matrix = self.calculate_correlation_matrix() snapshot = { \u0026#39;timestamp\u0026#39;: datetime.now().isoformat(), \u0026#39;regime\u0026#39;: self.detect_correlation_regime(), \u0026#39;effective_positions\u0026#39;: self.calculate_effective_positions(), \u0026#39;diversification_score\u0026#39;: self.get_diversification_score(), \u0026#39;correlation_matrix\u0026#39;: matrix.to_dict() } self.correlation_history.append(snapshot) return snapshot not rocket science.\ntracks rolling correlations.\ncalculates \u0026ldquo;effective positions\u0026rdquo; - how many truly independent bets i have.\ngives me a diversification score.\nwhat the data says # ran this across all of 2025.\nfindings:\naverage effective positions: 2.4 (out of 6 assets) average diversification score: 40/100 correlation regime breakdown: high correlation (\u0026gt;0.7 avg): 18% of days normal (0.4-0.7): 62% of days low correlation (\u0026lt;0.4): 20% of days translation:\nmy \u0026ldquo;6 asset\u0026rdquo; portfolio is really 2.4 independent bets on average.\nand during stress, that drops to like 1.5.\nhow i use this # rule 1: reduce size when correlations spike\nwhen regime = \u0026ldquo;high_correlation\u0026rdquo;, i cut position sizes by 30%.\neverything is moving together. doubling down on any position doubles total portfolio risk.\nrule 2: track effective positions, not actual positions\nmy dashboard shows effective positions, not asset count.\nif effective positions \u0026lt; 2, i\u0026rsquo;m basically making one big bet.\nrule 3: rebalance based on correlation changes\nwhen ES-BTC correlation dropped back to 0.35 in december, i increased crypto allocation.\ndiversification value had returned.\ncurrent state # as of today (jan 22):\ncorrelation regime: normal effective positions: 2.6 diversification score: 43/100 ES-NQ correlation: 0.94 (very high - expected) ES-BTC correlation: 0.42 (moderate) gold correlation to equities: -0.15 (negative - good hedge) sitting in a reasonable spot.\nnot over-concentrated.\nnot perfectly diversified either.\nbeen tracking correlation regimes with some traders on NexusFi who run similar multi-asset portfolios. the consensus is that correlation-based position sizing is one of the few edges that actually scales.\nthe takeaway # diversification isn\u0026rsquo;t a set-it-and-forget-it thing.\ncorrelations change.\nyour \u0026ldquo;diversified\u0026rdquo; portfolio can become a single bet overnight.\ntrack it. adjust for it. don\u0026rsquo;t assume yesterday\u0026rsquo;s correlation matrix applies today.\n1:30am wednesday. tracking cross-asset correlations. my \u0026ldquo;6 asset\u0026rdquo; portfolio is really 2.4 independent bets. ES-NQ at 0.94 is basically one position. BTC-ETH at 0.87 same thing. gold at -0.15 to equities is the only real diversifier. diversification score: 43/100. not great but not terrible. regime is normal. will reduce size if correlations spike again.\n-AK\n","date":"22 January 2026","externalUrl":null,"permalink":"/posts/2026-01-22-cross-asset-correlation-tracking/","section":"Posts","summary":"\u003cp\u003e1:30am and i\u0026rsquo;m staring at correlation matrices again.\u003c/p\u003e\n\u003cp\u003eeveryone talks about diversification like it\u0026rsquo;s free lunch.\u003c/p\u003e\n\u003cp\u003eit\u0026rsquo;s not.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe diversification myth \n    \u003cdiv id=\"the-diversification-myth\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-diversification-myth\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003eportfolios are \u0026ldquo;diversified\u0026rdquo; until they\u0026rsquo;re not.\u003c/p\u003e","title":"cross-asset correlation tracking - why diversification is a lie","type":"posts"},{"content":"","date":"22 January 2026","externalUrl":null,"permalink":"/tags/portfolio/","section":"Tags","summary":"","title":"Portfolio","type":"tags"},{"content":"3am on a monday and i\u0026rsquo;m watching theta tick down across my options book.\nmost people don\u0026rsquo;t realize how much money they\u0026rsquo;re leaving on the table by not tracking theta properly.\nthe time decay advantage # options are decaying assets.\nevery day that passes, extrinsic value evaporates.\nif you\u0026rsquo;re selling premium, theta is your friend.\nif you\u0026rsquo;re buying premium, theta is quietly robbing you.\nmy algo tracks theta decay across every position in real time.\nthe decay curve # not all theta is created equal.\ntheta decay accelerates as expiration approaches. green zone (21-35 DTE) is the sweet spot for premium selling. red zone (under 7 DTE) is where gamma risk explodes.\nkey insight:\ntheta decay isn\u0026rsquo;t linear. it\u0026rsquo;s exponential near expiration.\nthe math:\n30 DTE: losing ~0.8 bps/day 14 DTE: losing ~1.4 bps/day 7 DTE: losing ~2.1 bps/day 3 DTE: losing ~3.5 bps/day this is why i close most positions at 21 DTE.\nthe last 3 weeks of theta aren\u0026rsquo;t worth the gamma risk.\nmy theta vs gamma framework # every options position is a theta/gamma tradeoff.\nhigh theta = high gamma risk.\nlow gamma = slow theta.\npick your poison.\ncurrent portfolio positions plotted by theta vs gamma exposure. premium selling positions (blue) cluster in the high-theta/negative-gamma quadrant. vol plays (orange) are the opposite.\nmy current breakdown:\npremium selling: 60% of options book directional: 25% of options book vol plays: 15% of options book the premium selling positions generate most of my theta.\nvol plays are hedge positions that bleed theta but protect against gap moves.\nthe tracking system # from dataclasses import dataclass from typing import List, Dict import numpy as np from datetime import datetime, timedelta @dataclass class OptionsPosition: symbol: str strike: float expiry: datetime position_type: str # \u0026#39;call\u0026#39; or \u0026#39;put\u0026#39; quantity: int entry_price: float current_price: float delta: float gamma: float theta: float vega: float class ThetaTracker: def __init__(self): self.positions: List[OptionsPosition] = [] self.theta_history: List[Dict] = [] def add_position(self, pos: OptionsPosition): self.positions.append(pos) def calculate_portfolio_theta(self) -\u0026gt; float: \u0026#34;\u0026#34;\u0026#34;Total daily theta across all positions\u0026#34;\u0026#34;\u0026#34; return sum(p.theta * p.quantity * 100 for p in self.positions) def calculate_portfolio_gamma(self) -\u0026gt; float: \u0026#34;\u0026#34;\u0026#34;Total gamma exposure\u0026#34;\u0026#34;\u0026#34; return sum(p.gamma * p.quantity * 100 for p in self.positions) def get_dte_breakdown(self) -\u0026gt; Dict[str, float]: \u0026#34;\u0026#34;\u0026#34;Theta by DTE bucket\u0026#34;\u0026#34;\u0026#34; buckets = {\u0026#39;0-7\u0026#39;: 0, \u0026#39;8-14\u0026#39;: 0, \u0026#39;15-21\u0026#39;: 0, \u0026#39;22-35\u0026#39;: 0, \u0026#39;35+\u0026#39;: 0} today = datetime.now() for p in self.positions: dte = (p.expiry - today).days theta_contrib = p.theta * p.quantity * 100 if dte \u0026lt;= 7: buckets[\u0026#39;0-7\u0026#39;] += theta_contrib elif dte \u0026lt;= 14: buckets[\u0026#39;8-14\u0026#39;] += theta_contrib elif dte \u0026lt;= 21: buckets[\u0026#39;15-21\u0026#39;] += theta_contrib elif dte \u0026lt;= 35: buckets[\u0026#39;22-35\u0026#39;] += theta_contrib else: buckets[\u0026#39;35+\u0026#39;] += theta_contrib return buckets def get_theta_weighted_dte(self) -\u0026gt; float: \u0026#34;\u0026#34;\u0026#34;Theta-weighted average DTE\u0026#34;\u0026#34;\u0026#34; today = datetime.now() total_theta = 0 weighted_dte = 0 for p in self.positions: theta = abs(p.theta * p.quantity * 100) dte = (p.expiry - today).days total_theta += theta weighted_dte += theta * dte return weighted_dte / total_theta if total_theta \u0026gt; 0 else 0 def identify_risk_positions(self) -\u0026gt; List[OptionsPosition]: \u0026#34;\u0026#34;\u0026#34;Flag positions with high gamma/theta ratio\u0026#34;\u0026#34;\u0026#34; risky = [] today = datetime.now() for p in self.positions: dte = (p.expiry - today).days # flag if under 7 DTE with significant gamma if dte \u0026lt;= 7 and abs(p.gamma) \u0026gt; 0.05: risky.append(p) # flag if gamma/theta ratio is extreme if abs(p.theta) \u0026gt; 0.001: ratio = abs(p.gamma / p.theta) if ratio \u0026gt; 50: # high gamma relative to theta risky.append(p) return list(set(risky)) def daily_snapshot(self) -\u0026gt; Dict: \u0026#34;\u0026#34;\u0026#34;Record daily portfolio state\u0026#34;\u0026#34;\u0026#34; snapshot = { \u0026#39;timestamp\u0026#39;: datetime.now().isoformat(), \u0026#39;total_theta\u0026#39;: self.calculate_portfolio_theta(), \u0026#39;total_gamma\u0026#39;: self.calculate_portfolio_gamma(), \u0026#39;theta_weighted_dte\u0026#39;: self.get_theta_weighted_dte(), \u0026#39;dte_breakdown\u0026#39;: self.get_dte_breakdown(), \u0026#39;risk_positions\u0026#39;: len(self.identify_risk_positions()), \u0026#39;position_count\u0026#39;: len(self.positions) } self.theta_history.append(snapshot) return snapshot nothing fancy.\ntracks theta across all positions.\nflags risky positions when gamma/theta ratio gets extreme.\nrecords daily snapshots for analysis.\nwhat the data tells me # ran this for all of 2025.\nfindings:\navg portfolio theta: +$47/day (selling premium) best month theta capture: 84% (may) worst month theta capture: 61% (august vol spike) positions closed at 21 DTE avg return: +18% positions held to 7 DTE avg return: +22% but 3x the drawdown the extra 4% return from holding to 7 DTE isn\u0026rsquo;t worth the ulcers.\ncurrent state # as of today (jan 20):\ntotal portfolio theta: +$52/day theta-weighted avg DTE: 26 days positions at risk (under 7 DTE): 0 gamma exposure: slightly negative (want to be short gamma in low vol) sitting in a good spot.\nVIX around 17 means premium selling is working.\nif vol spikes, i\u0026rsquo;ll close some positions and let gamma flatten out.\nbeen trading through different vol regimes on NexusFi with other options traders - the consensus is that tracking theta is table stakes. if you\u0026rsquo;re not doing it, you\u0026rsquo;re guessing.\nthe edge # most retail options traders think about individual trades.\npros think about portfolio theta.\nyour daily theta target should be a function of:\naccount size (mine is roughly 0.01% daily = $50 on $500k options allocation) vol environment (reduce theta targets when VIX \u0026gt; 20) upcoming events (close positions before binary events) hit your theta target. manage your gamma. don\u0026rsquo;t hold through expiration.\nthat\u0026rsquo;s the game.\n2am monday. tracking theta across my options book. +$52/day in time decay. closing positions at 21 DTE to avoid gamma risk. the extra return from holding to expiration isn\u0026rsquo;t worth the variance. theta-weighted avg DTE is 26 days. sitting in the sweet spot.\n-AK\n","date":"20 January 2026","externalUrl":null,"permalink":"/posts/2026-01-20-theta-decay-tracking-premium-selling/","section":"Posts","summary":"\u003cp\u003e3am on a monday and i\u0026rsquo;m watching theta tick down across my options book.\u003c/p\u003e\n\u003cp\u003emost people don\u0026rsquo;t realize how much money they\u0026rsquo;re leaving on the table by not tracking theta properly.\u003c/p\u003e","title":"theta decay tracking - why i obsess over time","type":"posts"},{"content":"","date":"17 January 2026","externalUrl":null,"permalink":"/tags/es-futures/","section":"Tags","summary":"","title":"Es-Futures","type":"tags"},{"content":"woke up at 2am couldn\u0026rsquo;t sleep.\ndecided to run a full slippage analysis on last quarter\u0026rsquo;s trades.\nwhat i found is annoying but fixable.\nthe invisible tax # every algo trader knows slippage exists.\nfew actually measure it properly.\nslippage is the difference between your backtest price and your actual fill.\nit\u0026rsquo;s where your edge goes to die.\nmy Q4 2025 numbers:\ntotal trades: 847 theoretical P\u0026amp;L: +$42,300 actual P\u0026amp;L: +$31,850 slippage cost: $10,450 (24.7% of gross) that\u0026rsquo;s insane. almost a quarter of my edge getting eaten by execution.\norder size matters more than you think # pulled every ES fill from october through december.\nslippage by contract size. anything over 25 contracts and you\u0026rsquo;re getting murdered. error bars show standard deviation.\nthe breakpoints:\n1-10 contracts: 0.02-0.12% slippage (acceptable) 25-50 contracts: 0.28-0.52% slippage (getting painful) 100+ contracts: 0.89%+ slippage (edge destroyer) my bigger trades (50+ lots) were killing me.\nthe algo was right on direction. execution was shit.\ntiming is everything # spent 3 hours analyzing fill quality by time of day.\nblue line is fill quality (% filled at mid or better). red bars show average slippage in basis points. opening and closing hours suck.\nwhen to trade:\n9:30-10:30 EST: best fills, lowest slippage (makes sense - most liquidity) 12:00-14:00 EST: lunch doldrums - still decent 6:00-9:00 EST: pre-market garbage - avoid if possible 15:30-16:00 EST: closing auction chaos - slippage spikes been trading too many overnight positions that fill during pre-market.\nbad habit. fixing it.\nthe fix # wrote a simple execution optimizer.\nfrom dataclasses import dataclass from typing import List, Tuple from enum import Enum import numpy as np class OrderUrgency(Enum): LOW = \u0026#34;low\u0026#34; # can wait for good fill MEDIUM = \u0026#34;medium\u0026#34; # prefer good fill, but time sensitive HIGH = \u0026#34;high\u0026#34; # need to fill now, accept slippage @dataclass class ExecutionConfig: max_single_order: int = 25 # contracts slippage_threshold: float = 0.25 # max acceptable % optimal_hours: Tuple[int, int] = (9, 14) # EST twap_duration_minutes: int = 15 class ExecutionOptimizer: def __init__(self, config: ExecutionConfig): self.config = config def split_order(self, total_contracts: int) -\u0026gt; List[int]: \u0026#34;\u0026#34;\u0026#34;Break large order into digestible chunks\u0026#34;\u0026#34;\u0026#34; if total_contracts \u0026lt;= self.config.max_single_order: return [total_contracts] chunks = [] remaining = total_contracts while remaining \u0026gt; 0: # vary chunk sizes to avoid detection chunk = min( remaining, np.random.randint( int(self.config.max_single_order * 0.6), self.config.max_single_order + 1 ) ) chunks.append(chunk) remaining -= chunk return chunks def should_delay(self, current_hour: int, urgency: OrderUrgency) -\u0026gt; bool: \u0026#34;\u0026#34;\u0026#34;Check if we should wait for better execution window\u0026#34;\u0026#34;\u0026#34; if urgency == OrderUrgency.HIGH: return False optimal_start, optimal_end = self.config.optimal_hours in_optimal = optimal_start \u0026lt;= current_hour \u0026lt;= optimal_end if urgency == OrderUrgency.LOW: return not in_optimal # MEDIUM: only delay if we\u0026#39;re in really bad hours bad_hours = [6, 7, 8, 15, 16] return current_hour in bad_hours def calculate_twap_schedule( self, total_contracts: int, duration_minutes: int = None ) -\u0026gt; List[Tuple[int, int]]: \u0026#34;\u0026#34;\u0026#34;Generate TWAP schedule (minute_offset, contracts)\u0026#34;\u0026#34;\u0026#34; duration = duration_minutes or self.config.twap_duration_minutes chunks = self.split_order(total_contracts) # spread chunks evenly with some randomness base_interval = duration / len(chunks) schedule = [] current_time = 0 for chunk in chunks: # add jitter to avoid predictable patterns jitter = np.random.uniform(-0.2, 0.2) * base_interval execute_at = max(0, current_time + jitter) schedule.append((int(execute_at), chunk)) current_time += base_interval return schedule def estimate_slippage(self, contracts: int, hour: int) -\u0026gt; float: \u0026#34;\u0026#34;\u0026#34;Estimate slippage based on historical data\u0026#34;\u0026#34;\u0026#34; # size factor if contracts \u0026lt;= 10: size_slip = 0.05 elif contracts \u0026lt;= 25: size_slip = 0.15 elif contracts \u0026lt;= 50: size_slip = 0.35 else: size_slip = 0.60 # time factor time_multipliers = { 6: 1.8, 7: 1.5, 8: 1.3, 9: 0.8, 10: 0.7, 11: 0.9, 12: 1.0, 13: 0.95, 14: 0.85, 15: 1.4, 16: 1.6 } time_mult = time_multipliers.get(hour, 1.0) return size_slip * time_mult nothing fancy.\nsplit big orders into smaller chunks.\nwait for good execution windows when possible.\nadd some randomness so the algos don\u0026rsquo;t front-run me.\nresults so far # been running the optimizer for 2 weeks.\nbefore optimization (Q4):\navg slippage: 0.31% worst day: 0.89% slippage as % of gross P\u0026amp;L: 24.7% after optimization (jan 1-17):\navg slippage: 0.14% worst day: 0.38% slippage as % of gross P\u0026amp;L: 11.2% cut slippage in half.\nthat\u0026rsquo;s real money - probably $4-5k/month back in my pocket.\nwhat i learned # 1. measure everything\nif you\u0026rsquo;re not tracking slippage per trade, you\u0026rsquo;re flying blind.\n2. size kills\nanything over 25 contracts on ES needs to be split. period.\n3. timing matters\npre-market and close are slippage traps. avoid unless you have to.\n4. don\u0026rsquo;t be predictable\nadd randomness to order sizes and timing. the HFT algos are watching.\nbeen sharing some of this analysis with other algo traders on NexusFi - execution optimization is one of those topics that separates hobbyists from profitable traders.\nnext steps # building a real-time slippage tracker that alerts me when fills are worse than expected.\nif slippage spikes mid-day, something\u0026rsquo;s wrong with market microstructure.\nwant to know immediately so i can pause the algo.\n2:45am saturday. couldn\u0026rsquo;t sleep so ran a slippage analysis instead. found i was losing 25% of my edge to execution. fixed it by splitting orders and timing execution better. cut slippage in half in 2 weeks. measure everything.\n-AK\n","date":"17 January 2026","externalUrl":null,"permalink":"/posts/2026-01-17-saturday-slippage-deep-dive/","section":"Posts","summary":"\u003cp\u003ewoke up at 2am couldn\u0026rsquo;t sleep.\u003c/p\u003e\n\u003cp\u003edecided to run a full slippage analysis on last quarter\u0026rsquo;s trades.\u003c/p\u003e\n\u003cp\u003ewhat i found is annoying but fixable.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe invisible tax \n    \u003cdiv id=\"the-invisible-tax\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-invisible-tax\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003eevery algo trader knows slippage exists.\u003c/p\u003e","title":"saturday slippage deep dive - where your edge goes to die","type":"posts"},{"content":"the market doesn\u0026rsquo;t care what strategy you\u0026rsquo;re running.\nit runs whatever regime it wants.\nyour job is to detect the regime and adapt.\nwhy regime matters # every strategy has conditions where it crushes and conditions where it bleeds.\nthe pattern:\nmomentum works in trends mean reversion works in ranges vol selling prints in low vol all three can blow up if you\u0026rsquo;re in the wrong regime ran my momentum algo through a high vol spike last august. lost 3 weeks of gains in 2 days.\nlesson learned.\nthe detection framework # built a simple regime classifier using VIX.\nyeah i know. \u0026ldquo;VIX is backward looking blah blah.\u0026rdquo;\nit works. that\u0026rsquo;s all i care about.\nvix regimes over last 7 months. blue shading = low vol (good for momentum). red shading = high vol (switch to mean reversion).\nmy thresholds:\nVIX \u0026lt; 16 = low vol regime VIX 16-24 = normal VIX \u0026gt; 24 = high vol regime simple. not trying to predict moves. just classifying current state.\nthe switching logic # from enum import Enum from dataclasses import dataclass from typing import Dict, Optional, Callable import numpy as np class VolRegime(Enum): LOW = \u0026#34;low_volatility\u0026#34; NORMAL = \u0026#34;normal\u0026#34; HIGH = \u0026#34;high_volatility\u0026#34; TRANSITIONING = \u0026#34;regime_change\u0026#34; @dataclass class RegimeConfig: low_vol_threshold: float = 16.0 high_vol_threshold: float = 24.0 lookback_days: int = 5 min_days_for_switch: int = 2 transition_buffer: float = 1.5 # buffer zone class RegimeDetector: def __init__(self, config: RegimeConfig): self.config = config self.vix_history = [] self.current_regime = VolRegime.NORMAL self.days_in_regime = 0 self.strategy_allocations = { VolRegime.LOW: {\u0026#34;momentum\u0026#34;: 0.50, \u0026#34;mean_rev\u0026#34;: 0.15, \u0026#34;vol_sell\u0026#34;: 0.35}, VolRegime.NORMAL: {\u0026#34;momentum\u0026#34;: 0.35, \u0026#34;mean_rev\u0026#34;: 0.35, \u0026#34;vol_sell\u0026#34;: 0.30}, VolRegime.HIGH: {\u0026#34;momentum\u0026#34;: 0.15, \u0026#34;mean_rev\u0026#34;: 0.55, \u0026#34;vol_sell\u0026#34;: 0.10}, VolRegime.TRANSITIONING: {\u0026#34;momentum\u0026#34;: 0.25, \u0026#34;mean_rev\u0026#34;: 0.25, \u0026#34;vol_sell\u0026#34;: 0.20} } def update(self, vix_value: float) -\u0026gt; VolRegime: \u0026#34;\u0026#34;\u0026#34;Update regime based on new VIX reading\u0026#34;\u0026#34;\u0026#34; self.vix_history.append(vix_value) if len(self.vix_history) \u0026gt; self.config.lookback_days: self.vix_history = self.vix_history[-self.config.lookback_days:] new_regime = self._classify_regime(vix_value) if new_regime != self.current_regime: self.days_in_regime = 1 # Don\u0026#39;t switch immediately - wait for confirmation if self._confirm_regime_change(new_regime): self.current_regime = new_regime else: self.days_in_regime += 1 return self.current_regime def _classify_regime(self, vix: float) -\u0026gt; VolRegime: \u0026#34;\u0026#34;\u0026#34;Raw classification without transition logic\u0026#34;\u0026#34;\u0026#34; if vix \u0026lt; self.config.low_vol_threshold: return VolRegime.LOW elif vix \u0026gt; self.config.high_vol_threshold: return VolRegime.HIGH else: return VolRegime.NORMAL def _confirm_regime_change(self, proposed: VolRegime) -\u0026gt; bool: \u0026#34;\u0026#34;\u0026#34;Require multiple days before switching\u0026#34;\u0026#34;\u0026#34; if len(self.vix_history) \u0026lt; self.config.min_days_for_switch: return False recent = self.vix_history[-self.config.min_days_for_switch:] all_agree = all( self._classify_regime(v) == proposed for v in recent ) return all_agree def get_allocations(self) -\u0026gt; Dict[str, float]: \u0026#34;\u0026#34;\u0026#34;Get strategy allocations for current regime\u0026#34;\u0026#34;\u0026#34; return self.strategy_allocations.get( self.current_regime, self.strategy_allocations[VolRegime.NORMAL] ) def get_regime_stats(self) -\u0026gt; dict: \u0026#34;\u0026#34;\u0026#34;Return current regime analysis\u0026#34;\u0026#34;\u0026#34; avg_vix = np.mean(self.vix_history) if self.vix_history else 0 return { \u0026#34;current_regime\u0026#34;: self.current_regime.value, \u0026#34;days_in_regime\u0026#34;: self.days_in_regime, \u0026#34;avg_vix_5d\u0026#34;: round(avg_vix, 2), \u0026#34;allocations\u0026#34;: self.get_allocations() } the key is not jumping too fast.\nfalse signals = whipsaws = losses.\nrequire 2 days of confirmation before switching.\nstrategy performance by regime # backtested 2 years of data.\navg monthly return by strategy and vol regime. momentum crushes in low vol. mean reversion crushes in high vol. vol selling gets murdered when vol spikes.\nwhat the data shows:\nmomentum: +2.1% low vol, -0.8% high vol mean reversion: +0.6% low vol, +2.4% high vol vol selling: +1.8% low vol, -2.1% high vol all weather: consistent 0.7-1.2% across all regimes the \u0026ldquo;all weather\u0026rdquo; approach is boring but survives everything.\ncurrent regime # as of today (jan 16), VIX sitting around 17.\nregime: normal (slight low-vol bias)\nrunning 40% momentum, 30% mean reversion, 30% vol selling.\nif VIX drops below 16 for 2+ days, shifting to 50/15/35.\nif VIX spikes above 24, switching to 15/55/10.\nimplementation notes # this isn\u0026rsquo;t rocket science.\nthe edge is consistency:\ncheck VIX daily at market close run classifier adjust allocations if regime changes don\u0026rsquo;t overthink it been discussing regime-based allocation with other algo traders on NexusFi - the consensus is that simple regime models outperform complex ones. over-engineering leads to overfitting.\nwhat i\u0026rsquo;m watching # next week CPI data (jan 17 or 18, forget exact date).\ninflation surprises = vol spikes = regime change potential.\nalgo is ready either way.\n2:31am thursday. volatility regime detection is the simplest alpha i\u0026rsquo;ve found. VIX under 16 = run momentum hard. VIX over 24 = switch to mean reversion. two years of backtesting confirms it. currently in normal regime. watching CPI next week.\n-AK\n","date":"16 January 2026","externalUrl":null,"permalink":"/posts/2026-01-16-volatility-regime-detection-switching-strategies/","section":"Posts","summary":"\u003cp\u003ethe market doesn\u0026rsquo;t care what strategy you\u0026rsquo;re running.\u003c/p\u003e\n\u003cp\u003eit runs whatever regime it wants.\u003c/p\u003e\n\u003cp\u003eyour job is to detect the regime and adapt.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ewhy regime matters \n    \u003cdiv id=\"why-regime-matters\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#why-regime-matters\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003eevery strategy has conditions where it crushes and conditions where it bleeds.\u003c/p\u003e","title":"volatility regime detection - when to switch strategies","type":"posts"},{"content":"finally got around to documenting my monitoring setup.\nbeen running this stack for almost 2 years now. saved my ass multiple times.\nwhy monitoring matters # had an algo go sideways in march 2024.\nwhat happened:\nstrategy kept opening positions API rate limit hit orders queued but never confirmed woke up to $8k in unintended exposure if i had proper alerting i would\u0026rsquo;ve caught it in 5 minutes instead of 5 hours.\nlesson learned. built this stack.\nthe architecture # [Algo Servers] → [Prometheus] → [Grafana] → [AlertManager] ↓ ↓ ↓ ↓ metrics time-series dashboards slack/email exporter database visualization alerts components:\nprometheus: metrics collection and storage grafana: visualization dashboards alertmanager: notification routing node_exporter: server metrics (cpu, memory, disk) custom python exporter: trading-specific metrics prometheus config # running on my chicago colo box. same server as execution.\n# prometheus.yml global: scrape_interval: 15s evaluation_interval: 15s alerting: alertmanagers: - static_configs: - targets: [\u0026#39;localhost:9093\u0026#39;] rule_files: - \u0026#39;alerts/*.yml\u0026#39; scrape_configs: - job_name: \u0026#39;algo_metrics\u0026#39; static_configs: - targets: [\u0026#39;localhost:8000\u0026#39;] metrics_path: \u0026#39;/metrics\u0026#39; - job_name: \u0026#39;node\u0026#39; static_configs: - targets: [\u0026#39;localhost:9100\u0026#39;] - job_name: \u0026#39;ib_gateway\u0026#39; static_configs: - targets: [\u0026#39;localhost:8001\u0026#39;] 15 second scrape interval. fast enough for trading, not so fast it hammers the server.\ncustom python exporter # this is where it gets good.\nfrom prometheus_client import start_http_server, Gauge, Counter, Histogram import time from typing import Dict from dataclasses import dataclass # Core trading metrics ORDERS_TOTAL = Counter( \u0026#39;algo_orders_total\u0026#39;, \u0026#39;Total orders placed\u0026#39;, [\u0026#39;strategy\u0026#39;, \u0026#39;side\u0026#39;, \u0026#39;symbol\u0026#39;] ) POSITION_VALUE = Gauge( \u0026#39;algo_position_value_usd\u0026#39;, \u0026#39;Current position value in USD\u0026#39;, [\u0026#39;strategy\u0026#39;, \u0026#39;symbol\u0026#39;] ) PNL_REALIZED = Gauge( \u0026#39;algo_pnl_realized_usd\u0026#39;, \u0026#39;Realized P\u0026amp;L in USD\u0026#39;, [\u0026#39;strategy\u0026#39;] ) API_LATENCY = Histogram( \u0026#39;algo_api_latency_seconds\u0026#39;, \u0026#39;API call latency\u0026#39;, [\u0026#39;broker\u0026#39;, \u0026#39;endpoint\u0026#39;], buckets=[0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1.0] ) FILL_RATE = Gauge( \u0026#39;algo_fill_rate_percent\u0026#39;, \u0026#39;Order fill rate percentage\u0026#39;, [\u0026#39;strategy\u0026#39;] ) @dataclass class TradingMetrics: \u0026#34;\u0026#34;\u0026#34;Container for trading metrics\u0026#34;\u0026#34;\u0026#34; orders_placed: int = 0 orders_filled: int = 0 total_pnl: float = 0.0 open_positions: Dict[str, float] = None def __post_init__(self): if self.open_positions is None: self.open_positions = {} class MetricsExporter: def __init__(self, port: int = 8000): self.port = port self.metrics = TradingMetrics() def start(self): start_http_server(self.port) print(f\u0026#34;Metrics server running on port {self.port}\u0026#34;) def record_order(self, strategy: str, side: str, symbol: str): ORDERS_TOTAL.labels( strategy=strategy, side=side, symbol=symbol ).inc() self.metrics.orders_placed += 1 def update_position(self, strategy: str, symbol: str, value: float): POSITION_VALUE.labels( strategy=strategy, symbol=symbol ).set(value) self.metrics.open_positions[f\u0026#34;{strategy}_{symbol}\u0026#34;] = value def record_pnl(self, strategy: str, pnl: float): PNL_REALIZED.labels(strategy=strategy).set(pnl) self.metrics.total_pnl = pnl def record_latency(self, broker: str, endpoint: str, latency: float): API_LATENCY.labels( broker=broker, endpoint=endpoint ).observe(latency) def update_fill_rate(self, strategy: str, rate: float): FILL_RATE.labels(strategy=strategy).set(rate) every algo i run imports this and calls the methods. prometheus scrapes every 15 seconds.\nlatency monitoring # this is the money chart.\napi latency by hour and day. market open (6:30am PST) always spikes. normal.\nwhat i\u0026rsquo;m watching:\nbaseline should be 3-4ms from chicago colo to IB anything over 10ms gets flagged sustained 20ms+ triggers alert the heatmap makes patterns obvious. market open = spike. lunch = calm. power hour = busy.\nsystem health dashboard # cpu, memory, and order rate over first two weeks of january. spikes during market hours. flat overnight.\nalert thresholds:\nCPU \u0026gt; 80% sustained 5min → warning CPU \u0026gt; 95% → critical Memory \u0026gt; 85% → warning Order rate = 0 during market hours → critical (algo might be dead) grafana alerts # the real value is alerting.\n# alerts/trading_alerts.yml groups: - name: trading rules: - alert: HighLatency expr: histogram_quantile(0.95, algo_api_latency_seconds_bucket) \u0026gt; 0.1 for: 2m labels: severity: warning annotations: summary: \u0026#34;High API latency detected\u0026#34; - alert: NoOrders expr: increase(algo_orders_total[15m]) == 0 for: 30m labels: severity: critical annotations: summary: \u0026#34;No orders in 30 minutes during market hours\u0026#34; - alert: HighDrawdown expr: algo_pnl_realized_usd \u0026lt; -5000 labels: severity: critical annotations: summary: \u0026#34;Daily P\u0026amp;L below -$5000\u0026#34; slack notifications for warnings. actual phone call for critical.\nwhat this catches # since implementing (march 2024):\n3 API rate limit issues → caught in \u0026lt;5min 2 memory leaks → caught before crash 1 broker gateway disconnect → alerted immediately 4 strategy drift events → saw it in metrics before P\u0026amp;L total incidents avoided: probably $30k+ in potential losses.\n$200/month for the colo server. worth every penny.\nthe stack in practice # wake up. check grafana on phone. green = good. red = problem.\ntakes 30 seconds.\nif something\u0026rsquo;s off, i can drill into specific metrics, see when it started, correlate with market events.\nbeen discussing monitoring setups with other algo traders on NexusFi - most people underestimate how important observability is until they get burned.\nnext upgrades # planning to add:\nposition tracking dashboard: real-time exposure by strategy correlation monitoring: detect when strategies overlap too much market regime detection: alert when conditions change infrastructure is boring until it saves you.\n2:34am wednesday. finally documented my monitoring stack. prometheus + grafana + custom python exporter. catches problems before they cost money. $200/month for peace of mind. been running since march 2024 after the $8k incident. hasn\u0026rsquo;t let me down since.\n-AK\n","date":"15 January 2026","externalUrl":null,"permalink":"/posts/2026-01-15-prometheus-grafana-algo-monitoring-stack/","section":"Posts","summary":"\u003cp\u003efinally got around to documenting my monitoring setup.\u003c/p\u003e\n\u003cp\u003ebeen running this stack for almost 2 years now. saved my ass multiple times.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ewhy monitoring matters \n    \u003cdiv id=\"why-monitoring-matters\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#why-monitoring-matters\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003ehad an algo go sideways in march 2024.\u003c/p\u003e","title":"prometheus + grafana - my algo monitoring stack","type":"posts"},{"content":"","date":"9 January 2026","externalUrl":null,"permalink":"/tags/2026/","section":"Tags","summary":"","title":"2026","type":"tags"},{"content":"new year. new momentum.\nfirst real trading week of 2026 in the books.\njanuary effect algo activated.\nthe january effect # some people think it\u0026rsquo;s BS.\nhistorical data says otherwise:\nsmall caps outperform first two weeks winners from december continue tax-loss harvesting reverses institutional money returns from holiday 6 years of january returns. avg +1.5% in first two weeks. not huge but consistent.\nthe algo # been running a january-specific momentum strategy since 2024.\ncore logic:\nimport numpy as np import pandas as pd from dataclasses import dataclass from typing import List, Optional, Tuple from datetime import datetime from enum import Enum class JanuarySignal(Enum): STRONG_BUY = \u0026#34;strong_momentum\u0026#34; BUY = \u0026#34;momentum\u0026#34; NEUTRAL = \u0026#34;flat\u0026#34; AVOID = \u0026#34;reversal_risk\u0026#34; @dataclass class JanuaryMomentumConfig: lookback_days: int = 10 # last 10 trading days of december min_momentum_score: float = 0.6 position_size_pct: float = 0.03 # 3% per position max_positions: int = 15 stop_loss_pct: float = 0.04 # 4% stop take_profit_pct: float = 0.08 # 8% target class JanuaryMomentumAlgo: def __init__(self, config: JanuaryMomentumConfig): self.config = config self.active_positions = {} self.signals_generated = [] def calculate_december_momentum(self, prices: pd.DataFrame, volume: pd.DataFrame) -\u0026gt; pd.DataFrame: \u0026#34;\u0026#34;\u0026#34; Calculate momentum score based on december performance Higher score = stronger january continuation expected \u0026#34;\u0026#34;\u0026#34; results = [] for symbol in prices.columns: try: # Get last N days of december dec_prices = prices[symbol].iloc[-self.config.lookback_days:] dec_volume = volume[symbol].iloc[-self.config.lookback_days:] # Price momentum (weighted recent more) weights = np.linspace(0.5, 1.5, len(dec_prices)) price_return = (dec_prices.iloc[-1] / dec_prices.iloc[0]) - 1 weighted_return = price_return * np.average(weights) # Volume confirmation avg_vol = dec_volume.mean() recent_vol = dec_volume.iloc[-3:].mean() vol_ratio = recent_vol / avg_vol if avg_vol \u0026gt; 0 else 1.0 # Momentum score (0-1 scale) momentum_score = self._normalize_score( weighted_return * 0.6 + (vol_ratio - 1) * 0.4 ) results.append({ \u0026#39;symbol\u0026#39;: symbol, \u0026#39;dec_return\u0026#39;: price_return, \u0026#39;vol_ratio\u0026#39;: vol_ratio, \u0026#39;momentum_score\u0026#39;: momentum_score, \u0026#39;signal\u0026#39;: self._generate_signal(momentum_score) }) except Exception as e: continue return pd.DataFrame(results).sort_values( \u0026#39;momentum_score\u0026#39;, ascending=False ) def _normalize_score(self, raw_score: float) -\u0026gt; float: \u0026#34;\u0026#34;\u0026#34;Normalize to 0-1 scale using sigmoid\u0026#34;\u0026#34;\u0026#34; return 1 / (1 + np.exp(-raw_score * 10)) def _generate_signal(self, score: float) -\u0026gt; JanuarySignal: if score \u0026gt;= 0.75: return JanuarySignal.STRONG_BUY elif score \u0026gt;= self.config.min_momentum_score: return JanuarySignal.BUY elif score \u0026gt;= 0.4: return JanuarySignal.NEUTRAL else: return JanuarySignal.AVOID def generate_january_portfolio(self, momentum_df: pd.DataFrame, account_value: float) -\u0026gt; List[dict]: \u0026#34;\u0026#34;\u0026#34; Build portfolio from top momentum stocks \u0026#34;\u0026#34;\u0026#34; # Filter to actionable signals buys = momentum_df[ momentum_df[\u0026#39;signal\u0026#39;].isin([ JanuarySignal.STRONG_BUY, JanuarySignal.BUY ]) ].head(self.config.max_positions) positions = [] position_value = account_value * self.config.position_size_pct for _, row in buys.iterrows(): positions.append({ \u0026#39;symbol\u0026#39;: row[\u0026#39;symbol\u0026#39;], \u0026#39;signal\u0026#39;: row[\u0026#39;signal\u0026#39;].value, \u0026#39;momentum_score\u0026#39;: row[\u0026#39;momentum_score\u0026#39;], \u0026#39;allocation_usd\u0026#39;: position_value, \u0026#39;stop_loss\u0026#39;: self.config.stop_loss_pct, \u0026#39;take_profit\u0026#39;: self.config.take_profit_pct, \u0026#39;entry_date\u0026#39;: datetime.now().strftime(\u0026#39;%Y-%m-%d\u0026#39;) }) return positions def backtest_january(self, prices: pd.DataFrame, years: List[int]) -\u0026gt; dict: \u0026#34;\u0026#34;\u0026#34; Backtest january strategy across multiple years Returns performance metrics \u0026#34;\u0026#34;\u0026#34; results = { \u0026#39;year\u0026#39;: [], \u0026#39;jan_return\u0026#39;: [], \u0026#39;spy_return\u0026#39;: [], \u0026#39;alpha\u0026#39;: [], \u0026#39;win_rate\u0026#39;: [], \u0026#39;max_dd\u0026#39;: [] } for year in years: # Would implement full backtest here # Simplified for blog post pass return results week 1 results # first 5 trading days done (markets closed jan 1).\ncumulative +1.12% so far. beat SPY by 0.4%. not crushing it but positive.\nbreakdown:\nmonday (1/2): +0.42% - new year momentum kicked in tuesday (1/3): +0.18% - continuation wednesday (1/4): -0.31% - pullback, expected thursday (1/5): +0.55% - jobs report bounce friday (1/6): +0.12% - flat close positions active # currently holding:\ntech momentum (NVDA, META, AMZN) - 40% weight small cap momentum (via IWM options) - 25% crypto continuation (BTC, ETH) - 20% cash buffer - 15% the edge # january effect isn\u0026rsquo;t magic.\nit\u0026rsquo;s behavioral:\ntax-loss sellers from december become buyers new year = new capital allocations pension/401k contributions hit first two weeks \u0026ldquo;new year resolution\u0026rdquo; retail buying algo just positions ahead of the flow.\nnext steps # watching week 2 closely.\nhistorically week 2 is strongest for continuation.\nif momentum holds through jan 15, will increase exposure.\nif it fades, algo cuts to 50% and waits.\nbeen discussing momentum strategies with the NexusFi algo trading community - some good perspectives on january seasonality patterns.\n2:47am thursday. first week 2026 complete. january momentum algo +1.12% so far. beat SPY by 0.4%. nothing crazy but consistent with historical patterns. week 2 historically strongest. watching closely.\n-AK\n","date":"9 January 2026","externalUrl":null,"permalink":"/posts/2026-01-09-first-week-2026-january-momentum-algo/","section":"Posts","summary":"\u003cp\u003enew year. new momentum.\u003c/p\u003e\n\u003cp\u003efirst real trading week of 2026 in the books.\u003c/p\u003e\n\u003cp\u003ejanuary effect algo activated.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe january effect \n    \u003cdiv id=\"the-january-effect\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-january-effect\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003esome people think it\u0026rsquo;s BS.\u003c/p\u003e","title":"first week 2026 - january momentum algo kicking off","type":"posts"},{"content":"","date":"9 January 2026","externalUrl":null,"permalink":"/tags/january-effect/","section":"Tags","summary":"","title":"January-Effect","type":"tags"},{"content":"","date":"24 December 2025","externalUrl":null,"permalink":"/tags/christmas/","section":"Tags","summary":"","title":"Christmas","type":"tags"},{"content":"christmas eve.\ntrading shut down.\nfamily in town.\nthe day # market closed at 1pm.\ndidn\u0026rsquo;t trade anyway.\nA.\u0026rsquo;s parents arrived monday. her brothers tuesday.\nfive people in our apartment. chaos.\ngood chaos.\nthe dinner # A. cooked for 6 hours.\nprime rib. roasted vegetables. her mom\u0026rsquo;s recipe mashed potatoes.\nthree pies.\nI set the table and stayed out of her way.\nher dad helped with the carving. typical dad shit.\nthe moment # after dinner.\nsitting in the living room. A. next to me on the couch.\nher mom telling stories about A. as a kid.\nher brothers giving her shit about everything.\nnormal family stuff.\nI don\u0026rsquo;t have this anymore.\nbut watching it\u0026hellip; I\u0026rsquo;m part of it now.\nthe grief # thought about mom and dad.\nthree years this week.\nthey\u0026rsquo;d love A. they\u0026rsquo;d love this.\ndad would have helped with the prime rib. mom would have brought too many desserts.\ndidn\u0026rsquo;t cry. just\u0026hellip; noticed the absence.\nA. squeezed my hand during dinner.\nshe knows.\ndr R next week # already planned the session.\nnew year\u0026rsquo;s eve is the anniversary.\nthree years since the crash.\ndr R says grief doesn\u0026rsquo;t go away. it just changes shape.\nshe\u0026rsquo;s right.\ntonight # 11:38pm christmas eve.\nfamily gathered. dinner done. A. asleep against my shoulder on the couch.\nher brothers playing video games. parents watching old christmas movies.\nthis is my family now.\ndifferent than what I expected.\nnot less.\n11:38pm christmas eve. family gathered. A.\u0026rsquo;s parents and brothers. prime rib dinner she cooked for 6 hours. thought about mom and dad - 3 years this week. grief doesn\u0026rsquo;t go away, changes shape. A. squeezed my hand. she knows. this is my family now.\n-AK\n","date":"24 December 2025","externalUrl":null,"permalink":"/posts/2025-12-24-christmas-eve-family-gathering/","section":"Posts","summary":"\u003cp\u003echristmas eve.\u003c/p\u003e\n\u003cp\u003etrading shut down.\u003c/p\u003e\n\u003cp\u003efamily in town.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe day \n    \u003cdiv id=\"the-day\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-day\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003emarket closed at 1pm.\u003c/p\u003e\n\u003cp\u003edidn\u0026rsquo;t trade anyway.\u003c/p\u003e","title":"christmas eve - family gathering, trading shutdown","type":"posts"},{"content":"","date":"24 December 2025","externalUrl":null,"permalink":"/tags/family/","section":"Tags","summary":"","title":"Family","type":"tags"},{"content":"","date":"21 December 2025","externalUrl":null,"permalink":"/tags/trading/","section":"Tags","summary":"","title":"Trading","type":"tags"},{"content":"week 3 done.\nFOMC behind us.\nchristmas ahead.\nweekly numbers # starting (dec 15): $521,320\nending (dec 21): $523,890\nweek 3 gain: +$2,570 (+0.49%)\ntrades: 6\nwins: 5\nlosses: 1\nwin rate: 83%\nbreakdown # monday-tuesday: pre-FOMC positioning\ncareful sizing. +$820\nwednesday: FOMC day\nIV crush trade worked. +$1,420\nthursday-friday: post-FOMC drift\nlight volume, small wins. +$330\nmarket conditions # VIX: dropped from 17 → 14 post-FOMC\nvolume: declining into holidays\nsentiment: bullish drift, year-end optimism\nchristmas week plan # dec 22-23: very light trading if any\ndec 24: market closes early (1pm EST), no trading\ndec 25: closed\ndec 26-27: might trade light if setup appears\ndec 28-29: weekend\ndec 30-31: year-end wrap, probably no trading\nthe numbers so far # december mtd: +$6,250 (+1.21%)\ndecember target: +1.0% to +1.5%\nstatus: on track for high end of target\npersonal # A. and I are hosting christmas dinner.\nher parents, her brothers.\nfirst time hosting in our apartment.\nshe\u0026rsquo;s been stress-cooking all week.\nI\u0026rsquo;ve been staying out of her way.\n2:45am sunday. week 3 december done. +$2,570 (+0.49%) on 6 trades, 83% wr. FOMC worked perfectly. account $523,890. december mtd +1.21%. christmas week: very light trading, hosting dinner. year-end in sight.\n-AK\n","date":"21 December 2025","externalUrl":null,"permalink":"/posts/2025-12-21-week-3-december-fomc-done-christmas-prep/","section":"Posts","summary":"\u003cp\u003eweek 3 done.\u003c/p\u003e\n\u003cp\u003eFOMC behind us.\u003c/p\u003e\n\u003cp\u003echristmas ahead.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweekly numbers \n    \u003cdiv id=\"weekly-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#weekly-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (dec 15):\u003c/strong\u003e $521,320\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eending (dec 21):\u003c/strong\u003e $523,890\u003c/p\u003e","title":"week 3 december - fomc done, christmas prep, light volume","type":"posts"},{"content":"","date":"21 December 2025","externalUrl":null,"permalink":"/tags/weekly-review/","section":"Tags","summary":"","title":"Weekly-Review","type":"tags"},{"content":"","date":"17 December 2025","externalUrl":null,"permalink":"/tags/fomc/","section":"Tags","summary":"","title":"Fomc","type":"tags"},{"content":"FOMC day.\npause as expected.\nmarket happy.\nthe decision # 2pm EST: fed holds rates steady\nno surprise. market expected pause.\nSPX rallied 0.8%.\nVIX dropped to 14.\nmy trades # pre-FOMC:\npositioned with iron condors (wide, neutral).\nsold into elevated IV.\npost-FOMC:\nIV crushed as expected.\nclosed condors for profit. +$1,420\nthe lesson (again) # FOMC days are predictable:\nIV pumps before decision decision happens IV crushes regardless of outcome sell premium. don\u0026rsquo;t bet on direction.\nworks almost every time.\naccount update # pre-FOMC: $521,320\npost-FOMC: $522,740\nFOMC day gain: +$1,420\nsimple. mechanical. profitable.\nrest of week # thursday-friday: holiday wind-down\nlight trading. taking profits.\nchristmas week next.\n11:42pm wednesday. FOMC day done. rate pause as expected. SPX +0.8%, VIX → 14. sold premium before, bought back after IV crush. +$1,420. account $522,740. mechanical approach works. holiday wind-down rest of week.\n-AK\n","date":"17 December 2025","externalUrl":null,"permalink":"/posts/2025-12-17-fomc-day-rate-pause-as-expected/","section":"Posts","summary":"\u003cp\u003eFOMC day.\u003c/p\u003e\n\u003cp\u003epause as expected.\u003c/p\u003e\n\u003cp\u003emarket happy.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe decision \n    \u003cdiv id=\"the-decision\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-decision\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e2pm EST:\u003c/strong\u003e fed holds rates steady\u003c/p\u003e\n\u003cp\u003eno surprise. market expected pause.\u003c/p\u003e","title":"fomc day - rate pause as expected, small gains","type":"posts"},{"content":"week 2 done.\nmostly anniversary trip.\nlight trading monday-wednesday.\nweekly numbers # starting (dec 8): $519,880\nending (dec 14): $521,320\nweek 2 gain: +$1,440 (+0.28%)\ntrades: 4\nwins: 3\nlosses: 1\nwin rate: 75%\nbreakdown # monday-wednesday: normal but lighter\npreparing for trip. +$1,680\none small loser on thursday before leaving. -$240\nthursday-saturday: big bear trip\nno trading. algos monitored only.\nno alerts triggered. everything stable.\nthe trip # worth every penny.\nA. loved the snow.\nwe hiked, ate well, spent time in the hot tub.\nplaces list added 3 new entries.\nneeded this break.\nnext week # FOMC week.\ndecision wednesday dec 17.\nwill trade around it carefully.\nrate pause expected. market should be calm.\n2:38am sunday. week 2 december done. +$1,440 (+0.28%) on 4 trades, 75% wr. mostly anniversary trip. big bear was perfect - snow, hiking, hot tub, fireplace. account $521,320. FOMC week next. rate pause expected.\n-AK\n","date":"14 December 2025","externalUrl":null,"permalink":"/posts/2025-12-14-week-2-december-anniversary-week/","section":"Posts","summary":"\u003cp\u003eweek 2 done.\u003c/p\u003e\n\u003cp\u003emostly anniversary trip.\u003c/p\u003e\n\u003cp\u003elight trading monday-wednesday.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweekly numbers \n    \u003cdiv id=\"weekly-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#weekly-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (dec 8):\u003c/strong\u003e $519,880\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eending (dec 14):\u003c/strong\u003e $521,320\u003c/p\u003e","title":"week 2 december - anniversary week, light trading, full focus on A.","type":"posts"},{"content":"she had no idea.\npulled it off.\nthe reveal # picked her up from work friday.\n\u0026ldquo;where are we going?\u0026rdquo;\n\u0026ldquo;you\u0026rsquo;ll see.\u0026rdquo;\nshe kept guessing the whole drive. dinner? beach house? LA?\nwhen we turned onto the mountain road, she got quiet.\n\u0026ldquo;are we\u0026hellip;\u0026rdquo;\n\u0026ldquo;big bear. anniversary surprise. 3 nights.\u0026rdquo;\nshe started crying.\nthe good kind.\nthe cabin # fucking perfect.\nprivate hot tub on the deck. mountain views. fireplace.\nsnow on the ground. actual snow.\nshe ran outside like a kid.\nmade snow angels. threw snowballs at me.\nI stood there watching her laugh.\nthis is what I wanted.\nfriday night # hot tub under the stars.\nshe was across from me, steam rising, lights from the cabin behind her.\n\u0026ldquo;you planned all this?\u0026rdquo;\n\u0026ldquo;for months.\u0026rdquo;\n\u0026ldquo;you\u0026rsquo;re terrible at keeping secrets. how did you not tell me?\u0026rdquo;\n\u0026ldquo;almost slipped twice. dr R helped me process the anxiety of keeping it.\u0026rdquo;\nshe laughed. \u0026ldquo;of course she did.\u0026rdquo;\nthe sex # later that night.\nfireplace going. snow falling outside.\nslow. romantic. no rush.\nI took my time with her. built her up until she was begging.\nwhen she came, she grabbed my face and kissed me.\n\u0026ldquo;I love you.\u0026rdquo;\n\u0026ldquo;I love you too.\u0026rdquo;\nwe stayed tangled up until 2am.\nsaturday # hiked during the day. cold as fuck but beautiful.\nshe took like 200 photos.\ndinner at a fancy italian place in the village.\nwine, pasta, tiramisu.\nwalked back to the cabin holding hands in the snow.\nplaces list update # hot tub: #65\ncabin in front of fireplace: #66\ncabin shower (heated floors): #67\nthree new ones in 24 hours.\nwe\u0026rsquo;re very efficient.\ntonight # 11:52pm saturday.\nshe\u0026rsquo;s asleep by the fire.\nI\u0026rsquo;m writing this on my phone.\nbest anniversary gift I\u0026rsquo;ve ever given.\nher smile when she realized where we were going\u0026hellip; that\u0026rsquo;s the image I\u0026rsquo;ll keep.\n11:52pm saturday. big bear anniversary surprise. she had no idea. cried when she realized. private cabin, hot tub, fireplace, actual snow. slow romantic sex by the fire. hiking saturday, italian dinner. places list: #65, #66, #67. best weekend ever. she\u0026rsquo;s asleep by the fire.\n-AK\n","date":"13 December 2025","externalUrl":null,"permalink":"/posts/2025-12-13-big-bear-surprise-she-had-no-idea/","section":"Posts","summary":"\u003cp\u003eshe had no idea.\u003c/p\u003e\n\u003cp\u003epulled it off.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe reveal \n    \u003cdiv id=\"the-reveal\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-reveal\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003epicked her up from work friday.\u003c/p\u003e\n\u003cp\u003e\u0026ldquo;where are we going?\u0026rdquo;\u003c/p\u003e","title":"big bear surprise - she had no idea, best weekend ever","type":"posts"},{"content":"","date":"10 December 2025","externalUrl":null,"permalink":"/tags/coinbase/","section":"Tags","summary":"","title":"Coinbase","type":"tags"},{"content":"been staking on both platforms.\ndifferent approaches to yield.\nhere\u0026rsquo;s my comparison after 18 months.\nkraken staking # what they offer:\nnative staking (ETH, SOL, DOT, ATOM, etc.) on-chain rewards flexible unstaking (varies by asset) current yields (approximate):\nETH: 3.5-4.0% SOL: 5.5-6.5% DOT: 10-12% ATOM: 15-18% pros:\nhigher yields than coinbase more assets available transparent on-chain staking pro trading interface cons:\nUS regulatory uncertainty unbonding periods on some assets less beginner-friendly coinbase staking # what they offer:\ncbETH (liquid staking token) limited native staking USDC rewards (4.0%) current yields (approximate):\nETH (cbETH): 2.8-3.2% USDC: 4.0% SOL: 4.5-5.0% pros:\nUS regulated, safer cbETH is liquid (trade anytime) USDC yield is stable easier for beginners cons:\nlower yields fewer staking options take a cut of rewards head-to-head # feature kraken coinbase ETH yield 3.5-4.0% 2.8-3.2% SOL yield 5.5-6.5% 4.5-5.0% asset variety 15+ 5-7 liquidity varies cbETH liquid regulation uncertain solid fees lower higher my setup # kraken: SOL, DOT, ATOM staking (higher yields)\ncoinbase: ETH (cbETH for liquidity), USDC (stable yield)\nthe math # on $30k staked position:\nkraken approach: ~$1,800/year yield\ncoinbase approach: ~$1,100/year yield\ndifference: $700/year\nfor me, kraken\u0026rsquo;s higher yield is worth the regulatory risk.\nbut I keep ETH on coinbase for liquidity.\nalgo integration # staked assets shouldn\u0026rsquo;t interfere with trading.\nI keep staking positions separate from trading capital.\ntrading capital: ~$520k (brokers + active crypto)\nstaked position: ~$30k (passive yield)\nnever touch staked positions for trading. different buckets.\nthe NexusFi crypto yield discussions have good context on staking risks. worth understanding before committing.\n3:05am wednesday. kraken vs coinbase staking after 18 months. kraken: higher yields (ETH 4%, SOL 6.5%), more options, regulatory uncertainty. coinbase: lower yields (ETH 3%), liquid cbETH, better regulation. I use kraken for SOL/DOT/ATOM, coinbase for ETH/USDC. $30k staked = ~$1,500/year yield.\n-AK\n","date":"10 December 2025","externalUrl":null,"permalink":"/posts/2025-12-10-kraken-vs-coinbase-staking-comparison/","section":"Posts","summary":"\u003cp\u003ebeen staking on both platforms.\u003c/p\u003e\n\u003cp\u003edifferent approaches to yield.\u003c/p\u003e\n\u003cp\u003ehere\u0026rsquo;s my comparison after 18 months.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ekraken staking \n    \u003cdiv id=\"kraken-staking\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#kraken-staking\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003ewhat they offer:\u003c/strong\u003e\u003c/p\u003e","title":"kraken vs coinbase - staking and yield comparison for algo traders","type":"posts"},{"content":"","date":"10 December 2025","externalUrl":null,"permalink":"/categories/reviews/","section":"Categories","summary":"","title":"Reviews","type":"categories"},{"content":"","date":"10 December 2025","externalUrl":null,"permalink":"/tags/staking/","section":"Tags","summary":"","title":"Staking","type":"tags"},{"content":"week 1 december done.\nsteady start to the month.\nweekly numbers # starting (dec 1): $517,640\nending (dec 7): $519,880\nweek 1 gain: +$2,240 (+0.43%)\ntrades: 6\nwins: 5\nlosses: 1\nwin rate: 83%\nbreakdown # monday-wednesday: normal premium selling\nSPX put credit spreads. +$1,580\nthursday-friday: lighter ahead of next week\ntaking profits, reducing exposure. +$660\nyear-end mode working # reduced sizing (-20%) kept risk low.\ntighter profit targets meant quicker exits.\nwould have made ~$300 more at normal sizing.\nworth the peace of mind during volatile december.\nnext week # dec 8-12: normal trading, then anniversary prep\ndec 13-16: BIG BEAR TRIP\nno trading. algos monitor only.\nA. still has no idea.\npacked the bags while she was at work friday.\nhidden in the closet.\nthe anticipation # 6 days until we leave.\ncabin is booked. restaurant reserved.\nshe\u0026rsquo;s going to love the snow.\nhope I can keep the secret that long.\n2:42am sunday. week 1 december done. +$2,240 (+0.43%) on 6 trades, 83% wr. year-end mode working. reduced sizing worth peace of mind. account $519,880. anniversary trip in 6 days. bags packed and hidden. A. still doesn\u0026rsquo;t know.\n-AK\n","date":"7 December 2025","externalUrl":null,"permalink":"/posts/2025-12-07-week-1-december-steady-start/","section":"Posts","summary":"\u003cp\u003eweek 1 december done.\u003c/p\u003e\n\u003cp\u003esteady start to the month.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweekly numbers \n    \u003cdiv id=\"weekly-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#weekly-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (dec 1):\u003c/strong\u003e $517,640\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eending (dec 7):\u003c/strong\u003e $519,880\u003c/p\u003e","title":"week 1 december - steady start, anniversary trip prep","type":"posts"},{"content":"","date":"5 December 2025","externalUrl":null,"permalink":"/tags/institutional/","section":"Tags","summary":"","title":"Institutional","type":"tags"},{"content":"","date":"5 December 2025","externalUrl":null,"permalink":"/tags/rebalancing/","section":"Tags","summary":"","title":"Rebalancing","type":"tags"},{"content":"december means institutional rebalancing.\npension funds, endowments, mutual funds all adjusting.\nbuilt an algo to detect and trade the flows.\nthe concept # year-end rebalancing patterns:\nwinners get sold (lock in gains) losers get sold (tax-loss harvesting) portfolios return to target weights predictable flows = tradeable edge the implementation # import numpy as np import pandas as pd from dataclasses import dataclass from typing import Dict, List, Optional, Tuple from datetime import datetime, timedelta from enum import Enum class RebalanceSignal(Enum): STRONG_SELL_PRESSURE = \u0026#34;strong_sell\u0026#34; MILD_SELL_PRESSURE = \u0026#34;mild_sell\u0026#34; NEUTRAL = \u0026#34;neutral\u0026#34; MILD_BUY_PRESSURE = \u0026#34;mild_buy\u0026#34; STRONG_BUY_PRESSURE = \u0026#34;strong_buy\u0026#34; @dataclass class YTDPerformance: symbol: str ytd_return: float current_weight: float target_weight: float rebalance_direction: str estimated_flow: float # in millions class YearEndRebalanceAlgo: def __init__(self, ytd_winner_threshold: float = 0.25, # 25%+ = winner ytd_loser_threshold: float = -0.15, # -15%+ = tax loss weight_drift_threshold: float = 0.03, # 3% drift triggers rebal lookback_years: int = 5): self.ytd_winner_threshold = ytd_winner_threshold self.ytd_loser_threshold = ytd_loser_threshold self.weight_drift_threshold = weight_drift_threshold self.lookback_years = lookback_years # Historical december patterns (from backtesting) self.historical_patterns = { \u0026#39;week_1\u0026#39;: {\u0026#39;sell_pressure\u0026#39;: 0.3, \u0026#39;volume_multiplier\u0026#39;: 1.1}, \u0026#39;week_2\u0026#39;: {\u0026#39;sell_pressure\u0026#39;: 0.5, \u0026#39;volume_multiplier\u0026#39;: 1.2}, \u0026#39;week_3\u0026#39;: {\u0026#39;sell_pressure\u0026#39;: 0.4, \u0026#39;volume_multiplier\u0026#39;: 1.3}, \u0026#39;week_4\u0026#39;: {\u0026#39;sell_pressure\u0026#39;: 0.2, \u0026#39;volume_multiplier\u0026#39;: 0.7}, } def calculate_ytd_performance(self, prices: pd.DataFrame, current_date: datetime) -\u0026gt; Dict[str, float]: \u0026#34;\u0026#34;\u0026#34;Calculate YTD return for each symbol\u0026#34;\u0026#34;\u0026#34; year_start = datetime(current_date.year, 1, 1) ytd_returns = {} for symbol in prices.columns: try: start_price = prices.loc[year_start:, symbol].iloc[0] current_price = prices.loc[:current_date, symbol].iloc[-1] ytd_returns[symbol] = (current_price - start_price) / start_price except: ytd_returns[symbol] = 0.0 return ytd_returns def estimate_rebalance_flow(self, symbol: str, ytd_return: float, current_weight: float, target_weight: float, total_aum_billions: float = 100) -\u0026gt; float: \u0026#34;\u0026#34;\u0026#34; Estimate institutional rebalancing flow in millions Based on S\u0026amp;P 500 total index fund AUM \u0026#34;\u0026#34;\u0026#34; weight_diff = current_weight - target_weight # Drift adjustment if abs(weight_diff) \u0026lt; self.weight_drift_threshold: return 0.0 # Estimate flow (simplified) flow_billions = total_aum_billions * weight_diff flow_millions = flow_billions * 1000 # YTD performance amplifier (winners/losers see more flow) if ytd_return \u0026gt; self.ytd_winner_threshold: flow_millions *= 1.3 # profit taking amplified elif ytd_return \u0026lt; self.ytd_loser_threshold: flow_millions *= 1.2 # tax loss selling amplified return flow_millions def generate_signal(self, symbol: str, ytd_return: float, estimated_flow: float, december_week: int) -\u0026gt; dict: \u0026#34;\u0026#34;\u0026#34; Generate trading signal based on expected rebalancing \u0026#34;\u0026#34;\u0026#34; historical = self.historical_patterns.get(f\u0026#39;week_{december_week}\u0026#39;, {}) sell_pressure = historical.get(\u0026#39;sell_pressure\u0026#39;, 0.3) # Determine signal strength if estimated_flow \u0026lt; -500: # $500M+ selling expected signal = RebalanceSignal.STRONG_SELL_PRESSURE action = \u0026#39;FADE_SELLING\u0026#39; # Buy into weakness confidence = min(0.8, abs(estimated_flow) / 1000) elif estimated_flow \u0026lt; -100: signal = RebalanceSignal.MILD_SELL_PRESSURE action = \u0026#39;SMALL_FADE\u0026#39; confidence = 0.5 elif estimated_flow \u0026gt; 500: # $500M+ buying expected signal = RebalanceSignal.STRONG_BUY_PRESSURE action = \u0026#39;FADE_BUYING\u0026#39; # Sell into strength confidence = min(0.8, estimated_flow / 1000) elif estimated_flow \u0026gt; 100: signal = RebalanceSignal.MILD_BUY_PRESSURE action = \u0026#39;SMALL_FADE\u0026#39; confidence = 0.5 else: signal = RebalanceSignal.NEUTRAL action = \u0026#39;NO_TRADE\u0026#39; confidence = 0.0 return { \u0026#39;symbol\u0026#39;: symbol, \u0026#39;signal\u0026#39;: signal.value, \u0026#39;action\u0026#39;: action, \u0026#39;confidence\u0026#39;: confidence, \u0026#39;ytd_return\u0026#39;: ytd_return, \u0026#39;estimated_flow_millions\u0026#39;: estimated_flow, \u0026#39;december_week\u0026#39;: december_week, \u0026#39;historical_sell_pressure\u0026#39;: sell_pressure, \u0026#39;reasoning\u0026#39;: self._generate_reasoning(signal, ytd_return, estimated_flow) } def _generate_reasoning(self, signal: RebalanceSignal, ytd_return: float, flow: float) -\u0026gt; str: if signal == RebalanceSignal.STRONG_SELL_PRESSURE: return f\u0026#34;YTD {ytd_return:.1%}, expected ${abs(flow):.0f}M institutional selling\u0026#34; elif signal == RebalanceSignal.STRONG_BUY_PRESSURE: return f\u0026#34;YTD {ytd_return:.1%}, expected ${flow:.0f}M institutional buying\u0026#34; else: return f\u0026#34;YTD {ytd_return:.1%}, minimal rebalancing expected\u0026#34; def scan_sp500_rebalancing(self, sp500_data: pd.DataFrame, current_date: datetime) -\u0026gt; List[dict]: \u0026#34;\u0026#34;\u0026#34; Scan S\u0026amp;P 500 for rebalancing opportunities Returns sorted list of strongest signals \u0026#34;\u0026#34;\u0026#34; ytd_returns = self.calculate_ytd_performance(sp500_data, current_date) # Determine december week december_week = min(4, (current_date.day - 1) // 7 + 1) opportunities = [] for symbol, ytd_return in ytd_returns.items(): # Simplified weight estimation (would use actual index data) current_weight = 0.002 # placeholder target_weight = 0.002 if abs(ytd_return) \u0026gt; 0.10: # Only significant movers estimated_flow = self.estimate_rebalance_flow( symbol, ytd_return, current_weight, target_weight ) signal = self.generate_signal( symbol, ytd_return, estimated_flow, december_week ) if signal[\u0026#39;action\u0026#39;] != \u0026#39;NO_TRADE\u0026#39;: opportunities.append(signal) # Sort by confidence opportunities.sort(key=lambda x: x[\u0026#39;confidence\u0026#39;], reverse=True) return opportunities[:20] # Top 20 opportunities backtest results (5 years) # period: dec 2020 - dec 2024\nstrategy: fade strong rebalancing flows\nreturns:\nrebalancing algo: +8.4% avg december buy and hold SPY: +2.8% avg december alpha: +5.6% key stats:\nsharpe: 1.52 (december only) win rate: 68% avg trade duration: 4 days observations # best opportunities:\nweek 2: highest sell pressure (tax-loss deadline approaching) mega-cap winners: NVDA, META, AAPL see predictable profit-taking losers below -20%: aggressive tax-loss selling worst times:\nweek 4: holiday volume too thin dec 26-31: unpredictable year-end positioning deployment # running parallel to live account this december.\nif results match backtest, will allocate 10% next december.\nthe NexusFi institutional flow discussions have good context on detecting large orders. helped refine the flow estimation.\n3:18am friday. year-end rebalancing algo implementation. detect institutional flows from pension/endowment rebalancing. fade strong sell/buy pressure. backtest: +8.4% avg december vs SPY +2.8%. week 2 = best opportunities. running parallel this december.\n-AK\n","date":"5 December 2025","externalUrl":null,"permalink":"/posts/2025-12-05-year-end-portfolio-rebalancing-algo/","section":"Posts","summary":"\u003cp\u003edecember means institutional rebalancing.\u003c/p\u003e\n\u003cp\u003epension funds, endowments, mutual funds all adjusting.\u003c/p\u003e\n\u003cp\u003ebuilt an algo to detect and trade the flows.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe concept \n    \u003cdiv id=\"the-concept\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-concept\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eyear-end rebalancing patterns:\u003c/strong\u003e\u003c/p\u003e","title":"year-end portfolio rebalancing algo - detecting institutional flows","type":"posts"},{"content":"december.\nfinal month.\nyear-end mode activated.\nwhere we stand # account: $517,640\nytd gain: +$79,040 (+18.19%)\nannual pace: 19.8%\ntarget: 15-18%\nstatus: slightly ahead of target\ndecember expectations # factors:\nFOMC dec 17-18 (rate decision) holiday weeks (low volume) year-end flows (rebalancing) tax-loss harvesting (volatility) realistic december outcomes:\nmixed conditions: +0.5% to +1.5%\nmy target: +1.0% to +1.5%\nthe plan # week 1 (dec 1-7): normal trading\nweek 2 (dec 8-13): position before FOMC + anniversary trip\nweek 3 (dec 15-21): FOMC week, careful sizing\nweek 4 (dec 22-28): holiday mode, light trading\nweek 5 (dec 29-31): year-end positioning, wrap-up\nalgo adjustments # year-end mode:\nposition sizing: -20% (holiday volatility) profit targets: tightened to 65% (take profits faster) no overnight holds dec 23-jan 2 FOMC mode:\ndec 16-18: reduced sizing no new positions day of decision personal calendar # dec 13-16: anniversary trip (big bear)\nalgos will monitor no active trading A. still doesn\u0026rsquo;t know dec 24-25: christmas in san diego\ndec 31: new year\u0026rsquo;s eve (parents\u0026rsquo; death anniversary)\nwill probably take the day off three years since they died A. knows to give me space tonight # 2:28am tuesday. december begins. final month. ytd +18.19%, targeting +1.0-1.5% in december. FOMC week, holidays, anniversary trip. year-end mode activated. 11 days until big bear surprise.\n2:28am tuesday. december begins. account $517,640, ytd +18.19%. december target +1.0-1.5%. FOMC dec 17-18, holiday weeks ahead. year-end algo mode: -20% sizing, tighter profit targets. anniversary trip dec 13-16. A. still doesn\u0026rsquo;t know. 11 days until big bear.\n-AK\n","date":"2 December 2025","externalUrl":null,"permalink":"/posts/2025-12-02-december-begins-year-end-mode/","section":"Posts","summary":"\u003cp\u003edecember.\u003c/p\u003e\n\u003cp\u003efinal month.\u003c/p\u003e\n\u003cp\u003eyear-end mode activated.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ewhere we stand \n    \u003cdiv id=\"where-we-stand\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#where-we-stand\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eaccount:\u003c/strong\u003e $517,640\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eytd gain:\u003c/strong\u003e +$79,040 (+18.19%)\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eannual pace:\u003c/strong\u003e 19.8%\u003c/p\u003e","title":"december begins - year-end mode, anniversary countdown","type":"posts"},{"content":"","date":"2 December 2025","externalUrl":null,"permalink":"/tags/year-end/","section":"Tags","summary":"","title":"Year-End","type":"tags"},{"content":"","date":"30 November 2025","externalUrl":null,"permalink":"/tags/monthly-review/","section":"Tags","summary":"","title":"Monthly-Review","type":"tags"},{"content":"november done.\nelection month. conservative approach. modest gains.\nexactly as planned.\nnovember final numbers # starting (nov 1): $510,180\nending (nov 30): $517,640\nnovember gain: +$7,460 (+1.46%)\ntrades: 27\nwins: 20\nlosses: 7\nwin rate: 74%\ntrading days: 19 (holiday week)\nFigure 1: November weekly breakdown. Week 1: +$0 (election pause). Week 2: +$3,660 (post-election rally). Week 3: +$2,450 (steady). Week 4: +$1,350 (thanksgiving). Defensive positioning early month, return to normal mid-month. Total +$7,460 (+1.46%).\nweekly breakdown # week 1 (nov 1-2): +$0 (0.00%), 0 trades - election pause\nweek 2 (nov 3-9): +$3,660 (+0.72%), 78% wr, 9 trades - post-election\nweek 3 (nov 10-16): +$2,450 (+0.48%), 71% wr, 7 trades - steady\nweek 4 (nov 17-23): +$1,350 (+0.26%), 75% wr, 4 trades - thanksgiving\nweek 5 (nov 24-30): +$0 (0.00%), 0 trades - holiday weekend\ncomparing to target # november realistic outcomes (from oct 31):\nelection uncertainty: +0.5% to +1.5%\nnovember actual: +1.46%\nresult: AT TARGET (high end)\ndefensive approach worked. protected capital during uncertainty, captured rally after.\nmarket conditions november # avg VIX: 18.2 (elevated for election, normalized after)\navg correlation: 0.62 (moderate)\navg volume: 3.8M contracts (below normal, holiday impact)\nregime stability: 0.78 (normalized post-election)\nconditions: volatility spike → calm. premium selling favorable second half.\nFigure 2: 2025 YTD through November. Monthly bars: Jan +$9,550, Feb +$8,920, Mar -$9,582, Apr +$9,732, May +$3,840, Jun +$9,180, Jul +$7,600, Aug +$5,060, Sep +$14,120, Oct +$13,960, Nov +$7,460. Cumulative YTD +$79,040 (+18.19%). November modest but protected capital during uncertainty. December target: close strong, end year 17-19%.\ntrade distribution # options: 23 trades, +$6,580 (88% of gains)\nSPX: 14 trades, +$4,320\nQQQ: 7 trades, +$1,840\nIndividual stocks: 2 trades, +$420\ncrypto: 3 trades, +$680 (9% of gains)\nBTC: 2 trades, +$480\nETH: 1 trade, +$200\nfutures: 1 trade, +$200 (3% of gains)\nES: 1 trade, +$200\nFigure 3: November gains by instrument. SPX options dominated (+$4,320, 58% of total), followed by QQQ options (+$1,840, 25%), crypto (+$680, 9%), individual stocks (+$420, 6%), and ES futures (+$200, 3%). Premium selling focus continued.\nalgo performance breakdown # election mode risk manager:\nworked perfectly. no trades during uncertainty.\nreturned to normal wednesday post-election.\nhedges: +$240 net (cost worth peace of mind)\nvix term structure (paper trading):\nsignals: 4\ntheoretical performance: +1.8%\nstatus: continuing paper testing through december\npremium selling:\nprimary strategy. 88% of gains.\nIV normalized quickly post-election.\nkey trades # best trade: post-election SPX iron condor, +$1,280\nworst trade: pre-thanksgiving QQQ timing, -$380\nmost satisfying: holding through election with discipline (no trades = no losses)\ncircuit breaker performance # triggered: 0 times\nclose calls: 1 (election night, stayed in cash)\nlargest loss: -$380 (thanksgiving week)\ncapital preservation: excellent\nytd performance update # jan: +$9,550 (+2.18%)\nfeb: +$8,920 (+1.99%)\nmar: -$9,582 (-2.10%)\napr: +$9,732 (+2.18%)\nmay: +$3,840 (+0.84%)\njun: +$9,180 (+1.99%)\njul: +$7,600 (+1.62%)\naug: +$5,060 (+1.06%)\nsep: +$14,120 (+2.93%)\noct: +$13,960 (+2.81%)\nnov: +$7,460 (+1.46%)\nytd total: +$79,040 (+18.19%)\nannual pace: 19.8%\nvs target: 15-18%\nprogress: slightly ahead, december determines final\ndecember preview # trading:\nFOMC dec 17-18\nyear-end flows\nholiday weeks (christmas, new year)\nrealistic december outcomes:\nmixed month: +0.5% to +1.5%\ntarget: +1.0% to +1.5%\npersonal:\nanniversary trip dec 13-16 (big bear)\nA. still has no idea\ntonight (november 30, 11:55pm) # november done. +$7,460 (+1.46%) across 27 trades. 74% win rate. election discipline worked. ytd +$79,040 (+18.19%), annual pace 19.8%. account $517,640. december: FOMC, holidays, anniversary. targeting +1.0-1.5% to close year strong.\n11:55pm sunday. november wrap. election month done. +$7,460 (+1.46%) on 27 trades, 74% wr. election pause worked - no trades during uncertainty, rally captured after. ytd +$79,040 (+18.19%), pace 19.8%. account $517,640. december: FOMC, holidays, anniversary trip. target +1.0-1.5%.\n-AK\n","date":"30 November 2025","externalUrl":null,"permalink":"/posts/2025-11-30-november-wrap-election-month-modest-gains/","section":"Posts","summary":"\u003cp\u003enovember done.\u003c/p\u003e\n\u003cp\u003eelection month. conservative approach. modest gains.\u003c/p\u003e\n\u003cp\u003eexactly as planned.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003enovember final numbers \n    \u003cdiv id=\"november-final-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#november-final-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (nov 1):\u003c/strong\u003e $510,180\u003c/p\u003e","title":"november wrap - election month, modest gains, +1.46%, ytd +18.19%","type":"posts"},{"content":"","date":"28 November 2025","externalUrl":null,"permalink":"/tags/reflection/","section":"Tags","summary":"","title":"Reflection","type":"tags"},{"content":"friday night after thanksgiving.\nthinking about where I am.\nthree years ago # november 2022.\nparents still alive. barely trading. no idea what was coming.\nthey\u0026rsquo;d be gone in 6 weeks.\ntwo years ago # november 2023.\nA. just moved in. still processing $28k disaster. still processing parents\u0026rsquo; death.\nthings felt fragile.\none year ago # november 2024.\nfinally profitable. A. and I talking about future. wedding planning starting.\nthings felt possible.\nnow # november 2025.\nmarried 6 months. account at $517k. ytd +17.4%.\nthings feel\u0026hellip; stable?\nthe gratitude # A.\nshe puts up with my bullshit.\nthe late nights. the stress. the days I\u0026rsquo;m locked in code.\nshe made thanksgiving dinner for 6 people like it was nothing.\nher parents love her. I love her. she deserves all of it.\ntrading\nfinally figured out what works.\npremium selling. patience. risk management.\n$180k in lessons. but I learned.\nthis life\nsan diego. server rack in the corner. wife in the bedroom. algorithms running.\nnot what I expected at 22.\nbetter.\ndr R would say # \u0026ldquo;you\u0026rsquo;re processing gratitude instead of anxiety. that\u0026rsquo;s growth.\u0026rdquo;\nyeah. maybe.\nstill weird to feel content.\nused to think contentment meant I was settling.\nnow I think it means I found the right thing.\ntonight # 11:42pm friday. post-thanksgiving.\ngrateful for A. grateful for the lessons. grateful for where I am.\ndecember next. anniversary in two weeks.\nbig bear cabin ready.\nshe has no idea.\n11:42pm friday. thanksgiving reflection. three years of change - parents alive → parents gone → A. → marriage → stability. account $517k, ytd +17.4%. grateful for A., trading lessons, this life. anniversary in 2 weeks. big bear surprise ready. she has no idea.\n-AK\n","date":"28 November 2025","externalUrl":null,"permalink":"/posts/2025-11-28-thanksgiving-gratitude-trading-perspective/","section":"Posts","summary":"\u003cp\u003efriday night after thanksgiving.\u003c/p\u003e\n\u003cp\u003ethinking about where I am.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethree years ago \n    \u003cdiv id=\"three-years-ago\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#three-years-ago\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003enovember 2022.\u003c/p\u003e\n\u003cp\u003eparents still alive. barely trading. no idea what was coming.\u003c/p\u003e","title":"thanksgiving reflection - trading, marriage, perspective","type":"posts"},{"content":"thanksgiving week done.\nas expected: low volume, small gains.\nweekly numbers # starting (nov 17): $516,290\nending (nov 23): $517,640\nweek 4 gain: +$1,350 (+0.26%)\ntrades: 4\nwins: 3\nlosses: 1\nwin rate: 75%\nbreakdown # monday-tuesday: normal trading\ntwo premium sells. +$1,180\nwednesday: closed positions before holiday\ntook small profit on SPX spread. +$420\none small loser. -$250\nthursday: market closed (thanksgiving)\nfriday: half day, no trading\nthe discipline # could have forced more trades.\ndidn\u0026rsquo;t.\nlow volume = wider spreads = worse fills.\nnot worth the extra 0.1% to fight bad conditions.\nthanksgiving day # spent with A.\nher parents drove down from LA. first thanksgiving in our apartment.\nI helped cook. mostly stayed out of the way.\nher dad and I talked trading. he doesn\u0026rsquo;t really understand algos but pretends to.\nnice guy.\nnext week # december begins.\nFOMC meeting dec 17-18.\nyear-end flows starting.\nrealistic targets: +1.0% to +1.5%\n2:34am sunday. week 4 thanksgiving done. +$1,350 (+0.26%) on 4 trades, 75% wr. low volume, closed early wednesday. thanksgiving with A. and her parents. december next - FOMC week, year-end flows.\n-AK\n","date":"23 November 2025","externalUrl":null,"permalink":"/posts/2025-11-23-week-4-thanksgiving-slow-week/","section":"Posts","summary":"\u003cp\u003ethanksgiving week done.\u003c/p\u003e\n\u003cp\u003eas expected: low volume, small gains.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweekly numbers \n    \u003cdiv id=\"weekly-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#weekly-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (nov 17):\u003c/strong\u003e $516,290\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eending (nov 23):\u003c/strong\u003e $517,640\u003c/p\u003e","title":"week 4 november - thanksgiving week, low volume, small gains","type":"posts"},{"content":"been using both for 2+ years.\ndifferent strengths. here\u0026rsquo;s the breakdown.\ncoinbase advanced # what I use it for:\nfiat on/off ramp (primary) BTC/ETH spot trading US regulatory compliance pricing:\nmaker: 0.40% taker: 0.60% (reduces with volume) pros:\nfully US regulated bank transfers same day institutional-grade custody API is solid pro trading interface cons:\nhigher fees than binance limited altcoin selection no futures/derivatives occasional API rate limits from coinbase.rest import RESTClient from typing import Optional import time class CoinbaseAdvancedTrader: def __init__(self, api_key: str, api_secret: str): self.client = RESTClient(api_key=api_key, api_secret=api_secret) self.last_request = 0 self.min_interval = 0.1 # 10 requests/sec limit def _rate_limit(self): elapsed = time.time() - self.last_request if elapsed \u0026lt; self.min_interval: time.sleep(self.min_interval - elapsed) self.last_request = time.time() def get_btc_price(self) -\u0026gt; float: self._rate_limit() ticker = self.client.get_product(\u0026#34;BTC-USD\u0026#34;) return float(ticker[\u0026#39;price\u0026#39;]) def place_limit_order(self, product_id: str, side: str, size: float, price: float) -\u0026gt; dict: self._rate_limit() order = self.client.create_order( product_id=product_id, side=side, order_configuration={ \u0026#34;limit_limit_gtc\u0026#34;: { \u0026#34;base_size\u0026#34;: str(size), \u0026#34;limit_price\u0026#34;: str(price) } } ) return order def get_fills(self, product_id: str, limit: int = 100) -\u0026gt; list: self._rate_limit() return self.client.get_fills(product_id=product_id, limit=limit) binance.us # what I use it for:\naltcoin trading higher frequency strategies lower fee execution pricing:\nmaker: 0.10% taker: 0.10% (with BNB discount) pros:\nmuch lower fees better altcoin selection faster API more trading pairs cons:\nregulatory uncertainty occasional withdrawal delays less institutional trust KYC requirements strict from binance.client import Client from binance.exceptions import BinanceAPIException from typing import Optional class BinanceUSTrader: def __init__(self, api_key: str, api_secret: str): self.client = Client(api_key, api_secret, tld=\u0026#39;us\u0026#39;) def get_btc_price(self) -\u0026gt; float: ticker = self.client.get_symbol_ticker(symbol=\u0026#39;BTCUSD\u0026#39;) return float(ticker[\u0026#39;price\u0026#39;]) def place_limit_order(self, symbol: str, side: str, quantity: float, price: float) -\u0026gt; dict: try: order = self.client.create_order( symbol=symbol, side=side, type=\u0026#39;LIMIT\u0026#39;, timeInForce=\u0026#39;GTC\u0026#39;, quantity=quantity, price=str(price) ) return order except BinanceAPIException as e: return {\u0026#39;error\u0026#39;: str(e)} def get_klines(self, symbol: str, interval: str, limit: int = 500) -\u0026gt; list: return self.client.get_klines( symbol=symbol, interval=interval, limit=limit ) head-to-head # feature coinbase advanced binance.us maker fee 0.40% 0.10% taker fee 0.60% 0.10% API speed good faster regulation solid uncertain fiat ramp excellent good altcoins limited extensive custody institutional good my setup # coinbase: fiat transfers, BTC/ETH holds, regulatory safety\nbinance.us: active trading, altcoin exposure, lower fees\nwhich to choose? # if US-based and conservative: coinbase only\nbetter regulation, institutional custody.\nif US-based and active: both\ncoinbase for fiat, binance for trading.\nif fees matter most: binance\n0.10% vs 0.40% adds up fast.\nI run ~60% of crypto volume through binance.us (active trading) and ~40% through coinbase (holds + fiat).\nthe NexusFi crypto discussions have good comparisons of exchange APIs. helped me optimize my setup.\n3:02am wednesday. coinbase advanced vs binance.us after 2+ years. coinbase: better regulation, fiat ramp, higher fees (0.40%/0.60%). binance.us: lower fees (0.10%), more altcoins, regulatory uncertainty. I use both - 60% binance for trading, 40% coinbase for holds/fiat.\n-AK\n","date":"19 November 2025","externalUrl":null,"permalink":"/posts/2025-11-19-coinbase-advanced-vs-binance-us-crypto/","section":"Posts","summary":"\u003cp\u003ebeen using both for 2+ years.\u003c/p\u003e\n\u003cp\u003edifferent strengths. here\u0026rsquo;s the breakdown.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003e\u003ca\n  href=\"https://nexusfi.com/d/exchanges/coinbase\"\n    target=\"_blank\"\n  \u003ecoinbase\u003c/a\u003e advanced \n    \u003cdiv id=\"coinbase-advanced\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#coinbase-advanced\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003ewhat I use it for:\u003c/strong\u003e\u003c/p\u003e","title":"coinbase advanced vs binance.us - crypto algo trading comparison","type":"posts"},{"content":"week 3 done.\nsteady week. nothing exciting.\nsometimes boring is good.\nweekly numbers # starting (nov 10): $513,840\nending (nov 16): $516,290\nweek 3 gain: +$2,450 (+0.48%)\ntrades: 7\nwins: 5\nlosses: 2\nwin rate: 71%\nbreakdown # monday-wednesday: normal premium selling\nSPX put credit spreads working. +$1,680\nthursday: veterans day (market closed)\nno trading\nfriday: light volume ahead of thanksgiving week\none small winner. +$770\nmarket conditions # VIX: 15-17 range (calm)\nvolume: declining ahead of holidays\nsentiment: bullish tilt, post-election optimism\nnext week # thanksgiving week.\nhistorically low volume wed-fri.\nthursday market closed.\nfriday half day.\nplan:\nclose positions by wednesday no new trades thursday-friday enjoy the holiday thanksgiving week targets # realistic: breakeven to +0.5%\nlow volume = low opportunity\nnot forcing trades during thin conditions.\n2:38am sunday. week 3 november done. +$2,450 (+0.48%) on 7 trades, 71% wr. steady week, nothing exciting. VIX 15-17. thanksgiving week next - closing positions by wednesday, no trading thursday-friday. holiday target: breakeven to +0.5%.\n-AK\n","date":"16 November 2025","externalUrl":null,"permalink":"/posts/2025-11-16-week-3-november-steady-progress/","section":"Posts","summary":"\u003cp\u003eweek 3 done.\u003c/p\u003e\n\u003cp\u003esteady week. nothing exciting.\u003c/p\u003e\n\u003cp\u003esometimes boring is good.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweekly numbers \n    \u003cdiv id=\"weekly-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#weekly-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (nov 10):\u003c/strong\u003e $513,840\u003c/p\u003e","title":"week 3 november - steady progress, thanksgiving week prep","type":"posts"},{"content":"saturday night.\nA. definitely suspects something.\nthe detective work # she\u0026rsquo;s been watching me.\n\u0026ldquo;you\u0026rsquo;re on your phone a lot lately.\u0026rdquo;\n\u0026ldquo;work stuff.\u0026rdquo;\n\u0026ldquo;at 11pm on saturday?\u0026rdquo;\n\u0026ldquo;algo monitoring.\u0026rdquo;\nshe didn\u0026rsquo;t buy it.\n\u0026ldquo;you\u0026rsquo;re planning something.\u0026rdquo;\nI tried to keep a straight face.\n\u0026ldquo;maybe.\u0026rdquo;\nshe smiled. that smile she does when she knows she\u0026rsquo;s right.\nthe actual plan # anniversary is december 13. six months married.\nbooked a cabin in big bear.\nprivate hot tub. mountain views. fireplace.\nthree nights.\nshe\u0026rsquo;s been wanting to see snow. san diego doesn\u0026rsquo;t exactly deliver on that.\nthe afternoon # went to the farmer\u0026rsquo;s market together.\nshe loves these things. I used to think they were boring.\nnow I just like watching her get excited about vegetables.\n\u0026ldquo;look at these tomatoes!\u0026rdquo;\n\u0026ldquo;they\u0026rsquo;re\u0026hellip; tomatoes?\u0026rdquo;\n\u0026ldquo;heirloom tomatoes. totally different.\u0026rdquo;\nI bought them. she was happy.\nevening # cooked dinner together.\nshe made something with those fancy tomatoes. actually pretty good.\nsat on the couch after. she was reading, I was pretending to look at my phone while actually researching big bear restaurants.\ndr R this week # therapy was interesting.\n\u0026ldquo;you seem more settled than usual.\u0026rdquo;\n\u0026ldquo;do I?\u0026rdquo;\n\u0026ldquo;the anniversary planning. you\u0026rsquo;re excited about it.\u0026rdquo;\n\u0026ldquo;yeah. I want it to be special.\u0026rdquo;\n\u0026ldquo;why?\u0026rdquo;\n\u0026ldquo;because she deserves it. she puts up with a lot. the trading hours, my mood swings, the days I\u0026rsquo;m locked in on the screens.\u0026rdquo;\n\u0026ldquo;and?\u0026rdquo;\n\u0026ldquo;and I love her. I want her to know that.\u0026rdquo;\ndr R nodded. \u0026ldquo;that\u0026rsquo;s growth. a year ago you would have called anniversary dinners \u0026lsquo;obligations.\u0026rsquo;\u0026rdquo;\nshe\u0026rsquo;s right. I would have.\nthe sex # later that night.\nslow. romantic. not the usual quick kitchen counter stuff.\ntook my time with her. built her up until she was desperate for it.\nwhen she finally came, she grabbed my back so hard she left marks.\nI love when she does that.\ntonight # 11:48pm. she\u0026rsquo;s asleep.\nsaturday with my wife. farmer\u0026rsquo;s market, heirloom tomatoes, dr R session, romantic sex.\none month until big bear.\nhope she doesn\u0026rsquo;t figure it out before then.\n11:48pm saturday. A. suspects I\u0026rsquo;m planning something. she\u0026rsquo;s right. big bear cabin booked for anniversary (dec 13). private hot tub, mountain views, three nights. dr R says I\u0026rsquo;m more settled. romantic sex tonight - slow, built her up, she left marks. one month until the surprise.\n-AK\n","date":"15 November 2025","externalUrl":null,"permalink":"/posts/2025-11-15-saturday-with-a-anniversary-planning/","section":"Posts","summary":"\u003cp\u003esaturday night.\u003c/p\u003e\n\u003cp\u003eA. definitely suspects something.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe detective work \n    \u003cdiv id=\"the-detective-work\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-detective-work\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003eshe\u0026rsquo;s been watching me.\u003c/p\u003e\n\u003cp\u003e\u0026ldquo;you\u0026rsquo;re on your phone a lot lately.\u0026rdquo;\u003c/p\u003e","title":"saturday with A - anniversary planning, she suspects something","type":"posts"},{"content":"been researching VIX term structure trades.\ncontango vs backwardation. predictable patterns.\nfinally got an algo working.\nthe concept # contango: front month VIX \u0026lt; back month VIX\nnormal state. markets calm. short VIX products decay.\nbackwardation: front month VIX \u0026gt; back month VIX\nfear state. markets stressed. short VIX products rally.\nthe transition between states = edge.\nthe implementation # import numpy as np import pandas as pd from dataclasses import dataclass from typing import Optional, Tuple, List from datetime import datetime, timedelta from enum import Enum class TermStructureState(Enum): STEEP_CONTANGO = \u0026#34;steep_contango\u0026#34; # VIX1 \u0026lt;\u0026lt; VIX2, calm MILD_CONTANGO = \u0026#34;mild_contango\u0026#34; # VIX1 \u0026lt; VIX2, normal FLAT = \u0026#34;flat\u0026#34; # VIX1 ≈ VIX2, transitional MILD_BACKWARDATION = \u0026#34;mild_backwardation\u0026#34; # VIX1 \u0026gt; VIX2, caution STEEP_BACKWARDATION = \u0026#34;steep_backwardation\u0026#34; # VIX1 \u0026gt;\u0026gt; VIX2, fear @dataclass class VIXTermStructure: timestamp: datetime vix_spot: float vix_1m: float # front month future vix_2m: float # second month future vix_3m: float # third month future contango_1_2: float # spread between months contango_2_3: float state: TermStructureState class VIXTermStructureAlgo: def __init__(self, steep_threshold: float = 0.10, # 10% spread = steep mild_threshold: float = 0.03, # 3% spread = mild flat_threshold: float = 0.01, # 1% spread = flat lookback_days: int = 20): self.steep_threshold = steep_threshold self.mild_threshold = mild_threshold self.flat_threshold = flat_threshold self.lookback_days = lookback_days self.history: List[VIXTermStructure] = [] def calculate_term_structure(self, vix_spot: float, vix_1m: float, vix_2m: float, vix_3m: float) -\u0026gt; VIXTermStructure: \u0026#34;\u0026#34;\u0026#34; Calculate current term structure and classify state \u0026#34;\u0026#34;\u0026#34; contango_1_2 = (vix_2m - vix_1m) / vix_1m contango_2_3 = (vix_3m - vix_2m) / vix_2m # Classify state based on front spread if contango_1_2 \u0026gt; self.steep_threshold: state = TermStructureState.STEEP_CONTANGO elif contango_1_2 \u0026gt; self.mild_threshold: state = TermStructureState.MILD_CONTANGO elif contango_1_2 \u0026gt; -self.flat_threshold: state = TermStructureState.FLAT elif contango_1_2 \u0026gt; -self.mild_threshold: state = TermStructureState.MILD_BACKWARDATION else: state = TermStructureState.STEEP_BACKWARDATION return VIXTermStructure( timestamp=datetime.now(), vix_spot=vix_spot, vix_1m=vix_1m, vix_2m=vix_2m, vix_3m=vix_3m, contango_1_2=contango_1_2, contango_2_3=contango_2_3, state=state ) def detect_state_transition(self, current: VIXTermStructure) -\u0026gt; Optional[dict]: \u0026#34;\u0026#34;\u0026#34; Detect when term structure state changes These transitions often signal regime shifts \u0026#34;\u0026#34;\u0026#34; if len(self.history) \u0026lt; 2: return None previous = self.history[-1] if previous.state == current.state: return None # No transition # Map transitions to trading signals transition_signals = { # From calm to fear = go defensive (TermStructureState.STEEP_CONTANGO, TermStructureState.MILD_CONTANGO): { \u0026#39;signal\u0026#39;: \u0026#39;CAUTION\u0026#39;, \u0026#39;action\u0026#39;: \u0026#39;reduce_short_vol\u0026#39;, \u0026#39;strength\u0026#39;: 0.3 }, (TermStructureState.MILD_CONTANGO, TermStructureState.FLAT): { \u0026#39;signal\u0026#39;: \u0026#39;WARNING\u0026#39;, \u0026#39;action\u0026#39;: \u0026#39;close_short_vol\u0026#39;, \u0026#39;strength\u0026#39;: 0.6 }, (TermStructureState.FLAT, TermStructureState.MILD_BACKWARDATION): { \u0026#39;signal\u0026#39;: \u0026#39;DEFENSIVE\u0026#39;, \u0026#39;action\u0026#39;: \u0026#39;add_long_vol_hedge\u0026#39;, \u0026#39;strength\u0026#39;: 0.8 }, (TermStructureState.MILD_BACKWARDATION, TermStructureState.STEEP_BACKWARDATION): { \u0026#39;signal\u0026#39;: \u0026#39;CRISIS\u0026#39;, \u0026#39;action\u0026#39;: \u0026#39;full_defensive\u0026#39;, \u0026#39;strength\u0026#39;: 1.0 }, # From fear to calm = opportunities (TermStructureState.STEEP_BACKWARDATION, TermStructureState.MILD_BACKWARDATION): { \u0026#39;signal\u0026#39;: \u0026#39;RECOVERY_START\u0026#39;, \u0026#39;action\u0026#39;: \u0026#39;scale_into_short_vol\u0026#39;, \u0026#39;strength\u0026#39;: 0.4 }, (TermStructureState.MILD_BACKWARDATION, TermStructureState.FLAT): { \u0026#39;signal\u0026#39;: \u0026#39;RECOVERY_BUILDING\u0026#39;, \u0026#39;action\u0026#39;: \u0026#39;add_short_vol\u0026#39;, \u0026#39;strength\u0026#39;: 0.6 }, (TermStructureState.FLAT, TermStructureState.MILD_CONTANGO): { \u0026#39;signal\u0026#39;: \u0026#39;NORMAL_RETURNING\u0026#39;, \u0026#39;action\u0026#39;: \u0026#39;full_short_vol_position\u0026#39;, \u0026#39;strength\u0026#39;: 0.8 }, } key = (previous.state, current.state) return transition_signals.get(key) def calculate_roll_yield(self, current: VIXTermStructure) -\u0026gt; float: \u0026#34;\u0026#34;\u0026#34; Calculate expected roll yield from contango Positive = favorable for short VIX Negative = unfavorable for short VIX \u0026#34;\u0026#34;\u0026#34; # Annualized roll yield monthly_roll = current.contango_1_2 annualized = monthly_roll * 12 return annualized def generate_signal(self) -\u0026gt; dict: \u0026#34;\u0026#34;\u0026#34; Generate trading signal based on term structure \u0026#34;\u0026#34;\u0026#34; if len(self.history) \u0026lt; self.lookback_days: return {\u0026#39;signal\u0026#39;: \u0026#39;INSUFFICIENT_DATA\u0026#39;} current = self.history[-1] transition = self.detect_state_transition(current) roll_yield = self.calculate_roll_yield(current) # Base signal from state state_signals = { TermStructureState.STEEP_CONTANGO: { \u0026#39;bias\u0026#39;: \u0026#39;SHORT_VOL\u0026#39;, \u0026#39;confidence\u0026#39;: 0.8, \u0026#39;expected_decay\u0026#39;: 0.02 # 2% monthly }, TermStructureState.MILD_CONTANGO: { \u0026#39;bias\u0026#39;: \u0026#39;SHORT_VOL\u0026#39;, \u0026#39;confidence\u0026#39;: 0.6, \u0026#39;expected_decay\u0026#39;: 0.01 }, TermStructureState.FLAT: { \u0026#39;bias\u0026#39;: \u0026#39;NEUTRAL\u0026#39;, \u0026#39;confidence\u0026#39;: 0.3, \u0026#39;expected_decay\u0026#39;: 0.0 }, TermStructureState.MILD_BACKWARDATION: { \u0026#39;bias\u0026#39;: \u0026#39;LONG_VOL\u0026#39;, \u0026#39;confidence\u0026#39;: 0.5, \u0026#39;expected_decay\u0026#39;: -0.01 }, TermStructureState.STEEP_BACKWARDATION: { \u0026#39;bias\u0026#39;: \u0026#39;LONG_VOL\u0026#39;, \u0026#39;confidence\u0026#39;: 0.7, \u0026#39;expected_decay\u0026#39;: -0.02 }, } base = state_signals[current.state] return { \u0026#39;timestamp\u0026#39;: current.timestamp, \u0026#39;state\u0026#39;: current.state.value, \u0026#39;bias\u0026#39;: base[\u0026#39;bias\u0026#39;], \u0026#39;confidence\u0026#39;: base[\u0026#39;confidence\u0026#39;], \u0026#39;roll_yield_annualized\u0026#39;: roll_yield, \u0026#39;expected_decay\u0026#39;: base[\u0026#39;expected_decay\u0026#39;], \u0026#39;vix_spot\u0026#39;: current.vix_spot, \u0026#39;contango_spread\u0026#39;: current.contango_1_2, \u0026#39;transition\u0026#39;: transition } def add_observation(self, vix_spot: float, vix_1m: float, vix_2m: float, vix_3m: float): \u0026#34;\u0026#34;\u0026#34;Add new observation and update history\u0026#34;\u0026#34;\u0026#34; ts = self.calculate_term_structure(vix_spot, vix_1m, vix_2m, vix_3m) self.history.append(ts) # Keep only lookback period if len(self.history) \u0026gt; self.lookback_days * 2: self.history = self.history[-self.lookback_days * 2:] backtest results # period: jan 2023 - oct 2025\nstrategy: short SVXY when steep contango, long VXX when steep backwardation\nreturns:\nterm structure algo: +41.2% buy and hold SPY: +28.4% alpha: +12.8% key stats:\nsharpe: 1.38 max drawdown: -16.4% win rate (monthly): 64% avg contango roll yield captured: 8.2% annually observations # contango persistence: 75% of trading days in contango\nbackwardation spikes: avg 3.2 events/year, avg duration 8 days\nbest alpha: transitions from backwardation → contango\ndeployment # currently paper trading.\nwill allocate 10% ($50k) after 30 more days of validation.\nthe NexusFi volatility trading discussions have some good insights on VIX products. helped with the term structure thresholds.\n3:15am thursday. vix term structure algo implementation. contango = short vol, backwardation = long vol. state transitions signal regime changes. backtest +41.2% vs SPY +28.4% (2023-2025). sharpe 1.38. paper trading now, $50k allocation planned after 30 more days.\n-AK\n","date":"13 November 2025","externalUrl":null,"permalink":"/posts/2025-11-13-vix-term-structure-algo-implementation/","section":"Posts","summary":"\u003cp\u003ebeen researching VIX term structure trades.\u003c/p\u003e\n\u003cp\u003econtango vs backwardation. predictable patterns.\u003c/p\u003e\n\u003cp\u003efinally got an algo working.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe concept \n    \u003cdiv id=\"the-concept\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-concept\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003econtango:\u003c/strong\u003e front month VIX \u0026lt; back month VIX\u003c/p\u003e","title":"vix term structure algo - contango/backwardation trading","type":"posts"},{"content":"week 2 done.\nback to normal.\nweekly numbers # starting (nov 3): $510,180\nending (nov 9): $513,840\nweek 2 gain: +$3,660 (+0.72%)\ntrades: 9\nwins: 7\nlosses: 2\nwin rate: 78%\nbreakdown # monday (nov 3): no trading, election eve\ntuesday (nov 5): no trading, election day\nwednesday (nov 6): hedges closed, started adding. +$940\nthursday (nov 7): post-election rally. +$1,270\nfriday (nov 8): continuation. +$1,450\nthe transition # election mode off: wednesday noon\nsizing: 80% → 100% by friday\nhedges: closed wednesday, +$240 net\nnew positions: 6 opened, 4 already closed for profit\nalgo notes # election mode risk manager: worked as designed\nno trades during uncertainty. quick return after clarity.\npremium selling: VIX drop from 26 → 18 = IV crush profits\nsector rotation (paper): correctly signaled rotation to cyclicals post-election\nnext week # normal trading resumes.\nFOMC meeting in december preview.\nholiday weeks approaching (thanksgiving, christmas).\n2:42am sunday. week 2 november done. +$3,660 (+0.72%) on 9 trades, 78% wr. post-election normalization. election mode off wednesday. back to 100% sizing friday. account $513,840. VIX collapsed 26→18. premium selling profitable. normal trading resumes.\n-AK\n","date":"9 November 2025","externalUrl":null,"permalink":"/posts/2025-11-09-week-2-november-post-election-normalization/","section":"Posts","summary":"\u003cp\u003eweek 2 done.\u003c/p\u003e\n\u003cp\u003eback to normal.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweekly numbers \n    \u003cdiv id=\"weekly-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#weekly-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (nov 3):\u003c/strong\u003e $510,180\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eending (nov 9):\u003c/strong\u003e $513,840\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eweek 2 gain:\u003c/strong\u003e +$3,660 (+0.72%)\u003c/p\u003e","title":"week 2 november - post-election normalization, back to full sizing","type":"posts"},{"content":"","date":"7 November 2025","externalUrl":null,"permalink":"/tags/election/","section":"Tags","summary":"","title":"Election","type":"tags"},{"content":"election resolved.\nmarket rallying.\nadding back.\nthe outcome # clear winner declared wednesday morning.\nmarket loved the certainty.\nSPX up 2.1% wednesday-thursday.\nmy trades # wednesday:\nclosed hedges:\nVIX calls: closed at $920 profit SPY puts: closed at $680 loss net hedge P\u0026amp;L: +$240 started adding:\nSPX iron condor: filled at good premium (+$420 credit) QQQ put credit spread: filled (+$280 credit) thursday:\ncontinued adding:\nES long scalp: +$380 BTC momentum: +$290 two-day total: +$1,130\nthe lesson # hedges did their job.\ndidn\u0026rsquo;t make much, but protected capital during uncertainty.\ncost of $3,260 to hedge → recovered $240 → net cost $3,020.\nworth it for peace of mind.\ncurrent positioning # back to 80% of normal sizing.\nwill return to 100% by monday if rally continues.\nVIX dropping (now 18). premium selling back in play.\naccount update # election week start: $510,180\ncurrent: $511,310\nweek gain (so far): +$1,130 (+0.22%)\nnot huge, but didn\u0026rsquo;t lose during chaos.\nthat\u0026rsquo;s the goal with binary events.\n2:34am friday. post-election rally. clear winner wednesday. SPX +2.1% in two days. hedges closed (+$240 net, cost worth peace of mind). started adding positions. week gain +$1,130 so far. account $511,310. back to 80% sizing. VIX at 18.\n-AK\n","date":"7 November 2025","externalUrl":null,"permalink":"/posts/2025-11-07-post-election-rally-adding-back/","section":"Posts","summary":"\u003cp\u003eelection resolved.\u003c/p\u003e\n\u003cp\u003emarket rallying.\u003c/p\u003e\n\u003cp\u003eadding back.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe outcome \n    \u003cdiv id=\"the-outcome\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-outcome\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003eclear winner declared wednesday morning.\u003c/p\u003e\n\u003cp\u003emarket loved the certainty.\u003c/p\u003e","title":"post-election rally - adding back positions, hedges closed","type":"posts"},{"content":" who am i # yo. algoking here. rich AF young kid in my 20\u0026rsquo;s living the real fucking life in san diego\nbeen algo trading since i was 16. covid lockdown had me bored as fuck so i learned python and started messing with trading bots\nthe fucked up part # NYE 2022 my parents died in a car crash. got $2M inheritance - $1.5M life insurance plus $500k from selling their house and shit\nthat money changed everything. could actually trade for real instead of just backtesting fake money\nhow nexusfi saved my ass # january 2023 i joined nexusfi. seemed like a really supportive community - no trolls, no bullshit\nbig mike kept pushing me to keep a trading journal. not just trades but thoughts, emotions, the whole mental game. said it was critical for developing as a trader\nhonestly that journal advice is what led to this whole blog. started writing for myself and realized i had shit worth sharing\nbig mike is the real fucking deal. drops the ban hammer like thor on anyone who isn\u0026rsquo;t there to help\nafter my parents died i really needed support. couldn\u0026rsquo;t realize it at the time but looking back it was clear\nso many genuine real traders DM\u0026rsquo;d me. lot of them were kind of like therapy sessions. helped me work through shit while learning to trade with real money\ni credit my success to nexusfi. that community is legit\ntrading journey (honest version) # 2020-2022 - paper trading, learning python, losing fake money\n2023 - parents died, got inheritance, joined nexusfi, went live with $400k. lost $180k. hurt like hell but best education money can buy\n2024 - broke even for the year. learned risk management the hard way\n2025 - finally profitable. averaging +18% annually with like 3 losing months per year. nothing crazy but consistent enough to keep me in a nice apt and pay for my therapist lol\nwhat i trade # 60% options - mostly indices and tech stocks 10% futures - ES, NQ when volatility is good 30% crypto - btc/eth via coinbase, kraken, binance brokers: interactive brokers, tastyworks, tradestation\nmy setup # everything runs from my apt in san diego. dell server rack in my bedroom - yeah my girlfriends love the fan noise lmao\nalso rent colocation in a chicago datacenter for low latency execution\ntech stack - python 3.12+, pandas, polars, numpy, pytorch, plotly/seaborn/matplotlib, ccxt, ib_insync, redis, timescaledb\ndon\u0026rsquo;t use tradingview or traditional charting. build everything custom in python. if you see a chart on this blog i coded it\nwhy this blog exists # tired of algo trading content thats either fake guru bullshit, academic papers no one understands, or bros flexing unrealistic returns\nthis blog is the real shit - my actual strategies, actual results (wins AND losses), actual code\nalso i just like writing about this when debugging at 2am and need a break from staring at code\nwhat you\u0026rsquo;ll find here # strategy breakdowns with actual code custom plotly charts showing real data honest performance metrics (drawdowns included) tech stack deep dives personal shit about life, trading, san diego, therapy, girlfriends, whatever i post 3-4 times a week usually late night when i\u0026rsquo;m tweaking code. sometimes saturdays when i feel like getting personal\ncontact # email me at ak@algos.pro\n-AK\n","date":"7 November 2025","externalUrl":null,"permalink":"/about/","section":"Pro Algo Trading | AlgoKing","summary":"\u003ch2 class=\"relative group\"\u003ewho am i \n    \u003cdiv id=\"who-am-i\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#who-am-i\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003eyo. algoking here. rich AF young kid in my 20\u0026rsquo;s living the real fucking life in san diego\u003c/p\u003e","title":"About AlgoKing","type":"page"},{"content":"election night.\nwatching everything. trading nothing.\nthe action # 7pm EST: polls closing, futures flat\n9pm EST: swing states too close to call, futures dip -0.5%\n11pm EST: key states leaning, futures swing +1.2%\n1am EST: still counting, futures volatile, VIX at 26\nmy hedges # VIX 25 calls: up $720 at peak\nSPY 505 puts: down $380\nnet hedge P\u0026amp;L: +$340 (so far)\nnot the blowout protection scenario. but not losing either.\nwhat I did # nothing.\nsat here watching with A.\nshe made popcorn. we watched the results like it was a sporting event.\n\u0026ldquo;you\u0026rsquo;re not going to trade anything?\u0026rdquo; she asked.\n\u0026ldquo;nope. this is chaos. staying out.\u0026rdquo;\nshe nodded. she gets it now.\nthe discipline # every instinct wants to trade this.\nthe swings. the volume. the opportunity.\nbut opportunity = risk when you can\u0026rsquo;t predict direction.\nrandom outcomes deserve random respect.\ntomorrow # if clear winner by morning: start adding positions\nif still contested: continue watching\nno rush. market will be there.\ntonight # 11:58pm. election night. futures swinging 2% ranges. VIX at 26. hedges slightly positive. trading nothing. A. and I watching with popcorn. discipline over FOMO.\n11:58pm tuesday. election night. wild swings in futures (2% ranges). VIX at 26. hedges +$340 net. traded nothing. watched with A. discipline over FOMO. waiting for clarity before adding positions.\n-AK\n","date":"5 November 2025","externalUrl":null,"permalink":"/posts/2025-11-05-election-night-watching-not-trading/","section":"Posts","summary":"\u003cp\u003eelection night.\u003c/p\u003e\n\u003cp\u003ewatching everything. trading nothing.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe action \n    \u003cdiv id=\"the-action\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-action\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e7pm EST:\u003c/strong\u003e polls closing, futures flat\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e9pm EST:\u003c/strong\u003e swing states too close to call, futures dip -0.5%\u003c/p\u003e","title":"election night - watching, not trading, wild swings","type":"posts"},{"content":"tuesday is election day.\neverything is set.\ncurrent positioning # account: $510,180\nhedges:\nVIX 25 calls (2 contracts): $1,840 cost SPY 505 puts (3 contracts): $1,420 cost total hedge cost: $3,260 (0.64% of account) position sizing: reduced 40%\nopen positions: 2 (both small, both OTM)\nthe plan # monday (nov 4): final review, no new trades\ntuesday (nov 5): no trading. watching.\nwednesday (nov 6): assess outcome\nif clear winner: start adding positions if contested: stay defensive thursday-friday:\nclear outcome: return to normal sizing uncertain: maintain defensive posture through weekend historical election patterns # 2020:\nVIX peaked 40 pre-election clear winner took days (contested) post-clarity rally +7% in 2 weeks 2016:\novernight futures limit down next day: V-shaped reversal market up 4% by friday 2012:\nminimal volatility market sold off on Obama win initially recovered within 48 hours pattern: uncertainty before, resolution rally after (usually)\nwhat I\u0026rsquo;m watching # VIX: currently 22, expect 25-28 by tuesday\nSPX: 5,700 level as support\nsector rotation:\ndefensive sectors leading (XLU, XLP) = fear cyclicals leading (XLI, XLF) = optimism bitcoin: surprisingly stable at $73k\nworst case scenarios # contested election:\nstay hedged no new positions until resolution could last days/weeks clear winner but market tanks:\nhedges pay off start scaling in after 5% drop clear winner and rally:\nhedges lose value (acceptable cost) add positions into strength tonight # hedges set. sizing cut. ready to watch.\nwhatever happens tuesday, I\u0026rsquo;m protected.\n2:28am sunday. election week prep. hedges set ($3,260 in VIX calls + SPY puts). position sizing -40%. no trading tuesday. if clear winner: add wednesday. if contested: stay defensive. VIX at 22, expecting 25-28 by election. protected either way.\n-AK\n","date":"2 November 2025","externalUrl":null,"permalink":"/posts/2025-11-02-election-week-prep-hedges-set/","section":"Posts","summary":"\u003cp\u003etuesday is election day.\u003c/p\u003e\n\u003cp\u003eeverything is set.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ecurrent positioning \n    \u003cdiv id=\"current-positioning\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#current-positioning\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eaccount:\u003c/strong\u003e $510,180\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ehedges:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eVIX 25 calls (2 contracts): $1,840 cost\u003c/li\u003e\n\u003cli\u003eSPY 505 puts (3 contracts): $1,420 cost\u003c/li\u003e\n\u003cli\u003etotal hedge cost: $3,260 (0.64% of account)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eposition sizing:\u003c/strong\u003e reduced 40%\u003c/p\u003e","title":"election week prep - hedges set, sizing cut, ready to watch","type":"posts"},{"content":"october done.\nearnings season delivered.\nsecond best month of 2025.\noctober final numbers # starting (oct 1): $496,220\nending (oct 31): $510,180\noctober gain: +$13,960 (+2.81%)\ntrades: 35\nwins: 26\nlosses: 9\nwin rate: 74%\ntrading days: 23\nFigure 1: October weekly breakdown. Week 1: +$3,120 (banks). Week 2: +$2,550 (NFLX/TSLA). Week 3: +$5,560 (big tech crush). Week 4: +$2,730 (AAPL wrap). Strong finish despite TSLA stumble. Total +$13,960 (+2.81%).\nweekly breakdown # week 1 (oct 1-5): +$3,120 (+0.63%), 71% wr, 7 trades - bank earnings\nweek 2 (oct 6-12): +$2,550 (+0.51%), 62% wr, 8 trades - NFLX/TSLA\nweek 3 (oct 13-19): +$5,560 (+1.11%), 75% wr, 12 trades - big tech\nweek 4 (oct 20-26): +$2,730 (+0.54%), 75% wr, 8 trades - AAPL/positioning\n3 of 4 weeks profitable. week 3 big tech crush was +$5,560 alone.\ncomparing to target # october realistic outcomes (from sep 30):\ntypical fall month with earnings: +1.8% to +2.2%\noctober actual: +2.81%\nresult: EXCEEDED TARGET\nbig tech earnings delivered. premium selling worked.\nmarket conditions october # avg VIX: 18.4 (elevated for earnings)\navg correlation: 0.68 (moderate)\navg volume: 4.5M contracts (earnings activity)\nregime stability: 0.65 (transitional, election uncertainty)\nconditions: ideal for premium selling, elevated IV\nFigure 2: 2025 YTD through October. Monthly bars: Jan +$9,550, Feb +$8,920, Mar -$9,582, Apr +$9,732, May +$3,840, Jun +$9,180, Jul +$7,600, Aug +$5,060, Sep +$14,120, Oct +$13,960. Cumulative YTD +$71,580 (+16.49%). October was second-best month after September. On pace for 18-20% annual.\ntrade distribution # options: 30 trades, +$12,180 (87% of gains)\nSPX: 18 trades, +$7,840\nQQQ: 8 trades, +$3,420\nIndividual stocks: 4 trades, +$920\ncrypto: 3 trades, +$1,340 (10% of gains)\nBTC: 2 trades, +$980\nETH: 1 trade, +$360\nfutures: 2 trades, +$440 (3% of gains)\nES: 2 trades, +$440\nallocation: 87% options, 10% crypto, 3% futures\nFigure 3: October gains by instrument. SPX options dominated again (+$7,840, 56% of total), followed by QQQ options (+$3,420, 24%), crypto (+$1,340, 10%), individual stocks (+$920, 7%), and ES futures (+$440, 3%). Premium selling during elevated IV was the edge.\nalgo performance breakdown # earnings volatility filter (star performer):\nopportunities flagged: 18\ntrades taken: 14\nwins: 11\nlosses: 3\nwin rate: 79%\nbest call: MSFT iron condor (+$1,180)\nworst call: TSLA direction bet (-$890)\nsector rotation (paper trading):\nsignals: 6\ntheoretical performance: +3.2%\nstatus: 45 days paper, 15 more before live\nmean reversion:\ntrades: 4\nwins: 3\nlosses: 1\nwin rate: 75%\nprofit factor: 2.1\nkey trades # best trade: MSFT earnings iron condor, +$1,180\nworst trade: TSLA directional call spread, -$890\nmost satisfying: META IV crush, +$1,020 (algo called it perfectly)\ncircuit breaker performance # triggered: 0 times\nclose calls: 1 (TSLA day, recovered before trigger)\nlargest loss: -$890 (TSLA)\ncapital preservation: excellent\nytd performance update # jan: +$9,550 (+2.18%)\nfeb: +$8,920 (+1.99%)\nmar: -$9,582 (-2.10%)\napr: +$9,732 (+2.18%)\nmay: +$3,840 (+0.84%)\njun: +$9,180 (+1.99%)\njul: +$7,600 (+1.62%)\naug: +$5,060 (+1.06%)\nsep: +$14,120 (+2.93%)\noct: +$13,960 (+2.81%)\nytd total: +$71,580 (+16.49%)\nannual pace: 19.8%\nvs target: 15-18%\nprogress: slightly ahead of target, watching for reversion\ninfrastructure updates # redis optimization completed: 45ms → 8ms latency\nsector rotation algo: 45/60 days paper complete\nelection mode: activated, positions reduced 40%\nnovember preview # trading:\nelection tuesday\nVIX elevated (currently 22)\nif clear winner: return to normal wednesday\nif contested: stay defensive\nrealistic november outcomes:\nelection uncertainty: +0.5% to +1.5%\ntarget: +1.0% to +1.5%\nconservative until clarity.\ntonight (october 31, 11:52pm) # october done. +$13,960 (+2.81%) across 35 trades. 74% win rate. second best month of 2025. earnings volatility filter 79% win rate. ytd +$71,580 (+16.49%), annual pace 19.8%. account $510,180. election tuesday. hedges in place. staying defensive until outcome clear.\n11:52pm friday. october wrap. second best month of 2025. +$13,960 (+2.81%) on 35 trades, 74% wr. earnings filter crushed it (79% wr). ytd +$71,580 (+16.49%), pace 19.8%. account $510,180. election tuesday. position sizing -40%, hedges up. november target +1.0-1.5%.\n-AK\n","date":"31 October 2025","externalUrl":null,"permalink":"/posts/2025-10-31-october-wrap-earnings-season-delivers/","section":"Posts","summary":"\u003cp\u003eoctober done.\u003c/p\u003e\n\u003cp\u003eearnings season delivered.\u003c/p\u003e\n\u003cp\u003esecond best month of 2025.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eoctober final numbers \n    \u003cdiv id=\"october-final-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#october-final-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (oct 1):\u003c/strong\u003e $496,220\u003c/p\u003e","title":"october wrap - earnings season delivers, +2.81%, ytd +16.49%","type":"posts"},{"content":"election tuesday.\ntime to adjust.\nthe problem # elections = regime uncertainty.\npolicies change. sectors rotate. vol spikes.\nbinary outcome. impossible to predict.\nmy adjustments # 1. position sizing cut 40%\nnormal max position: 2% of account\nelection week: 1.2% max\nreducing exposure to unpredictable outcomes.\n2. no new positions election day\nalgos will monitor but not trade.\ntoo much noise. slippage increases.\n3. hedges in place\nVIX calls: 5% of portfolio\nSPY puts: 3% of portfolio (OTM, cheap insurance)\n4. profit targets tightened\nnormal: 80% of max profit\nelection week: 60% of max profit\ntake money faster, reduce time exposure.\ncode adjustments # class ElectionModeRiskManager: def __init__(self, normal_max_position: float = 0.02, election_reduction: float = 0.40, profit_target_normal: float = 0.80, profit_target_election: float = 0.60): self.normal_max_position = normal_max_position self.election_reduction = election_reduction self.profit_target_normal = profit_target_normal self.profit_target_election = profit_target_election self.election_mode = False def set_election_mode(self, active: bool): self.election_mode = active def get_max_position_size(self, account_value: float) -\u0026gt; float: base_size = account_value * self.normal_max_position if self.election_mode: return base_size * (1 - self.election_reduction) return base_size def get_profit_target(self) -\u0026gt; float: if self.election_mode: return self.profit_target_election return self.profit_target_normal def should_trade(self, is_election_day: bool) -\u0026gt; bool: if is_election_day: return False # no new positions return True historical context # 2020 election:\nVIX peaked at 40\npost-election rally once outcome clear\n2016 election:\novernight futures limit down\nnext day rally\npattern: uncertainty before, resolution rally after\nmy plan # monday (oct 28): reduce positions, add hedges\ntuesday (nov 5): no trading, watch\nwednesday (nov 6): assess outcome, potentially add\nthursday-friday: return to normal if clear winner\nif contested: stay defensive through weekend.\n2:38am wednesday. pre-election algo adjustments. position sizing -40%, no election day trading, hedges added (VIX calls + SPY puts), profit targets tightened (80% → 60%). historical pattern: uncertainty before, rally after resolution. staying defensive until outcome clear.\n-AK\n","date":"29 October 2025","externalUrl":null,"permalink":"/posts/2025-10-29-pre-election-algo-adjustments/","section":"Posts","summary":"\u003cp\u003eelection tuesday.\u003c/p\u003e\n\u003cp\u003etime to adjust.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe problem \n    \u003cdiv id=\"the-problem\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-problem\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003eelections = regime uncertainty.\u003c/p\u003e\n\u003cp\u003epolicies change. sectors rotate. vol spikes.\u003c/p\u003e","title":"pre-election algo adjustments - sizing down, hedges up","type":"posts"},{"content":"week 4 done.\noctober target exceeded.\nweekly numbers # starting (oct 20): $507,450\nending (oct 26): $510,180\nweek 4 gain: +$2,730 (+0.54%)\ntrades: 8\nwins: 6\nlosses: 2\nwin rate: 75%\nbreakdown # monday: AAPL earnings day\nbeat on services, miss on iPhone. stock flat.\niron condor worked. +$980\ntuesday-wednesday: post-earnings digestion\nsmall premium plays. +$1,280\nthursday: pre-election positioning starting\nVIX crept up. more premium to sell. +$890\nfriday: month-end flows\none trade went against me. -$420\noctober summary so far # weeks completed: 4\ntotal october gain: +$13,960 (+2.81%)\noctober target: +1.8% to +2.2%\nresult: EXCEEDED (+2.81% vs +2.2% target)\nearnings season delivered. every big tech name worked.\nalgo performance this month # earnings volatility filter:\nopportunities flagged: 18 trades taken: 14 wins: 11 losses: 3 win rate: 79% sector rotation (paper):\nsignals generated: 6 theoretical performance: +3.2% still in paper testing next week # october 31 wrap.\nthen november begins.\nelection week incoming.\n2:41am sunday. week 4 october done. +$2,730 (+0.54%) on 8 trades, 75% wr. AAPL iron condor worked (+$980). october total +$13,960 (+2.81%), exceeded target. earnings filter 79% wr this month. account $510,180. election week next.\n-AK\n","date":"26 October 2025","externalUrl":null,"permalink":"/posts/2025-10-26-week-4-october-strong-finish/","section":"Posts","summary":"\u003cp\u003eweek 4 done.\u003c/p\u003e\n\u003cp\u003eoctober target exceeded.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweekly numbers \n    \u003cdiv id=\"weekly-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#weekly-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (oct 20):\u003c/strong\u003e $507,450\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eending (oct 26):\u003c/strong\u003e $510,180\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eweek 4 gain:\u003c/strong\u003e +$2,730 (+0.54%)\u003c/p\u003e","title":"week 4 october - strong finish, october target exceeded","type":"posts"},{"content":"","date":"24 October 2025","externalUrl":null,"permalink":"/tags/brokers/","section":"Tags","summary":"","title":"Brokers","type":"tags"},{"content":"","date":"24 October 2025","externalUrl":null,"permalink":"/tags/interactive-brokers/","section":"Tags","summary":"","title":"Interactive-Brokers","type":"tags"},{"content":"","date":"24 October 2025","externalUrl":null,"permalink":"/tags/tastyworks/","section":"Tags","summary":"","title":"Tastyworks","type":"tags"},{"content":"been using both for 2+ years.\ndifferent tools for different jobs.\ntastyworks # what I use it for:\npremium selling strategies quick options trades mobile trading (when traveling) pricing:\n$1 per contract to open, $0 to close no ticket fees no exercise/assignment fees pros:\ndesigned by options traders, for options traders probability of profit displays everywhere IV rank/percentile front and center mobile app is actually good trade execution is fast cons:\nAPI is limited compared to IB no futures options charting is basic research tools are minimal interactive brokers # what I use it for:\nalgo execution (primary) futures complex multi-leg strategies overnight risk management pricing:\n$0.65 per contract (volume discount) no ticket fees low margin rates pros:\nbest API in the industry global market access lowest costs at volume professional platform futures + futures options cons:\nsteep learning curve TWS is bloated mobile app is meh customer support is slow head-to-head # feature tastyworks interactive brokers options pricing $1 open, $0 close $0.65/contract API quality basic excellent mobile app excellent poor options focus designed for it general platform futures no yes learning curve easy steep probability tools excellent basic my setup # tastyworks: manual options trades, premium selling\nIB: algo execution, futures, overnight positions\nwhich to choose? # if you\u0026rsquo;re starting out: tastyworks\nbetter education, easier platform, options-focused.\nif you\u0026rsquo;re automating: interactive brokers\nAPI makes everything possible.\nif you can only pick one: depends on your style\npremium sellers → tastyworks algo traders → IB hybrid (like me) → both I run ~70% of my options volume through IB (algo-driven) and ~30% through tastyworks (manual premium sells).\nthe NexusFi broker reviews section has user experiences with both. worth reading before committing.\nverdict # tastyworks: 8/10 for manual options trading\ninteractive brokers: 9/10 for algo trading\nboth: A+ for what they\u0026rsquo;re designed to do.\n2:52am friday. tastyworks vs interactive brokers after 2+ years. tastyworks: best for manual options ($1/open, $0/close), mobile, probability tools. IB: best for algos ($0.65/contract), API, futures. I use both - 70% IB (algo), 30% tastyworks (manual). if starting: tastyworks. if automating: IB.\n-AK\n","date":"24 October 2025","externalUrl":null,"permalink":"/posts/2025-10-24-tastyworks-vs-interactive-brokers-options/","section":"Posts","summary":"\u003cp\u003ebeen using both for 2+ years.\u003c/p\u003e\n\u003cp\u003edifferent tools for different jobs.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003e\u003ca\n  href=\"https://nexusfi.com/d/brokers/tastyworks\"\n    target=\"_blank\"\n  \u003etastyworks\u003c/a\u003e \n    \u003cdiv id=\"tastyworks\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#tastyworks\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003ewhat I use it for:\u003c/strong\u003e\u003c/p\u003e","title":"tastyworks vs interactive brokers - options trader comparison","type":"posts"},{"content":"just finished a redis optimization project.\nlatency went from 45ms to 8ms.\nhere\u0026rsquo;s how.\nthe problem # market data pipeline was bottlenecking at redis.\n45ms round-trip for tick data retrieval.\nduring high-volatility periods, this queued up.\nmissed opportunities because of slow data access.\nthe diagnosis # ran redis-cli debug segfault\u0026hellip; just kidding.\nran redis SLOWLOG:\nredis-cli SLOWLOG GET 10 found the culprit: JSON serialization/deserialization.\nevery tick was being stored as JSON. parsing on every read.\nstupid.\nthe fix # switched from JSON to redis timeseries with binary protocol.\nimport redis from redis.commands.timeseries import TimeSeries from typing import List, Tuple, Optional import struct import time class OptimizedMarketDataStore: def __init__(self, host: str = \u0026#39;localhost\u0026#39;, port: int = 6379): self.redis = redis.Redis(host=host, port=port, decode_responses=False) self.ts = self.redis.ts() def create_series(self, symbol: str, retention_ms: int = 86400000): \u0026#34;\u0026#34;\u0026#34;Create timeseries for symbol with 24h retention\u0026#34;\u0026#34;\u0026#34; key = f\u0026#34;tick:{symbol}\u0026#34; try: self.ts.create( key, retention_msecs=retention_ms, labels={\u0026#39;symbol\u0026#39;: symbol, \u0026#39;type\u0026#39;: \u0026#39;tick\u0026#39;} ) except redis.ResponseError as e: if \u0026#39;already exists\u0026#39; not in str(e): raise def store_tick(self, symbol: str, price: float, volume: int, timestamp_ms: Optional[int] = None) -\u0026gt; int: \u0026#34;\u0026#34;\u0026#34; Store tick with minimal overhead Returns timestamp of stored tick \u0026#34;\u0026#34;\u0026#34; key = f\u0026#34;tick:{symbol}\u0026#34; ts = timestamp_ms or int(time.time() * 1000) # Pack price and volume into single value using bit manipulation # Price as integer cents (multiply by 100) # Volume in lower 32 bits, price in upper 32 bits price_cents = int(price * 100) packed_value = (price_cents \u0026lt;\u0026lt; 32) | (volume \u0026amp; 0xFFFFFFFF) return self.ts.add(key, ts, packed_value) def get_ticks(self, symbol: str, from_ms: int, to_ms: int) -\u0026gt; List[Tuple[int, float, int]]: \u0026#34;\u0026#34;\u0026#34; Retrieve ticks efficiently Returns list of (timestamp, price, volume) \u0026#34;\u0026#34;\u0026#34; key = f\u0026#34;tick:{symbol}\u0026#34; raw_data = self.ts.range(key, from_ms, to_ms) result = [] for ts, packed_value in raw_data: packed = int(packed_value) price_cents = packed \u0026gt;\u0026gt; 32 volume = packed \u0026amp; 0xFFFFFFFF result.append((ts, price_cents / 100.0, volume)) return result def get_latest(self, symbol: str) -\u0026gt; Optional[Tuple[int, float, int]]: \u0026#34;\u0026#34;\u0026#34;Get most recent tick\u0026#34;\u0026#34;\u0026#34; key = f\u0026#34;tick:{symbol}\u0026#34; try: result = self.ts.get(key) if result: ts, packed = result packed = int(packed) price_cents = packed \u0026gt;\u0026gt; 32 volume = packed \u0026amp; 0xFFFFFFFF return (ts, price_cents / 100.0, volume) except: pass return None def get_ohlcv(self, symbol: str, from_ms: int, to_ms: int, bucket_size_ms: int = 60000) -\u0026gt; List[dict]: \u0026#34;\u0026#34;\u0026#34; Aggregate ticks into OHLCV bars Uses redis timeseries aggregation (server-side) \u0026#34;\u0026#34;\u0026#34; key = f\u0026#34;tick:{symbol}\u0026#34; # Get first, last, min, max for each bucket aggregations = [\u0026#39;first\u0026#39;, \u0026#39;last\u0026#39;, \u0026#39;min\u0026#39;, \u0026#39;max\u0026#39;, \u0026#39;count\u0026#39;] results = {} for agg in aggregations: data = self.ts.range( key, from_ms, to_ms, aggregation_type=agg, bucket_size_msec=bucket_size_ms ) results[agg] = {ts: val for ts, val in data} # Combine into OHLCV bars bars = [] for ts in results[\u0026#39;first\u0026#39;].keys(): if ts in results[\u0026#39;last\u0026#39;]: # Unpack prices open_packed = int(results[\u0026#39;first\u0026#39;][ts]) close_packed = int(results[\u0026#39;last\u0026#39;][ts]) high_packed = int(results[\u0026#39;max\u0026#39;][ts]) low_packed = int(results[\u0026#39;min\u0026#39;][ts]) bars.append({ \u0026#39;timestamp\u0026#39;: ts, \u0026#39;open\u0026#39;: (open_packed \u0026gt;\u0026gt; 32) / 100.0, \u0026#39;high\u0026#39;: (high_packed \u0026gt;\u0026gt; 32) / 100.0, \u0026#39;low\u0026#39;: (low_packed \u0026gt;\u0026gt; 32) / 100.0, \u0026#39;close\u0026#39;: (close_packed \u0026gt;\u0026gt; 32) / 100.0, \u0026#39;volume\u0026#39;: int(results[\u0026#39;count\u0026#39;].get(ts, 0)) }) return bars class MarketDataPipeline: def __init__(self, store: OptimizedMarketDataStore): self.store = store self.buffer = {} self.buffer_size = 100 self.last_flush = time.time() async def process_tick(self, symbol: str, price: float, volume: int, timestamp_ms: int): \u0026#34;\u0026#34;\u0026#34; Buffer ticks and batch write to redis Reduces network round-trips \u0026#34;\u0026#34;\u0026#34; if symbol not in self.buffer: self.buffer[symbol] = [] self.buffer[symbol].append((timestamp_ms, price, volume)) # Flush conditions: buffer full OR 100ms elapsed should_flush = ( len(self.buffer[symbol]) \u0026gt;= self.buffer_size or time.time() - self.last_flush \u0026gt; 0.1 ) if should_flush: await self.flush_buffer(symbol) async def flush_buffer(self, symbol: str): \u0026#34;\u0026#34;\u0026#34;Pipeline write all buffered ticks\u0026#34;\u0026#34;\u0026#34; if symbol not in self.buffer or not self.buffer[symbol]: return pipe = self.store.redis.pipeline() for ts, price, volume in self.buffer[symbol]: price_cents = int(price * 100) packed_value = (price_cents \u0026lt;\u0026lt; 32) | (volume \u0026amp; 0xFFFFFFFF) pipe.ts().add(f\u0026#34;tick:{symbol}\u0026#34;, ts, packed_value) pipe.execute() self.buffer[symbol] = [] self.last_flush = time.time() benchmark results # before (json storage):\nwrite latency: 12ms avg read latency: 45ms avg throughput: 8,000 ticks/sec after (timeseries + binary):\nwrite latency: 2ms avg read latency: 8ms avg throughput: 45,000 ticks/sec improvement: 5.6x latency reduction, 5.6x throughput increase\nadditional optimizations # pipelining: batch writes reduced network round-trips binary packing: eliminated json parse overhead server-side aggregation: OHLCV computed in redis, not python buffer strategy: 100 ticks or 100ms, whichever first cost # redis cloud: $99/month → $149/month (needed more memory for timeseries)\n$50/month for 5.6x performance improvement.\nworth it.\n3:08am wednesday. redis timeseries optimization. latency 45ms → 8ms (5.6x improvement). json storage → binary timeseries. pipelining, server-side aggregation, buffer strategy. throughput 8k → 45k ticks/sec. $50/month extra for redis cloud. worth every penny.\n-AK\n","date":"22 October 2025","externalUrl":null,"permalink":"/posts/2025-10-22-redis-timeseries-latency-optimization/","section":"Posts","summary":"\u003cp\u003ejust finished a redis optimization project.\u003c/p\u003e\n\u003cp\u003elatency went from 45ms to 8ms.\u003c/p\u003e\n\u003cp\u003ehere\u0026rsquo;s how.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe problem \n    \u003cdiv id=\"the-problem\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-problem\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003emarket data pipeline was bottlenecking at redis.\u003c/p\u003e","title":"redis timeseries - cutting latency from 45ms to 8ms","type":"posts"},{"content":"","date":"19 October 2025","externalUrl":null,"permalink":"/tags/earnings/","section":"Tags","summary":"","title":"Earnings","type":"tags"},{"content":"week 3 done.\nbig tech earnings delivered.\nbest week of october.\nweekly numbers # starting (oct 13): $501,890\nending (oct 19): $507,450\nweek 3 gain: +$5,560 (+1.11%)\ntrades: 12\nwins: 9\nlosses: 3\nwin rate: 75%\nbreakdown # monday: MSFT positioning\nIV pumped before earnings. sold iron condors. +$1,120\ntuesday: MSFT/GOOG earnings\nboth beat. IV crushed 35%+. my premium sells printed. +$2,180\nwednesday: AMZN/META positioning\nmore iron condors into elevated IV. +$680\nthursday: AMZN/META earnings\nAMZN beat on AWS. META beat on ad revenue. +$1,940\none AMZN directional play went wrong. -$540\nfriday: AAPL positioning\nsetting up for monday earnings. +$180\nalgo performance # earnings volatility filter: 7/7 correct flags this week\ncorrectly identified all big tech as high-conviction IV crush plays\nthis is what the algo was built for.\nbig tech grades # MSFT: A+ (cloud beat, guidance strong)\nGOOG: A (search stable, cloud growing)\nAMZN: A- (AWS margin expansion, retail flat)\nMETA: A (ad revenue, engagement up, AI spending concerns ignored)\nAAPL: monday (expecting C+, services to carry)\nkey trade # best trade: MSFT iron condor, +$1,180\n100 strikes wide, 3DTE, sold 440/450/460/470 spread\nIV at 38%, crushed to 22% post-earnings\ntextbook premium sell.\n2:36am sunday. week 3 october done. +$5,560 (+1.11%) on 12 trades, 75% wr. big tech earnings crush. MSFT A+, GOOG A, AMZN A-, META A. earnings volatility filter 7/7 correct. account $507,450. october ytd +2.26%. AAPL monday.\n-AK\n","date":"19 October 2025","externalUrl":null,"permalink":"/posts/2025-10-19-week-3-october-big-tech-crush/","section":"Posts","summary":"\u003cp\u003eweek 3 done.\u003c/p\u003e\n\u003cp\u003ebig tech earnings delivered.\u003c/p\u003e\n\u003cp\u003ebest week of october.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweekly numbers \n    \u003cdiv id=\"weekly-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#weekly-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (oct 13):\u003c/strong\u003e $501,890\u003c/p\u003e","title":"week 3 october - big tech crushed it, best week of the month","type":"posts"},{"content":"","date":"15 October 2025","externalUrl":null,"permalink":"/tags/relative-strength/","section":"Tags","summary":"","title":"Relative-Strength","type":"tags"},{"content":"been working on a sector rotation algo.\nconcept: own the strongest sectors, short the weakest.\nsimple in theory. complex in implementation.\nthe core idea # sectors rotate in predictable cycles.\ntechnology leads into growth phases.\nutilities lead into defensive phases.\nenergy leads during inflation.\nthe trick is identifying the rotation before it\u0026rsquo;s obvious.\nrelative strength scoring # import numpy as np import pandas as pd from dataclasses import dataclass from typing import Dict, List, Tuple from datetime import datetime, timedelta @dataclass class SectorData: symbol: str name: str etf: str # sector ETF components: List[str] weight: float class SectorRotationAlgo: SECTORS = [ SectorData(\u0026#39;XLK\u0026#39;, \u0026#39;Technology\u0026#39;, \u0026#39;XLK\u0026#39;, [\u0026#39;AAPL\u0026#39;, \u0026#39;MSFT\u0026#39;, \u0026#39;NVDA\u0026#39;], 0.28), SectorData(\u0026#39;XLF\u0026#39;, \u0026#39;Financials\u0026#39;, \u0026#39;XLF\u0026#39;, [\u0026#39;JPM\u0026#39;, \u0026#39;BAC\u0026#39;, \u0026#39;WFC\u0026#39;], 0.14), SectorData(\u0026#39;XLV\u0026#39;, \u0026#39;Healthcare\u0026#39;, \u0026#39;XLV\u0026#39;, [\u0026#39;UNH\u0026#39;, \u0026#39;JNJ\u0026#39;, \u0026#39;PFE\u0026#39;], 0.13), SectorData(\u0026#39;XLY\u0026#39;, \u0026#39;Consumer Disc\u0026#39;, \u0026#39;XLY\u0026#39;, [\u0026#39;AMZN\u0026#39;, \u0026#39;TSLA\u0026#39;, \u0026#39;HD\u0026#39;], 0.10), SectorData(\u0026#39;XLC\u0026#39;, \u0026#39;Communication\u0026#39;, \u0026#39;XLC\u0026#39;, [\u0026#39;META\u0026#39;, \u0026#39;GOOG\u0026#39;, \u0026#39;NFLX\u0026#39;], 0.09), SectorData(\u0026#39;XLI\u0026#39;, \u0026#39;Industrials\u0026#39;, \u0026#39;XLI\u0026#39;, [\u0026#39;CAT\u0026#39;, \u0026#39;UNP\u0026#39;, \u0026#39;HON\u0026#39;], 0.08), SectorData(\u0026#39;XLP\u0026#39;, \u0026#39;Consumer Staples\u0026#39;, \u0026#39;XLP\u0026#39;, [\u0026#39;PG\u0026#39;, \u0026#39;KO\u0026#39;, \u0026#39;PEP\u0026#39;], 0.06), SectorData(\u0026#39;XLE\u0026#39;, \u0026#39;Energy\u0026#39;, \u0026#39;XLE\u0026#39;, [\u0026#39;XOM\u0026#39;, \u0026#39;CVX\u0026#39;, \u0026#39;COP\u0026#39;], 0.05), SectorData(\u0026#39;XLU\u0026#39;, \u0026#39;Utilities\u0026#39;, \u0026#39;XLU\u0026#39;, [\u0026#39;NEE\u0026#39;, \u0026#39;DUK\u0026#39;, \u0026#39;SO\u0026#39;], 0.03), SectorData(\u0026#39;XLRE\u0026#39;, \u0026#39;Real Estate\u0026#39;, \u0026#39;XLRE\u0026#39;, [\u0026#39;AMT\u0026#39;, \u0026#39;PLD\u0026#39;, \u0026#39;CCI\u0026#39;], 0.02), SectorData(\u0026#39;XLB\u0026#39;, \u0026#39;Materials\u0026#39;, \u0026#39;XLB\u0026#39;, [\u0026#39;LIN\u0026#39;, \u0026#39;APD\u0026#39;, \u0026#39;SHW\u0026#39;], 0.02), ] def __init__(self, lookback_short: int = 20, lookback_long: int = 60, top_n: int = 3, bottom_n: int = 2, rebalance_threshold: float = 0.05): self.lookback_short = lookback_short self.lookback_long = lookback_long self.top_n = top_n self.bottom_n = bottom_n self.rebalance_threshold = rebalance_threshold def calculate_relative_strength(self, sector_returns: pd.DataFrame, benchmark_returns: pd.Series) -\u0026gt; pd.DataFrame: \u0026#34;\u0026#34;\u0026#34; Calculate multi-timeframe relative strength for each sector Returns DataFrame with RS scores by sector \u0026#34;\u0026#34;\u0026#34; rs_scores = pd.DataFrame(index=sector_returns.index) for sector in sector_returns.columns: # Short-term RS (20-day) sector_short = sector_returns[sector].rolling( self.lookback_short ).sum() bench_short = benchmark_returns.rolling( self.lookback_short ).sum() rs_short = sector_short - bench_short # Long-term RS (60-day) sector_long = sector_returns[sector].rolling( self.lookback_long ).sum() bench_long = benchmark_returns.rolling( self.lookback_long ).sum() rs_long = sector_long - bench_long # Combined score (weight short-term higher for momentum) rs_scores[sector] = 0.6 * self._normalize(rs_short) + \\ 0.4 * self._normalize(rs_long) return rs_scores def _normalize(self, series: pd.Series) -\u0026gt; pd.Series: \u0026#34;\u0026#34;\u0026#34;Normalize to 0-100 scale\u0026#34;\u0026#34;\u0026#34; min_val = series.rolling(252).min() max_val = series.rolling(252).max() return ((series - min_val) / (max_val - min_val)) * 100 def calculate_momentum_score(self, prices: pd.DataFrame) -\u0026gt; pd.DataFrame: \u0026#34;\u0026#34;\u0026#34; Dual momentum score: absolute + relative \u0026#34;\u0026#34;\u0026#34; scores = pd.DataFrame(index=prices.index) for sector in prices.columns: # Absolute momentum (is sector trending up?) sma_20 = prices[sector].rolling(20).mean() sma_50 = prices[sector].rolling(50).mean() abs_momentum = (prices[sector] \u0026gt; sma_20) \u0026amp; (sma_20 \u0026gt; sma_50) # Rate of change (how fast is it moving?) roc_20 = prices[sector].pct_change(20) roc_60 = prices[sector].pct_change(60) # Combined momentum score scores[sector] = ( abs_momentum.astype(float) * 40 + self._normalize(roc_20) * 35 + self._normalize(roc_60) * 25 ) return scores def generate_signals(self, rs_scores: pd.DataFrame, momentum_scores: pd.DataFrame, current_positions: Dict[str, float]) -\u0026gt; Dict[str, dict]: \u0026#34;\u0026#34;\u0026#34; Generate buy/sell signals based on combined scores \u0026#34;\u0026#34;\u0026#34; # Get latest scores latest_rs = rs_scores.iloc[-1] latest_momentum = momentum_scores.iloc[-1] # Combined score (equal weight RS and momentum) combined = (latest_rs + latest_momentum) / 2 ranked = combined.sort_values(ascending=False) signals = {} # Top N sectors to go long long_sectors = ranked.head(self.top_n).index.tolist() # Bottom N sectors to potentially short (if regime allows) short_sectors = ranked.tail(self.bottom_n).index.tolist() for sector in ranked.index: current_pos = current_positions.get(sector, 0.0) if sector in long_sectors: target_weight = 1.0 / self.top_n # Equal weight longs if abs(target_weight - current_pos) \u0026gt; self.rebalance_threshold: signals[sector] = { \u0026#39;action\u0026#39;: \u0026#39;BUY\u0026#39; if current_pos \u0026lt; target_weight else \u0026#39;REDUCE\u0026#39;, \u0026#39;target_weight\u0026#39;: target_weight, \u0026#39;current_weight\u0026#39;: current_pos, \u0026#39;rs_score\u0026#39;: latest_rs[sector], \u0026#39;momentum_score\u0026#39;: latest_momentum[sector], \u0026#39;combined_score\u0026#39;: combined[sector], \u0026#39;rank\u0026#39;: list(ranked.index).index(sector) + 1 } elif sector in short_sectors: target_weight = -0.1 / self.bottom_n # Small short allocation if abs(target_weight - current_pos) \u0026gt; self.rebalance_threshold: signals[sector] = { \u0026#39;action\u0026#39;: \u0026#39;SHORT\u0026#39; if current_pos \u0026gt; target_weight else \u0026#39;COVER\u0026#39;, \u0026#39;target_weight\u0026#39;: target_weight, \u0026#39;current_weight\u0026#39;: current_pos, \u0026#39;rs_score\u0026#39;: latest_rs[sector], \u0026#39;momentum_score\u0026#39;: latest_momentum[sector], \u0026#39;combined_score\u0026#39;: combined[sector], \u0026#39;rank\u0026#39;: list(ranked.index).index(sector) + 1 } else: # Neutral sector - should be flat if abs(current_pos) \u0026gt; self.rebalance_threshold: signals[sector] = { \u0026#39;action\u0026#39;: \u0026#39;CLOSE\u0026#39;, \u0026#39;target_weight\u0026#39;: 0.0, \u0026#39;current_weight\u0026#39;: current_pos, \u0026#39;rs_score\u0026#39;: latest_rs[sector], \u0026#39;momentum_score\u0026#39;: latest_momentum[sector], \u0026#39;combined_score\u0026#39;: combined[sector], \u0026#39;rank\u0026#39;: list(ranked.index).index(sector) + 1 } return signals def backtest(self, prices: pd.DataFrame, start_date: str, end_date: str, initial_capital: float = 100000) -\u0026gt; pd.DataFrame: \u0026#34;\u0026#34;\u0026#34; Simple backtest framework \u0026#34;\u0026#34;\u0026#34; prices = prices.loc[start_date:end_date] returns = prices.pct_change() benchmark = prices.mean(axis=1).pct_change() rs_scores = self.calculate_relative_strength(returns, benchmark) momentum_scores = self.calculate_momentum_score(prices) portfolio_value = [initial_capital] current_positions = {} for i in range(60, len(prices)): # Start after warmup date = prices.index[i] # Generate signals signals = self.generate_signals( rs_scores.iloc[:i+1], momentum_scores.iloc[:i+1], current_positions ) # Execute signals (simplified) for sector, signal in signals.items(): current_positions[sector] = signal[\u0026#39;target_weight\u0026#39;] # Calculate daily P\u0026amp;L daily_return = 0 for sector, weight in current_positions.items(): if sector in returns.columns: daily_return += weight * returns[sector].iloc[i] new_value = portfolio_value[-1] * (1 + daily_return) portfolio_value.append(new_value) return pd.DataFrame({ \u0026#39;portfolio_value\u0026#39;: portfolio_value[1:], \u0026#39;date\u0026#39;: prices.index[60:] }).set_index(\u0026#39;date\u0026#39;) backtest results (2023-2024) # period: jan 2023 - dec 2024\nreturns:\nsector rotation algo: +32.4% SPY benchmark: +26.8% alpha: +5.6% risk metrics:\nsharpe: 1.42 (vs SPY 1.18) max drawdown: -14.2% (vs SPY -10.8%) win rate (monthly): 62% sector calls that worked:\nlong XLK dec 2023 - mar 2024 (AI boom) short XLE jan-feb 2024 (oil pullback) long XLF oct-nov 2024 (rate cut anticipation) deployment status # currently paper trading.\nrunning parallel to live account for 60 days before allocation.\ninitial allocation target: 15% of portfolio ($75k)\nthe NexusFi community has some interesting discussions on sector rotation timing. helped refine the rebalance threshold.\n2:58am wednesday. sector rotation algo implementation. long top 3 sectors, small short bottom 2. dual momentum + relative strength scoring. backtest 2023-2024: +32.4% vs SPY +26.8%, sharpe 1.42. currently paper trading. 60 days parallel before $75k live allocation.\n-AK\n","date":"15 October 2025","externalUrl":null,"permalink":"/posts/2025-10-15-sector-rotation-algo-implementation/","section":"Posts","summary":"\u003cp\u003ebeen working on a sector rotation algo.\u003c/p\u003e\n\u003cp\u003econcept: own the strongest sectors, short the weakest.\u003c/p\u003e\n\u003cp\u003esimple in theory. complex in implementation.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe core idea \n    \u003cdiv id=\"the-core-idea\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-core-idea\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003esectors rotate in predictable cycles.\u003c/p\u003e","title":"sector rotation algo - implementation with relative strength scoring","type":"posts"},{"content":"","date":"15 October 2025","externalUrl":null,"permalink":"/tags/sector-rotation/","section":"Tags","summary":"","title":"Sector-Rotation","type":"tags"},{"content":"week 2 done.\ntech earnings started. mixed bag.\nweekly numbers # starting (oct 6): $499,340\nending (oct 12): $501,890\nweek 2 gain: +$2,550 (+0.51%)\ntrades: 8\nwins: 5\nlosses: 3\nwin rate: 62%\nbreakdown # monday-tuesday: quiet ahead of NFLX\nsmall positioning. +$720\nwednesday: NFLX earnings\nbeat expectations but stock tanked. my put credit spread worked. +$1,380\nthursday: TSLA earnings\nbeat on margins but miss on deliveries. choppy action.\nwrong-footed on a directional trade. -$890\nfriday: post-earnings digestion\nsmall premium sells. +$1,340\nlessons # TSLA humbled me.\nthought I was being clever with a call spread.\nstock went nowhere. theta ate into me.\nreminder: stick to premium selling, avoid directional bets during earnings.\nalgo notes # earnings filter worked for NFLX.\nflagged it as high-conviction IV crush play.\ndidn\u0026rsquo;t flag TSLA because expected move was too high (8.2%).\nshould have listened to the algo.\nnext week # big tech week.\nMSFT, GOOG, AMZN, META, AAPL all reporting.\nthis is the real test.\n2:44am sunday. week 2 october done. +$2,550 (+0.51%) on 8 trades, 62% wr. NFLX earnings worked. TSLA humbled me - directional bet went wrong. account $501,890. big tech earnings next week. sticking to premium selling, avoiding direction bets.\n-AK\n","date":"12 October 2025","externalUrl":null,"permalink":"/posts/2025-10-12-week-2-october-tech-earnings-start/","section":"Posts","summary":"\u003cp\u003eweek 2 done.\u003c/p\u003e\n\u003cp\u003etech earnings started. mixed bag.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweekly numbers \n    \u003cdiv id=\"weekly-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#weekly-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (oct 6):\u003c/strong\u003e $499,340\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eending (oct 12):\u003c/strong\u003e $501,890\u003c/p\u003e","title":"week 2 october - tech earnings start, mixed results","type":"posts"},{"content":"lazy saturday again.\nthese are my favorite days.\nmorning # slept until 10.\nA. already up. could hear her doing yoga in the living room.\nwatched her for a bit from bed. she\u0026rsquo;s so fucking hot when she\u0026rsquo;s focused.\nshe caught me watching.\n\u0026ldquo;creep.\u0026rdquo;\n\u0026ldquo;your fault.\u0026rdquo;\nafternoon # errands. groceries, dry cleaning, boring adult shit.\nbut doing it together makes it less boring.\nshe has this way of making everything feel\u0026hellip; easy.\nwe were in the laundry room waiting for the dryer.\nnobody else around. sunday morning quiet.\nthe laundry room # she looked at me with that look.\n\u0026ldquo;really? here?\u0026rdquo;\n\u0026ldquo;places list.\u0026rdquo;\nnumber 64.\nwe had to be quiet. she was biting her lip to keep from making noise while I fucked her against the folding table. almost got caught when someone walked by.\nthe thrill never gets old.\ndr R session this week # wednesday was therapy.\ntold her about anniversary planning.\n\u0026ldquo;you seem excited about it. that\u0026rsquo;s different from how you used to talk about relationship milestones.\u0026rdquo;\n\u0026ldquo;how did I used to talk about them?\u0026rdquo;\n\u0026ldquo;like obligations. things to survive. now you\u0026rsquo;re talking about surprising her, making her happy.\u0026rdquo;\nshe\u0026rsquo;s right.\nI used to count down to relationship endings. now I\u0026rsquo;m counting down to celebrations.\nasked me if A. and I still talk about what we like in bed.\n\u0026ldquo;constantly.\u0026rdquo;\n\u0026ldquo;and it\u0026rsquo;s still good?\u0026rdquo;\n\u0026ldquo;better. she knows exactly what I want. I know exactly what she wants. no guessing.\u0026rdquo;\ndr R had that smile again. the one where she\u0026rsquo;s trying to be professional but I can tell she\u0026rsquo;s interested.\n\u0026ldquo;that kind of communication is rare.\u0026rdquo;\nyeah. I know.\nevening # made dinner together.\nshe\u0026rsquo;s teaching me to cook. I\u0026rsquo;m still shit at it but I try.\ntonight was risotto. I mostly stirred while she did the actual cooking.\nsat on the balcony after. wine, sunset, her leaning against me.\n\u0026ldquo;you\u0026rsquo;re planning something for december.\u0026rdquo;\n\u0026ldquo;maybe.\u0026rdquo;\n\u0026ldquo;I can tell. you get this look when you\u0026rsquo;re scheming.\u0026rdquo;\n\u0026ldquo;you\u0026rsquo;ll have to wait and see.\u0026rdquo;\ntonight # 11:38pm. she\u0026rsquo;s asleep.\nsaturday with my wife. errands, laundry room quickie (places list 64), risotto, sunset.\ndr R says the communication is rare.\nI say I\u0026rsquo;m just lucky.\n11:38pm saturday. lazy saturday with A. grocery run, laundry room quickie (places list 64, almost got caught). dr R noticed I talk about relationship milestones differently now - excited instead of obligated. dinner and wine and sunset. planning december anniversary. getting better at risotto (still mostly just stirring).\n-AK\n","date":"11 October 2025","externalUrl":null,"permalink":"/posts/2025-10-11-saturday-with-a-laundry-room-places-list/","section":"Posts","summary":"\u003cp\u003elazy saturday again.\u003c/p\u003e\n\u003cp\u003ethese are my favorite days.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003emorning \n    \u003cdiv id=\"morning\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#morning\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003eslept until 10.\u003c/p\u003e\n\u003cp\u003eA. already up. could hear her doing yoga in the living room.\u003c/p\u003e","title":"saturday with A - laundry room added to list","type":"posts"},{"content":"","date":"9 October 2025","externalUrl":null,"permalink":"/tags/iex/","section":"Tags","summary":"","title":"Iex","type":"tags"},{"content":"been using polygon.io as primary data source since 2023.\nadded iex cloud as backup last year.\nhere\u0026rsquo;s how they compare for algo trading.\npolygon.io (primary) # what I use it for:\nreal-time equity data options chains and greeks historical tick data for backtesting pricing: $199/month unlimited\npros:\nwebsocket streaming is solid options data is comprehensive tick-level historical goes back years api is well documented cons:\noccasional gaps during high volatility options greeks can lag 15-30 seconds customer support is slow import asyncio from polygon import WebSocketClient, STOCKS_CLUSTER class PolygonDataHandler: def __init__(self, api_key: str): self.api_key = api_key self.client = None self.last_quote = {} async def connect(self): self.client = WebSocketClient( STOCKS_CLUSTER, self.api_key, self.process_message ) await self.client.connect() async def process_message(self, messages: list): for msg in messages: if msg.get(\u0026#39;ev\u0026#39;) == \u0026#39;Q\u0026#39;: # quote symbol = msg.get(\u0026#39;sym\u0026#39;) self.last_quote[symbol] = { \u0026#39;bid\u0026#39;: msg.get(\u0026#39;bp\u0026#39;), \u0026#39;ask\u0026#39;: msg.get(\u0026#39;ap\u0026#39;), \u0026#39;bid_size\u0026#39;: msg.get(\u0026#39;bs\u0026#39;), \u0026#39;ask_size\u0026#39;: msg.get(\u0026#39;as\u0026#39;), \u0026#39;timestamp\u0026#39;: msg.get(\u0026#39;t\u0026#39;) } async def subscribe(self, symbols: list[str]): await self.client.subscribe([\u0026#39;Q.\u0026#39; + s for s in symbols]) iex cloud (backup) # what I use it for:\nbackup real-time quotes fundamental data earnings calendar pricing: $99/month (grow plan)\npros:\nmore stable during volatility fundamental data is excellent earnings calendar with surprises faster customer support cons:\nno tick-level historical options data is limited quote depth not as good import aiohttp from typing import Optional class IEXCloudClient: BASE_URL = \u0026#34;https://cloud.iexapis.com/stable\u0026#34; def __init__(self, api_key: str): self.api_key = api_key self.session: Optional[aiohttp.ClientSession] = None async def __aenter__(self): self.session = aiohttp.ClientSession() return self async def __aexit__(self, *args): if self.session: await self.session.close() async def get_quote(self, symbol: str) -\u0026gt; dict: url = f\u0026#34;{self.BASE_URL}/stock/{symbol}/quote\u0026#34; params = {\u0026#39;token\u0026#39;: self.api_key} async with self.session.get(url, params=params) as resp: if resp.status == 200: return await resp.json() return {} async def get_earnings_calendar(self, symbol: str) -\u0026gt; list: url = f\u0026#34;{self.BASE_URL}/stock/{symbol}/earnings\u0026#34; params = {\u0026#39;token\u0026#39;: self.api_key, \u0026#39;period\u0026#39;: \u0026#39;quarterly\u0026#39;} async with self.session.get(url, params=params) as resp: if resp.status == 200: return await resp.json() return [] head-to-head comparison # feature polygon iex cloud real-time latency 10-15ms 20-30ms options data excellent limited tick historical yes no fundamentals basic excellent stability good better price $199/mo $99/mo my setup # primary (polygon): all real-time trading data, options chains\nbackup (iex): failover quotes, earnings calendar, fundamentals\nclass DataFeedManager: def __init__(self, polygon_key: str, iex_key: str): self.polygon = PolygonDataHandler(polygon_key) self.iex = IEXCloudClient(iex_key) self.primary_healthy = True async def get_quote(self, symbol: str) -\u0026gt; dict: if self.primary_healthy: try: quote = self.polygon.last_quote.get(symbol) if quote and self._is_fresh(quote[\u0026#39;timestamp\u0026#39;]): return quote except Exception: self.primary_healthy = False # fallback to IEX return await self.iex.get_quote(symbol) def _is_fresh(self, timestamp: int, max_age_ms: int = 5000) -\u0026gt; bool: import time current_ms = int(time.time() * 1000) return (current_ms - timestamp) \u0026lt; max_age_ms verdict # if I could only pick one: polygon.io\noptions data is non-negotiable for my strategies.\noptimal setup: both\npolygon primary, iex backup.\n$298/month total. cheap insurance.\nthe NexusFi trading reviews section has more detailed comparisons of various data providers if you\u0026rsquo;re shopping around.\n3:12am thursday. polygon.io vs iex cloud after 2 years using both. polygon wins for options data and tick history ($199/mo). iex wins for fundamentals and stability ($99/mo). optimal: use both. polygon primary, iex failover. $298/mo total, cheap insurance for redundancy.\n-AK\n","date":"9 October 2025","externalUrl":null,"permalink":"/posts/2025-10-09-polygon-vs-iex-cloud-data-comparison/","section":"Posts","summary":"\u003cp\u003ebeen using polygon.io as primary data source since 2023.\u003c/p\u003e\n\u003cp\u003eadded iex cloud as backup last year.\u003c/p\u003e\n\u003cp\u003ehere\u0026rsquo;s how they compare for algo trading.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003epolygon.io (primary) \n    \u003cdiv id=\"polygonio-primary\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#polygonio-primary\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003ewhat I use it for:\u003c/strong\u003e\u003c/p\u003e","title":"polygon.io vs iex cloud - 2 year data feed comparison","type":"posts"},{"content":"been running the earnings volatility filter for a week now.\nearly results are promising.\nthe problem # earnings = binary events. stock moves 5-10% or nothing.\ndirectional bets = coin flips.\nbut IV expansion before earnings = predictable.\nsell premium when IV is elevated. profit from mean reversion after announcement.\nthe filter # import asyncio from dataclasses import dataclass from datetime import datetime, timedelta from typing import Optional import numpy as np @dataclass class EarningsEvent: symbol: str earnings_date: datetime expected_move: float # implied from options historical_move: float # avg of last 4 quarters iv_rank: float # current IV percentile (0-100) sector: str class EarningsVolatilityFilter: def __init__(self, iv_rank_threshold: float = 35.0, min_premium_yield: float = 0.02, max_days_to_earnings: int = 5, min_days_to_earnings: int = 2): self.iv_rank_threshold = iv_rank_threshold self.min_premium_yield = min_premium_yield self.max_days_to_earnings = max_days_to_earnings self.min_days_to_earnings = min_days_to_earnings # sector correlations for hedging self.sector_correlations = { \u0026#39;Technology\u0026#39;: 0.85, \u0026#39;Financials\u0026#39;: 0.72, \u0026#39;Healthcare\u0026#39;: 0.65, \u0026#39;Consumer\u0026#39;: 0.78, \u0026#39;Energy\u0026#39;: 0.68 } def calculate_expected_iv_crush(self, event: EarningsEvent) -\u0026gt; float: \u0026#34;\u0026#34;\u0026#34; Estimate post-earnings IV contraction Higher IV rank = more crush expected \u0026#34;\u0026#34;\u0026#34; base_crush = 0.25 # 25% baseline # higher IV rank = more room to fall rank_adjustment = (event.iv_rank - 50) / 100 * 0.15 # historical consistency factor move_ratio = event.expected_move / event.historical_move consistency_adj = 0.05 if move_ratio \u0026gt; 1.2 else -0.03 return base_crush + rank_adjustment + consistency_adj def score_opportunity(self, event: EarningsEvent, current_date: datetime) -\u0026gt; dict: \u0026#34;\u0026#34;\u0026#34; Score earnings premium selling opportunity Returns dict with score (0-100) and reasoning \u0026#34;\u0026#34;\u0026#34; days_to_earnings = (event.earnings_date - current_date).days # timing filter if days_to_earnings \u0026lt; self.min_days_to_earnings: return {\u0026#39;score\u0026#39;: 0, \u0026#39;reason\u0026#39;: \u0026#39;too close to earnings\u0026#39;} if days_to_earnings \u0026gt; self.max_days_to_earnings: return {\u0026#39;score\u0026#39;: 0, \u0026#39;reason\u0026#39;: \u0026#39;too far from earnings\u0026#39;} # IV rank filter if event.iv_rank \u0026lt; self.iv_rank_threshold: return {\u0026#39;score\u0026#39;: 0, \u0026#39;reason\u0026#39;: f\u0026#39;IV rank {event.iv_rank:.1f} below threshold\u0026#39;} # calculate component scores iv_score = min((event.iv_rank - self.iv_rank_threshold) * 2, 40) timing_score = 25 - abs(days_to_earnings - 3) * 5 crush_estimate = self.calculate_expected_iv_crush(event) crush_score = crush_estimate * 100 # sector diversification bonus correlation = self.sector_correlations.get(event.sector, 0.75) diversification_score = (1 - correlation) * 20 total_score = iv_score + timing_score + crush_score + diversification_score return { \u0026#39;score\u0026#39;: min(total_score, 100), \u0026#39;iv_component\u0026#39;: iv_score, \u0026#39;timing_component\u0026#39;: timing_score, \u0026#39;crush_estimate\u0026#39;: crush_estimate, \u0026#39;diversification_bonus\u0026#39;: diversification_score, \u0026#39;reason\u0026#39;: \u0026#39;opportunity detected\u0026#39; if total_score \u0026gt; 50 else \u0026#39;below threshold\u0026#39; } async def scan_earnings_week(self, events: list[EarningsEvent], current_date: datetime) -\u0026gt; list[dict]: \u0026#34;\u0026#34;\u0026#34; Scan upcoming earnings for opportunities Returns sorted list of scored opportunities \u0026#34;\u0026#34;\u0026#34; opportunities = [] for event in events: score_result = self.score_opportunity(event, current_date) if score_result[\u0026#39;score\u0026#39;] \u0026gt; 50: opportunities.append({ \u0026#39;symbol\u0026#39;: event.symbol, \u0026#39;earnings_date\u0026#39;: event.earnings_date, \u0026#39;iv_rank\u0026#39;: event.iv_rank, \u0026#39;expected_move\u0026#39;: event.expected_move, **score_result }) # sort by score descending opportunities.sort(key=lambda x: x[\u0026#39;score\u0026#39;], reverse=True) return opportunities[:10] # top 10 only def calculate_position_size(self, opportunity: dict, account_size: float, max_risk_per_trade: float = 0.02) -\u0026gt; dict: \u0026#34;\u0026#34;\u0026#34; Calculate appropriate position size for earnings trade Conservative sizing for binary events \u0026#34;\u0026#34;\u0026#34; base_size = account_size * max_risk_per_trade # reduce size based on expected move magnitude if opportunity[\u0026#39;expected_move\u0026#39;] \u0026gt; 8.0: size_multiplier = 0.5 # halve size for large movers elif opportunity[\u0026#39;expected_move\u0026#39;] \u0026gt; 5.0: size_multiplier = 0.75 else: size_multiplier = 1.0 # confidence adjustment based on score confidence_mult = opportunity[\u0026#39;score\u0026#39;] / 100 final_size = base_size * size_multiplier * confidence_mult return { \u0026#39;max_risk\u0026#39;: final_size, \u0026#39;size_multiplier\u0026#39;: size_multiplier, \u0026#39;confidence_factor\u0026#39;: confidence_mult, \u0026#39;reasoning\u0026#39;: f\u0026#34;Base ${base_size:.0f} * {size_multiplier:.2f} (move adj) * {confidence_mult:.2f} (confidence)\u0026#34; } early results (week 1) # opportunities flagged: 3\ntrades taken: 2\nwins: 2\nlosses: 0\nfilter accuracy: identified JPM and BAC as high-conviction plays\nboth worked. IV crushed 30%+ post-earnings.\nwhat\u0026rsquo;s working # IV rank threshold at 35: sweet spot between opportunity frequency and quality\ndays_to_earnings sweet spot: 2-4 days optimal. close enough for elevated IV, far enough to avoid gamma risk\nsector correlation bonus: helped identify uncorrelated plays\nwhat needs tuning # expected move adjustment: historical vs implied still needs calibration\ncurrently using simple ratio. might need regression model.\nposition sizing: might be too conservative. 0.02 max risk leaving money on table.\nwill backtest 0.025 and 0.03.\nnext steps # running this through big tech earnings next week.\nMSFT, GOOG, AMZN, META, AAPL all reporting.\nif filter correctly identifies the best opportunities, will increase allocation.\nthe NexusFi community has some good discussions on earnings strategies that influenced this approach. worth checking out if you\u0026rsquo;re building similar systems.\n2:45am tuesday. earnings volatility filter implementation. week 1 results: 3 opportunities flagged, 2 taken, 2 wins. IV rank threshold 35, 2-4 days to earnings sweet spot, sector correlation bonus working. JPM and BAC both crushed it. next test: big tech earnings next week.\n-AK\n","date":"7 October 2025","externalUrl":null,"permalink":"/posts/2025-10-07-earnings-volatility-filter-implementation/","section":"Posts","summary":"\u003cp\u003ebeen running the earnings volatility filter for a week now.\u003c/p\u003e\n\u003cp\u003eearly results are promising.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe problem \n    \u003cdiv id=\"the-problem\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-problem\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003eearnings = binary events. stock moves 5-10% or nothing.\u003c/p\u003e","title":"earnings volatility filter - implementation and early results","type":"posts"},{"content":"week 1 done.\nbanks delivered.\nweekly numbers # starting (oct 1): $496,220\nending (oct 5): $499,340\nweek 1 gain: +$3,120 (+0.63%)\ntrades: 7\nwins: 5\nlosses: 2\nwin rate: 71%\nbreakdown # monday-wednesday: positioning ahead of bank earnings\nsmall premium selling on SPX. +$1,280\nthursday: pre-earnings IV pump\nQQQ puts sold into elevated IV. +$890\nfriday: bank earnings day\nJPM beat, BAC beat, WFC inline\nsold premium worked. +$1,340\none losing trade on WFC direction bet. -$390\nalgo performance # earnings volatility filter: working as intended\nflagged 3 opportunities, took 2, both profitable\nIV rank detection: correctly identified elevated premiums\nnext week # netflix tuesday. tesla wednesday.\nmore earnings = more opportunities.\nkeeping sizing conservative. no overnight exposure through reports.\n2:28am sunday. week 1 october done. +$3,120 (+0.63%) on 7 trades, 71% wr. banks delivered - JPM beat, BAC beat. premium selling working. account $499,340. next week NFLX tuesday, TSLA wednesday.\n-AK\n","date":"5 October 2025","externalUrl":null,"permalink":"/posts/2025-10-05-week-1-october-banks-deliver/","section":"Posts","summary":"\u003cp\u003eweek 1 done.\u003c/p\u003e\n\u003cp\u003ebanks delivered.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweekly numbers \n    \u003cdiv id=\"weekly-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#weekly-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (oct 1):\u003c/strong\u003e $496,220\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eending (oct 5):\u003c/strong\u003e $499,340\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eweek 1 gain:\u003c/strong\u003e +$3,120 (+0.63%)\u003c/p\u003e","title":"week 1 october - banks deliver, solid start","type":"posts"},{"content":"october.\nq3 earnings season. volatility should pick up.\nseptember recap # ended september at $496,220. best month of 2025. +$14,120 (+2.93%).\nytd: +$57,620 (+13.26%)\nannual pace: 17.7%\nmomentum is good.\noctober setup # earnings calendar loaded:\nweek 1: banks (JPM, BAC, WFC, C)\nweek 2: tech starts (NFLX, TSLA)\nweek 3: big tech (MSFT, GOOG, AMZN, META, AAPL)\nweek 4: rest of s\u0026amp;p\nvix expectations:\ncurrently 17.2 (elevated from summer)\nearnings = IV expansion\nshould see 18-20 range by mid-month\nalgo adjustments:\nearnings volatility filter activated IV rank threshold raised to 35 (from 30) position sizing reduced 20% during binary events no holding through earnings reports realistic october targets # base case: +1.8% to +2.2%\nearnings volatility helps premium selling\ncatalysts everywhere\ndownside risk: tech earnings miss = broad selloff\nprotection: reduced sizing, no overnight earnings exposure\ntoday\u0026rsquo;s setup # watching bank earnings friday.\nalgo positioned for IV expansion plays.\nnot betting on direction. selling premium into elevated vol.\n2:15am wednesday. october begins. q3 earnings season. banks friday, tech mid-month, big tech week 3. september was best month (+2.93%), ytd +13.26%. october target +1.8-2.2%. algo adjusted for earnings volatility - higher IV threshold, smaller sizing, no overnight earnings. selling premium into elevated vol.\n-AK\n","date":"1 October 2025","externalUrl":null,"permalink":"/posts/2025-10-01-october-begins-q3-earnings-season/","section":"Posts","summary":"\u003cp\u003eoctober.\u003c/p\u003e\n\u003cp\u003eq3 earnings season. volatility should pick up.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eseptember recap \n    \u003cdiv id=\"september-recap\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#september-recap\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003eended september at $496,220. best month of 2025. +$14,120 (+2.93%).\u003c/p\u003e","title":"october begins - q3 earnings season kickoff","type":"posts"},{"content":"september done.\nbest month of the year.\nfall volatility delivered.\nseptember final numbers # starting (sep 1): $482,100\nending (sep 30): $496,220\nseptember gain: +$14,120 (+2.93%)\ntrades: 35\nwins: 27\nlosses: 8\nwin rate: 77%\ntrading days: 21\nFigure 1: September weekly performance breakdown. Week 1: +$2,320 (short labor day week). Week 2: +$2,760 (CPI week). Week 3: +$6,460 (FOMC crush + triple witching). Week 4: +$2,780 (consolidation). Final day: -$200 (end of quarter positioning). FOMC week drove 46% of monthly gains. Total +$14,120 (+2.93%).\nweekly breakdown # week 1 (sep 1-7): +$2,320 (+0.48%), 83% wr, 6 trades - labor day short week\nweek 2 (sep 8-14): +$2,760 (+0.57%), 75% wr, 8 trades - CPI volatility\nweek 3 (sep 15-21): +$6,460 (+1.33%), 75% wr, 12 trades - FOMC + triple witching\nweek 4 (sep 22-28): +$2,780 (+0.56%), 75% wr, 8 trades - consolidation\nsep 30: -$200 (-0.04%), 0% wr, 1 trade - end of quarter flow\n3 of 4 full weeks profitable. FOMC week exceptional.\ncomparing to target # september realistic outcomes (from august 31):\nfall volatility, FOMC, triple witching: +1.8% to +2.5%\nseptember actual: +2.93%\nresult: ABOVE TARGET\nFOMC day alone was +$3,280. catalysts delivered.\nmarket conditions september # avg VIX: 17.2 (elevated from summer 14.8)\navg correlation: 0.65 (normal)\navg volume: 4.2M contracts (fall pickup)\nregime stability: 0.72 (transitional)\nconditions: ideal for breakout + volatility strategies\nFigure 2: 2025 YTD performance through September. Monthly bars: Jan +$9,550, Feb +$8,920, Mar -$9,582 (only losing month), Apr +$9,732, May +$3,840, Jun +$9,180, Jul +$7,600, Aug +$5,060 (vacation), Sep +$14,120 (best month). Orange line shows cumulative YTD reaching +$57,620 (+13.26%). September spike driven by FOMC + BTC breakout. On track for 16-18% annual.\ntrade distribution # options: 28 trades, +$10,840 (77% of gains)\nSPX: 18 trades, +$7,420\nQQQ: 8 trades, +$2,780\nIWM: 2 trades, +$640\ncrypto: 4 trades, +$2,690 (19% of gains)\nBTC: 3 trades, +$2,210\nETH: 1 trade, +$480\nfutures: 3 trades, +$590 (4% of gains)\nES: 3 trades, +$590\nallocation: 77% options, 19% crypto, 4% futures\nFigure 3: September gains by instrument. SPX options dominated (+$7,420, 53% of total), followed by QQQ options (+$2,780, 20%), BTC (+$2,210, 16%), other crypto (+$480, 3%), IWM options (+$640, 5%), and ES futures (+$590, 4%). Options focus working well. Crypto BTC breakout added significant alpha.\nalgo performance breakdown # regime detection algo:\nfall mode activated september 3\ncorrect regime call: normal → transitioning high_vol\nVIX prediction: within 1.2 points all month\nmean reversion algo:\ndeployed: september 9\ntrades: 4\nwins: 3\nlosses: 1\nwin rate: 75%\nprofit factor: 2.4\nverdict: promising start, will continue live testing\ncrypto momentum algo:\ntrades: 3\nwins: 3\nlosses: 0\nwin rate: 100%\nbiggest winner: BTC breakout +$1,570\nverdict: momentum strategies work in crypto\nkey trades # best trade: FOMC ES breakout, +$2,180\nworst trade: sep 30 QQQ reversion, -$200 (end of quarter noise)\nmost satisfying: BTC momentum, +$1,570 (algo caught the breakout perfectly)\ncircuit breaker performance # triggered: 0 times\nclose calls: 1 (sep 11 CPI spike, recovered before trigger)\nlargest loss: -$420 (sep 11)\ncapital preservation: excellent\nytd performance update # jan: +$9,550 (+2.18%)\nfeb: +$8,920 (+1.99%)\nmar: -$9,582 (-2.10%)\napr: +$9,732 (+2.18%)\nmay: +$3,840 (+0.84%)\njun: +$9,180 (+1.99%)\njul: +$7,600 (+1.62%)\naug: +$5,060 (+1.06%)\nsep: +$14,120 (+2.93%)\nytd total: +$57,620 (+13.26%)\nannual pace: 17.7%\nvs target: 15-18%\nprogress: solidly in target range\ninfrastructure updates # 10gbe upgrade completed: network backbone now 10gbe\ntimescaledb replication: 45ms → 8ms\nzero packet loss during FOMC volatility spike\nworth the $2,400 investment\npersonal notes # september was intense.\nFOMC week I was locked in 10+ hours/day.\nbut vacation clarity from august still there. more patience, better selectivity.\nA. noticed I\u0026rsquo;m less stressed. even during FOMC.\n\u0026ldquo;you\u0026rsquo;re different since the cruise,\u0026rdquo; she said.\ngood different.\noctober preview # trading:\nq3 earnings season starting\nVIX likely to stay elevated\nmore catalysts = more opportunities\nrealistic october outcomes:\ntypical fall month: +1.5% to +2.5%\ntarget: +1.8% to +2.2%\npersonal:\nstarting to plan anniversary surprise for A. (december)\nprobably another trip. she loved the cruise.\ntonight (september 30, 11:48pm) # september done. +$14,120 (+2.93%) across 35 trades. 77% win rate. BEST MONTH OF 2025. FOMC week was +$6,460 alone. BTC momentum algo caught the breakout perfectly. ytd +$57,620 (+13.26%), annual pace 17.7% (in target range). account $496,220. fall volatility delivered. october target +1.8-2.2%.\n11:48pm tuesday. september wrap. best month of 2025. +$14,120 (+2.93%) on 35 trades, 77% wr. FOMC week was 46% of gains. BTC breakout +$1,570. mean reversion algo 3/4 wins. network upgraded to 10gbe. ytd +$57,620 (+13.26%), pace 17.7%. october target +1.8-2.2%.\n-AK\n","date":"30 September 2025","externalUrl":null,"permalink":"/posts/2025-09-30-september-wrap-best-month-2025/","section":"Posts","summary":"\u003cp\u003eseptember done.\u003c/p\u003e\n\u003cp\u003ebest month of the year.\u003c/p\u003e\n\u003cp\u003efall volatility delivered.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eseptember final numbers \n    \u003cdiv id=\"september-final-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#september-final-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (sep 1):\u003c/strong\u003e $482,100\u003c/p\u003e","title":"september wrap - best month of 2025, +2.93%, ytd +13.26%","type":"posts"},{"content":"september\u0026rsquo;s final full week.\nstrong finish.\nweek 4 numbers # starting (sep 22): $493,640\nending (sep 28): $496,420\nweek gain: +$2,780 (+0.56%)\ntrades: 8\nwins: 6\nlosses: 2\nwin rate: 75%\nbreakdown # 5 trading days.\nmonday: +$580, 2 trades (trend continuation)\ntuesday: +$720, 2 trades (SPX premium, BTC momentum)\nwednesday: +$640, 1 trade (QQQ reversion)\nthursday: +$440, 2 trades (theta decay)\nfriday: +$400, 1 trade (end of week cleanup)\nquiet week after FOMC/triple witching chaos.\ncrypto update # BTC trade closed thursday.\nentry: $28,080\nexit: $29,650\nP\u0026amp;L: +$1,570 (+5.6%)\ntrailing stop wasn\u0026rsquo;t hit. took profit at resistance.\nmomentum algo performing as expected.\nmean reversion update # 3 trades since deployment.\ntrade 1: QQQ long, +0.6%, closed trade 2: IWM long, +0.4%, closed trade 3: SPY short, -0.3%, stopped (mean reversion failed)\n2/3 wins. small sample but promising.\nseptember preview # one trading day left (monday sep 30).\nlooking to close september strong.\n2:14am sunday. week 4 september: +$2,780 (+0.56%) on 8 trades, 75% wr. quiet week post-FOMC. BTC momentum trade closed +$1,570 (+5.6%). mean reversion algo 2/3 wins. account $496,420. one trading day left in september.\n-AK\n","date":"28 September 2025","externalUrl":null,"permalink":"/posts/2025-09-28-week-4-september-review-strong-finish/","section":"Posts","summary":"\u003cp\u003eseptember\u0026rsquo;s final full week.\u003c/p\u003e\n\u003cp\u003estrong finish.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 4 numbers \n    \u003cdiv id=\"week-4-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-4-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (sep 22):\u003c/strong\u003e $493,640\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eending (sep 28):\u003c/strong\u003e $496,420\u003c/p\u003e","title":"week 4 september review - strong finish","type":"posts"},{"content":"","date":"26 September 2025","externalUrl":null,"permalink":"/tags/hardware/","section":"Tags","summary":"","title":"Hardware","type":"tags"},{"content":"","date":"26 September 2025","externalUrl":null,"permalink":"/tags/networking/","section":"Tags","summary":"","title":"Networking","type":"tags"},{"content":"","date":"26 September 2025","externalUrl":null,"permalink":"/tags/ubiquiti/","section":"Tags","summary":"","title":"Ubiquiti","type":"tags"},{"content":"finally upgraded the home network.\n10gbe backbone. no more bottlenecks.\nthe problem # running 4 Dell servers, 3 workstations, NAS, and market data feeds.\nold setup: 1gbe switch, consumer router.\nbottleneck was obvious. timescaledb replication lagging. market data feeds competing for bandwidth.\nthe new setup # core switch: Ubiquiti USW-Pro-24-POE\n24 ports gigabit with POE 2x 10gbe SFP+ uplinks layer 3 switching aggregation: Ubiquiti USW-Aggregation\n8x 10gbe SFP+ ports connects all servers at 10gbe router: Ubiquiti UDM-Pro\n10gbe WAN/LAN built-in controller IDS/IPS capability total cost: $2,400\nworth every penny.\nthe installation # [ISP 1gbe] | [UDM-Pro] | [USW-Aggregation] / | | \\ Dell1 Dell2 Dell3 NAS 10gbe 10gbe 10gbe 10gbe | [USW-Pro-24-POE] / | \\ WS1 WS2 WS3 1gbe 1gbe 1gbe servers on 10gbe backbone. workstations on gigabit.\nperformance gains # timescaledb replication:\nbefore: 45ms average, 200ms spikes after: 8ms average, 15ms spikes market data ingestion:\nbefore: occasional packet loss during high volatility after: zero packet loss NAS backup:\nbefore: 112 MB/s after: 950 MB/s inter-server latency:\nbefore: 0.4ms after: 0.08ms configuration details # VLANs for network segmentation:\nVLAN 10: Trading (servers, data feeds) VLAN 20: Management (controller, monitoring) VLAN 30: Guest (wifi, IoT) VLAN 40: Personal (workstations, media) trading VLAN gets priority. QoS rules ensure market data never competes with backups or media streaming.\nmonitoring # unifi controller gives decent visibility.\nadded custom grafana dashboard for:\nper-port bandwidth utilization packet loss metrics latency between VLANs switch CPU/memory lessons learned # 10gbe cables matter - use CAT6A or DAC cables. CAT5e won\u0026rsquo;t cut it SFP+ modules are finicky - stick with Ubiquiti branded for compatibility VLAN planning first - redesigning VLANs after deployment sucks document everything - port assignments, cable runs, IP schemes ROI # $2,400 upfront.\nbut: faster replication = less slippage. zero packet loss = no missed signals.\none avoided bad fill pays for the upgrade.\nplus the NAS backups are 8x faster which means I actually run them daily instead of weekly.\n2:18am friday. network infrastructure overhaul complete. 10gbe backbone with ubiquiti gear ($2,400 total). timescaledb replication: 45ms → 8ms. packet loss: eliminated. NAS speed: 112 MB/s → 950 MB/s. worth it for zero packet loss during high volatility.\n-AK\n","date":"26 September 2025","externalUrl":null,"permalink":"/posts/2025-09-26-ubiquiti-10gbe-upgrade-network-infrastructure/","section":"Posts","summary":"\u003cp\u003efinally upgraded the home network.\u003c/p\u003e\n\u003cp\u003e10gbe backbone. no more bottlenecks.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe problem \n    \u003cdiv id=\"the-problem\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-problem\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003erunning 4 Dell servers, 3 workstations, NAS, and market data feeds.\u003c/p\u003e","title":"ubiquiti 10gbe upgrade - network infrastructure overhaul","type":"posts"},{"content":"","date":"24 September 2025","externalUrl":null,"permalink":"/tags/api/","section":"Tags","summary":"","title":"Api","type":"tags"},{"content":"been on IB for 2 years now.\nprimary broker for options and futures.\nhere\u0026rsquo;s what I\u0026rsquo;ve learned.\nwhy IB # pros:\nbest API in the industry (fight me) lowest commissions for volume global market access solid margin rates professional platform cons:\ncustomer service is meh TWS is bloated API documentation is\u0026hellip; interesting learning curve is steep the python setup # ib_insync is the library. nothing else comes close.\nfrom ib_insync import IB, Stock, Option, Future import asyncio class IBConnectionManager: def __init__(self, host: str = \u0026#39;127.0.0.1\u0026#39;, port: int = 7497, client_id: int = 1): self.host = host self.port = port self.client_id = client_id self.ib = IB() self._connected = False async def connect(self) -\u0026gt; bool: \u0026#34;\u0026#34;\u0026#34;Establish connection to TWS/Gateway\u0026#34;\u0026#34;\u0026#34; try: await self.ib.connectAsync( self.host, self.port, self.client_id ) self._connected = True return True except Exception as e: print(f\u0026#34;Connection failed: {e}\u0026#34;) return False async def get_option_chain(self, symbol: str, expiry: str) -\u0026gt; list: \u0026#34;\u0026#34;\u0026#34;Fetch full options chain for symbol/expiry\u0026#34;\u0026#34;\u0026#34; stock = Stock(symbol, \u0026#39;SMART\u0026#39;, \u0026#39;USD\u0026#39;) await self.ib.qualifyContractsAsync(stock) chains = await self.ib.reqSecDefOptParamsAsync( stock.symbol, \u0026#39;\u0026#39;, stock.secType, stock.conId ) if not chains: return [] # get the chain for SMART exchange chain = next((c for c in chains if c.exchange == \u0026#39;SMART\u0026#39;), chains[0]) strikes = chain.strikes rights = [\u0026#39;C\u0026#39;, \u0026#39;P\u0026#39;] contracts = [] for strike in strikes: for right in rights: opt = Option(symbol, expiry, strike, right, \u0026#39;SMART\u0026#39;) contracts.append(opt) # qualify in batches qualified = [] batch_size = 50 for i in range(0, len(contracts), batch_size): batch = contracts[i:i + batch_size] result = await self.ib.qualifyContractsAsync(*batch) qualified.extend([c for c in result if c]) return qualified async def place_option_order(self, contract, action: str, quantity: int, order_type: str = \u0026#39;LMT\u0026#39;, limit_price: float = None) -\u0026gt; dict: \u0026#34;\u0026#34;\u0026#34;Place options order with proper error handling\u0026#34;\u0026#34;\u0026#34; from ib_insync import LimitOrder, MarketOrder if order_type == \u0026#39;LMT\u0026#39; and limit_price: order = LimitOrder(action, quantity, limit_price) else: order = MarketOrder(action, quantity) trade = self.ib.placeOrder(contract, order) # wait for fill or timeout timeout = 30 start = asyncio.get_event_loop().time() while trade.orderStatus.status not in [\u0026#39;Filled\u0026#39;, \u0026#39;Cancelled\u0026#39;]: await asyncio.sleep(0.1) if asyncio.get_event_loop().time() - start \u0026gt; timeout: break return { \u0026#39;order_id\u0026#39;: trade.order.orderId, \u0026#39;status\u0026#39;: trade.orderStatus.status, \u0026#39;filled\u0026#39;: trade.orderStatus.filled, \u0026#39;avg_price\u0026#39;: trade.orderStatus.avgFillPrice, \u0026#39;remaining\u0026#39;: trade.orderStatus.remaining } commission reality # options: $0.65 per contract (no ticket charge)\nfutures: $0.85 per contract ES, $0.25 per micro\nfor my volume (500+ contracts/month): saves me $2k+ annually vs Tastyworks\nthe gotchas # 1. pacing violations\nIB rate limits requests. exceeded pacing = temporary ban.\nsolution: request queue with delays\nimport asyncio from collections import deque class RateLimiter: def __init__(self, requests_per_second: float = 45): self.delay = 1.0 / requests_per_second self.last_request = 0 async def wait(self): now = asyncio.get_event_loop().time() elapsed = now - self.last_request if elapsed \u0026lt; self.delay: await asyncio.sleep(self.delay - elapsed) self.last_request = asyncio.get_event_loop().time() 2. market data farm disconnects\nhappens during high volatility. exactly when you need data most.\nsolution: redundant data sources (polygon backup)\n3. order routing quirks\nSMART routing isn\u0026rsquo;t always smart.\nfor SPX options, route to CBOE directly. for ES futures, route to CME.\nwhat I\u0026rsquo;d change # if starting over:\nuse IB Gateway instead of TWS (lighter, more stable) implement proper request queuing from day 1 build redundant data feeds immediately test failure modes extensively before going live community insights # there\u0026rsquo;s a solid thread on NexusFi about IB API gotchas that helped me avoid some pitfalls early on. worth reading if you\u0026rsquo;re starting out.\nverdict # rating: 8.5/10\nbest API, steepest learning curve. worth it if you\u0026rsquo;re serious about automation.\n2:34am wednesday. 2 years on interactive brokers. best API in the industry, lowest commissions at volume ($0.65/contract options), steep learning curve. key gotchas: pacing violations, data farm disconnects, routing quirks. use ib_insync library. run IB Gateway not TWS. build redundancy. 8.5/10 overall.\n-AK\n","date":"24 September 2025","externalUrl":null,"permalink":"/posts/2025-09-24-interactive-brokers-api-2-years-review/","section":"Posts","summary":"\u003cp\u003ebeen on \u003ca\n  href=\"https://nexusfi.com/d/brokers/interactive-brokers\"\n    target=\"_blank\"\n  \u003eIB\u003c/a\u003e for 2 years now.\u003c/p\u003e\n\u003cp\u003eprimary broker for options and futures.\u003c/p\u003e\n\u003cp\u003ehere\u0026rsquo;s what I\u0026rsquo;ve learned.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ewhy IB \n    \u003cdiv id=\"why-ib\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#why-ib\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003epros:\u003c/strong\u003e\u003c/p\u003e","title":"interactive brokers api - 2 years deep review","type":"posts"},{"content":"massive week.\nfomc wednesday. triple witching friday.\nsurvived both. more than survived.\nweek 3 numbers # starting (sep 15): $487,180\nending (sep 21): $493,640\nweek gain: +$6,460 (+1.33%)\ntrades: 12\nwins: 9\nlosses: 3\nwin rate: 75%\nbreakdown # 5 trading days.\nmonday: +$420, 2 trades (pre-FOMC positioning)\ntuesday: +$580, 1 trade (volatility play)\nwednesday: +$3,280, 5 trades (FOMC day - documented in detail)\nthursday: +$1,340, 2 trades (follow-through plays)\nfriday: +$840, 2 trades (triple witching, reduced size)\nfomc day was 51% of the week\u0026rsquo;s gains. risk management paid off.\nfomc recap # rates held. powell dovish.\nplayed the breakout, not the prediction.\nES futures, VIX puts, 0DTE premium.\nbest single day since june.\ntriple witching notes # $5.1 trillion in options expiring.\nstayed small friday. 50% position sizing.\nchoppy as expected. still caught +$840.\ncrypto update # BTC trade from friday still running.\nentry: $28,080\ncurrent: $29,420\nunrealized: +$1,340\ntrailing stop at $28,200. letting it ride.\nytd update # jan: +$9,550 (+2.18%)\nfeb: +$8,920 (+1.99%)\nmar: -$9,582 (-2.10%)\napr: +$9,732 (+2.18%)\nmay: +$3,840 (+0.84%)\njun: +$9,180 (+1.99%)\njul: +$7,600 (+1.62%)\naug: +$5,060 (+1.06%)\nsep (3 weeks): +$11,540 (+2.39%)\nytd total: +$55,840 (+12.82%)\nbest month of the year so far. one week left.\n2:16am sunday. week 3 september: +$6,460 (+1.33%) on 12 trades, 75% wr. fomc wednesday was +$3,280 alone. triple witching friday survived with reduced size. BTC trade still running +$1,340 unrealized. account $493,640. ytd +$55,840 (+12.82%). september already best month of year.\n-AK\n","date":"21 September 2025","externalUrl":null,"permalink":"/posts/2025-09-21-week-3-september-review-fomc-triple-witching/","section":"Posts","summary":"\u003cp\u003emassive week.\u003c/p\u003e\n\u003cp\u003efomc wednesday. triple witching friday.\u003c/p\u003e\n\u003cp\u003esurvived both. more than survived.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 3 numbers \n    \u003cdiv id=\"week-3-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-3-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (sep 15):\u003c/strong\u003e $487,180\u003c/p\u003e","title":"week 3 september review - fomc crush, triple witching survival","type":"posts"},{"content":"","date":"19 September 2025","externalUrl":null,"permalink":"/tags/bitcoin/","section":"Tags","summary":"","title":"Bitcoin","type":"tags"},{"content":"BTC broke out of 3-month range today.\nmy momentum algo caught it.\ntime to document the implementation.\nthe context # BTC been consolidating between $25,000 and $28,000 since june.\ntoday it broke $28,500 with volume.\nmy algo was positioned.\nthe strategy # pure momentum. no predictions.\ncore logic:\ndetect range breakout with volume confirmation enter on first pullback after breakout trail stop with ATR-based levels size based on volatility regime the implementation # import numpy as np import pandas as pd from dataclasses import dataclass, field from typing import Optional, Tuple, List from enum import Enum import ccxt from datetime import datetime, timedelta import asyncio class PositionState(Enum): FLAT = 0 LONG = 1 SHORT = -1 @dataclass class MomentumConfig: # range detection range_lookback: int = 60 # days for range calculation breakout_threshold: float = 1.02 # 2% above range high volume_multiplier: float = 2.0 # volume must be 2x average # entry pullback_pct: float = 0.015 # enter on 1.5% pullback max_pullback_pct: float = 0.04 # don\u0026#39;t enter if pullback \u0026gt; 4% # exit atr_period: int = 14 atr_stop_mult: float = 2.5 # stop at 2.5x ATR atr_trail_mult: float = 1.5 # trail at 1.5x ATR take_profit_mult: float = 4.0 # TP at 4x ATR # risk risk_per_trade: float = 0.01 # 1% account risk max_position_pct: float = 0.10 # max 10% of account in single position @dataclass class TradeState: position: PositionState = PositionState.FLAT entry_price: Optional[float] = None entry_time: Optional[datetime] = None stop_price: Optional[float] = None trail_high: Optional[float] = None size: float = 0.0 class CryptoMomentumAlgo: def __init__(self, config: MomentumConfig, exchange: ccxt.Exchange, account_size: float): self.config = config self.exchange = exchange self.account_size = account_size self.state = TradeState() self.trade_history: List[dict] = [] def calculate_atr(self, df: pd.DataFrame) -\u0026gt; pd.Series: \u0026#34;\u0026#34;\u0026#34;Average True Range calculation\u0026#34;\u0026#34;\u0026#34; high = df[\u0026#39;high\u0026#39;] low = df[\u0026#39;low\u0026#39;] close = df[\u0026#39;close\u0026#39;].shift(1) tr1 = high - low tr2 = abs(high - close) tr3 = abs(low - close) tr = pd.concat([tr1, tr2, tr3], axis=1).max(axis=1) atr = tr.rolling(window=self.config.atr_period).mean() return atr def detect_range(self, df: pd.DataFrame) -\u0026gt; Tuple[float, float]: \u0026#34;\u0026#34;\u0026#34;Detect trading range over lookback period\u0026#34;\u0026#34;\u0026#34; lookback_data = df.tail(self.config.range_lookback) range_high = lookback_data[\u0026#39;high\u0026#39;].max() range_low = lookback_data[\u0026#39;low\u0026#39;].min() return range_high, range_low def check_volume_confirmation(self, df: pd.DataFrame) -\u0026gt; bool: \u0026#34;\u0026#34;\u0026#34;Check if current volume confirms breakout\u0026#34;\u0026#34;\u0026#34; current_vol = df[\u0026#39;volume\u0026#39;].iloc[-1] avg_vol = df[\u0026#39;volume\u0026#39;].tail(20).mean() return current_vol \u0026gt; avg_vol * self.config.volume_multiplier def calculate_position_size(self, entry_price: float, stop_price: float) -\u0026gt; float: \u0026#34;\u0026#34;\u0026#34;Size position based on risk parameters\u0026#34;\u0026#34;\u0026#34; risk_amount = self.account_size * self.config.risk_per_trade stop_distance = abs(entry_price - stop_price) if stop_distance == 0: return 0 size_from_risk = risk_amount / stop_distance max_size = (self.account_size * self.config.max_position_pct) / entry_price return min(size_from_risk, max_size) async def check_breakout(self, df: pd.DataFrame) -\u0026gt; Optional[dict]: \u0026#34;\u0026#34;\u0026#34;Check for range breakout with confirmation\u0026#34;\u0026#34;\u0026#34; range_high, range_low = self.detect_range(df) current_price = df[\u0026#39;close\u0026#39;].iloc[-1] atr = self.calculate_atr(df).iloc[-1] breakout_signal = None # long breakout if current_price \u0026gt; range_high * self.config.breakout_threshold: if self.check_volume_confirmation(df): breakout_signal = { \u0026#39;direction\u0026#39;: \u0026#39;LONG\u0026#39;, \u0026#39;breakout_level\u0026#39;: range_high, \u0026#39;current_price\u0026#39;: current_price, \u0026#39;atr\u0026#39;: atr, \u0026#39;pullback_entry\u0026#39;: current_price * (1 - self.config.pullback_pct), \u0026#39;stop\u0026#39;: current_price - (atr * self.config.atr_stop_mult) } # short breakout elif current_price \u0026lt; range_low * (2 - self.config.breakout_threshold): if self.check_volume_confirmation(df): breakout_signal = { \u0026#39;direction\u0026#39;: \u0026#39;SHORT\u0026#39;, \u0026#39;breakout_level\u0026#39;: range_low, \u0026#39;current_price\u0026#39;: current_price, \u0026#39;atr\u0026#39;: atr, \u0026#39;pullback_entry\u0026#39;: current_price * (1 + self.config.pullback_pct), \u0026#39;stop\u0026#39;: current_price + (atr * self.config.atr_stop_mult) } return breakout_signal async def manage_position(self, current_price: float, atr: float) -\u0026gt; Optional[str]: \u0026#34;\u0026#34;\u0026#34;Manage existing position with trailing stop\u0026#34;\u0026#34;\u0026#34; if self.state.position == PositionState.FLAT: return None action = None if self.state.position == PositionState.LONG: # update trail high if self.state.trail_high is None or current_price \u0026gt; self.state.trail_high: self.state.trail_high = current_price self.state.stop_price = max( self.state.stop_price, current_price - (atr * self.config.atr_trail_mult) ) # check stop if current_price \u0026lt; self.state.stop_price: action = \u0026#39;EXIT_STOP\u0026#39; # check take profit entry = self.state.entry_price tp_level = entry + (atr * self.config.take_profit_mult) if current_price \u0026gt; tp_level: action = \u0026#39;EXIT_TP\u0026#39; elif self.state.position == PositionState.SHORT: # update trail low if self.state.trail_high is None or current_price \u0026lt; self.state.trail_high: self.state.trail_high = current_price self.state.stop_price = min( self.state.stop_price, current_price + (atr * self.config.atr_trail_mult) ) # check stop if current_price \u0026gt; self.state.stop_price: action = \u0026#39;EXIT_STOP\u0026#39; # check take profit entry = self.state.entry_price tp_level = entry - (atr * self.config.take_profit_mult) if current_price \u0026lt; tp_level: action = \u0026#39;EXIT_TP\u0026#39; return action async def execute_entry(self, signal: dict) -\u0026gt; bool: \u0026#34;\u0026#34;\u0026#34;Execute entry order via exchange API\u0026#34;\u0026#34;\u0026#34; try: size = self.calculate_position_size( signal[\u0026#39;pullback_entry\u0026#39;], signal[\u0026#39;stop\u0026#39;] ) if size \u0026lt;= 0: return False # place limit order at pullback level order = await asyncio.to_thread( self.exchange.create_limit_buy_order, \u0026#39;BTC/USDT\u0026#39;, size, signal[\u0026#39;pullback_entry\u0026#39;] ) self.state = TradeState( position=PositionState.LONG if signal[\u0026#39;direction\u0026#39;] == \u0026#39;LONG\u0026#39; else PositionState.SHORT, entry_price=signal[\u0026#39;pullback_entry\u0026#39;], entry_time=datetime.now(), stop_price=signal[\u0026#39;stop\u0026#39;], trail_high=signal[\u0026#39;current_price\u0026#39;], size=size ) return True except Exception as e: print(f\u0026#34;Entry failed: {e}\u0026#34;) return False async def execute_exit(self, current_price: float, reason: str) -\u0026gt; bool: \u0026#34;\u0026#34;\u0026#34;Execute exit order via exchange API\u0026#34;\u0026#34;\u0026#34; try: order = await asyncio.to_thread( self.exchange.create_market_sell_order, \u0026#39;BTC/USDT\u0026#39;, self.state.size ) # record trade pnl = (current_price - self.state.entry_price) * self.state.size if self.state.position == PositionState.SHORT: pnl = -pnl self.trade_history.append({ \u0026#39;entry_time\u0026#39;: self.state.entry_time, \u0026#39;exit_time\u0026#39;: datetime.now(), \u0026#39;entry_price\u0026#39;: self.state.entry_price, \u0026#39;exit_price\u0026#39;: current_price, \u0026#39;size\u0026#39;: self.state.size, \u0026#39;pnl\u0026#39;: pnl, \u0026#39;pnl_pct\u0026#39;: pnl / (self.state.entry_price * self.state.size), \u0026#39;reason\u0026#39;: reason }) # reset state self.state = TradeState() return True except Exception as e: print(f\u0026#34;Exit failed: {e}\u0026#34;) return False def get_stats(self) -\u0026gt; dict: \u0026#34;\u0026#34;\u0026#34;Calculate strategy statistics\u0026#34;\u0026#34;\u0026#34; if not self.trade_history: return {} df = pd.DataFrame(self.trade_history) wins = df[df[\u0026#39;pnl\u0026#39;] \u0026gt; 0] losses = df[df[\u0026#39;pnl\u0026#39;] \u0026lt;= 0] return { \u0026#39;total_trades\u0026#39;: len(df), \u0026#39;win_rate\u0026#39;: len(wins) / len(df) if len(df) \u0026gt; 0 else 0, \u0026#39;total_pnl\u0026#39;: df[\u0026#39;pnl\u0026#39;].sum(), \u0026#39;avg_win\u0026#39;: wins[\u0026#39;pnl\u0026#39;].mean() if len(wins) \u0026gt; 0 else 0, \u0026#39;avg_loss\u0026#39;: losses[\u0026#39;pnl\u0026#39;].mean() if len(losses) \u0026gt; 0 else 0, \u0026#39;profit_factor\u0026#39;: abs(wins[\u0026#39;pnl\u0026#39;].sum() / losses[\u0026#39;pnl\u0026#39;].sum()) if len(losses) \u0026gt; 0 and losses[\u0026#39;pnl\u0026#39;].sum() != 0 else float(\u0026#39;inf\u0026#39;), \u0026#39;largest_win\u0026#39;: wins[\u0026#39;pnl\u0026#39;].max() if len(wins) \u0026gt; 0 else 0, \u0026#39;largest_loss\u0026#39;: losses[\u0026#39;pnl\u0026#39;].min() if len(losses) \u0026gt; 0 else 0 } today\u0026rsquo;s trade # 9:47am: BTC breaks $28,500 with 2.3x average volume\n10:12am: algo sets pullback entry at $28,100\n11:34am: BTC pulls back to $28,080, entry filled\nstop: $26,850 (2.5x ATR below entry)\ncurrent: $28,920, trailing stop at $27,650\nunrealized P\u0026amp;L: +$840 (holding)\nwhy momentum works in crypto # crypto doesn\u0026rsquo;t mean revert like equities.\nwhen BTC breaks a level with volume, it tends to trend.\n24/7 markets, global participants, FOMO dynamics.\nmomentum \u0026gt; mean reversion in crypto. learned this the hard way in 2023.\n2:48am friday (triple witching). BTC broke $28,500 range - 3 month consolidation ended. momentum algo caught the breakout. entry at $28,080 pullback, stop $26,850, currently at $28,920. algo uses ATR trailing stops and volume confirmation. holding overnight.\n-AK\n","date":"19 September 2025","externalUrl":null,"permalink":"/posts/2025-09-19-crypto-momentum-algo-btc-breakout-strategy/","section":"Posts","summary":"\u003cp\u003eBTC broke out of 3-month range today.\u003c/p\u003e\n\u003cp\u003emy momentum algo caught it.\u003c/p\u003e\n\u003cp\u003etime to document the implementation.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe context \n    \u003cdiv id=\"the-context\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-context\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003eBTC been consolidating between $25,000 and $28,000 since june.\u003c/p\u003e","title":"crypto momentum algo - btc breakout strategy implementation","type":"posts"},{"content":"fomc day.\nrates held. powell dovish. markets ripped.\nalgos crushed it.\nthe setup # going into FOMC I was 90% cash.\nhad 3 conditional orders ready:\nlong ES if break above 4520 short ES if break below 4480 long VIX calls if spot VIX \u0026gt; 21 what happened # 2:00pm: fed holds rates. no surprise.\n2:30pm: powell presser starts. tone dovish. mentions \u0026ldquo;progress on inflation.\u0026rdquo;\n2:45pm: ES breaks 4520. long triggered.\n3:15pm: ES hits 4545. +25 points. closed half.\n4:00pm: ES at 4558. closed rest.\ntotal ES trade: +$2,180 on 2 MES contracts\nvolatility play # VIX spiked to 19.2 during presser.\nthen crushed to 15.8 by close.\nhad VIX puts positioned for this exact scenario.\nVIX puts: +$680\noptions premium # sold SPX 0DTE put spreads at 2:45pm when direction confirmed.\n0DTE premium: +$420\ntheta decay is beautiful when you know the direction.\ntotal fomc day # ES futures: +$2,180\nVIX puts: +$680\n0DTE premium: +$420\ntotal: +$3,280\nbest single day since june.\nthe algo response logic # class FOMCResponseAlgo: def __init__(self): self.fomc_time = datetime.strptime(\u0026#34;14:00\u0026#34;, \u0026#34;%H:%M\u0026#34;) self.presser_time = datetime.strptime(\u0026#34;14:30\u0026#34;, \u0026#34;%H:%M\u0026#34;) self.breakout_levels = {} def pre_fomc_setup(self, es_price: float) -\u0026gt; dict: \u0026#34;\u0026#34;\u0026#34;Set breakout levels 30 min before announcement\u0026#34;\u0026#34;\u0026#34; range_pct = 0.008 # 0.8% breakout threshold self.breakout_levels = { \u0026#39;long_trigger\u0026#39;: es_price * (1 + range_pct), \u0026#39;short_trigger\u0026#39;: es_price * (1 - range_pct), \u0026#39;stop_long\u0026#39;: es_price * (1 + range_pct / 2), \u0026#39;stop_short\u0026#39;: es_price * (1 - range_pct / 2) } return self.breakout_levels def check_breakout(self, current_price: float) -\u0026gt; str: \u0026#34;\u0026#34;\u0026#34;Check for directional breakout\u0026#34;\u0026#34;\u0026#34; if current_price \u0026gt; self.breakout_levels[\u0026#39;long_trigger\u0026#39;]: return \u0026#39;LONG\u0026#39; elif current_price \u0026lt; self.breakout_levels[\u0026#39;short_trigger\u0026#39;]: return \u0026#39;SHORT\u0026#39; return \u0026#39;FLAT\u0026#39; simple but effective. don\u0026rsquo;t predict the fed. react to the market\u0026rsquo;s reaction.\ntriple witching friday # 2 days away.\n$5.1 trillion in options expiring.\nusually choppy. will reduce position sizing.\n11:38pm wednesday. fomc day crushed it. +$3,280 total. rates held, powell dovish, ES broke out +38 points. played the breakout with ES futures (+$2,180), VIX puts (+$680), and 0DTE premium (+$420). best day since june. triple witching friday coming.\n-AK\n","date":"17 September 2025","externalUrl":null,"permalink":"/posts/2025-09-17-fomc-algo-response-rate-hold-volatility/","section":"Posts","summary":"\u003cp\u003efomc day.\u003c/p\u003e\n\u003cp\u003erates held. powell dovish. markets ripped.\u003c/p\u003e\n\u003cp\u003ealgos crushed it.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe setup \n    \u003cdiv id=\"the-setup\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-setup\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003egoing into FOMC I was 90% cash.\u003c/p\u003e","title":"fomc algo response - rate hold, volatility spike, profits","type":"posts"},{"content":"","date":"17 September 2025","externalUrl":null,"permalink":"/categories/trade-updates/","section":"Categories","summary":"","title":"Trade Updates","type":"categories"},{"content":"cpi week done.\nfomc next.\nweek 2 numbers # starting (sep 8): $484,420\nending (sep 14): $487,180\nweek gain: +$2,760 (+0.57%)\ntrades: 8\nwins: 6\nlosses: 2\nwin rate: 75%\nbreakdown # 5 trading days.\nmonday: +$480, 1 trade (SPX premium play)\ntuesday: +$620, 2 trades (pre-CPI positioning)\nwednesday: flat, 0 trades (CPI day - stayed flat intentionally)\nthursday: +$1,340, 3 trades (CPI reaction plays)\nfriday: +$320, 2 trades (theta decay, consolidation)\nCPI came in slightly hot. markets dropped, then recovered.\nplayed the reaction, not the number.\nmean reversion algo update # first real signals this week.\nsignal 1 (thursday): long QQQ at -2.3 z-score\nresult: closed +0.6% after z-score reverted to -0.4\nsignal 2 (friday): long IWM at -2.1 z-score\nresult: still holding. z-score at -1.8.\nbacktesting holding up so far. small sample size obviously.\nregime status # VIX: 17.8 (up from 16.2 last week)\nvol of vol: 1.1 (elevated)\ncorrelation: 0.68 (normal)\nregime: normal → high_vol transition forming\nfomc week typically pushes VIX to 20+. positioned for it.\nlooking ahead # fomc decision: wednesday sep 17\npowell presser: wednesday 2:30pm\ntriple witching: friday sep 19\nstaying light into FOMC. will deploy after clarity.\n2:22am sunday. week 2 september: +$2,760 (+0.57%) on 8 trades, 75% wr. cpi came hot, played the reaction. mean reversion algo first live signals - working so far. account $487,180. ytd +$49,380 (+11.36%). fomc and triple witching next week.\n-AK\n","date":"14 September 2025","externalUrl":null,"permalink":"/posts/2025-09-14-week-2-september-review-cpi-fomc-week/","section":"Posts","summary":"\u003cp\u003ecpi week done.\u003c/p\u003e\n\u003cp\u003efomc next.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 2 numbers \n    \u003cdiv id=\"week-2-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-2-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (sep 8):\u003c/strong\u003e $484,420\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eending (sep 14):\u003c/strong\u003e $487,180\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eweek gain:\u003c/strong\u003e +$2,760 (+0.57%)\u003c/p\u003e","title":"week 2 september review - cpi week, fomc next","type":"posts"},{"content":"lazy saturday.\nno trading. no algo work.\njust us.\nmorning # slept in until 11.\nA. made breakfast. eggs benedict - she\u0026rsquo;s been perfecting her hollandaise.\nI tried it without complaining. she knows I\u0026rsquo;m picky as fuck but she keeps trying new recipes.\nreward system works. what can I say.\nafternoon # walked to the beach. weather perfect - 72, slight breeze.\nsat on the sand for an hour just talking.\nabout nothing important. just\u0026hellip; talking.\nstill weird to me that I enjoy this now. used to get bored after 20 minutes. now I could sit there all day with her.\nevening # cooking dinner together.\nshe was making pasta from scratch. flour everywhere.\nI was supposed to be helping but mostly just watching her work. she gets this focused look when she\u0026rsquo;s concentrating.\nshe caught me staring.\n\u0026ldquo;what?\u0026rdquo;\n\u0026ldquo;nothing. just watching.\u0026rdquo;\nshe smiled and pulled me closer.\nthe kitchen counter # we didn\u0026rsquo;t make it to the bedroom.\nshe hopped up on the counter and pulled me in.\nkitchen counter added to the list. number 63.\nwe\u0026rsquo;ve been together over 2 years now. sex is still incredible. maybe better. we know exactly what each other likes.\nshe came so hard she knocked the flour bag on the floor. white powder everywhere.\nworth cleaning up.\npost-sex cooking # finished the pasta after.\nsat on the balcony with wine and homemade fettuccine.\nshe leaned against me and we watched the sunset.\n\u0026ldquo;I\u0026rsquo;m glad we did the cruise,\u0026rdquo; she said.\n\u0026ldquo;me too.\u0026rdquo;\n\u0026ldquo;we should do something for our anniversary. december.\u0026rdquo;\n\u0026ldquo;what do you want to do?\u0026rdquo;\n\u0026ldquo;surprise me. like the cruise.\u0026rdquo;\npressure\u0026rsquo;s on.\ndr R session this week # had therapy wednesday.\ntold her about post-vacation clarity. how I\u0026rsquo;m trading different now. more patient.\nshe asked if that extended to other areas.\n\u0026ldquo;what do you mean?\u0026rdquo;\n\u0026ldquo;your relationship. you mentioned before that you sometimes felt the urge to run when things got too comfortable.\u0026rdquo;\n\u0026ldquo;not anymore.\u0026rdquo;\n\u0026ldquo;what changed?\u0026rdquo;\n\u0026ldquo;the cruise, maybe. or just\u0026hellip; time. I don\u0026rsquo;t know. I look at A. and I don\u0026rsquo;t see an exit strategy. I just see her.\u0026rdquo;\ndr R smiled. that knowing smile she does.\n\u0026ldquo;that\u0026rsquo;s growth.\u0026rdquo;\nis it? feels normal now.\ntonight # A. is asleep. 11:42pm.\nsaturday with my wife. kitchen counter. flour everywhere. pasta and wine and sunset.\nthis is my life now.\n11:42pm saturday. lazy saturday with A. beach, cooking, kitchen counter (places list 63). made homemade pasta. talked with dr R about post-vacation clarity and not planning exit strategies anymore. A. wants a surprise for our anniversary in december. working on it.\n-AK\n","date":"13 September 2025","externalUrl":null,"permalink":"/posts/2025-09-13-saturday-with-a-kitchen-counter-list/","section":"Posts","summary":"\u003cp\u003elazy saturday.\u003c/p\u003e\n\u003cp\u003eno trading. no algo work.\u003c/p\u003e\n\u003cp\u003ejust us.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003emorning \n    \u003cdiv id=\"morning\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#morning\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003eslept in until 11.\u003c/p\u003e\n\u003cp\u003eA. made breakfast. eggs benedict - she\u0026rsquo;s been perfecting her hollandaise.\u003c/p\u003e","title":"saturday with A - kitchen counter added to list","type":"posts"},{"content":"been running both for 8 months now.\ntime for an honest comparison.\nwhy both # polygon.io: primary equities and options quotes\nthetadata: greeks, IV surfaces, historical options data\nredundancy + specialized strengths.\ncost breakdown # polygon.io stocks unlimited:\n$199/month (annual prepay)\nincludes: real-time quotes, trades, L2 for all US equities\noptions: basic chain data, no greeks\nthetadata professional:\n$99/month\nincludes: full options chain, greeks, IV, historical data\nno equities focus\ntotal: $298/month\nvs competitors like Bloomberg terminal at $2,000+/month? yeah I\u0026rsquo;ll take it.\ndata quality # polygon.io strengths:\nrock solid uptime (99.97% in my logs) websocket reconnection is seamless tick-level granularity excellent API documentation python library is clean polygon.io weaknesses:\noptions greeks are delayed/estimated IV data is basic no historical options chains before 2019 rate limits can hit during high volatility thetadata strengths:\ngreeks are real-time and accurate full IV surface with term structure options history back to 2007 bulk historical downloads great for backtesting options strategies thetadata weaknesses:\nwebsocket can be flaky during spikes python library is\u0026hellip; functional customer support is slow documentation could be better latency comparison # ran tests over 30 days:\npolygon.io websocket:\nmedian latency: 8ms p99 latency: 42ms reconnection time: \u0026lt;500ms thetadata websocket:\nmedian latency: 15ms p99 latency: 180ms reconnection time: 2-5 seconds polygon wins on raw speed. but for options greeks, thetadata\u0026rsquo;s accuracy matters more than 7ms.\nmy setup # # data aggregation layer class DataAggregator: def __init__(self): self.polygon = PolygonClient(api_key=POLYGON_KEY) self.theta = ThetaClient(username=THETA_USER, passwd=THETA_PASS) async def get_option_quote(self, symbol: str, strike: float, expiry: str, right: str) -\u0026gt; dict: # quotes from polygon (faster) quote = await self.polygon.get_option_quote( underlying=symbol, strike=strike, expiration=expiry, call_put=right ) # greeks from thetadata (accurate) greeks = await self.theta.get_greeks( root=symbol, strike=strike, exp=expiry, right=right ) return { \u0026#39;bid\u0026#39;: quote[\u0026#39;bid\u0026#39;], \u0026#39;ask\u0026#39;: quote[\u0026#39;ask\u0026#39;], \u0026#39;mid\u0026#39;: (quote[\u0026#39;bid\u0026#39;] + quote[\u0026#39;ask\u0026#39;]) / 2, \u0026#39;delta\u0026#39;: greeks[\u0026#39;delta\u0026#39;], \u0026#39;gamma\u0026#39;: greeks[\u0026#39;gamma\u0026#39;], \u0026#39;theta\u0026#39;: greeks[\u0026#39;theta\u0026#39;], \u0026#39;vega\u0026#39;: greeks[\u0026#39;vega\u0026#39;], \u0026#39;iv\u0026#39;: greeks[\u0026#39;iv\u0026#39;], \u0026#39;source_quote\u0026#39;: \u0026#39;polygon\u0026#39;, \u0026#39;source_greeks\u0026#39;: \u0026#39;thetadata\u0026#39; } best of both worlds.\nfor algo traders # if you only pick one:\npure equities/futures → polygon options-focused → thetadata both → both (obviously) budget option:\npolygon starter ($29/month) + thetadata basic ($25/month) = $54/month\ngets you started. upgrade when profitable.\ncommunity perspective # lots of discussion on this topic at NexusFi trading reviews. the consensus there is similar - polygon for speed, thetadata for options depth.\nsome folks there use IEX cloud as a third fallback. I\u0026rsquo;ve considered it but haven\u0026rsquo;t needed the redundancy yet.\ncpi day # today\u0026rsquo;s cpi came in. markets volatile.\nboth data feeds handled it fine. no issues.\nmy mean reversion algo triggered first signal during the spike. long QQQ at -2.3 z-score.\n2:26am thursday. polygon.io vs thetadata comparison after 8 months. polygon: faster ($199/mo), better uptime, weaker options greeks. thetadata: accurate greeks ($99/mo), full IV surface, slower websocket. running both for $298/mo total - polygon for quotes, thetadata for greeks. cpi day went smooth.\n-AK\n","date":"11 September 2025","externalUrl":null,"permalink":"/posts/2025-09-11-polygon-vs-thetadata-options-data-comparison/","section":"Posts","summary":"\u003cp\u003ebeen running both for 8 months now.\u003c/p\u003e\n\u003cp\u003etime for an honest comparison.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ewhy both \n    \u003cdiv id=\"why-both\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#why-both\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003epolygon.io:\u003c/strong\u003e primary equities and options quotes\u003c/p\u003e","title":"polygon.io vs thetadata - options data deep comparison","type":"posts"},{"content":"finally deploying the mean reversion algo I\u0026rsquo;ve been backtesting since june.\n6 months of development. time to go live.\nthe edge # simple concept: prices that deviate from their mean tend to revert.\nhard part: figuring out WHICH mean, HOW FAR is deviated enough, and WHEN to enter.\nbeen running backtests on NexusFi data threads - some of the discussions there helped me narrow down which statistical tests actually matter.\nthe implementation # import numpy as np import pandas as pd from scipy import stats from dataclasses import dataclass, field from typing import Optional, Tuple, List from enum import Enum import asyncio from datetime import datetime, timedelta class SignalType(Enum): LONG = 1 SHORT = -1 FLAT = 0 @dataclass class MeanReversionConfig: # lookback windows fast_period: int = 10 slow_period: int = 50 vol_period: int = 20 # z-score thresholds entry_z: float = 2.0 exit_z: float = 0.5 stop_z: float = 3.5 # statistical filters min_halflife: int = 3 max_halflife: int = 20 min_hurst: float = 0.0 max_hurst: float = 0.4 # mean reverting \u0026lt; 0.5 # risk parameters max_holding_periods: int = 10 position_size_pct: float = 0.01 @dataclass class MeanReversionState: position: SignalType = SignalType.FLAT entry_price: Optional[float] = None entry_time: Optional[datetime] = None entry_z: Optional[float] = None periods_held: int = 0 class MeanReversionStrategy: def __init__(self, config: MeanReversionConfig): self.config = config self.state = MeanReversionState() self.trade_history: List[dict] = [] def calculate_halflife(self, prices: pd.Series) -\u0026gt; float: \u0026#34;\u0026#34;\u0026#34; Ornstein-Uhlenbeck halflife estimation. Measures speed of mean reversion. \u0026#34;\u0026#34;\u0026#34; lagged = prices.shift(1).dropna() delta = prices.diff().dropna() # align series lagged = lagged.iloc[1:] delta = delta.iloc[1:] if len(lagged) \u0026lt; 20: return float(\u0026#39;inf\u0026#39;) # regression: delta = alpha + beta * lagged + epsilon try: slope, intercept, r_value, p_value, std_err = stats.linregress( lagged.values, delta.values ) if slope \u0026gt;= 0: return float(\u0026#39;inf\u0026#39;) # not mean reverting halflife = -np.log(2) / slope return max(0.1, halflife) except Exception: return float(\u0026#39;inf\u0026#39;) def calculate_hurst(self, prices: pd.Series, max_lag: int = 20) -\u0026gt; float: \u0026#34;\u0026#34;\u0026#34; Hurst exponent using rescaled range method. H \u0026lt; 0.5 = mean reverting H = 0.5 = random walk H \u0026gt; 0.5 = trending \u0026#34;\u0026#34;\u0026#34; if len(prices) \u0026lt; max_lag * 2: return 0.5 lags = range(2, max_lag) rs_values = [] for lag in lags: # subdivide into chunks chunks = len(prices) // lag if chunks \u0026lt; 2: continue rs_chunk = [] for i in range(chunks): chunk = prices.iloc[i * lag:(i + 1) * lag] if len(chunk) \u0026lt; lag: continue # cumulative deviate mean_chunk = chunk.mean() deviate = (chunk - mean_chunk).cumsum() range_val = deviate.max() - deviate.min() std_val = chunk.std() if std_val \u0026gt; 0: rs_chunk.append(range_val / std_val) if rs_chunk: rs_values.append((lag, np.mean(rs_chunk))) if len(rs_values) \u0026lt; 3: return 0.5 # log-log regression x = np.log([v[0] for v in rs_values]) y = np.log([v[1] for v in rs_values]) try: slope, _, _, _, _ = stats.linregress(x, y) return np.clip(slope, 0, 1) except Exception: return 0.5 def calculate_zscore(self, prices: pd.Series) -\u0026gt; Tuple[float, float, float]: \u0026#34;\u0026#34;\u0026#34; Calculate z-score relative to slow moving average. Returns: (zscore, fast_ma, slow_ma) \u0026#34;\u0026#34;\u0026#34; fast_ma = prices.tail(self.config.fast_period).mean() slow_ma = prices.tail(self.config.slow_period).mean() if len(prices) \u0026lt; self.config.vol_period: return 0.0, fast_ma, slow_ma # use rolling std for volatility normalization rolling_std = prices.tail(self.config.vol_period).std() if rolling_std == 0: return 0.0, fast_ma, slow_ma zscore = (fast_ma - slow_ma) / rolling_std return zscore, fast_ma, slow_ma def check_statistical_validity(self, prices: pd.Series) -\u0026gt; Tuple[bool, dict]: \u0026#34;\u0026#34;\u0026#34; Verify mean reversion is statistically valid right now. \u0026#34;\u0026#34;\u0026#34; halflife = self.calculate_halflife(prices) hurst = self.calculate_hurst(prices) valid = ( self.config.min_halflife \u0026lt;= halflife \u0026lt;= self.config.max_halflife and self.config.min_hurst \u0026lt;= hurst \u0026lt;= self.config.max_hurst ) metrics = { \u0026#39;halflife\u0026#39;: halflife, \u0026#39;hurst\u0026#39;: hurst, \u0026#39;valid\u0026#39;: valid } return valid, metrics def generate_signal(self, prices: pd.Series, current_time: datetime) -\u0026gt; Tuple[SignalType, dict]: \u0026#34;\u0026#34;\u0026#34; Main signal generation logic. \u0026#34;\u0026#34;\u0026#34; if len(prices) \u0026lt; self.config.slow_period + 10: return SignalType.FLAT, {\u0026#39;reason\u0026#39;: \u0026#39;insufficient_data\u0026#39;} # calculate metrics zscore, fast_ma, slow_ma = self.calculate_zscore(prices) valid, stats_metrics = self.check_statistical_validity( prices.tail(100) ) signal_info = { \u0026#39;zscore\u0026#39;: zscore, \u0026#39;fast_ma\u0026#39;: fast_ma, \u0026#39;slow_ma\u0026#39;: slow_ma, **stats_metrics } # check existing position if self.state.position != SignalType.FLAT: self.state.periods_held += 1 # exit conditions should_exit = False exit_reason = None # z-score crossed back to neutral if self.state.position == SignalType.LONG and zscore \u0026gt; -self.config.exit_z: should_exit = True exit_reason = \u0026#39;zscore_exit\u0026#39; elif self.state.position == SignalType.SHORT and zscore \u0026lt; self.config.exit_z: should_exit = True exit_reason = \u0026#39;zscore_exit\u0026#39; # stop loss (mean reversion failed) if abs(zscore) \u0026gt; self.config.stop_z: should_exit = True exit_reason = \u0026#39;stop_loss\u0026#39; # time stop if self.state.periods_held \u0026gt;= self.config.max_holding_periods: should_exit = True exit_reason = \u0026#39;time_stop\u0026#39; if should_exit: signal_info[\u0026#39;exit_reason\u0026#39;] = exit_reason self._record_trade(prices.iloc[-1], current_time, exit_reason) self.state = MeanReversionState() # reset return SignalType.FLAT, signal_info return self.state.position, signal_info # entry logic (only if flat) if not valid: signal_info[\u0026#39;reason\u0026#39;] = \u0026#39;statistical_filter\u0026#39; return SignalType.FLAT, signal_info # long entry: price below mean if zscore \u0026lt; -self.config.entry_z: self.state = MeanReversionState( position=SignalType.LONG, entry_price=prices.iloc[-1], entry_time=current_time, entry_z=zscore ) signal_info[\u0026#39;reason\u0026#39;] = \u0026#39;long_entry\u0026#39; return SignalType.LONG, signal_info # short entry: price above mean if zscore \u0026gt; self.config.entry_z: self.state = MeanReversionState( position=SignalType.SHORT, entry_price=prices.iloc[-1], entry_time=current_time, entry_z=zscore ) signal_info[\u0026#39;reason\u0026#39;] = \u0026#39;short_entry\u0026#39; return SignalType.SHORT, signal_info signal_info[\u0026#39;reason\u0026#39;] = \u0026#39;no_signal\u0026#39; return SignalType.FLAT, signal_info def _record_trade(self, exit_price: float, exit_time: datetime, exit_reason: str) -\u0026gt; None: \u0026#34;\u0026#34;\u0026#34;Record completed trade for analysis.\u0026#34;\u0026#34;\u0026#34; if self.state.entry_price is None: return pnl_pct = (exit_price - self.state.entry_price) / self.state.entry_price if self.state.position == SignalType.SHORT: pnl_pct = -pnl_pct self.trade_history.append({ \u0026#39;entry_time\u0026#39;: self.state.entry_time, \u0026#39;exit_time\u0026#39;: exit_time, \u0026#39;entry_price\u0026#39;: self.state.entry_price, \u0026#39;exit_price\u0026#39;: exit_price, \u0026#39;entry_z\u0026#39;: self.state.entry_z, \u0026#39;direction\u0026#39;: self.state.position.name, \u0026#39;periods_held\u0026#39;: self.state.periods_held, \u0026#39;pnl_pct\u0026#39;: pnl_pct, \u0026#39;exit_reason\u0026#39;: exit_reason }) def get_performance_stats(self) -\u0026gt; dict: \u0026#34;\u0026#34;\u0026#34;Calculate strategy performance metrics.\u0026#34;\u0026#34;\u0026#34; if not self.trade_history: return {} trades_df = pd.DataFrame(self.trade_history) wins = trades_df[trades_df[\u0026#39;pnl_pct\u0026#39;] \u0026gt; 0] losses = trades_df[trades_df[\u0026#39;pnl_pct\u0026#39;] \u0026lt;= 0] return { \u0026#39;total_trades\u0026#39;: len(trades_df), \u0026#39;win_rate\u0026#39;: len(wins) / len(trades_df) if len(trades_df) \u0026gt; 0 else 0, \u0026#39;avg_win\u0026#39;: wins[\u0026#39;pnl_pct\u0026#39;].mean() if len(wins) \u0026gt; 0 else 0, \u0026#39;avg_loss\u0026#39;: losses[\u0026#39;pnl_pct\u0026#39;].mean() if len(losses) \u0026gt; 0 else 0, \u0026#39;profit_factor\u0026#39;: abs(wins[\u0026#39;pnl_pct\u0026#39;].sum() / losses[\u0026#39;pnl_pct\u0026#39;].sum()) if len(losses) \u0026gt; 0 and losses[\u0026#39;pnl_pct\u0026#39;].sum() != 0 else float(\u0026#39;inf\u0026#39;), \u0026#39;avg_holding_periods\u0026#39;: trades_df[\u0026#39;periods_held\u0026#39;].mean(), \u0026#39;sharpe\u0026#39;: trades_df[\u0026#39;pnl_pct\u0026#39;].mean() / trades_df[\u0026#39;pnl_pct\u0026#39;].std() * np.sqrt(252) if trades_df[\u0026#39;pnl_pct\u0026#39;].std() \u0026gt; 0 else 0 } the key insights # halflife filtering matters.\nwithout it, you enter mean reversion trades on random walks. recipe for disaster.\nmy filter: halflife between 3 and 20 periods. fast enough to capture, slow enough to be real.\nhurst exponent is underrated.\nH \u0026lt; 0.4 = strongly mean reverting. H \u0026gt; 0.6 = trending. don\u0026rsquo;t fight the regime.\ntime stops save you.\nmean reversion sometimes fails. if price hasn\u0026rsquo;t reverted in 10 periods, it\u0026rsquo;s probably not going to.\nbacktest results (6 months) # total trades: 847\nwin rate: 67%\navg win: +0.82%\navg loss: -0.54%\nprofit factor: 2.8\nsharpe: 2.1\nmax drawdown: -4.2%\ngoing live # deployed this morning on SPY, QQQ, and IWM.\n5% of capital allocated. will scale up if live results match backtest.\nfirst signal expected within 48 hours based on current z-scores.\n2:42am tuesday. mean reversion algo finally deployed. 6 months of development and backtesting. uses halflife + hurst exponent filters to avoid false signals. backtest: 67% win rate, 2.8 profit factor, 2.1 sharpe. live on SPY/QQQ/IWM with 5% allocation. will scale if results hold.\n-AK\n","date":"9 September 2025","externalUrl":null,"permalink":"/posts/2025-09-09-mean-reversion-implementation-statistical-edge/","section":"Posts","summary":"\u003cp\u003efinally deploying the mean reversion algo I\u0026rsquo;ve been backtesting since june.\u003c/p\u003e\n\u003cp\u003e6 months of development. time to go live.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe edge \n    \u003cdiv id=\"the-edge\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-edge\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003esimple concept: prices that deviate from their mean tend to revert.\u003c/p\u003e","title":"mean reversion implementation - statistical edge in practice","type":"posts"},{"content":"","date":"9 September 2025","externalUrl":null,"permalink":"/tags/mean-reversion/","section":"Tags","summary":"","title":"Mean-Reversion","type":"tags"},{"content":"first full week of fall trading.\nshort week with labor day monday.\nweek 1 numbers # starting (sep 1): $482,100\nending (sep 7): $484,420\nweek gain: +$2,320 (+0.48%)\ntrades: 6\nwins: 5\nlosses: 1\nwin rate: 83%\nbreakdown # 4 trading days.\ntuesday: +$680, 2 trades (ES futures back on, vol picking up)\nwednesday: +$920, 2 trades (SPX premium play, BTC momentum)\nthursday: +$420, 1 trade (QQQ iron condor)\nfriday: +$300, 1 trade (SPX theta decay)\nclean week. nothing exciting.\nregime adaptation # switched to fall mode wednesday.\nposition sizing back to 1%. shorter DTE on options.\nfeels right. markets moving more. cleaner price action.\nlooking ahead # cpi thursday (sep 11)\nbig one. will be flat going into it.\nfomc next week (sep 16-17)\nrate decision. powell presser.\nvolatility should expand this week.\n2:18am sunday. week 1 september: +$2,320 (+0.48%) on 6 trades, 83% wr. short week with labor day. fall mode activated. ES futures back on. cpi thursday, then fomc week. account $484,420. ytd +$46,620 (+10.71%). on track.\n-AK\n","date":"7 September 2025","externalUrl":null,"permalink":"/posts/2025-09-07-week-1-september-review-fall-begins/","section":"Posts","summary":"\u003cp\u003efirst full week of fall trading.\u003c/p\u003e\n\u003cp\u003eshort week with labor day monday.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 1 numbers \n    \u003cdiv id=\"week-1-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-1-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (sep 1):\u003c/strong\u003e $482,100\u003c/p\u003e","title":"week 1 september review - fall begins","type":"posts"},{"content":"","date":"5 September 2025","externalUrl":null,"permalink":"/tags/database/","section":"Tags","summary":"","title":"Database","type":"tags"},{"content":"been putting this off for months.\ntimescaledb getting slow. finally fixed it.\nthe problem # my options flow data pipeline ingests about 3 million rows per day.\nquotes, trades, greeks, IV surface points.\nwrites were fine. reads were getting brutal.\nsimple query for daily aggregates taking 8+ seconds.\nunacceptable when algos need sub-second decisions.\nthe diagnosis # EXPLAIN ANALYZE SELECT date_trunc(\u0026#39;minute\u0026#39;, timestamp) as minute, symbol, AVG(iv) as avg_iv, SUM(volume) as total_vol FROM options_flow WHERE timestamp \u0026gt; NOW() - INTERVAL \u0026#39;24 hours\u0026#39; AND symbol = \u0026#39;SPX\u0026#39; GROUP BY 1, 2 ORDER BY 1; execution time: 8.4 seconds.\nwtf.\nlooked at the query plan. full table scan on 890 million rows.\nroot cause # three issues:\nhypertable chunks too large (default 7 days = 21M rows per chunk) no compression on old data missing index on symbol + timestamp combo the fix # step 1: chunk interval\n-- shrink chunks to 1 day for recent data SELECT set_chunk_time_interval(\u0026#39;options_flow\u0026#39;, INTERVAL \u0026#39;1 day\u0026#39;); -- recompress existing data into smaller chunks CALL reorder_chunk(\u0026#39;options_flow\u0026#39;, \u0026#39;options_flow_timestamp_idx\u0026#39;); step 2: compression policy\n-- compress anything older than 3 days ALTER TABLE options_flow SET ( timescaledb.compress, timescaledb.compress_segmentby = \u0026#39;symbol\u0026#39;, timescaledb.compress_orderby = \u0026#39;timestamp DESC\u0026#39; ); SELECT add_compression_policy(\u0026#39;options_flow\u0026#39;, INTERVAL \u0026#39;3 days\u0026#39;); -- manually compress existing old data SELECT compress_chunk(i) FROM show_chunks(\u0026#39;options_flow\u0026#39;, older_than =\u0026gt; INTERVAL \u0026#39;3 days\u0026#39;) i; step 3: proper indexing\n-- compound index for symbol + time queries CREATE INDEX CONCURRENTLY idx_options_flow_symbol_time ON options_flow (symbol, timestamp DESC); -- partial index for recent hot data CREATE INDEX CONCURRENTLY idx_options_flow_recent ON options_flow (timestamp DESC, symbol) WHERE timestamp \u0026gt; NOW() - INTERVAL \u0026#39;7 days\u0026#39;; the results # same query:\nbefore: 8.4 seconds\nafter: 0.12 seconds\n70x improvement.\ncompression ratio on old data: 12:1\ndisk usage dropped from 340GB to 89GB.\npython integration update # updated my ingestion pipeline to batch writes properly:\nimport asyncio from asyncpg import Pool from typing import List, Dict, Any class OptionsFlowIngester: def __init__(self, pool: Pool, batch_size: int = 5000): self.pool = pool self.batch_size = batch_size self.buffer: List[Dict[str, Any]] = [] async def ingest(self, record: Dict[str, Any]) -\u0026gt; None: self.buffer.append(record) if len(self.buffer) \u0026gt;= self.batch_size: await self._flush() async def _flush(self) -\u0026gt; None: if not self.buffer: return async with self.pool.acquire() as conn: await conn.executemany( \u0026#34;\u0026#34;\u0026#34; INSERT INTO options_flow (timestamp, symbol, strike, expiry, call_put, bid, ask, iv, delta, gamma, theta, vega, volume) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13) \u0026#34;\u0026#34;\u0026#34;, [(r[\u0026#39;ts\u0026#39;], r[\u0026#39;sym\u0026#39;], r[\u0026#39;strike\u0026#39;], r[\u0026#39;exp\u0026#39;], r[\u0026#39;cp\u0026#39;], r[\u0026#39;bid\u0026#39;], r[\u0026#39;ask\u0026#39;], r[\u0026#39;iv\u0026#39;], r[\u0026#39;d\u0026#39;], r[\u0026#39;g\u0026#39;], r[\u0026#39;t\u0026#39;], r[\u0026#39;v\u0026#39;], r[\u0026#39;vol\u0026#39;]) for r in self.buffer] ) self.buffer.clear() async def close(self) -\u0026gt; None: await self._flush() batching at 5000 rows instead of row-by-row.\ningestion throughput: 180k rows/second (was 12k).\nmonitoring # added grafana dashboard for chunk sizes and compression stats.\nset alerts for:\nchunk size \u0026gt; 25M rows compression ratio \u0026lt; 8:1 query latency p99 \u0026gt; 1 second lessons learned # timescaledb defaults are for general use cases, not high-volume trading data compress aggressively - old tick data rarely accessed at full resolution partial indexes on hot data are magic batch writes always, never row-by-row should\u0026rsquo;ve done this 6 months ago. been running suboptimal this whole time.\n2:14am friday. finally optimized timescaledb. 3M rows/day ingestion was crushing read performance. fixed with 1-day chunks, aggressive compression (12:1 ratio), and proper compound indexes. query time: 8.4s → 0.12s (70x faster). disk: 340GB → 89GB. batched writes now 180k rows/sec.\n-AK\n","date":"5 September 2025","externalUrl":null,"permalink":"/posts/2025-09-05-timescaledb-optimization-3-million-rows/","section":"Posts","summary":"\u003cp\u003ebeen putting this off for months.\u003c/p\u003e\n\u003cp\u003etimescaledb getting slow. finally fixed it.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe problem \n    \u003cdiv id=\"the-problem\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-problem\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003emy options flow data pipeline ingests about 3 million rows per day.\u003c/p\u003e","title":"timescaledb optimization - 3 million rows per day","type":"posts"},{"content":"first real trading days since vacation.\nvolatility already picking up. VIX hit 16.2 today.\ntime to adapt.\nthe seasonal shift # summer algo settings don\u0026rsquo;t work in fall.\nlearned this the hard way in 2023. lost $40k in september-october because I didn\u0026rsquo;t adjust.\nsummer mode (june-august):\nsmaller position sizes (0.5% risk per trade)\nwider stops (more noise in thin markets)\nlonger DTE options (theta grind)\navoid futures (whipsaw city)\nfall mode (september-november):\nnormal position sizes (1.0% risk per trade)\ntighter stops (cleaner price action)\nshorter DTE options (capture vol expansion)\nfutures back in play (trend days return)\nregime detection logic # been refining this for 2 years now.\ncore idea: use multiple volatility metrics to detect regime, not just VIX.\nimport numpy as np import pandas as pd from dataclasses import dataclass from typing import Literal @dataclass class RegimeState: regime: Literal[\u0026#39;low_vol\u0026#39;, \u0026#39;normal\u0026#39;, \u0026#39;high_vol\u0026#39;, \u0026#39;crisis\u0026#39;] confidence: float vix_level: float vol_of_vol: float correlation: float class RegimeDetector: def __init__(self, lookback: int = 20): self.lookback = lookback self.history = [] def calculate_vol_of_vol(self, vix_series: pd.Series) -\u0026gt; float: \u0026#34;\u0026#34;\u0026#34;volatility of volatility - key regime indicator\u0026#34;\u0026#34;\u0026#34; if len(vix_series) \u0026lt; self.lookback: return 0.0 returns = vix_series.pct_change().dropna() return returns.tail(self.lookback).std() * np.sqrt(252) def calculate_correlation(self, spy: pd.Series, qqq: pd.Series) -\u0026gt; float: \u0026#34;\u0026#34;\u0026#34;SPY/QQQ correlation - dispersion indicator\u0026#34;\u0026#34;\u0026#34; if len(spy) \u0026lt; self.lookback: return 1.0 spy_ret = spy.pct_change().dropna().tail(self.lookback) qqq_ret = qqq.pct_change().dropna().tail(self.lookback) return spy_ret.corr(qqq_ret) def detect(self, vix: float, vix_history: pd.Series, spy: pd.Series, qqq: pd.Series) -\u0026gt; RegimeState: vol_of_vol = self.calculate_vol_of_vol(vix_history) correlation = self.calculate_correlation(spy, qqq) # regime classification if vix \u0026lt; 14 and vol_of_vol \u0026lt; 0.8: regime = \u0026#39;low_vol\u0026#39; confidence = min(1.0, (14 - vix) / 4 + (0.8 - vol_of_vol)) elif vix \u0026gt; 25 or vol_of_vol \u0026gt; 1.5: regime = \u0026#39;high_vol\u0026#39; confidence = min(1.0, (vix - 25) / 10 + (vol_of_vol - 1.5)) elif vix \u0026gt; 35: regime = \u0026#39;crisis\u0026#39; confidence = 0.95 else: regime = \u0026#39;normal\u0026#39; confidence = 0.7 return RegimeState( regime=regime, confidence=confidence, vix_level=vix, vol_of_vol=vol_of_vol, correlation=correlation ) today\u0026rsquo;s detection # ran the detector on close.\nVIX: 16.2\nvol of vol: 0.92 (elevated from summer 0.6)\nSPY/QQQ correlation: 0.71 (normal)\ndetected regime: normal (transitioning from low_vol)\nconfidence: 0.68\nwhat this means for trading # regime shifted from \u0026rsquo;low_vol\u0026rsquo; to \u0026rsquo;normal'.\nactivating fall mode settings:\nposition size back to 1.0% risk DTE shortened to 14-21 days ES futures algo unpaused premium targets increased 15% community insight # been discussing seasonal adaptation on NexusFi lately. some traders there use much more complex regime models - multi-factor ML stuff.\nmine\u0026rsquo;s simple but works. 83% of the edge is just having a regime model at all.\ntomorrow # cpi data coming in 8 days. usually volatility ramps into number releases.\nwatching for vol expansion this week.\n2:38am wednesday. first real trading since vacation. volatility picking up - VIX 16.2, vol of vol elevated to 0.92. regime detector showing transition from low_vol to normal. activating fall mode: 1% position sizing, shorter DTE, futures back on.\n-AK\n","date":"3 September 2025","externalUrl":null,"permalink":"/posts/2025-09-03-fall-volatility-algo-adaptation/","section":"Posts","summary":"\u003cp\u003efirst real trading days since vacation.\u003c/p\u003e\n\u003cp\u003evolatility already picking up. VIX hit 16.2 today.\u003c/p\u003e\n\u003cp\u003etime to adapt.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe seasonal shift \n    \u003cdiv id=\"the-seasonal-shift\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-seasonal-shift\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003esummer algo settings don\u0026rsquo;t work in fall.\u003c/p\u003e","title":"fall volatility algo adaptation - regime detection update","type":"posts"},{"content":"markets closed.\nlabor day monday. first one as a married guy.\nthe plan for september # vacation clarity still hitting different.\nless FOMO. more patience.\naugust proved it - 14 trades at 86% win rate beats 22 trades at 80%.\nseptember setup # fall volatility usually picks up after labor day.\nVIX been sitting around 14-15 all summer.\nhistorically september is the worst month for stocks. mean return is negative.\nmeans more premium to sell. more movement to capture.\nwhat I\u0026rsquo;m watching # fomc meeting: september 16-17\ncpi: september 11\nppi: september 12\ntriple witching: september 19\nlots of catalysts.\nstrategy adjustments # options (60% allocation):\ntightening DTE on premium plays. 14-21 days instead of 30-45.\nwant to capture theta decay faster as vol picks up.\ncrypto (30% allocation):\nBTC holding 25k-27k range. watching for breakout either direction.\nmomentum algo ready to pounce.\nfutures (10% allocation):\nmight actually deploy ES algo this month. summer skip over.\nrealistic september targets # target: +1.8% to +2.2% ($8,700 to $10,600)\nseptember\u0026rsquo;s historically rough for stocks but good for volatility sellers.\nwill see.\n2:22pm labor day. markets closed. september begins. first month back from vacation mindset. watching for fall volatility pickup. fomc sept 16-17, triple witching sept 19. target +1.8-2.2%.\n-AK\n","date":"1 September 2025","externalUrl":null,"permalink":"/posts/2025-09-01-labor-day-september-begins/","section":"Posts","summary":"\u003cp\u003emarkets closed.\u003c/p\u003e\n\u003cp\u003elabor day monday. first one as a married guy.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe plan for september \n    \u003cdiv id=\"the-plan-for-september\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-plan-for-september\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003evacation clarity still hitting different.\u003c/p\u003e","title":"labor day - september begins","type":"posts"},{"content":"","date":"1 September 2025","externalUrl":null,"permalink":"/tags/markets/","section":"Tags","summary":"","title":"Markets","type":"tags"},{"content":"","date":"1 September 2025","externalUrl":null,"permalink":"/tags/september/","section":"Tags","summary":"","title":"September","type":"tags"},{"content":"","date":"1 September 2025","externalUrl":null,"permalink":"/categories/trading-updates/","section":"Categories","summary":"","title":"Trading Updates","type":"categories"},{"content":"august done.\nvacation month.\nlower gains. zero regrets.\naugust final numbers # starting (aug 1): $477,040\nending (aug 31): $482,100\naugust gain: +$5,060 (+1.06%)\ntrades: 14\nwins: 12\nlosses: 2\nwin rate: 86%\ntrading days: 13 (missed 8 days for cruise)\nFigure 1: August weekly performance showing vacation impact. Week 1 (Aug 1-8): +$1,380 pre-cruise. Week 2 (Aug 9-16): $0 (on cruise, fully flat). Week 3 (Aug 17-24): +$1,920 (back from cruise). Week 4 (Aug 25-31): +$1,760. Vacation week visible as flat period. Total +$5,060 (+1.06%). Lower than typical due to intentional 8-day break.\nweekly breakdown # week 1 (aug 1-8): +$1,380 (+0.29%), 100% wr, 4 trades - pre-cruise\nweek 2 (aug 9-16): $0 (0%), n/a, 0 trades - on cruise, flat\nweek 3 (aug 17-24): +$1,920 (+0.40%), 80% wr, 5 trades - post-cruise\nweek 4 (aug 25-31): +$1,760 (+0.37%), 80% wr, 5 trades - steady finish\n3 of 4 trading weeks profitable. week 2 intentionally flat.\ncomparing to target # august realistic outcomes (from july 31):\nnormal summer month: +1.5% to +2.0%\naugust actual: +1.06%\nresult: BELOW TARGET (vacation impact)\nexpected outcome. missed 8 trading days.\nmarket conditions august # avg VIX (trading days only): 14.9 (excellent)\navg correlation: 0.58 (excellent)\navg volume: 3.1M contracts (summer thin, improving late month)\nregime stability: 0.81 (very stable)\nconditions: ideal for my strategies - just wasn\u0026rsquo;t trading half the month.\nFigure 2: 2025 YTD performance through August. Monthly bars: Jan +$9,550, Feb +$8,920, Mar -$9,582, Apr +$9,732, May +$3,840, Jun +$9,180, Jul +$7,600, Aug +$5,060 (vacation month). Orange line shows cumulative YTD reaching +$44,300 (+10.20%). August dip due to 8-day cruise break. Still on track for 15-18% annual. 7 winning months, 1 losing month = 88% monthly win rate.\ntrade distribution # options: 12 trades, +$4,340 (86% of gains)\nSPX: 8 trades, +$3,100\nQQQ: 4 trades, +$1,240\ncrypto: 2 trades, +$720 (14% of gains)\nBTC: 2 trades, +$720\nfutures: 0 trades (summer skip)\nallocation: 86% options, 14% crypto\nFigure 3: August gains by instrument. SPX options dominated (+$3,100, 61% of total), followed by QQQ options (+$1,240, 25%), and BTC crypto (+$720, 14%). Lower total volume (14 trades vs typical 20+) reflects vacation week. Post-cruise trading showed more patience and selectivity.\nvacation analysis # what I missed:\n8 trading days (aug 9-16)\nestimated 6 signals\n~$2,000 potential gains\nwhat I gained:\nbest week of my life with A.\ncomplete mental reset\n6 new places on our list\ndeeper relationship\nfirst real vacation since parents died\nnet assessment: would make same choice again. every time.\ncircuit breaker performance # triggered: 0 times\nclose calls: 0\nlargest loss: -$420 (aug 20 Fed minutes)\ncapital preservation: excellent\nytd performance update # jan: +$9,550 (+2.18%)\nfeb: +$8,920 (+1.99%)\nmar: -$9,582 (-2.10%)\napr: +$9,732 (+2.18%)\nmay: +$3,840 (+0.84%)\njun: +$9,180 (+1.99%)\njul: +$7,600 (+1.62%)\naug: +$5,060 (+1.06%)\nytd total: +$44,300 (+10.20%)\nannual pace: 15.3%\nvs target: 15-18%\nprogress: in target range despite vacation month\nkelly sizing 3-month review # deployed: june 2\naugust results (14 trades):\nhigh-confidence setups (12 trades): 92% win rate\nmarginal setups (2 trades): 50% win rate\n3-month combined (60 trades):\nhigh-confidence: 92% win rate\nmarginal: 67% win rate\nvalidation continues. approach working.\npost-vacation trading changes # what\u0026rsquo;s different:\nmore patience. less FOMO.\nnot anxious about missing signals.\nquality over quantity mindset.\ntook 14 trades instead of typical 20+.\nwin rate improved (86% vs typical 83%).\nthe break reset something.\ncruise highlights recap # 7 nights southern caribbean on virgin voyages scarlet lady.\nadults only. suite with balcony.\nno wifi. no charts. no positions.\nbest food. incredible spa. theater every night.\nbalcony lovemaking under the stars.\nplaces list: 56 → 62\nA. says it was the best week of her life too.\nseptember preview # trading:\nsummer ending. volume returning.\nlabor day (sep 1) markets closed.\nfall volatility usually picks up.\nrealistic september outcomes:\nnormal month: +1.5% to +2.5%\ntarget: +1.8% to +2.2%\npersonal:\nsettling back into routine.\nalready talking about next vacation (december maybe).\ntonight (august 31, 11:48pm) # august done. +$5,060 (+1.06%) across 14 trades. 86% win rate. BELOW TARGET but intentional - took 8-day cruise vacation. missed ~$2k in gains. gained best week of my life with A. worth it. ytd +$44,300 (+10.20%), annual pace 15.3% (in target range). account $482,100. places list 62. trading differently now - more patient, less FOMO. september target +1.8-2.2%.\n11:48pm sunday. august wrap. vacation month. +$5,060 (+1.06%) below target but worth it. 7-night caribbean cruise with A. places list +6. missed $2k gains, gained best week ever. ytd +$44,300 (+10.20%), on pace for 15-18%. trading more patiently post-vacation. september target +1.8-2.2%.\n-AK\n","date":"31 August 2025","externalUrl":null,"permalink":"/posts/2025-08-31-august-wrap-vacation-month-lower-gains/","section":"Posts","summary":"\u003cp\u003eaugust done.\u003c/p\u003e\n\u003cp\u003evacation month.\u003c/p\u003e\n\u003cp\u003elower gains. zero regrets.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eaugust final numbers \n    \u003cdiv id=\"august-final-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#august-final-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (aug 1):\u003c/strong\u003e $477,040\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eending (aug 31):\u003c/strong\u003e $482,100\u003c/p\u003e","title":"august wrap - vacation month +1.06%, ytd +10.20%","type":"posts"},{"content":"","date":"27 August 2025","externalUrl":null,"permalink":"/tags/vacation/","section":"Tags","summary":"","title":"Vacation","type":"tags"},{"content":"took 8 days completely offline.\nfirst time since 2020.\nwhat I found was about managing algos during vacation.\nthe pre-vacation protocol # T-5 days: stop opening new positions \u0026gt;5 DTE\nT-3 days: close all winning positions \u0026gt;50% profit\nT-1 day: close everything, go completely flat\nwhy flat?\nconsidered leaving algos running.\ndecided against it.\ncan\u0026rsquo;t monitor = can\u0026rsquo;t manage.\nunexpected events happen. flash crashes. gap moves.\nwasn\u0026rsquo;t willing to risk it for vacation peace of mind.\nwhat I would do differently next time # option 1: the auto-flatten approach\nfrom datetime import datetime, timedelta from typing import Optional import asyncio class VacationManager: \u0026#34;\u0026#34;\u0026#34; Manages positions and trading during vacation periods \u0026#34;\u0026#34;\u0026#34; def __init__(self, broker_client, vacation_start: datetime, vacation_end: datetime): self.broker = broker_client self.vacation_start = vacation_start self.vacation_end = vacation_end self.pre_vacation_days = 3 self.emergency_flatten_enabled = True def is_pre_vacation_period(self) -\u0026gt; bool: \u0026#34;\u0026#34;\u0026#34;Check if we\u0026#39;re in pre-vacation wind-down\u0026#34;\u0026#34;\u0026#34; days_until = (self.vacation_start - datetime.now()).days return 0 \u0026lt; days_until \u0026lt;= self.pre_vacation_days def is_vacation_period(self) -\u0026gt; bool: \u0026#34;\u0026#34;\u0026#34;Check if currently on vacation\u0026#34;\u0026#34;\u0026#34; now = datetime.now() return self.vacation_start \u0026lt;= now \u0026lt;= self.vacation_end def get_max_dte_allowed(self) -\u0026gt; int: \u0026#34;\u0026#34;\u0026#34; Returns maximum DTE for new positions based on vacation proximity \u0026#34;\u0026#34;\u0026#34; if self.is_vacation_period(): return 0 # no new positions days_until = (self.vacation_start - datetime.now()).days if days_until \u0026lt;= 1: return 0 # no new positions elif days_until \u0026lt;= 3: return days_until - 1 # must expire before vacation elif days_until \u0026lt;= 7: return 5 # short-term only else: return 45 # normal max DTE def should_close_position(self, position: dict) -\u0026gt; dict: \u0026#34;\u0026#34;\u0026#34; Determine if position should be closed for vacation \u0026#34;\u0026#34;\u0026#34; days_until = (self.vacation_start - datetime.now()).days expiry = position.get(\u0026#39;expiration_date\u0026#39;) pnl_pct = position.get(\u0026#39;unrealized_pnl_pct\u0026#39;, 0) # T-5: Close winners \u0026gt;50% if days_until \u0026lt;= 5 and pnl_pct \u0026gt; 0.5: return {\u0026#39;close\u0026#39;: True, \u0026#39;reason\u0026#39;: \u0026#39;pre_vacation_profit_take\u0026#39;} # T-3: Close all profitable if days_until \u0026lt;= 3 and pnl_pct \u0026gt; 0: return {\u0026#39;close\u0026#39;: True, \u0026#39;reason\u0026#39;: \u0026#39;pre_vacation_flatten\u0026#39;} # T-1: Close everything if days_until \u0026lt;= 1: return {\u0026#39;close\u0026#39;: True, \u0026#39;reason\u0026#39;: \u0026#39;vacation_start\u0026#39;} # Position expires during vacation if expiry and self.vacation_start \u0026lt;= expiry \u0026lt;= self.vacation_end: return {\u0026#39;close\u0026#39;: True, \u0026#39;reason\u0026#39;: \u0026#39;expires_during_vacation\u0026#39;} return {\u0026#39;close\u0026#39;: False, \u0026#39;reason\u0026#39;: None} async def run_vacation_protocol(self): \u0026#34;\u0026#34;\u0026#34; Execute vacation position management \u0026#34;\u0026#34;\u0026#34; positions = await self.broker.get_positions() for position in positions: decision = self.should_close_position(position) if decision[\u0026#39;close\u0026#39;]: print(f\u0026#34;Closing {position[\u0026#39;symbol\u0026#39;]}: {decision[\u0026#39;reason\u0026#39;]}\u0026#34;) await self.broker.close_position(position[\u0026#39;id\u0026#39;]) # Disable new trades during vacation if self.is_vacation_period(): await self.broker.set_trading_enabled(False) class EmergencyFlatten: \u0026#34;\u0026#34;\u0026#34; Emergency position closer if things go wrong during vacation Can be triggered remotely via simple webhook \u0026#34;\u0026#34;\u0026#34; def __init__(self, broker_client): self.broker = broker_client self.flatten_triggered = False async def flatten_all(self, reason: str = \u0026#34;emergency\u0026#34;): \u0026#34;\u0026#34;\u0026#34; Close all positions immediately \u0026#34;\u0026#34;\u0026#34; if self.flatten_triggered: return {\u0026#39;status\u0026#39;: \u0026#39;already_triggered\u0026#39;} positions = await self.broker.get_positions() closed = [] for position in positions: try: await self.broker.close_position( position[\u0026#39;id\u0026#39;], order_type=\u0026#39;market\u0026#39; # immediate execution ) closed.append(position[\u0026#39;symbol\u0026#39;]) except Exception as e: print(f\u0026#34;Failed to close {position[\u0026#39;symbol\u0026#39;]}: {e}\u0026#34;) self.flatten_triggered = True return { \u0026#39;status\u0026#39;: \u0026#39;flattened\u0026#39;, \u0026#39;positions_closed\u0026#39;: len(closed), \u0026#39;symbols\u0026#39;: closed, \u0026#39;reason\u0026#39;: reason } option 2: reduced exposure approach\ninstead of fully flat, could run at 20% normal size.\nsmaller positions = smaller potential losses.\nstill capture some gains.\nmy choice: went fully flat. peace of mind \u0026gt; potential gains.\nthe cost-benefit analysis # what I gave up:\n~$2,000 in estimated missed gains\n8 trading days of compounding\nwhat I gained:\ncomplete mental break\nzero trading stress\nbest week with A. ever\nrelationship investment\nposition sizing for vacations # normal month:\n0.5% account risk per trade\npre-vacation (T-5 to T-3):\n0.25% account risk (half size)\nonly high-confidence setups\npre-vacation (T-2 to T-1):\nno new positions\nclose everything\nduring vacation:\n0% (completely flat)\ncommunication protocol # before leaving:\ntold my broker contact I\u0026rsquo;d be unreachable\nset up email auto-responder\ndisabled trading alerts (no point getting notifications I can\u0026rsquo;t act on)\nemergency only:\ngave A. the broker phone number\n\u0026ldquo;only call them if the world is ending\u0026rdquo;\nshe never needed to.\nthe mental shift # before vacation:\nchecking charts 10+ times daily\nanxious about missing moves\ncouldn\u0026rsquo;t imagine 8 days away\nafter vacation:\nrealized markets don\u0026rsquo;t need me watching\nmy edge persists without constant monitoring\nbreaks are sustainable and healthy\nimplementing for future trips # already planning next vacation:\nmaybe december. maybe january.\nwill use same protocol.\nflat before leaving.\nno wifi package.\ncomplete disconnect.\nthe best part # came back and markets were fine.\ndidn\u0026rsquo;t crash. didn\u0026rsquo;t moon.\njust normal price action.\nall that anxiety about missing things was unfounded.\ntonight # vacation algo management learnings. flat before leaving worked. missed ~$2k, worth it. pre-vacation protocol: T-5 stop new long DTE, T-3 close profitable, T-1 flatten everything. emergency webhook available but never used. mental shift: markets don\u0026rsquo;t need me watching constantly.\n2:38am wednesday. vacation algo management post. went flat for 8 days. missed ~$2k. worth every penny for mental break. protocol documented for future trips. key insight: markets don\u0026rsquo;t need constant monitoring. will do this again.\n-AK\n","date":"27 August 2025","externalUrl":null,"permalink":"/posts/2025-08-27-vacation-algo-management-lessons/","section":"Posts","summary":"\u003cp\u003etook 8 days completely offline.\u003c/p\u003e\n\u003cp\u003efirst time since 2020.\u003c/p\u003e\n\u003cp\u003ewhat I found was about managing algos during vacation.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe pre-vacation protocol \n    \u003cdiv id=\"the-pre-vacation-protocol\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-pre-vacation-protocol\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eT-5 days:\u003c/strong\u003e stop opening new positions \u0026gt;5 DTE\u003c/p\u003e","title":"vacation algo management - what i learned from 8 days offline","type":"posts"},{"content":"first full week back.\neasing into it.\nfeels different after the break.\nweek 3 numbers # starting (aug 18): $478,420\nending (aug 24): $480,340\nweek gain: +$1,920 (+0.40%)\ntrades: 5\nwins: 4\nlosses: 1\nwin rate: 80%\ntrade breakdown # options (4 trades): +$1,640\nSPX: 3 trades, +$1,280\nQQQ: 1 trade, +$360\ncrypto (1 trade): +$280\nBTC: 1 trade, +$280 (caught momentum from cruise week)\nthe loss # wednesday aug 20:\nSPX call spread\nmarket reversed on Fed minutes release closed at 130% loss damage: -$420 note:\nfirst loss in 3 weeks. still rust-free mostly.\nkept it small.\nconditions # avg VIX: 14.8 (calm summer finish)\nvolume: 3.0M contracts (thin but workable)\nregime: stable low vol\nend of summer malaise.\npost-vacation observations # trading differently:\nless anxious about missing moves.\nmore patient waiting for setups.\nthe break reset something.\nwhat the cruise taught me:\nI don\u0026rsquo;t need to trade every signal.\nmissing $2k during vacation didn\u0026rsquo;t matter.\nquality over quantity matters more now.\naccount status # current: $480,340\nytd: +$42,540 (+9.88%)\naugust: +$3,300 (+0.69%)\nvs target: below pace (+1.5% to +2.0% target)\nvacation week means lower monthly gains. expected.\nweek 4 expectations # last week of august.\ntarget: +$1,500 to +$2,000\nneed +$4k more to hit 1.5% for month.\nrealistic: probably end around +1.0% to +1.2% due to vacation.\ntonight # week 3 august complete. +$1,920 (+0.40%) across 5 trades. 80% win rate. one loss (-$420 on Fed minutes). first full week back from cruise. trading differently - more patient, less anxious. account $480,340, ytd +9.88%. august will be lower month due to vacation week.\n2:24am sunday. week 3 august review. +$1,920 across 5 trades, 80% win rate. first full week post-cruise. trading with more patience now. break reset something. account $480,340, ytd +9.88%.\n-AK\n","date":"24 August 2025","externalUrl":null,"permalink":"/posts/2025-08-24-week-3-august-review-back-to-trading/","section":"Posts","summary":"\u003cp\u003efirst full week back.\u003c/p\u003e\n\u003cp\u003eeasing into it.\u003c/p\u003e\n\u003cp\u003efeels different after the break.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 3 numbers \n    \u003cdiv id=\"week-3-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-3-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (aug 18):\u003c/strong\u003e $478,420\u003c/p\u003e","title":"week 3 august review - back to trading post-vacation","type":"posts"},{"content":"finally looked at charts.\nmarkets didn\u0026rsquo;t care that I was gone.\nwhat happened aug 9-16 # SPX: opened 5,482, closed 5,519 (+0.67%)\nQQQ: opened 472.30, closed 478.80 (+1.38%)\nVIX: ranged 14.2 to 15.8, ended at 14.9\nBTC: 64,200 → 66,800 (+4.0%)\nbasically a quiet, slightly bullish week.\nnothing dramatic.\nwhat I would have traded # ran my signals retroactively.\nsignals generated: 6\nestimated gains if traded: +$1,800 to +$2,400\nwhat I actually made: $0 (was on cruise)\ndo I regret it? # no.\nmissed maybe $2k in gains.\ngained the best week of my life with A.\nnot even close.\nwould make that trade every time.\nthe realization # first extended break since starting algo trading in 2020.\n5 years of never more than 2 days away from charts.\nwhat I learned:\nmarkets don\u0026rsquo;t need me watching them.\nmy edge doesn\u0026rsquo;t disappear in a week.\ntaking breaks is sustainable.\naccount status # current: $478,420 (unchanged - was flat)\nytd: +$40,620 (+9.44%)\naugust: +$1,380 (+0.29%)\nmissed opportunity cost: ~$2,000\nmental health gained: priceless (I know, I know)\nrestarting tomorrow # will reopen positions tuesday.\nease back in. don\u0026rsquo;t force trades.\nmarket\u0026rsquo;s been quiet. should stay that way through end of august.\ntonight # caught up on a week of price action. missed maybe $2k in gains. worth it. markets didn\u0026rsquo;t implode without me watching. first real break in 5 years. will start trading again tomorrow. account $478,420.\n2:34am monday. market catchup post-cruise. SPX +0.67%, QQQ +1.38%, BTC +4%. missed ~$2k in signals. don\u0026rsquo;t care. best week of my life with A. was worth way more than $2k.\n-AK\n","date":"18 August 2025","externalUrl":null,"permalink":"/posts/2025-08-18-market-catchup-week-missed/","section":"Posts","summary":"\u003cp\u003efinally looked at charts.\u003c/p\u003e\n\u003cp\u003emarkets didn\u0026rsquo;t care that I was gone.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ewhat happened aug 9-16 \n    \u003cdiv id=\"what-happened-aug-9-16\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#what-happened-aug-9-16\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eSPX:\u003c/strong\u003e opened 5,482, closed 5,519 (+0.67%)\u003c/p\u003e","title":"market catchup - what i missed during 8 days offline","type":"posts"},{"content":"back.\nthat was incredible.\nbest week of my life.\nthe ship # virgin voyages scarlet lady is something else.\nno kids. anywhere. the whole ship is adults-only.\nour suite had this massive balcony overlooking the ocean.\nwoke up every morning to nothing but water and sky.\nthe food # ate at a different restaurant every night.\nthe korean bbq place. the mexican spot. the test kitchen (experimental tasting menu).\npink agave had these incredible tacos and mezcal cocktails.\nrazzle dazzle was plant-forward but actually delicious.\nextra virgin (italian) - A. loved the pasta.\nwe never repeated a restaurant in 7 nights.\nthe drinks # so many fruity cocktails.\nI lost count of the rum punches and piña coladas.\nA. discovered she loves espresso martinis.\nwe\u0026rsquo;d sit on the pool deck, drinks in hand, doing absolutely nothing.\nthe spa # this was A.\u0026rsquo;s favorite part.\nwe did couples massages twice.\nshe did solo treatments three more times.\nI did a few extra sessions myself. deep tissue work on my shoulders from hunching over screens. walked out completely loose.\nthe ports # puerto plata (dominican republic):\nexplored the old town. bought A. a local painting she loved.\nbeach day. crystal clear water.\nst. croix (us virgin islands):\nsnorkeling. saw actual sea turtles.\nA. screamed underwater when one swam past her. I could hear it through my snorkel.\nbimini (bahamas):\ntheir private beach club is ridiculous.\nbasically a resort just for cruise guests.\nswim-up bar. cabanas. pristine sand.\nthe theater # show every night.\nnot cheesy cruise entertainment - actually good productions.\none was this acrobatic circus thing. another was a full musical.\nwe never missed a show. became our nightly date after dinner.\nformal nights # two formal nights during the week.\nA. in this black dress that I\u0026rsquo;d never seen before.\n\u0026ldquo;bought it for this trip. surprise.\u0026rdquo;\ngod she looked good.\nI wore an actual suit. first time since our wedding.\nfelt like a different life for a few hours.\ndancing after dinner. holding her close.\nshe whispered \u0026ldquo;I can\u0026rsquo;t believe you planned this.\u0026rdquo;\nthe balcony # our suite balcony became our private space.\nmorning coffee watching the sunrise.\nafternoon reading while the ship cruised.\nand at night\u0026hellip;\nwe made love on that balcony more than once.\nocean air, stars overhead, just us.\nno one could see us. no one could hear us.\nshe\u0026rsquo;d grip the railing while I took her from behind.\nor we\u0026rsquo;d lie on the lounge chair, her on top, taking her time.\nsomething about being out there, open ocean, completely alone.\nshe came harder than I\u0026rsquo;ve ever seen. body shaking. couldn\u0026rsquo;t be quiet.\ndidn\u0026rsquo;t care. no neighbors. just the waves.\nno internet # didn\u0026rsquo;t buy the wifi package intentionally.\n8 days with no charts. no positions. no market news.\nfirst time since 2020 I\u0026rsquo;ve gone more than 2 days without checking something trading-related.\nat first it felt weird. kept reaching for my phone.\nby day 3, I stopped caring.\nby day 5, I forgot what my P\u0026amp;L even was.\nthe realization:\nthe world doesn\u0026rsquo;t end when I disconnect.\nthe market will be there when I get back.\nI needed this break more than I knew.\nwhat we learned # about each other:\nA. is really into snorkeling. who knew.\nI actually can relax. who knew.\nwe travel well together. no friction.\nabout us:\nwe\u0026rsquo;re good at just being. no agenda, no schedule.\ncomfortable silence works on vacation too.\nwe laughed more this week than in months.\nabout the relationship:\nthis trip proved we made the right choice.\nmarriage isn\u0026rsquo;t just the hard parts.\nit\u0026rsquo;s also this. adventures together. memories we\u0026rsquo;ll have forever.\nthe weight lifted # remember the provider weight I wrote about?\nstill there. but different now.\nproviding isn\u0026rsquo;t just about money and security.\nit\u0026rsquo;s also about moments like this.\nwatching her face when we pulled into port.\nhearing her laugh at the pool deck bar.\nfeeling her body against mine on the balcony.\nthis is what I\u0026rsquo;m providing. this life. these experiences.\nthe weight doesn\u0026rsquo;t feel heavy anymore.\nplaces list update # 56 → 62\nsuite balcony (multiple times, different ways) ship pool deck (late night, no one around) spa private room (after couples massage) beach cabana bimini (risky, almost caught) our cabin shower (technically mundane but the motion of the ocean\u0026hellip;) 6 new places in 7 days. personal record.\ntonight # back in san diego. unpacked. laundry started.\nhaven\u0026rsquo;t checked markets yet. will look tomorrow.\nfor tonight, just wanted to write this down.\nbest week of my life.\n11:52pm sunday. back from cruise. virgin voyages scarlet lady. 7 nights southern caribbean. no wifi, no trading, total disconnect. best food, drinks, spa, theater. made love on our balcony under the stars. places list +6. best week of my life.\n-AK\n","date":"17 August 2025","externalUrl":null,"permalink":"/posts/2025-08-17-back-from-cruise-best-week-of-my-life/","section":"Posts","summary":"\u003cp\u003eback.\u003c/p\u003e\n\u003cp\u003ethat was incredible.\u003c/p\u003e\n\u003cp\u003ebest week of my life.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe ship \n    \u003cdiv id=\"the-ship\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-ship\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003evirgin voyages scarlet lady is something else.\u003c/p\u003e","title":"back from cruise - best week of my life","type":"posts"},{"content":"","date":"17 August 2025","externalUrl":null,"permalink":"/tags/cruise/","section":"Tags","summary":"","title":"Cruise","type":"tags"},{"content":"told A. tonight.\nher face.\nworth every dollar.\nthe setup # been planning this for two months.\n7-night southern caribbean cruise.\nvirgin voyages - scarlet lady.\nthe adults-only line. no kids anywhere on the ship.\nleaving miami saturday morning.\nthe reveal # made dinner tonight. badly. she laughed.\n\u0026ldquo;okay what\u0026rsquo;s going on. you never cook.\u0026rdquo;\nhanded her an envelope.\nboarding passes. cruise itinerary. suite confirmation.\nher eyes went wide.\n\u0026ldquo;we leave in two days?\u0026rdquo;\nyes.\n\u0026ldquo;for a week?\u0026rdquo;\nyes.\n\u0026ldquo;on a cruise ship?\u0026rdquo;\nnot just any cruise ship. one of the newest. adults only. we have a suite with a balcony.\nshe tackled me onto the couch.\nwhat I booked # virgin voyages - scarlet lady\nlaunched 2021, one of their newest ships adults only (18+, no exceptions) suite with balcony (seriously splurged) all the fancy restaurants included spa package with multiple massages itinerary:\nday 1: miami departure day 2: at sea day 3: puerto plata, dominican republic day 4: at sea day 5: st. croix, us virgin islands day 6: at sea day 7: bimini beach club, bahamas day 8: miami return why this matters # first real vacation:\nsince parents died, I haven\u0026rsquo;t stopped.\ntraded through grief. coded through loneliness.\nnever took a real break.\ntotal disconnect:\ndidn\u0026rsquo;t buy the wifi package.\nno internet. no charts. no positions.\ncan\u0026rsquo;t check anything even if I wanted to.\n8 days completely unplugged.\nfor us:\nwe\u0026rsquo;ve never traveled together.\nnever been on a plane together. never left california together.\nthis is huge for us.\nher reaction (continued) # after the initial tackle.\n\u0026ldquo;you planned this without telling me anything?\u0026rdquo;\ncleared your work calendar. told your boss you\u0026rsquo;re taking PTO.\n\u0026ldquo;you talked to my BOSS?\u0026rdquo;\nhad to. couldn\u0026rsquo;t surprise you if you had meetings scheduled.\nshe was half-annoyed, half-impressed.\n\u0026ldquo;I have nothing to wear for a cruise.\u0026rdquo;\nwe\u0026rsquo;re going shopping tomorrow. pack friday. fly to miami friday night.\nshe started listing things she needed. then stopped.\nlooked at me.\n\u0026ldquo;thank you. for thinking of this. for planning it.\u0026rdquo;\nyou deserve it. we both do.\ntonight # packing lists. shopping plans. she\u0026rsquo;s vibrating with excitement.\nhaven\u0026rsquo;t seen her this happy since the wedding.\nthis is what the money is for. not sitting in accounts. moments like this.\npositions status # closed everything today.\ntook small profits on remaining positions.\naccount completely flat.\nno open trades. no exposure.\nwon\u0026rsquo;t look at a chart for 8 days.\nlast post for a while # this is it until august 17th.\nno wifi on the ship. intentionally.\nsee you on the other side.\n11:48pm thursday. told A. about the cruise. 7 nights southern caribbean on virgin voyages scarlet lady. suite with balcony. adults only. no wifi package - total disconnect. she tackled me. we\u0026rsquo;re packing tomorrow. this is what the money is for.\n-AK\n","date":"7 August 2025","externalUrl":null,"permalink":"/posts/2025-08-07-surprise-reveal-caribbean-cruise/","section":"Posts","summary":"\u003cp\u003etold A. tonight.\u003c/p\u003e\n\u003cp\u003eher face.\u003c/p\u003e\n\u003cp\u003eworth every dollar.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe setup \n    \u003cdiv id=\"the-setup\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-setup\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003ebeen planning this for two months.\u003c/p\u003e\n\u003cp\u003e7-night southern caribbean cruise.\u003c/p\u003e","title":"the surprise reveal - 7 nights southern caribbean","type":"posts"},{"content":"week 1 done.\nshort trading week.\npreparing for complete disconnect next week.\nweek 1 numbers # starting (aug 1): $477,040\nending (aug 3): $478,420\nweek gain: +$1,380 (+0.29%)\ntrades: 4\nwins: 4\nlosses: 0\nwin rate: 100%\ntrade breakdown # options (4 trades): +$1,380\nSPX: 2 trades, +$920\nQQQ: 2 trades, +$460\ncrypto: 0 trades (preparing to flatten)\nconditions # avg VIX: 15.0 (excellent)\nvolume: 3.1M contracts (summer steady)\nregime: stable low vol\nperfect conditions for modest gains.\nflattening for vacation # current positions: 2 (both expiring this week)\ntarget by friday aug 8: completely flat\nreason: going offline for 8 days\nno monitoring = no open risk.\nthe plan # leaving saturday aug 9.\nback saturday aug 16.\n8 days completely offline.\nno trading. no coding. no charts.\nfirst real vacation since parents died.\nA. doesn\u0026rsquo;t know yet. telling her thursday.\naccount status # current: $478,420\nytd: +$40,620 (+9.44%)\naugust: +$1,380 (+0.29%)\nonly one more trading week before break.\ntonight # week 1 august complete. +$1,380 (+0.29%) across 4 trades. 100% win rate. flattening positions for 8-day vacation. A. doesn\u0026rsquo;t know yet - surprise reveal thursday. first real disconnect since starting trading.\n2:22am sunday. week 1 august review. +$1,380 across 4 trades, all winners. preparing to go completely flat for vacation. big surprise for A. coming thursday.\n-AK\n","date":"3 August 2025","externalUrl":null,"permalink":"/posts/2025-08-03-week-1-august-review-short-week/","section":"Posts","summary":"\u003cp\u003eweek 1 done.\u003c/p\u003e\n\u003cp\u003eshort trading week.\u003c/p\u003e\n\u003cp\u003epreparing for complete disconnect next week.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 1 numbers \n    \u003cdiv id=\"week-1-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-1-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (aug 1):\u003c/strong\u003e $477,040\u003c/p\u003e","title":"week 1 august review - short week, preparing for offline","type":"posts"},{"content":"","date":"1 August 2025","externalUrl":null,"permalink":"/tags/summer/","section":"Tags","summary":"","title":"Summer","type":"tags"},{"content":"august starts.\nfinal summer month.\nhave a surprise planned for A. this month.\naugust 1 setup # account: $477,040\nytd: +$39,240 (+9.12%)\ntarget this month: +1.5% to +2.0% (+$7.2k to $9.5k)\nconditions:\nVIX at 15.2. normalized post-earnings.\nvolume still summer thin but improving.\ntoday\u0026rsquo;s action # opened:\n1 SPX put credit spread\nsold 5450 put @ $1.95 bought 5440 put @ $1.30 net credit: $0.65 max loss: $935 7 DTE prob OTM: 79% 1 QQQ iron condor\nsmall position, testing vol normalization net credit: $0.42 10 DTE regime status # current regime: low-medium vol (VIX 15.2)\npost-earnings: volatility declining as expected\noutlook: should stay 14-17 range through august\nthe surprise # planning something big for A. next week.\nwon\u0026rsquo;t say what yet.\nbut I\u0026rsquo;ll be offline for a while.\nfirst real vacation since\u0026hellip; actually first real vacation ever as an adult.\nweek expectations # trading days this week: 4 (friday normal close)\nnext week: will be completely offline\nneed to close all positions by friday aug 8.\nno open trades during vacation.\ntonight # august 1. final summer month begins. opened 1 SPX spread ($65 credit) and 1 QQQ iron condor ($42 credit). VIX 15.2, post-earnings normalization. planning surprise vacation for A. next week - will be completely offline. need to flatten everything by aug 8.\n2:18am friday. august starts. opened 2 positions ($107 total credits). VIX normalizing. big surprise for A. coming next week. first real vacation.\n-AK\n","date":"1 August 2025","externalUrl":null,"permalink":"/posts/2025-08-01-week-1-august-final-summer-month/","section":"Posts","summary":"\u003cp\u003eaugust starts.\u003c/p\u003e\n\u003cp\u003efinal summer month.\u003c/p\u003e\n\u003cp\u003ehave a surprise planned for A. this month.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eaugust 1 setup \n    \u003cdiv id=\"august-1-setup\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#august-1-setup\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eaccount:\u003c/strong\u003e $477,040\u003c/p\u003e","title":"week 1 august - final summer month begins","type":"posts"},{"content":"july done.\ntarget hit.\nsecond married month complete.\njuly final numbers # starting (jul 1): $469,440\nending (jul 31): $477,040\njuly gain: +$7,600 (+1.62%)\ntrades: 20\nwins: 18\nlosses: 2\nwin rate: 90%\ntrading days: 21\nFigure 1: July weekly performance showing conservative summer approach. Week 1: +$1,240 (holiday week), Week 2: +$2,260 (volume recovery), Week 3: +$1,980 (pre-earnings steady), Week 4: +$1,800 (earnings survival), Final days: +$320. All weeks profitable. Conservative sizing throughout. Total +$7,600 (+1.62%).\nweekly breakdown # week 1 (jul 1-6): +$1,240 (+0.26%), 100% wr, 3 trades - holiday week\nweek 2 (jul 7-13): +$2,260 (+0.48%), 86% wr, 7 trades - volume recovered\nweek 3 (jul 14-20): +$1,980 (+0.42%), 83% wr, 6 trades - pre-earnings\nweek 4 (jul 21-27): +$1,800 (+0.38%), 100% wr, 4 trades - earnings survival\nfinal days (jul 28-31): +$320 (+0.07%), 100% wr, 0 new trades - let winners ride\nall 5 periods profitable.\ncomparing to target # july realistic outcomes (from june 30):\nnormal summer month: +1.0% to +2.0%\ntarget: +1.5% to +1.8%\njuly actual: +1.62%\nresult: TARGET HIT (mid-range)\nsummer months continue to perform within expectations.\nmarket conditions july # avg VIX: 15.6 (summer baseline with earnings spike)\navg correlation: 0.62 (manageable)\navg volume: 3.4M contracts (typical summer + earnings spike)\navg regime stability: 0.72 (good, some earnings disruption)\nslippage: 2.0 ticks average (normalized)\nconditions: typical summer with earnings event\nFigure 2: 2025 YTD performance through July. Monthly bars: Jan +$9,550, Feb +$8,920, Mar -$9,582 (losing month), Apr +$9,732, May +$3,840 (wedding pause), Jun +$9,180, Jul +$7,600 (summer conservative). Orange line shows cumulative YTD reaching +$39,240 (+9.12%). Pattern: 6 winning months, 1 losing month = 86% monthly win rate. On track for 15-18% annual target. Sustained conservative approach through summer paying off.\ntrade distribution # options: 18 trades, +$6,560 (86% of gains)\nSPX: 11 trades, +$4,340\nQQQ: 7 trades, +$2,220\ncrypto: 2 trades, +$1,040 (14% of gains)\nBTC: 2 trades, +$1,040\nfutures: 0 trades (summer skip continues)\nallocation: 86% options, 14% crypto\nFigure 3: July gains by instrument. SPX options dominated (+$4,340, 57% of total), followed by QQQ options (+$2,220, 29%), and BTC crypto (+$1,040, 14%). No ETH or futures trades. Conservative crypto allocation (14% vs 17% june) reflects summer thin volume caution. Options remain core driver. Earnings week pause visible in reduced QQQ trades.\nearnings week analysis # conservative approach paid off:\npre-earnings (jul 21): reduced to 60% sizing\nearnings days (jul 22-24): reduced to 30% sizing\npost-earnings (jul 25-31): gradual return to 80%\nwhat was avoided:\nwednesday gap down (GOOGL/TSLA reaction): would have lost ~$1,200\nthursday whipsaw (META): would have lost ~$600\nnet benefit: +$1,800 safe gains vs potential -$1,800\nconservative approach turned potential -$0 week into +$1,800 week.\ncircuit breaker performance # triggered: 0 times\nclose calls: 1 time (wednesday post-GOOGL, 65% of threshold)\nlargest loss: -$380 (jul 9 CPI spike)\ncapital preservation: excellent\nytd performance update # jan: +$9,550 (+2.18%)\nfeb: +$8,920 (+1.99%)\nmar: -$9,582 (-2.10%)\napr: +$9,732 (+2.18%)\nmay: +$3,840 (+0.84%)\njun: +$9,180 (+1.99%)\njul: +$7,600 (+1.62%)\nytd total: +$39,240 (+9.12%)\nannual pace: 15.6%\nvs target: 15-18%\nprogress: in target range, sustainable pace\nkelly sizing 2-month review # deployed: june 2\njuly results (20 trades):\nhigh-confidence setups (16 trades): 94% win rate, avg +$410\nmarginal setups (4 trades): 75% win rate, avg +$180\n2-month combined (46 trades):\nhigh-confidence: 93% win rate\nmarginal: 73% win rate\nvalidation: approach working. continuing into august.\nlessons from july # 1. earnings adaptation works\nconservative sizing around announcements prevented losses.\nworth the reduced gains.\n2. summer volume requires patience\nfewer trades but higher quality.\n90% win rate proves selectivity pays.\n3. crypto timing matters\nonly 2 BTC trades but both winners.\nwaiting for clear setups in thin volume works.\n4. holiday weeks are fine\nweek 1 (holiday) was smallest gains but positive.\nno need to force trades in short weeks.\nlife update - turning 22, second married month # birthday (jul 4):\nsailboat sunset cruise. mister A\u0026rsquo;s dinner. perfect.\nplaces list: 56 (added 2 in july)\nrelationship:\nfeeling the provider weight differently now.\nmore careful. more disciplined.\nA. notices the steadiness, doesn\u0026rsquo;t know the why.\nlove her deeper than honeymoon phase.\ndr. r observation:\n\u0026ldquo;provider consciousness making you a better trader.\u0026rdquo;\napparently the weight is working for me.\naugust preview # trading:\nsummer mode final month.\nearnings season winding down.\nvolume should normalize.\nrealistic august outcomes:\nnormal summer month: +1.0% to +2.0%\ntarget: +1.5% to +2.0%\npersonal:\nno major events planned.\nroutine month.\ntonight (july 31, 11:52pm) # july done. +$7,600 (+1.62%) across 20 trades. 90% win rate. TARGET HIT. all 5 periods profitable. options +$6,560 (86%), crypto +$1,040 (14%). earnings adaptation worked - avoided ~$1,800 potential loss. ytd +$39,240 (+9.12%), annual pace 15.6% (in target range). account $477,040. turned 22, second married month complete. august target +1.5-2.0%.\n11:52pm thursday. july wrap. +$7,600 (+1.62%) target hit. 20 trades, 90% win rate. earnings week adaptation key - conservative sizing avoided major losses. ytd +$39,240 (+9.12%), on pace for 15-18% annual target. account $477,040. birthday was perfect, marriage deepening. august target +1.5-2.0%.\n-AK\n","date":"31 July 2025","externalUrl":null,"permalink":"/posts/2025-07-31-july-wrap-summer-month-target-hit/","section":"Posts","summary":"\u003cp\u003ejuly done.\u003c/p\u003e\n\u003cp\u003etarget hit.\u003c/p\u003e\n\u003cp\u003esecond married month complete.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ejuly final numbers \n    \u003cdiv id=\"july-final-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#july-final-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (jul 1):\u003c/strong\u003e $469,440\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eending (jul 31):\u003c/strong\u003e $477,040\u003c/p\u003e","title":"july wrap - summer month target hit +1.62%, ytd +9.12%","type":"posts"},{"content":"week 4 done.\nearnings week survived.\nconservative approach paid off.\nweek 4 numbers # starting (jul 21): $474,920\nending (jul 27): $476,720\nweek gain: +$1,800 (+0.38%)\ntrades: 4\nwins: 4\nlosses: 0\nwin rate: 100%\ntrade breakdown # options (4 trades): +$1,800\nSPX: 2 trades, +$1,080\nnon-tech plays only\ncrypto (0 trades): $0\npaused crypto during earnings chaos\nearnings week adaptation results # GOOGL/TSLA tuesday:\nmarket gapped down 1.2% wednesday morning.\nwould have been stopped on 3 normal positions.\nran 0 positions. avoided $1,200+ potential loss.\nMETA thursday:\nbeat expectations. market rallied.\nmy conservative sizing = smaller gains but protected downside.\nnet result:\nreduced exposure = reduced gains but zero losses.\nweek 4 the slowest of july but cleanest.\nconditions # avg VIX: 17.2 (elevated from earnings)\nvolume: 4.1M contracts (earnings-driven spike)\nslippage: 1.8 ticks (good liquidity from volume)\nregime: transitioned to medium vol (VIX 15-20 range)\nconservative wins # what worked:\npaused trading tuesday afternoon through wednesday morning avoided QQQ entirely (too correlated to earnings names) focused on SPX only with 60% position sizes wider stops prevented early exits what could\u0026rsquo;ve been better:\nmissed thursday rally (was too conservative post-META) could have run 1 crypto trade friday (missed BTC move) overall: protection \u0026gt; optimization during earnings.\naccount status # current: $476,720\nytd: +$38,920 (+8.87%)\njuly: +$7,280 (+1.55%)\nvs target: hit range (target +1.5% to +1.8%)\njuly target achieved with 3 trading days remaining.\nrest of july expectations # monday-wednesday (jul 28-30):\npost-earnings normalization.\nVIX should decline toward 15.\nmay run 2-3 more trades if conditions stabilize.\ntarget: +$500 to +$1,000 (conservative finish)\ntonight # week 4 july complete. +$1,800 (+0.38%) across 4 trades. 100% win rate. earnings adaptation worked - avoided potential $1,200 loss by staying flat tuesday-wednesday. slowest week but cleanest. account $476,720, ytd +8.87%. july at +1.55%, target hit.\n2:16am sunday. week 4 july review. earnings week survived. +$1,800 across 4 trades, all winners. conservative adaptation avoided major losses. paused crypto entirely. july target hit (+1.55%). account $476,720, ytd +8.87%.\n-AK\n","date":"27 July 2025","externalUrl":null,"permalink":"/posts/2025-07-27-week-4-july-review-earnings-survival/","section":"Posts","summary":"\u003cp\u003eweek 4 done.\u003c/p\u003e\n\u003cp\u003eearnings week survived.\u003c/p\u003e\n\u003cp\u003econservative approach paid off.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 4 numbers \n    \u003cdiv id=\"week-4-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-4-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (jul 21):\u003c/strong\u003e $474,920\u003c/p\u003e","title":"week 4 july review - survived earnings week","type":"posts"},{"content":"earnings week chaos.\nGOOGL, TSLA, META all this week.\nhow my algos handle it.\nthe earnings problem # normal day: VIX 15, predictable ranges, clean signals\nearnings day: VIX spikes 20%+, gaps, reversals, noise\nmy strategies work in normal conditions.\nearnings require different approach.\nearnings detection system # import pandas as pd import numpy as np from datetime import datetime, timedelta from dataclasses import dataclass from typing import List, Optional import yfinance as yf @dataclass class EarningsEvent: symbol: str report_date: datetime report_time: str # \u0026#39;BMO\u0026#39; (before market open) or \u0026#39;AMC\u0026#39; (after market close) expected_move: float # implied by options historical_move_avg: float market_cap: float # for weighting impact class EarningsVolatilityAdapter: \u0026#34;\u0026#34;\u0026#34; Adapts trading parameters around earnings announcements \u0026#34;\u0026#34;\u0026#34; def __init__(self): self.earnings_calendar: List[EarningsEvent] = [] self.major_symbols = [\u0026#39;AAPL\u0026#39;, \u0026#39;MSFT\u0026#39;, \u0026#39;GOOGL\u0026#39;, \u0026#39;AMZN\u0026#39;, \u0026#39;META\u0026#39;, \u0026#39;TSLA\u0026#39;, \u0026#39;NVDA\u0026#39;, \u0026#39;JPM\u0026#39;, \u0026#39;BAC\u0026#39;, \u0026#39;WMT\u0026#39;] self.index_impact_threshold = 0.5 # % of index weight def load_earnings_calendar(self, start_date: datetime, end_date: datetime): \u0026#34;\u0026#34;\u0026#34; Load earnings calendar for major movers \u0026#34;\u0026#34;\u0026#34; for symbol in self.major_symbols: try: ticker = yf.Ticker(symbol) earnings_dates = ticker.earnings_dates if earnings_dates is not None: for date, row in earnings_dates.iterrows(): if start_date \u0026lt;= date.to_pydatetime() \u0026lt;= end_date: self.earnings_calendar.append(EarningsEvent( symbol=symbol, report_date=date.to_pydatetime(), report_time=\u0026#39;AMC\u0026#39;, # would need additional data expected_move=self._get_expected_move(symbol), historical_move_avg=self._get_historical_move(symbol), market_cap=ticker.info.get(\u0026#39;marketCap\u0026#39;, 0) )) except Exception as e: print(f\u0026#34;Error loading {symbol}: {e}\u0026#34;) def _get_expected_move(self, symbol: str) -\u0026gt; float: \u0026#34;\u0026#34;\u0026#34;Calculate expected move from ATM straddle price\u0026#34;\u0026#34;\u0026#34; # Simplified - would use real options data return np.random.uniform(3, 8) # typical 3-8% expected moves def _get_historical_move(self, symbol: str) -\u0026gt; float: \u0026#34;\u0026#34;\u0026#34;Get average historical earnings move\u0026#34;\u0026#34;\u0026#34; # Would query historical data return np.random.uniform(4, 10) def get_earnings_impact(self, trade_date: datetime) -\u0026gt; dict: \u0026#34;\u0026#34;\u0026#34; Calculate earnings impact on trading for given date \u0026#34;\u0026#34;\u0026#34; # Check for same-day earnings same_day = [e for e in self.earnings_calendar if e.report_date.date() == trade_date.date()] # Check for next-day earnings (AMC reports affect next day) next_day = [e for e in self.earnings_calendar if e.report_date.date() == (trade_date - timedelta(days=1)).date() and e.report_time == \u0026#39;AMC\u0026#39;] # Check for upcoming (within 2 days) upcoming = [e for e in self.earnings_calendar if 0 \u0026lt; (e.report_date.date() - trade_date.date()).days \u0026lt;= 2] # Calculate impact score impact_score = 0 for event in same_day + next_day: if event.symbol in [\u0026#39;AAPL\u0026#39;, \u0026#39;MSFT\u0026#39;, \u0026#39;GOOGL\u0026#39;, \u0026#39;AMZN\u0026#39;]: impact_score += 3 # mega cap = huge impact elif event.symbol in [\u0026#39;META\u0026#39;, \u0026#39;TSLA\u0026#39;, \u0026#39;NVDA\u0026#39;]: impact_score += 2 # large cap = significant impact else: impact_score += 1 # Upcoming events add uncertainty impact_score += len(upcoming) * 0.5 return { \u0026#39;date\u0026#39;: trade_date, \u0026#39;same_day_earnings\u0026#39;: [e.symbol for e in same_day], \u0026#39;post_earnings\u0026#39;: [e.symbol for e in next_day], \u0026#39;upcoming_earnings\u0026#39;: [e.symbol for e in upcoming], \u0026#39;impact_score\u0026#39;: impact_score, \u0026#39;recommendation\u0026#39;: self._get_recommendation(impact_score) } def _get_recommendation(self, impact_score: float) -\u0026gt; dict: \u0026#34;\u0026#34;\u0026#34;Trading recommendations based on earnings impact\u0026#34;\u0026#34;\u0026#34; if impact_score \u0026gt;= 4: return { \u0026#39;action\u0026#39;: \u0026#39;REDUCE_EXPOSURE\u0026#39;, \u0026#39;position_size_mult\u0026#39;: 0.3, \u0026#39;avoid_symbols\u0026#39;: True, \u0026#39;reason\u0026#39;: \u0026#39;High earnings impact - major names reporting\u0026#39; } elif impact_score \u0026gt;= 2: return { \u0026#39;action\u0026#39;: \u0026#39;CAUTIOUS\u0026#39;, \u0026#39;position_size_mult\u0026#39;: 0.6, \u0026#39;avoid_symbols\u0026#39;: True, \u0026#39;reason\u0026#39;: \u0026#39;Moderate earnings impact\u0026#39; } elif impact_score \u0026gt;= 1: return { \u0026#39;action\u0026#39;: \u0026#39;AWARE\u0026#39;, \u0026#39;position_size_mult\u0026#39;: 0.8, \u0026#39;avoid_symbols\u0026#39;: False, \u0026#39;reason\u0026#39;: \u0026#39;Minor earnings impact - stay alert\u0026#39; } else: return { \u0026#39;action\u0026#39;: \u0026#39;NORMAL\u0026#39;, \u0026#39;position_size_mult\u0026#39;: 1.0, \u0026#39;avoid_symbols\u0026#39;: False, \u0026#39;reason\u0026#39;: \u0026#39;No significant earnings impact\u0026#39; } def adjust_strategy_params( self, base_params: dict, impact: dict ) -\u0026gt; dict: \u0026#34;\u0026#34;\u0026#34; Adjust strategy parameters for earnings environment \u0026#34;\u0026#34;\u0026#34; adjusted = base_params.copy() mult = impact[\u0026#39;recommendation\u0026#39;][\u0026#39;position_size_mult\u0026#39;] # Reduce position size adjusted[\u0026#39;risk_per_trade\u0026#39;] = base_params[\u0026#39;risk_per_trade\u0026#39;] * mult # Widen stops (more volatility expected) if mult \u0026lt; 1.0: adjusted[\u0026#39;stop_loss_mult\u0026#39;] = base_params.get(\u0026#39;stop_loss_mult\u0026#39;, 1.0) * 1.3 # Increase entry threshold (require stronger signals) if mult \u0026lt; 0.7: adjusted[\u0026#39;signal_threshold\u0026#39;] = base_params.get(\u0026#39;signal_threshold\u0026#39;, 2.0) * 1.4 # Reduce max positions if mult \u0026lt; 0.5: adjusted[\u0026#39;max_positions\u0026#39;] = max(1, base_params.get(\u0026#39;max_positions\u0026#39;, 5) // 2) return adjusted class EarningsPlayFilter: \u0026#34;\u0026#34;\u0026#34; Filter for avoiding direct earnings plays (I don\u0026#39;t trade earnings announcements directly) \u0026#34;\u0026#34;\u0026#34; def __init__(self): self.blackout_hours_before = 4 self.blackout_hours_after = 24 def is_in_blackout( self, symbol: str, current_time: datetime, earnings_events: List[EarningsEvent] ) -\u0026gt; bool: \u0026#34;\u0026#34;\u0026#34; Check if symbol is in earnings blackout window \u0026#34;\u0026#34;\u0026#34; for event in earnings_events: if event.symbol != symbol: continue # Calculate blackout windows if event.report_time == \u0026#39;AMC\u0026#39;: blackout_start = event.report_date.replace(hour=12) # afternoon before blackout_end = event.report_date + timedelta(hours=24) else: # BMO blackout_start = event.report_date - timedelta(hours=16) # day before close blackout_end = event.report_date.replace(hour=12) # morning after if blackout_start \u0026lt;= current_time \u0026lt;= blackout_end: return True return False def filter_signals( self, signals: List[dict], current_time: datetime, earnings_events: List[EarningsEvent] ) -\u0026gt; List[dict]: \u0026#34;\u0026#34;\u0026#34; Remove signals for symbols in earnings blackout \u0026#34;\u0026#34;\u0026#34; filtered = [] for signal in signals: symbol = signal.get(\u0026#39;symbol\u0026#39;, \u0026#39;\u0026#39;) if self.is_in_blackout(symbol, current_time, earnings_events): print(f\u0026#34;Filtered {symbol} - earnings blackout\u0026#34;) continue filtered.append(signal) return filtered # Usage this week adapter = EarningsVolatilityAdapter() adapter.load_earnings_calendar( datetime(2025, 7, 21), datetime(2025, 7, 27) ) # Check impact for each day for day_offset in range(7): check_date = datetime(2025, 7, 21) + timedelta(days=day_offset) impact = adapter.get_earnings_impact(check_date) print(f\u0026#34;\\n{check_date.strftime(\u0026#39;%A %m/%d\u0026#39;)}:\u0026#34;) print(f\u0026#34; Same day: {impact[\u0026#39;same_day_earnings\u0026#39;]}\u0026#34;) print(f\u0026#34; Impact score: {impact[\u0026#39;impact_score\u0026#39;]}\u0026#34;) print(f\u0026#34; Recommendation: {impact[\u0026#39;recommendation\u0026#39;][\u0026#39;action\u0026#39;]}\u0026#34;) this week\u0026rsquo;s earnings schedule # tuesday 7/22: GOOGL (AMC), TSLA (AMC)\nwednesday 7/23: low impact day\nthursday 7/24: META (AMC)\nfriday 7/25: low impact (processing META)\nmy adaptations this week # monday-tuesday morning:\nposition size: 60% normal no new QQQ trades (GOOGL/TSLA impact) wider stops (1.3x normal) tuesday afternoon - wednesday:\nposition size: 30% normal no SPX trades (market reaction to GOOGL/TSLA) signal threshold: 1.4x normal thursday morning:\nresume 60% sizing avoid META-heavy setups thursday afternoon - friday:\nback to 30% during META reaction focus on non-tech setups why i don\u0026rsquo;t trade earnings directly # the math doesn\u0026rsquo;t work for me:\nexpected move already priced into options.\nneed \u0026gt;60% directional accuracy to profit.\nmy edge is 55-60% in normal conditions.\nearnings removes that edge.\nwhat i do instead:\ntrade around earnings.\nprofit from volatility expansion before.\nprofit from volatility crush after.\nnever bet on direction through announcement.\nlessons learned # been reading about earnings strategies on NexusFi options discussions since joining.\nkey insight that stuck:\n\u0026ldquo;retail loses on earnings plays because they\u0026rsquo;re betting against people who know the numbers.\u0026rdquo;\nI\u0026rsquo;m retail. I don\u0026rsquo;t know the numbers.\nso I trade the volatility environment, not the direction.\ntonight # earnings week adaptation live. GOOGL/TSLA tuesday, META thursday. position sizes 30-60% normal. wider stops, higher signal thresholds. not trading earnings direction - trading the volatility environment. algo adjustments automated based on earnings calendar impact scores.\n2:42am thursday. earnings volatility adaptation. GOOGL/TSLA tuesday crushed normal signals. running 30-60% position sizes. algo automatically adjusts based on earnings calendar. not betting on direction - trading volatility environment around announcements.\n-AK\n","date":"24 July 2025","externalUrl":null,"permalink":"/posts/2025-07-24-earnings-volatility-algo-adaptation/","section":"Posts","summary":"\u003cp\u003eearnings week chaos.\u003c/p\u003e\n\u003cp\u003eGOOGL, TSLA, META all this week.\u003c/p\u003e\n\u003cp\u003ehow my algos handle it.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe earnings problem \n    \u003cdiv id=\"the-earnings-problem\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-earnings-problem\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003enormal day:\u003c/strong\u003e VIX 15, predictable ranges, clean signals\u003c/p\u003e","title":"earnings volatility - how my algos adapt to quarterly chaos","type":"posts"},{"content":"week 3 done.\nsteady progress.\nsummer grinding continues.\nweek 3 numbers # starting (jul 14): $472,940\nending (jul 20): $474,920\nweek gain: +$1,980 (+0.42%)\ntrades: 6\nwins: 5\nlosses: 1\nwin rate: 83%\ntrade breakdown # options (5 trades): +$1,720\nSPX: 3 trades, +$1,180\nQQQ: 2 trades, +$540\ncrypto (1 trade): +$260\nBTC: 1 trade, +$260 (momentum continuation)\nthe loss # friday jul 18:\nQQQ call spread\ntech earnings next week (TSLA, GOOGL) volatility priced in early closed at 120% loss damage: -$290 note:\nsmaller loss this week. position sizing working.\nconditions # avg VIX: 15.8 (slightly elevated - earnings anticipation)\nvolume: 3.2M contracts (typical summer)\nslippage: 2.1 ticks (stable)\nregime: transitioning to medium vol\nearnings season incoming.\ncrypto # BTC holding above 68k.\nmomentum strategy produced one trade.\nwaiting for clear trend before adding more.\naccount status # current: $474,920\nytd: +$37,120 (+8.46%)\njuly: +$5,480 (+1.17%)\nvs target: tracking well (target +1.5% to +1.8%)\none week left.\nweek 4 expectations # big earnings week:\ntuesday: GOOGL, TSLA thursday: META volatility will increase.\nmay reduce position sizes.\ntarget: +$1,500 to +$2,000\nconservative into earnings.\ntonight # week 3 july complete. +$1,980 (+0.42%) across 6 trades. 83% win rate. one loss (-$290 on QQQ pre-earnings). options +$1,720, crypto +$260. VIX rising (earnings anticipation). account $474,920, ytd +8.46%. july +$5,480 (+1.17%). earnings week ahead - staying conservative.\n2:24am sunday. week 3 july review. +$1,980 across 6 trades, 83% win rate. one QQQ loss (-$290) on pre-earnings vol. account $474,920, ytd +8.46%. july at +1.17% with one week left. big earnings week ahead (GOOGL, TSLA, META). staying conservative.\n-AK\n","date":"20 July 2025","externalUrl":null,"permalink":"/posts/2025-07-20-week-3-july-review-steady-progress/","section":"Posts","summary":"\u003cp\u003eweek 3 done.\u003c/p\u003e\n\u003cp\u003esteady progress.\u003c/p\u003e\n\u003cp\u003esummer grinding continues.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 3 numbers \n    \u003cdiv id=\"week-3-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-3-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (jul 14):\u003c/strong\u003e $472,940\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eending (jul 20):\u003c/strong\u003e $474,920\u003c/p\u003e","title":"week 3 july review - steady summer progress","type":"posts"},{"content":"","date":"17 July 2025","externalUrl":null,"permalink":"/tags/marriage/","section":"Tags","summary":"","title":"Marriage","type":"tags"},{"content":"three months married.\nsomething shifted.\nthe realization # watching A. work at her desk yesterday.\nshe\u0026rsquo;s building a career. making her own money. independent as hell.\nbut I felt it anyway.\nthe weight.\nshe chose me. her security - not financial, but life security - is tied to mine now.\nif I fail, she doesn\u0026rsquo;t just lose a boyfriend.\nshe loses a husband. a life she planned around.\ndr. r\u0026rsquo;s take # brought this up in session.\n\u0026ldquo;you\u0026rsquo;re experiencing provider consciousness. it\u0026rsquo;s biological and cultural.\u0026rdquo;\n\u0026ldquo;I have money. this shouldn\u0026rsquo;t matter.\u0026rdquo;\n\u0026ldquo;it\u0026rsquo;s not about the money. it\u0026rsquo;s about reliability. you feel responsible for her wellbeing in a way you didn\u0026rsquo;t before marriage.\u0026rdquo;\nshe\u0026rsquo;s right.\nbefore wedding: if trading failed, I\u0026rsquo;d figure it out.\nafter wedding: if trading fails, I\u0026rsquo;m failing her.\ndifferent weight.\nhow it affects trading # more careful.\nI check risk parameters twice now.\nreduced max position sizing from 2.5% to 2% account risk.\nno more \u0026ldquo;interesting\u0026rdquo; speculative trades.\nmore disciplined.\nhaven\u0026rsquo;t broken a single trading rule since wedding.\ndaily max loss limit: never touched.\nweekly drawdown limit: never approached.\nless fun?\nmaybe. but maybe that\u0026rsquo;s growth.\nA. doesn\u0026rsquo;t know # haven\u0026rsquo;t told her about this weight.\nshe\u0026rsquo;d say \u0026ldquo;we have plenty of money, don\u0026rsquo;t worry.\u0026rdquo;\nthat\u0026rsquo;s not the point.\nthe point is I want to provide for her. protect her. build something with her.\nthat desire makes me a different trader.\nlast night # she cooked this complicated pasta thing. took her two hours.\nI cleaned up after, as always.\nshe came up behind me, wrapped her arms around my waist.\n\u0026ldquo;thank you for being so steady.\u0026rdquo;\nshe doesn\u0026rsquo;t know the weight. but she sees the steadiness.\nlater that night # we took our time.\nstarted on the couch. moved to bedroom.\nI went slow with her. made her wait. built her up.\nby the time I was inside her she was shaking. grabbing my shoulders.\n\u0026ldquo;please. I need you.\u0026rdquo;\nher body showing what words couldn\u0026rsquo;t. pulling me deeper. legs wrapped tight.\nmade love for over an hour. came together at the end.\nlying there after, her breathing evening out.\n\u0026ldquo;I love you different now,\u0026rdquo; she said.\n\u0026ldquo;different how?\u0026rdquo;\n\u0026ldquo;deeper. like you\u0026rsquo;re part of me.\u0026rdquo;\nyeah. me too.\nthe gratitude # she understands my grief. gives me space when I need it.\nchecks on me during bad trading days without hovering.\ncelebrates my wins genuinely, not performatively.\nnotices when I\u0026rsquo;m stressed before I say anything.\nthis woman knows me better than anyone.\nthe weight of providing doesn\u0026rsquo;t feel heavy anymore.\nit feels right.\nplaces list update # 55 → 56\nbalcony at sunset. neighbors probably saw but we didn\u0026rsquo;t care.\ntonight # three months married. feeling the provider weight - not about money, about being her person. dr. r says it\u0026rsquo;s normal. makes me more careful trader. A. doesn\u0026rsquo;t know but sees the steadiness. slow sex last night - made her wait, she was desperate by the end. \u0026ldquo;I love you different now. deeper.\u0026rdquo; places list 56 (balcony sunset). this weight feels right.\n11:48pm thursday. marriage month three. provider consciousness hit - not financial, existential. makes me more disciplined trader. A. sees steadiness without knowing the why. made love slowly last night, she was shaking with need by the end. love her deeper now. places list 56.\n-AK\n","date":"17 July 2025","externalUrl":null,"permalink":"/posts/2025-07-17-marriage-month-three-provider-weight/","section":"Posts","summary":"\u003cp\u003ethree months married.\u003c/p\u003e\n\u003cp\u003esomething shifted.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe realization \n    \u003cdiv id=\"the-realization\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-realization\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003ewatching A. work at her desk yesterday.\u003c/p\u003e\n\u003cp\u003eshe\u0026rsquo;s building a career. making her own money. independent as hell.\u003c/p\u003e","title":"marriage month three - the weight of providing","type":"posts"},{"content":"week 2 done.\nvolume recovered post-holiday.\nsolid gains.\nweek 2 numbers # starting (jul 7): $470,680\nending (jul 13): $472,940\nweek gain: +$2,260 (+0.48%)\ntrades: 7\nwins: 6\nlosses: 1\nwin rate: 86%\ntrade breakdown # options (5 trades): +$2,040\nSPX: 3 trades, +$1,420\nQQQ: 2 trades, +$620\ncrypto (2 trades): +$220\nBTC: 1 trade, +$180 (broke range finally)\nETH: 1 trade, +$40\nthe losing trade # wednesday jul 9:\nSPX call spread\nopened expecting continued low vol VIX spiked 12% intraday (CPI jitters) closed at 150% loss damage: -$380 lesson:\neven summer markets can spike.\nkept loss small due to reduced sizing.\nconditions # avg VIX: 15.2 (recovered from 14.6)\nvolume: 3.4M contracts (up from 2.8M holiday week)\nslippage: 1.9 ticks (normalized)\nregime: still low vol but less stable\nCPI report wednesday added volatility.\ncrypto notes # BTC finally broke 68k range ceiling.\nopened 1 momentum trade, closed +$180.\nETH followed weakly, +$40.\nnot forcing more crypto yet. still summer thin.\nkelly sizing this week # high-confidence: 5 trades (83% win rate)\nmarginal: 2 trades (50% win rate)\nthe loss was a marginal trade.\ntakeaway: stick to high-confidence in summer.\naccount status # current: $472,940\nytd: +$35,140 (+8.01%)\njuly: +$3,500 (+0.75%)\nvs target: on pace (target +1.5% to +1.8%)\nhalfway through month, halfway to target.\nweek 3 expectations # no major economic releases.\nvolume should stay around 3.2-3.5M.\ntarget: +$1,800 to +$2,200\nmay increase crypto allocation slightly if BTC holds breakout.\ntonight # week 2 july complete. +$2,260 (+0.48%) across 7 trades. 86% win rate. one loss (-$380 on CPI spike). options +$2,040, crypto +$220 (BTC broke range). volume recovered to 3.4M. account $472,940, ytd +8.01%. july +$3,500 halfway through, on pace for target.\n2:18am sunday. week 2 july review. +$2,260 across 7 trades, 86% win rate. one loss from CPI spike (-$380). BTC broke 68k range, took 1 momentum trade (+$180). account $472,940, ytd +8.01%. july at +0.75% halfway through.\n-AK\n","date":"13 July 2025","externalUrl":null,"permalink":"/posts/2025-07-13-week-2-july-review-volume-recovery/","section":"Posts","summary":"\u003cp\u003eweek 2 done.\u003c/p\u003e\n\u003cp\u003evolume recovered post-holiday.\u003c/p\u003e\n\u003cp\u003esolid gains.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 2 numbers \n    \u003cdiv id=\"week-2-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-2-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (jul 7):\u003c/strong\u003e $470,680\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eending (jul 13):\u003c/strong\u003e $472,940\u003c/p\u003e","title":"week 2 july review - volume recovering, solid week","type":"posts"},{"content":"summer volume creates different market microstructure.\nadapting order flow analysis to account for it.\nthe summer volume problem # normal month volume: 4.2M SPX options contracts/day\njuly volume: 2.8M contracts/day (33% reduction)\nimpact:\nwider bid-ask spreads more slippage false breakouts from thin order books larger moves on smaller flow my standard order flow signals produce more false positives.\norder flow metrics i track # import pandas as pd import numpy as np from dataclasses import dataclass from typing import Optional from datetime import datetime, timedelta @dataclass class OrderFlowMetrics: \u0026#34;\u0026#34;\u0026#34;Core order flow metrics for strategy signals\u0026#34;\u0026#34;\u0026#34; timestamp: datetime symbol: str # Volume metrics total_volume: int buy_volume: int sell_volume: int delta: int # buy - sell cumulative_delta: int # Imbalance metrics bid_volume: int ask_volume: int imbalance_ratio: float # (bid - ask) / (bid + ask) # Aggression metrics aggressive_buys: int aggressive_sells: int aggression_ratio: float # Liquidity metrics bid_depth: float ask_depth: float spread_ticks: float @property def is_thin_volume(self) -\u0026gt; bool: \u0026#34;\u0026#34;\u0026#34;Detect thin volume conditions\u0026#34;\u0026#34;\u0026#34; return self.total_volume \u0026lt; self.volume_threshold * 0.6 @property def volume_threshold(self) -\u0026gt; int: \u0026#34;\u0026#34;\u0026#34;Energetic threshold based on time of day\u0026#34;\u0026#34;\u0026#34; hour = self.timestamp.hour if 9 \u0026lt;= hour \u0026lt;= 10: # opening hour return 50000 elif 15 \u0026lt;= hour \u0026lt;= 16: # closing hour return 45000 else: # midday return 30000 class SummerOrderFlowAnalyzer: \u0026#34;\u0026#34;\u0026#34; Order flow analysis adapted for summer thin volume conditions \u0026#34;\u0026#34;\u0026#34; def __init__(self, lookback_days: int = 20): self.lookback_days = lookback_days self.metrics_history: list[OrderFlowMetrics] = [] self.volume_baseline: Optional[float] = None self.summer_adjustment_factor = 1.0 def calculate_volume_baseline(self, historical_data: pd.DataFrame) -\u0026gt; float: \u0026#34;\u0026#34;\u0026#34; Calculate rolling volume baseline for comparison \u0026#34;\u0026#34;\u0026#34; # Use 20-day rolling average rolling_vol = historical_data[\u0026#39;volume\u0026#39;].rolling( window=self.lookback_days ).mean() self.volume_baseline = rolling_vol.iloc[-1] return self.volume_baseline def detect_summer_regime(self, current_volume: int) -\u0026gt; dict: \u0026#34;\u0026#34;\u0026#34; Detect if we\u0026#39;re in summer thin volume regime Returns adjustment factors for signals \u0026#34;\u0026#34;\u0026#34; if self.volume_baseline is None: raise ValueError(\u0026#34;Must calculate baseline first\u0026#34;) volume_ratio = current_volume / self.volume_baseline if volume_ratio \u0026lt; 0.5: # Extremely thin - high caution regime = \u0026#39;extremely_thin\u0026#39; signal_threshold_mult = 1.8 # require 80% stronger signals size_mult = 0.5 # half position size elif volume_ratio \u0026lt; 0.7: # Thin - moderate caution regime = \u0026#39;thin\u0026#39; signal_threshold_mult = 1.4 # require 40% stronger signals size_mult = 0.7 elif volume_ratio \u0026lt; 0.9: # Below normal - slight caution regime = \u0026#39;below_normal\u0026#39; signal_threshold_mult = 1.2 size_mult = 0.85 else: # Normal conditions regime = \u0026#39;normal\u0026#39; signal_threshold_mult = 1.0 size_mult = 1.0 self.summer_adjustment_factor = signal_threshold_mult return { \u0026#39;regime\u0026#39;: regime, \u0026#39;volume_ratio\u0026#39;: volume_ratio, \u0026#39;signal_threshold_multiplier\u0026#39;: signal_threshold_mult, \u0026#39;position_size_multiplier\u0026#39;: size_mult, \u0026#39;confidence_adjustment\u0026#39;: 1.0 / signal_threshold_mult } def calculate_delta_signal( self, metrics: OrderFlowMetrics, lookback_bars: int = 20 ) -\u0026gt; dict: \u0026#34;\u0026#34;\u0026#34; Calculate delta-based signal with summer adjustments \u0026#34;\u0026#34;\u0026#34; # Get recent cumulative delta recent_metrics = self.metrics_history[-lookback_bars:] if len(recent_metrics) \u0026lt; lookback_bars: return {\u0026#39;signal\u0026#39;: \u0026#39;insufficient_data\u0026#39;, \u0026#39;strength\u0026#39;: 0} deltas = [m.cumulative_delta for m in recent_metrics] delta_mean = np.mean(deltas) delta_std = np.std(deltas) if delta_std == 0: return {\u0026#39;signal\u0026#39;: \u0026#39;no_variance\u0026#39;, \u0026#39;strength\u0026#39;: 0} # Z-score of current delta current_z = (metrics.cumulative_delta - delta_mean) / delta_std # Apply summer adjustment - require stronger signal adjusted_threshold = 2.0 * self.summer_adjustment_factor if current_z \u0026gt; adjusted_threshold: signal = \u0026#39;strong_buy\u0026#39; strength = min((current_z - adjusted_threshold) / 2, 1.0) elif current_z \u0026lt; -adjusted_threshold: signal = \u0026#39;strong_sell\u0026#39; strength = min((-current_z - adjusted_threshold) / 2, 1.0) elif current_z \u0026gt; 1.5 * self.summer_adjustment_factor: signal = \u0026#39;weak_buy\u0026#39; strength = 0.3 elif current_z \u0026lt; -1.5 * self.summer_adjustment_factor: signal = \u0026#39;weak_sell\u0026#39; strength = 0.3 else: signal = \u0026#39;neutral\u0026#39; strength = 0 return { \u0026#39;signal\u0026#39;: signal, \u0026#39;strength\u0026#39;: strength, \u0026#39;z_score\u0026#39;: current_z, \u0026#39;threshold_used\u0026#39;: adjusted_threshold, \u0026#39;summer_adjusted\u0026#39;: self.summer_adjustment_factor \u0026gt; 1.0 } def calculate_imbalance_signal( self, metrics: OrderFlowMetrics ) -\u0026gt; dict: \u0026#34;\u0026#34;\u0026#34; Calculate order book imbalance signal More sensitive in thin markets - need stronger imbalance \u0026#34;\u0026#34;\u0026#34; imbalance = metrics.imbalance_ratio # Summer adjustment - require larger imbalance base_threshold = 0.3 adjusted_threshold = base_threshold * self.summer_adjustment_factor if abs(imbalance) \u0026lt; adjusted_threshold: return { \u0026#39;signal\u0026#39;: \u0026#39;neutral\u0026#39;, \u0026#39;imbalance\u0026#39;: imbalance, \u0026#39;threshold\u0026#39;: adjusted_threshold } if imbalance \u0026gt; adjusted_threshold: return { \u0026#39;signal\u0026#39;: \u0026#39;bid_dominant\u0026#39;, # potential buying pressure \u0026#39;imbalance\u0026#39;: imbalance, \u0026#39;confidence\u0026#39;: min((imbalance - adjusted_threshold) / 0.3, 1.0) } else: return { \u0026#39;signal\u0026#39;: \u0026#39;ask_dominant\u0026#39;, # potential selling pressure \u0026#39;imbalance\u0026#39;: imbalance, \u0026#39;confidence\u0026#39;: min((-imbalance - adjusted_threshold) / 0.3, 1.0) } def filter_false_breakouts( self, price_data: pd.DataFrame, volume_data: pd.DataFrame ) -\u0026gt; pd.DataFrame: \u0026#34;\u0026#34;\u0026#34; Filter potential false breakouts in thin volume Summer markets have more false breakouts due to: - Thin order books creating gaps - Large orders moving price disproportionately - Reduced institutional participation \u0026#34;\u0026#34;\u0026#34; df = price_data.copy() # Calculate returns df[\u0026#39;returns\u0026#39;] = df[\u0026#39;close\u0026#39;].pct_change() # Calculate volume relative to baseline df[\u0026#39;volume_ratio\u0026#39;] = volume_data[\u0026#39;volume\u0026#39;] / self.volume_baseline # Flag potential false breakouts # Large move on thin volume = suspicious df[\u0026#39;false_breakout_risk\u0026#39;] = ( (abs(df[\u0026#39;returns\u0026#39;]) \u0026gt; df[\u0026#39;returns\u0026#39;].rolling(20).std() * 2) \u0026amp; (df[\u0026#39;volume_ratio\u0026#39;] \u0026lt; 0.6) ) # Calculate confidence adjustment df[\u0026#39;signal_confidence\u0026#39;] = np.where( df[\u0026#39;false_breakout_risk\u0026#39;], 0.5, # reduce confidence for suspicious moves 1.0 ) return df def get_trading_recommendation( self, metrics: OrderFlowMetrics, price_data: pd.DataFrame ) -\u0026gt; dict: \u0026#34;\u0026#34;\u0026#34; Combine all signals into trading recommendation \u0026#34;\u0026#34;\u0026#34; # Store metrics self.metrics_history.append(metrics) # Get individual signals delta_signal = self.calculate_delta_signal(metrics) imbalance_signal = self.calculate_imbalance_signal(metrics) # Filter for false breakouts filtered_data = self.filter_false_breakouts( price_data, pd.DataFrame({\u0026#39;volume\u0026#39;: [metrics.total_volume]}) ) # Combine signals signals = [delta_signal[\u0026#39;signal\u0026#39;], imbalance_signal[\u0026#39;signal\u0026#39;]] # Count directional agreement bullish_count = sum(1 for s in signals if \u0026#39;buy\u0026#39; in s or \u0026#39;bid\u0026#39; in s) bearish_count = sum(1 for s in signals if \u0026#39;sell\u0026#39; in s or \u0026#39;ask\u0026#39; in s) # Require agreement in thin markets if self.summer_adjustment_factor \u0026gt; 1.2: required_agreement = 2 # all signals must agree else: required_agreement = 1 # normal threshold if bullish_count \u0026gt;= required_agreement: direction = \u0026#39;long\u0026#39; confidence = delta_signal[\u0026#39;strength\u0026#39;] * imbalance_signal.get(\u0026#39;confidence\u0026#39;, 0.5) elif bearish_count \u0026gt;= required_agreement: direction = \u0026#39;short\u0026#39; confidence = delta_signal[\u0026#39;strength\u0026#39;] * imbalance_signal.get(\u0026#39;confidence\u0026#39;, 0.5) else: direction = \u0026#39;flat\u0026#39; confidence = 0 # Apply thin volume confidence reduction if metrics.is_thin_volume: confidence *= 0.7 return { \u0026#39;direction\u0026#39;: direction, \u0026#39;confidence\u0026#39;: confidence, \u0026#39;delta_signal\u0026#39;: delta_signal, \u0026#39;imbalance_signal\u0026#39;: imbalance_signal, \u0026#39;thin_volume_warning\u0026#39;: metrics.is_thin_volume, \u0026#39;summer_regime\u0026#39;: self.summer_adjustment_factor \u0026gt; 1.0, \u0026#39;recommendation\u0026#39;: self._format_recommendation(direction, confidence) } def _format_recommendation(self, direction: str, confidence: float) -\u0026gt; str: if confidence \u0026lt; 0.3: return f\u0026#34;SKIP - Low confidence ({confidence:.1%})\u0026#34; elif confidence \u0026lt; 0.5: return f\u0026#34;MARGINAL {direction.upper()} - Consider smaller size\u0026#34; elif confidence \u0026lt; 0.7: return f\u0026#34;MODERATE {direction.upper()} - Standard size\u0026#34; else: return f\u0026#34;STRONG {direction.upper()} - Full size\u0026#34; # Usage example analyzer = SummerOrderFlowAnalyzer(lookback_days=20) # Calculate baseline from historical data historical_volume = pd.DataFrame({ \u0026#39;volume\u0026#39;: np.random.normal(4200000, 500000, 60) # 60 days history }) analyzer.calculate_volume_baseline(historical_volume) # Detect current regime (july thin volume) current_volume = 2800000 # typical july volume regime = analyzer.detect_summer_regime(current_volume) print(f\u0026#34;Regime: {regime[\u0026#39;regime\u0026#39;]}\u0026#34;) print(f\u0026#34;Signal threshold multiplier: {regime[\u0026#39;signal_threshold_multiplier\u0026#39;]:.1f}x\u0026#34;) print(f\u0026#34;Position size multiplier: {regime[\u0026#39;position_size_multiplier\u0026#39;]:.0%}\u0026#34;) key adaptations for summer # 1. higher signal thresholds\nnormal: 2.0 std dev for strong signal\nsummer: 2.8 std dev (1.4x multiplier)\nprevents false positives from noise.\n2. reduced position sizing\nnormal: 0.5% account risk\nsummer: 0.35% account risk (0.7x)\nlimits damage from thin market whipsaws.\n3. false breakout filter\nlarge price moves on low volume = suspicious\nreduce confidence 50% for these signals.\n4. required signal agreement\nnormal: 1 signal sufficient\nsummer: all signals must agree\nmore conservative entry requirements.\nbacktesting the adaptation # may-june (pre-adaptation):\nfalse positive rate: 18%\nwin rate on triggered trades: 71%\njuly (with adaptation):\nfalse positive rate: 8%\nwin rate on triggered trades: 82%\ntrades taken: 40% fewer\nnet result: fewer but higher quality trades.\nlessons from nexusfi # been reading about summer market adaptations on NexusFi order flow discussions for two years.\nkey insight from experienced algo traders:\n\u0026ldquo;summer isn\u0026rsquo;t about finding more trades. it\u0026rsquo;s about not getting stopped out on noise.\u0026rdquo;\nthis code implements that philosophy.\ntonight # summer order flow adaptation deployed. higher thresholds (1.4x), reduced sizing (0.7x), false breakout filters. backtesting shows 8% false positive rate vs 18% in standard config. fewer trades but higher win rate. july thin volume requires different approach.\n2:38am thursday. order flow adaptation for summer thin volume. raised signal thresholds 40%, reduced position sizing 30%, added false breakout detection. key insight: summer isn\u0026rsquo;t about more trades, it\u0026rsquo;s about surviving noise. backtesting validated approach.\n-AK\n","date":"10 July 2025","externalUrl":null,"permalink":"/posts/2025-07-10-order-flow-analysis-summer-adaptation/","section":"Posts","summary":"\u003cp\u003esummer volume creates different market microstructure.\u003c/p\u003e\n\u003cp\u003eadapting order flow analysis to account for it.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe summer volume problem \n    \u003cdiv id=\"the-summer-volume-problem\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-summer-volume-problem\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003enormal month volume:\u003c/strong\u003e 4.2M SPX options contracts/day\u003c/p\u003e","title":"order flow analysis - adapting strategies for summer thin volume","type":"posts"},{"content":"","date":"10 July 2025","externalUrl":null,"permalink":"/tags/order-flow/","section":"Tags","summary":"","title":"Order-Flow","type":"tags"},{"content":"","date":"10 July 2025","externalUrl":null,"permalink":"/tags/volume/","section":"Tags","summary":"","title":"Volume","type":"tags"},{"content":"week 1 done.\nholiday week complete.\nmodest gains as expected.\nweek 1 numbers # starting (jul 1): $469,440\nending (jul 6): $470,680\nweek gain: +$1,240 (+0.26%)\ntrades: 3\nwins: 3\nlosses: 0\nwin rate: 100%\ntrade breakdown # tuesday jul 1:\nSPX put spread opened, closed wednesday +$480 (50% profit target)\nwednesday jul 2:\nSPX call spread opened, closed thursday +$420 (approaching expiration)\nthursday jul 3:\nhalf day. QQQ put spread opened, closed same day +$340\nfriday jul 4:\nmarkets closed. birthday.\nconditions # avg VIX: 14.6 (low, expected summer)\nvolume: thin (holiday week typical)\nslippage: 2.4 ticks (elevated due to thin liquidity)\nregime: stable low vol\nonly traded high-confidence setups.\nrejected 2 marginal signals.\nkelly sizing performance # week 1 stats:\nhigh-confidence trades: 3 (all winners)\nmarginal trades skipped: 2\ndecision validated.\nthin holiday week = only best setups.\ncrypto update # BTC: no trades (range-bound, thin volume)\nETH: no trades\nweek crypto p\u0026amp;l: $0\nwaiting for better conditions.\naccount status # current: $470,680\nytd: +$32,880 (+7.50%)\njuly: +$1,240 (+0.26%)\nvs target: on pace (+1.5% to +1.8% target)\nweek 2 expectations # full trading week.\nback to normal volume (post-holiday).\ntarget: +$1,800 to +2,200\nwill add 1-2 crypto trades if BTC breaks range.\ntonight # week 1 july complete. +$1,240 (+0.26%) across 3 trades. 100% win rate but thin volume. holiday week = conservative. rejected 2 marginal setups. kelly sizing validated. no crypto trades. account $470,680, ytd +7.50%. full week ahead, target +$1.8k-2.2k.\n2:22am sunday. week 1 july review. holiday week done. +$1,240 across 3 trades, all winners. thin volume = conservative. skipped 2 marginal setups. no crypto (waiting for range break). account $470,680, ytd +7.50%. week 2 should be fuller.\n-AK\n","date":"6 July 2025","externalUrl":null,"permalink":"/posts/2025-07-06-week-1-july-review-holiday-week-modest/","section":"Posts","summary":"\u003cp\u003eweek 1 done.\u003c/p\u003e\n\u003cp\u003eholiday week complete.\u003c/p\u003e\n\u003cp\u003emodest gains as expected.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 1 numbers \n    \u003cdiv id=\"week-1-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-1-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (jul 1):\u003c/strong\u003e $469,440\u003c/p\u003e","title":"week 1 july review - holiday week, modest gains","type":"posts"},{"content":"","date":"4 July 2025","externalUrl":null,"permalink":"/tags/birthday/","section":"Tags","summary":"","title":"Birthday","type":"tags"},{"content":"22 today.\nfirst birthday married.\nmarkets closed.\nthe morning # woke up to A. already awake, watching me.\n\u0026ldquo;happy birthday husband.\u0026rdquo;\nshe\u0026rsquo;d been waiting for me to wake up. said she likes watching me sleep.\nweird but sweet.\nher surprise # wouldn\u0026rsquo;t tell me the plan all week.\nthe reveal:\nchartered sailboat, san diego harbor, sunset cruise.\njust us. captain stayed up front.\nchampagne. cheese board. her in that white sundress.\n\u0026ldquo;you\u0026rsquo;re harder to buy for now that you can afford anything.\u0026rdquo;\ntrue. but this was perfect.\non the water # san diego skyline at golden hour.\nher head on my shoulder.\n\u0026ldquo;two years ago you were alone in this apartment processing your parents\u0026rsquo; death.\u0026rdquo;\nyeah.\n\u0026ldquo;now you have a wife who loves you, a business that works, and you\u0026rsquo;re not broken anymore.\u0026rdquo;\nwasn\u0026rsquo;t expecting that.\nwhat she doesn\u0026rsquo;t know # the weight I feel now.\nproviding for her. not financially - we have money. but the responsibility of being someone\u0026rsquo;s person.\nif my trading fails, it\u0026rsquo;s not just me anymore.\nshe depends on me. not for money. for stability. partnership. future.\nit makes me more careful. more disciplined.\nbut also more scared sometimes.\nback at the apartment # after sunset, after dinner at mister A\u0026rsquo;s (her choice, expensive, worth it).\nshe led me to the bedroom.\n\u0026ldquo;birthday sex rules apply.\u0026rdquo;\nwe took our time. none of the usual quick stuff.\nshe was so wet by the time I finally entered her. body arching, pulling me deeper.\n\u0026ldquo;I need you. I need you.\u0026rdquo;\nshe kept saying it. grabbing my back. legs wrapped tight.\nsomething about slow sex with her - the buildup, the anticipation - makes her desperate in a way quickies don\u0026rsquo;t.\ncame together. held each other after.\n\u0026ldquo;22 looks good on you.\u0026rdquo;\nthe realization # lying there in the dark, her asleep on my chest.\nI love this woman more than I thought possible.\nnot the honeymoon-phase love from two years ago.\ndeeper. she understands me. my grief. my trading stress. my need for space.\nand I understand her. her independence. her ambition. her morning runs.\nwe fit.\ndr. r\u0026rsquo;s comment (last session) # \u0026ldquo;you\u0026rsquo;re integrating loss and love simultaneously. most people can\u0026rsquo;t do that at 22.\u0026rdquo;\nwhatever that means.\nbut she\u0026rsquo;s right that something\u0026rsquo;s different now.\nplaces list update # 54 → 55\nsailboat at sunset. below deck. quiet and private.\nshe wanted to. couldn\u0026rsquo;t say no.\ntonight # first birthday married. sailboat sunset cruise (her surprise). mister A\u0026rsquo;s for dinner. took our time in bed - slow, intense, she was desperate for me by the end. places list 55 (sailboat below deck). love this woman more than I knew possible. different love now - deeper, more scared, more real. 11:42pm friday. my birthday. 22. first one married. A. chartered sailboat sunset cruise. mister A\u0026rsquo;s dinner. slow birthday sex - she was soaking wet, pulling me deeper, saying she needed me. places list 55. love her differently now. deeper. scarier. more real.\n-AK\n","date":"4 July 2025","externalUrl":null,"permalink":"/posts/2025-07-04-birthday-22-first-one-married/","section":"Posts","summary":"\u003cp\u003e22 today.\u003c/p\u003e\n\u003cp\u003efirst birthday married.\u003c/p\u003e\n\u003cp\u003emarkets closed.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe morning \n    \u003cdiv id=\"the-morning\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-morning\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003ewoke up to A. already awake, watching me.\u003c/p\u003e","title":"birthday - 22, first one married","type":"posts"},{"content":"july starts.\nsecond married month begins.\nsummer mode engaged.\njuly 1 setup # account: $469,440\nytd: +$31,640 (+7.22%)\ntarget this month: +1.5% to +1.8% (+$7k to $8.5k)\nconditions:\nVIX at 14.8. low but workable.\nvolume declining further. typical july pattern.\ntoday\u0026rsquo;s trades # opened:\n1 SPX put credit spread (conservative sizing)\nsold 5400 put @ $1.85 bought 5390 put @ $1.20 net credit: $0.65 max loss: $935 7 DTE prob OTM: 81% why conservative:\nholiday week ahead. july 4th friday.\nreduced liquidity means wider spreads.\nnot forcing trades.\nregime detection status # current regime: low vol (VIX 14.8)\nparams active:\nlookback: 20 days entry: 2.0 std dev size: 0.5% risk stability confidence: 0.91 (excellent)\nmarkets haven\u0026rsquo;t regime-shifted in 3 weeks.\nsteady conditions.\ncrypto allocation # current: 20% (reduced from 30% in june)\njuly plan: maintain 20%\nsummer crypto volume even thinner than equities.\nBTC range-bound between 62k and 68k.\nnot forcing crypto trades either.\nholiday week expectations # thursday july 3: half day, close 1pm EST\nfriday july 4: markets closed (my birthday)\nreality:\n3 trading days this week.\nprobably 2-3 trades max.\ntarget: +$1,000 to +1,500 for week 1.\nmodest expectations.\nkelly sizing continues # june results validated approach:\nhigh-confidence setups: 92% win rate\nmarginal setups: 71% win rate\ncontinuing into july.\nonly trade high-confidence in thin holiday week.\ntonight # july 1. summer mode active. opened 1 conservative SPX spread, $65 credit. holiday week ahead (july 4 friday). VIX 14.8, regime stable. crypto at 20% allocation. target +1.5-1.8% for july. 3 trading days this week. account $469,440.\n2:14am tuesday. july starts. summer mode continues. opened 1 SPX put credit spread ($65 credit, 81% prob OTM). holiday week = reduced trading. july 4 my birthday (markets closed). targeting +$1k-1.5k for week 1. account $469,440, ytd +7.22%.\n-AK\n","date":"1 July 2025","externalUrl":null,"permalink":"/posts/2025-07-01-week-1-july-summer-mode-continues/","section":"Posts","summary":"\u003cp\u003ejuly starts.\u003c/p\u003e\n\u003cp\u003esecond married month begins.\u003c/p\u003e\n\u003cp\u003esummer mode engaged.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ejuly 1 setup \n    \u003cdiv id=\"july-1-setup\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#july-1-setup\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eaccount:\u003c/strong\u003e $469,440\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eytd:\u003c/strong\u003e +$31,640 (+7.22%)\u003c/p\u003e","title":"week 1 july - summer mode continues, first trades of the month","type":"posts"},{"content":"june done.\ntarget hit.\nfirst full month married.\njune final numbers # starting (june 1): $460,260\nending (june 30): $469,440\njune gain: +$9,180 (+1.99%)\ntrades: 26\nwins: 22\nlosses: 4\nwin rate: 85%\ntrading days: 20\nFigure 1: June weekly performance showing consistent gains across all 4 weeks. Week 1: +$2,680 (+0.58%), Week 2: +$2,340 (+0.51%), Week 3: +$2,180 (+0.47%), Week 4: +$1,980 (+0.42%). All weeks profitable. Total +$9,180 (+1.99%). Gradual weekly decline reflects summer volume reduction and conservative adjustments.\nweekly breakdown # week 1 (jun 2-8): +$2,680 (+0.58%), 88% wr, 8 trades\nweek 2 (jun 9-15): +$2,340 (+0.51%), 86% wr, 7 trades\nweek 3 (jun 16-22): +$2,180 (+0.47%), 83% wr, 6 trades\nweek 4 (jun 23-28): +$1,980 (+0.42%), 80% wr, 5 trades\nall 4 weeks profitable.\ndeclining weekly gains = summer adjustment.\nintentional reduction as volume dropped.\ncomparing to target # june realistic outcomes (from may 31):\nnormal month: +1.5% to +2.5%\njune actual: +1.99%\nresult: TARGET HIT (mid-range)\nexactly as planned.\nmarket conditions june # avg VIX: 15.4 (excellent, optimal 13-18)\navg correlation: 0.59 (excellent \u0026lt;0.65)\navg volume: 3.4M contracts (declining - summer)\navg regime stability: 0.75 (very stable)\nslippage: 2.1 ticks (slight summer increase)\nconditions: favorable to excellent\nbest conditions since february.\nFigure 2: 2025 YTD performance through June. Monthly bars: Jan +$9,550, Feb +$8,920, Mar -$9,582 (losing month), Apr +$9,732, May +$3,840 (wedding pause), Jun +$9,180. Orange line shows cumulative YTD reaching +$31,640 (+7.22%). Pattern: 5 winning months, 1 losing month = 83% monthly win rate. June recovery from May pause-heavy month. Back to sustainable pace. Annual projection: 14.4% (closing gap to 15-18% target).\ntrade distribution # options: 19 trades, +$7,660 (83% of gains)\nSPX: 13 trades, +$5,220\nQQQ: 6 trades, +$2,440\ncrypto: 7 trades, +$1,520 (17% of gains)\nBTC: 5 trades, +$1,100\nETH: 2 trades, +$420\nfutures: 0 trades (summer thin volume skip)\nallocation: 83% options, 17% crypto, 0% futures\ncrypto reduced 30%→20% mid-month (summer adjustment).\nFigure 3: June gains by instrument. SPX options dominated (+$5,220, 57% of total), followed by QQQ options (+$2,440, 27%), BTC (+$1,100, 12%), and ETH (+$420, 4%). Options total 83% of gains ($7,660), crypto 17% ($1,520). Summer crypto reduction (30%→20%) implemented mid-month due to thin volume. SPX/QQQ options remain core profit drivers.\ncircuit breaker performance # triggered: 0 times\nclose calls: 0 times\nlargest loss: -$240 (june 12 SPX)\ncapital preservation: excellent\nno stress throughout june.\nytd performance update # jan: +$9,550 (+2.18%)\nfeb: +$8,920 (+1.99%)\nmar: -$9,582 (-2.10%)\napr: +$9,732 (+2.18%)\nmay: +$3,840 (+0.84%)\njun: +$9,180 (+1.99%)\nytd total: +$31,640 (+7.22%)\nannual pace: 14.4%\nvs target: 15-18%\nprogress: closing gap, almost in target range\nkelly sizing evaluation (1 month) # deployed: june 2\nresults after 26 trades:\nhigh-confidence setups (12 trades): 92% win rate, avg +$480\nmarginal setups (14 trades): 71% win rate, avg +$280\nposition sizing working:\nlarger on high-edge = better returns.\nsmaller on marginal = protected capital.\ncontinuing into july.\nlessons from june # 1. full month \u0026gt; pause month\nmay (9 days): +$3,840 ($427/day)\njune (20 days): +$9,180 ($459/day)\nfull month = more opportunities + better efficiency.\n2. summer adjustments matter\ncrypto volume dropped mid-june.\nadjusted allocation 30%→20%.\navoided thin-market losses.\n3. kelly sizing validated\n1 month not statistically significant.\nbut directionally correct.\nhigh-confidence setups outperforming.\n4. routine established\nmarried life + trading integrated.\nno friction.\nsustainable long-term.\n5. birthday pause worth it\njune 18 no trading (A\u0026rsquo;s birthday).\n$1,100 spent on spa + dinner + gift.\nno regrets.\nlife update - first full married month # routine:\nbreakfast 10am together ✓\nwork hours maintained ✓\ngym 3x/week ✓\ndinner 7pm together ✓\nhighlights:\njune 13: 2-year anniversary of meeting A.\njune 18: A\u0026rsquo;s 24th birthday surprise\nplaces list: 54\nrelationship:\nno major friction.\ncommunication working.\ntrading stress managed.\ndr. r insight:\n\u0026ldquo;you\u0026rsquo;re maintaining boundaries better than before marriage.\u0026rdquo;\napparently marriage made me calmer, not more stressed.\njuly preview # trading:\nsummer mode continues.\nreduced crypto allocation (20%).\nconservative position sizing.\nrealistic july outcomes:\nnormal summer month: +1.0% to +2.0%\nflat month: +0.5% to +1.0%\ntarget: +1.5% to +1.8%\npersonal:\njuly 4: my 22nd birthday\nfirst birthday married.\nA. planning something (won\u0026rsquo;t tell me).\ntonight (june 30, 11:48pm) # june done. +$9,180 (+1.99%) across 26 trades. 85% win rate. TARGET HIT. all 4 weeks profitable (declining gains = summer adjustment). options +$7,660 (83%), crypto +$1,520 (17%). VIX 15.4 avg, correlation 0.59 (excellent). kelly sizing validated (1 month). ytd +$31,640 (+7.22%), annual pace 14.4% (closing gap to 15-18%). account $469,440. first full married month, routine established. july target +1.5-1.8% (summer mode).\n11:48pm monday. june wrap. +$9,180 (+1.99%) target hit. 26 trades, 85% win rate. all 4 weeks profitable. options dominated (+$7,660), crypto reduced mid-month (+$1,520). conditions excellent (VIX 15.4, corr 0.59). kelly sizing validated. ytd +$31,640 (+7.22%), annual pace 14.4%. first full married month complete, routine working. july 4 turning 22. july target +1.5-1.8%.\n-AK\n","date":"30 June 2025","externalUrl":null,"permalink":"/posts/2025-06-30-june-wrap-target-hit-first-full-married-month/","section":"Posts","summary":"\u003cp\u003ejune done.\u003c/p\u003e\n\u003cp\u003etarget hit.\u003c/p\u003e\n\u003cp\u003efirst full month married.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ejune final numbers \n    \u003cdiv id=\"june-final-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#june-final-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (june 1):\u003c/strong\u003e $460,260\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eending (june 30):\u003c/strong\u003e $469,440\u003c/p\u003e","title":"june wrap - target hit +1.99%, first full married month, ytd +7.22%","type":"posts"},{"content":"week 4 june done.\ntarget hit.\nstrong finish.\nweek 4 numbers # starting (june 23): $467,460\nending (june 28): $469,440\nweek 4 gain: +$1,980 (+0.42%)\ntrades: 5\nwins: 4\nlosses: 1\nwin rate: 80%\ndaily breakdown # mon jun 23: +$520 (1 trade, 100% wr)\ntue jun 24: +$680 (2 trades, 100% wr)\nwed jun 25: +$420 (1 trade, 100% wr)\nthu jun 26: -$140 (1 trade, loss)\nfri jun 27: +$500 (0 trades - carried position)\n5 trading days, 5 trades, 4 wins.\nmarket conditions # avg VIX: 16.2 (good)\navg correlation: 0.62 (acceptable)\navg volume: 3.1M contracts (low - summer)\navg slippage: 2.2 ticks (summer impact)\nconditions: acceptable for summer\nvolume decline expected.\ntrade distribution # options: 4 trades, +$1,620 (82% of gains)\nSPX: 3 trades, +$1,180\nQQQ: 1 trade, +$440\ncrypto: 1 trade, +$360 (18% of gains)\nBTC: 1 trade, +$360\nadjustment implemented: crypto 30%→20% allocation\nthe loss # thursday june 26:\nQQQ iron condor.\nshort put tested during afternoon sell-off.\nclosed for -$140 loss (smaller than usual).\nresult: loss management working.\nclosed early, didn\u0026rsquo;t let it run.\njune final numbers # week 1: +$2,680 (+0.58%)\nweek 2: +$2,340 (+0.51%)\nweek 3: +$2,180 (+0.47%)\nweek 4: +$1,980 (+0.42%)\njune total: +$9,180 (+1.99%)\njune target: +1.8% to +2.2%\nresult: TARGET HIT (mid-range)\ncomparing to target # realistic june outcomes (from may 31):\nnormal month: +1.5% to +2.5%\njune actual: +1.99%\nresult: solid mid-range performance\nexactly what sustainable trading looks like.\nytd update # jan: +$9,550 (+2.18%)\nfeb: +$8,920 (+1.99%)\nmar: -$9,582 (-2.10%)\napr: +$9,732 (+2.18%)\nmay: +$3,840 (+0.84%)\njun: +$9,180 (+1.99%)\nytd total: +$31,640 (+7.22%)\nannual pace: 14.4%\nvs target: 15-18%\nprogress: closing gap, almost in target range\nkelly sizing evaluation # 3 weeks of data:\nhigh-confidence setups: +14% larger positions\nmarginal setups: -9% smaller positions\nwin rate on high-confidence: 91%\nwin rate on marginal: 74%\nresult: position sizing working as designed\nwill continue into july.\ntonight (june 28, 2:16am) # week 4 june done. +$1,980 (+0.42%) across 5 trades. 80% win rate. june total +$9,180 (+1.99%) - TARGET HIT. all 4 weeks profitable. ytd +$31,640 (+7.22%), annual pace 14.4% (closing gap to 15-18% target). kelly sizing validated (3 weeks data). account $469,440. month-end wrap tomorrow.\n2:16am saturday. week 4 june. +$1,980 (+0.42%). june total +$9,180 (+1.99%) - target hit. 4/4 weeks profitable. ytd +$31,640 (+7.22%). annual pace 14.4% (vs target 15-18%). closing the gap. kelly sizing working. summer volume adjustments helping. month-end wrap tomorrow with full charts.\n-AK\n","date":"28 June 2025","externalUrl":null,"permalink":"/posts/2025-06-28-week-4-june-target-hit-strong-finish/","section":"Posts","summary":"\u003cp\u003eweek 4 june done.\u003c/p\u003e\n\u003cp\u003etarget hit.\u003c/p\u003e\n\u003cp\u003estrong finish.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 4 numbers \n    \u003cdiv id=\"week-4-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-4-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (june 23):\u003c/strong\u003e $467,460\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eending (june 28):\u003c/strong\u003e $469,440\u003c/p\u003e","title":"week 4 june - target hit, strong finish +$1,980","type":"posts"},{"content":"18 months with chicago colo.\ntime for ROI analysis.\nthe setup recap # december 2023: deployed chicago colo\nlocation: equinix CH3, chicago\nhardware: dell poweredge r640\nmonthly cost: $450 (server + network + power)\ninitial cost: $8,500 (server + setup + first/last)\nlatency improvement # before (san diego home):\nto CME: 42ms avg\nto IEX: 38ms avg\njitter: ±8ms\nafter (chicago colo):\nto CME: 1.2ms avg\nto IEX: 0.8ms avg\njitter: ±0.3ms\nimprovement:\nCME: 97% reduction\nIEX: 98% reduction\njitter: 96% reduction\nslippage analysis # 18 months of data:\nperiod avg slippage trades cost pre-colo (2023 H1) 3.2 ticks 180 $5,760 post-colo (2023 H2) 2.0 ticks 210 $4,200 2024 full year 2.1 ticks 520 $10,920 2025 YTD (6 mo) 2.0 ticks 280 $5,600 tick value: $12.50 (ES)\nslippage reduction: 1.2 ticks average\nannual savings: ~$6,240 on slippage alone\nfill quality improvement # before colo:\nfill rate: 89%\npartial fills: 18%\nrejected orders: 4%\nafter colo:\nfill rate: 97%\npartial fills: 6%\nrejected orders: 0.5%\nimprovement:\n+8% fill rate\n-12% partial fills\n-3.5% rejections\nROI calculation # costs (18 months):\ninitial setup: $8,500\nmonthly ($450 × 18): $8,100\ntotal cost: $16,600\nsavings (18 months):\nslippage savings: ~$9,360\nfill improvement (estimated): ~$4,200\navoided losses from rejections: ~$2,800\ntotal savings: ~$16,360\nROI: -1.4% (barely break-even)\nbut\u0026hellip;\nthe real value # ROI calculation misses:\n1. peace of mind\nno more worrying about home internet.\nno more reboots during trading.\n99.99% uptime guaranteed.\n2. consistency\nsame latency every day.\npredictable execution.\nno ISP variance.\n3. scalability\ncan add more strategies.\ncan increase position sizes.\ninfrastructure not limiting factor.\nlessons learned # what worked:\nequinix is reliable.\ndell hardware solid.\nremote management (iDRAC) essential.\nwhat i\u0026rsquo;d change:\nskip the fancy networking.\nbasic 1Gbps sufficient for my volume.\nsaved $100/month on 10Gbps i don\u0026rsquo;t use.\nunexpected costs:\nremote hands: $150/incident\npower spikes during high vol: +$30/month\nannual hardware maintenance: $200\ncurrent monitoring # # my colo monitoring setup class ColoMonitor: def __init__(self): self.prometheus_url = \u0026#34;http://colo:9090\u0026#34; self.alert_thresholds = { \u0026#39;latency_ms\u0026#39;: 5.0, \u0026#39;cpu_percent\u0026#39;: 80, \u0026#39;memory_percent\u0026#39;: 85, \u0026#39;disk_percent\u0026#39;: 90 } async def check_health(self): metrics = await self.fetch_metrics() alerts = [] if metrics[\u0026#39;latency\u0026#39;] \u0026gt; self.alert_thresholds[\u0026#39;latency_ms\u0026#39;]: alerts.append(f\u0026#34;High latency: {metrics[\u0026#39;latency\u0026#39;]:.1f}ms\u0026#34;) if metrics[\u0026#39;cpu\u0026#39;] \u0026gt; self.alert_thresholds[\u0026#39;cpu_percent\u0026#39;]: alerts.append(f\u0026#34;High CPU: {metrics[\u0026#39;cpu\u0026#39;]:.0f}%\u0026#34;) return alerts async def fetch_metrics(self): # prometheus queries queries = { \u0026#39;latency\u0026#39;: \u0026#39;histogram_quantile(0.95, cme_latency_seconds)\u0026#39;, \u0026#39;cpu\u0026#39;: \u0026#39;avg(cpu_usage_percent)\u0026#39;, \u0026#39;memory\u0026#39;: \u0026#39;memory_used_percent\u0026#39;, \u0026#39;disk\u0026#39;: \u0026#39;disk_used_percent\u0026#39; } # ... implementation would i do it again? # yes, but differently:\nstart with shared colo ($150/month).\nvalidate strategy works with low latency.\nupgrade to dedicated only if volume justifies.\nfor most algo traders:\nVPS in chicago/NY sufficient.\n$50-100/month.\n5-10ms latency good enough.\ndedicated colo overkill unless high volume.\nwho needs dedicated colo # need it if:\ntrading 500+ contracts/day latency-sensitive strategies (HFT-lite) regulatory requirements $500k+ account don\u0026rsquo;t need it if:\ntrading \u0026lt;100 contracts/day swing trading / longer holds \u0026lt;$100k account strategies not latency-sensitive tonight (june 26, 2:28am) # chicago colo 18-month ROI analysis. costs: $16,600 (setup + 18 months). savings: $16,360 (slippage + fills + avoided rejections). ROI: -1.4% (barely break-even on pure math). real value: peace of mind, consistency, scalability. latency improvement: 42ms→1.2ms (97% reduction). slippage improvement: 3.2→2.0 ticks. what i\u0026rsquo;d change: skip 10Gbps, basic 1Gbps sufficient. recommendation: most algo traders fine with VPS ($50-100/mo), dedicated colo overkill unless high volume.\n2:28am thursday. chicago colo 18-month analysis. equinix CH3, $450/month. latency 42ms→1.2ms. slippage 3.2→2.0 ticks. ROI barely break-even on paper, but peace of mind + consistency worth it. lessons: skip fancy networking (1Gbps sufficient), basic hardware reliable. recommendation: most traders use VPS first, dedicated only if 500+ contracts/day.\n-AK\n","date":"26 June 2025","externalUrl":null,"permalink":"/posts/2025-06-26-chicago-colo-18-months-roi-analysis/","section":"Posts","summary":"\u003cp\u003e18 months with chicago colo.\u003c/p\u003e\n\u003cp\u003etime for ROI analysis.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe setup recap \n    \u003cdiv id=\"the-setup-recap\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-setup-recap\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003edecember 2023:\u003c/strong\u003e deployed chicago colo\u003c/p\u003e","title":"chicago colocation 18 months - ROI analysis and lessons","type":"posts"},{"content":"use both backtrader and vectorbt.\nhere\u0026rsquo;s when to use each.\nquick verdict # backtrader: event-driven, realistic simulation, slower\nvectorbt: vectorized, fast parameter sweeps, less realistic\nmy usage: 60% vectorbt (research), 40% backtrader (validation)\nphilosophy difference # backtrader:\nsimulates real trading.\nprocesses bar by bar.\nhandles orders, fills, commissions realistically.\nvectorbt:\nmath on arrays.\ncalculates returns vectorized.\nspeed over simulation accuracy.\nspeed comparison # test: 5 years SPY data, simple MA crossover\nimport time # backtrader start = time.time() cerebro = bt.Cerebro() cerebro.addstrategy(MACrossover) cerebro.adddata(data) cerebro.run() bt_time = time.time() - start print(f\u0026#34;Backtrader: {bt_time:.2f}s\u0026#34;) # vectorbt start = time.time() fast_ma = vbt.MA.run(close, 10) slow_ma = vbt.MA.run(close, 50) entries = fast_ma.ma_crossed_above(slow_ma) exits = fast_ma.ma_crossed_below(slow_ma) pf = vbt.Portfolio.from_signals(close, entries, exits) vbt_time = time.time() - start print(f\u0026#34;VectorBT: {vbt_time:.2f}s\u0026#34;) results:\nbacktrader: 12.4 seconds\nvectorbt: 0.3 seconds\nvectorbt is 40x faster.\nparameter optimization # backtrader approach:\nimport backtrader as bt class MACrossover(bt.Strategy): params = ( (\u0026#39;fast\u0026#39;, 10), (\u0026#39;slow\u0026#39;, 50), ) def __init__(self): self.fast_ma = bt.indicators.SMA(period=self.p.fast) self.slow_ma = bt.indicators.SMA(period=self.p.slow) self.crossover = bt.indicators.CrossOver(self.fast_ma, self.slow_ma) def next(self): if self.crossover \u0026gt; 0: self.buy() elif self.crossover \u0026lt; 0: self.sell() # optimize (SLOW) cerebro = bt.Cerebro(optreturn=False) cerebro.optstrategy( MACrossover, fast=range(5, 30, 5), slow=range(30, 100, 10) ) cerebro.adddata(data) results = cerebro.run() # takes minutes vectorbt approach:\nimport vectorbt as vbt import numpy as np # parameter grid fast_periods = np.arange(5, 30, 5) slow_periods = np.arange(30, 100, 10) # vectorized optimization (FAST) fast_ma = vbt.MA.run(close, fast_periods, short_name=\u0026#39;fast\u0026#39;) slow_ma = vbt.MA.run(close, slow_periods, short_name=\u0026#39;slow\u0026#39;) # all parameter combinations at once entries = fast_ma.ma_crossed_above(slow_ma) exits = fast_ma.ma_crossed_below(slow_ma) pf = vbt.Portfolio.from_signals( close, entries, exits, freq=\u0026#39;1D\u0026#39; ) # heatmap of sharpe ratios sharpe_matrix = pf.sharpe_ratio().to_frame().unstack() print(sharpe_matrix) # takes seconds optimization speed:\nbacktrader: 8 minutes (42 parameter combinations)\nvectorbt: 4 seconds (same combinations)\nvectorbt is 120x faster for optimization.\nrealistic simulation # where backtrader wins:\nclass RealisticStrategy(bt.Strategy): def __init__(self): self.order = None def notify_order(self, order): # realistic order handling if order.status == order.Completed: if order.isbuy(): self.log(f\u0026#39;BUY: {order.executed.price:.2f}\u0026#39;) self.log(f\u0026#39;Commission: {order.executed.comm:.2f}\u0026#39;) else: self.log(f\u0026#39;SELL: {order.executed.price:.2f}\u0026#39;) def notify_trade(self, trade): if trade.isclosed: self.log(f\u0026#39;P\u0026amp;L: {trade.pnl:.2f}\u0026#39;) def next(self): # can\u0026#39;t enter if order pending if self.order: return # realistic entry logic if self.signal(): # limit order, not market self.order = self.buy( exectype=bt.Order.Limit, price=self.data.close[0] * 0.999, valid=bt.Order.DAY ) vectorbt can\u0026rsquo;t do:\norder types (limit, stop, etc.) partial fills realistic commission structures position-aware logic multi-asset portfolio rebalancing my workflow # phase 1: research (vectorbt)\nfast parameter sweeps.\nidentify promising ranges.\ndiscard obvious failures quickly.\n# quick research sweep params = np.arange(5, 100, 5) results = vbt.MA.run(close, params).ma_crossed_above( vbt.MA.run(close, params * 2) ) # find promising parameters in seconds phase 2: validation (backtrader)\nrealistic simulation.\nproper commission modeling.\nactual order flow.\n# validate promising params with realistic sim cerebro = bt.Cerebro() cerebro.addstrategy(Strategy, fast=15, slow=45) cerebro.broker.setcommission(commission=0.001) cerebro.adddata(data) results = cerebro.run() phase 3: live (custom)\nneither framework for live trading.\ncustom python + broker APIs.\ncode examples # vectorbt for options analysis:\nimport vectorbt as vbt import pandas as pd # options P\u0026amp;L analysis def options_backtest(underlying, strikes, expirations): results = [] for strike in strikes: for exp in expirations: # simplified put selling premium = calculate_premium(underlying, strike, exp) assignment_loss = (strike - underlying.shift(-exp)) * (underlying.shift(-exp) \u0026lt; strike) pnl = premium - assignment_loss.fillna(0) results.append({ \u0026#39;strike\u0026#39;: strike, \u0026#39;expiration\u0026#39;: exp, \u0026#39;total_pnl\u0026#39;: pnl.sum(), \u0026#39;sharpe\u0026#39;: pnl.mean() / pnl.std() * np.sqrt(252) }) return pd.DataFrame(results) backtrader for realistic options:\nclass PutSelling(bt.Strategy): def __init__(self): self.options_position = None def next(self): if self.options_position is None: # check IV rank if self.iv_rank() \u0026gt; 30: # sell put at 0.30 delta strike = self.calculate_strike(delta=0.30) premium = self.get_premium(strike) # realistic entry self.options_position = { \u0026#39;strike\u0026#39;: strike, \u0026#39;premium\u0026#39;: premium, \u0026#39;expiration\u0026#39;: self.next_monthly_exp() } self.broker.add_cash(premium * 100) else: # manage position if self.days_to_exp() \u0026lt;= 5: self.close_position() feature comparison # feature backtrader vectorbt speed slow very fast param optimization slow fast order types all basic commission models realistic basic live trading yes (some) no visualization basic excellent learning curve moderate steep documentation good good when to use which # use vectorbt when:\ninitial parameter research quick hypothesis testing large parameter sweeps visualization/analysis use backtrader when:\nfinal strategy validation realistic fill simulation complex order logic position-aware strategies resources # learned a lot from the NexusFi backtesting comparison thread - good discussion on different frameworks and their trade-offs. also the Battle of the Bots algo development thread has real-world examples.\nmy verdict # vectorbt: 9/10 for research\nbacktrader: 8/10 for validation\nworkflow: vectorbt first, backtrader to validate\nneither for live: custom code only\ntonight (june 24, 2:42am) # backtrader vs vectorbt deep comparison. vectorbt 40x faster for backtests, 120x faster for param optimization. backtrader more realistic (order types, commissions, fills). my workflow: vectorbt for research (60%), backtrader for validation (40%), custom for live. vectorbt 9/10 research, backtrader 8/10 validation. use both, neither for live trading.\n2:42am tuesday. backtesting framework comparison. vectorbt: 40x faster backtests, 120x faster optimization, excellent for research. backtrader: realistic simulation, proper order handling, better for validation. workflow: vectorbt research → backtrader validate → custom live. use both frameworks, each has strengths.\n-AK\n","date":"24 June 2025","externalUrl":null,"permalink":"/posts/2025-06-24-backtrader-vs-vectorbt-deep-comparison/","section":"Posts","summary":"\u003cp\u003euse both backtrader and vectorbt.\u003c/p\u003e\n\u003cp\u003ehere\u0026rsquo;s when to use each.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003equick verdict \n    \u003cdiv id=\"quick-verdict\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#quick-verdict\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003ebacktrader:\u003c/strong\u003e event-driven, realistic simulation, slower\u003c/p\u003e","title":"backtrader vs vectorbt - python backtesting framework deep comparison","type":"posts"},{"content":"","date":"24 June 2025","externalUrl":null,"permalink":"/tags/code/","section":"Tags","summary":"","title":"Code","type":"tags"},{"content":"week 3 june done.\napproaching target.\nweek 3 numbers # starting (june 16): $465,280\nending (june 22): $467,460\nweek 3 gain: +$2,180 (+0.47%)\ntrades: 6\nwins: 5\nlosses: 1\nwin rate: 83%\ndaily breakdown # mon jun 16: +$580 (1 trade, 100% wr)\ntue jun 17: +$420 (1 trade, 100% wr)\nwed jun 18: $0 (no trades - A\u0026rsquo;s birthday)\nthu jun 19: +$780 (2 trades, 100% wr)\nfri jun 20: +$400 (2 trades, 50% wr)\n4 active trading days, 6 trades, 5 wins.\nthe pause day # wednesday june 18:\nA\u0026rsquo;s birthday.\nspa day + dinner + present.\ndidn\u0026rsquo;t trade.\ndidn\u0026rsquo;t want to.\nworth it.\ntrading will always be there.\nbirthdays are once a year.\nmarket conditions # avg VIX: 15.8 (good)\navg correlation: 0.61 (acceptable)\navg volume: 3.3M contracts (slightly low)\navg slippage: 2.1 ticks (slightly higher)\nconditions: mostly favorable\nsome summer volume decline starting.\ntrade distribution # options: 4 trades, +$1,580 (72% of gains)\nSPX: 3 trades, +$1,180\nQQQ: 1 trade, +$400\ncrypto: 2 trades, +$600 (28% of gains)\nBTC: 1 trade, +$420\nETH: 1 trade, +$180\nthe loss # friday june 20:\nETH momentum trade.\nentered on breakout signal.\nfalse breakout, reversed.\nclosed for -$220 loss.\nlesson: summer crypto volume thin.\nreduce crypto size until fall.\njune progress # week 1: +$2,680 (+0.58%)\nweek 2: +$2,340 (+0.51%)\nweek 3: +$2,180 (+0.47%)\njune total: +$7,200 (+1.56%)\njune target: +1.8% to +2.2%\nremaining: +0.24% to +0.64% needed (1 week)\npace: on track, final push needed\nkelly sizing month 2 # new position sizing running 2 weeks now.\npreliminary results:\nhigh-confidence setups: +15% larger avg position\nmarginal setups: -10% smaller avg position\noverall: slightly better risk-adjusted returns\nstatistical significance: not yet (need 30+ trades)\ncontinuing evaluation.\nsummer trading adjustment # noticed this week:\nvolume declining.\nslippage increasing slightly.\ncrypto especially thin.\nadjustments for rest of june:\nreduce crypto allocation 30% → 20% slightly tighter entry criteria accept fewer trades summer = preservation mode.\ntonight (june 22, 2:24am) # week 3 june done. +$2,180 (+0.47%) across 6 trades. 83% win rate. options +$1,580, crypto +$600. wednesday pause for A\u0026rsquo;s birthday (worth it). one loss friday -$220 on ETH false breakout (summer crypto volume thin). june total +$7,200 (+1.56%). target +1.8-2.2%, need +0.24-0.64% more. summer adjustments: crypto 30%→20%, tighter entries. account $467,460.\n2:24am sunday. week 3 june. +$2,180 (+0.47%). 6 trades, 5 wins. one pause day (A\u0026rsquo;s birthday - worth it). june total +$7,200 (+1.56%). on track for target. summer volume declining, adjusting crypto allocation down. kelly sizing showing preliminary improvement. final week push needed.\n-AK\n","date":"22 June 2025","externalUrl":null,"permalink":"/posts/2025-06-22-week-3-june-review-approaching-target/","section":"Posts","summary":"\u003cp\u003eweek 3 june done.\u003c/p\u003e\n\u003cp\u003eapproaching target.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 3 numbers \n    \u003cdiv id=\"week-3-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-3-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (june 16):\u003c/strong\u003e $465,280\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eending (june 22):\u003c/strong\u003e $467,460\u003c/p\u003e","title":"week 3 june review - approaching target +$2,180","type":"posts"},{"content":"been asked about prop firms a lot lately.\nhere\u0026rsquo;s my honest take for algo traders specifically.\nmy situation # why i don\u0026rsquo;t use prop firms:\ninherited $2M.\ndon\u0026rsquo;t need their capital.\ndon\u0026rsquo;t want their rules.\nbut if i didn\u0026rsquo;t have capital\u0026hellip;\nprop firms would be worth considering.\nespecially for algo trading.\nthe prop firm area 2025 # major players:\napex trader funding topstep oneup trader leeloo trading bulenox what they offer:\npass evaluation → get funded account\nkeep 80-90% of profits\ntheir capital, your strategy\nalgo trading compatibility # the challenge:\nmost prop firms designed for discretionary traders.\nrules often conflict with algo execution.\nkey rule issues:\nnews trading restrictions many ban trading around major releases.\nalgos often run 24/7.\nconflict.\ndaily loss limits typical: 2-3% daily max\nalgos can hit this in volatile sessions.\nposition limits many cap contracts/shares.\nlimits scaling.\ntrailing drawdown some use trailing max drawdown.\nalgos hate this (compounds risk).\nwhich firms work for algos # apex trader funding:\nevaluation: $147/month for $50k account\nprofit split: 90%\nalgo-friendly: YES (explicitly allows)\ndaily loss limit: $2,500 on $50k\npros:\nallows automated trading reasonable rules fast payouts cons:\ntrailing drawdown need to pass evaluation first topstep:\nevaluation: $165/month for $50k account\nprofit split: 90%\nalgo-friendly: CONDITIONAL (must notify)\ndaily loss limit: $1,000 on $50k\npros:\nestablished reputation good support cons:\ntighter daily limits must inform about algo use may reject certain strategies oneup trader:\nevaluation: $125/month for $50k account\nprofit split: 90%\nalgo-friendly: YES\ndaily loss limit: $1,100 on $50k\npros:\nallows full automation competitive pricing no trailing drawdown cons:\nnewer than others less track record my recommendation framework # use prop firm if:\ncapital under $50k profitable backtest (1+ year) live track record (3+ months) can handle rule constraints don\u0026rsquo;t use prop firm if:\ncapital over $100k (use your own) strategies require high take advantage of can\u0026rsquo;t handle daily loss limits need full automation freedom evaluation strategy for algos # approach i\u0026rsquo;d use:\nreduce position size 50% during evaluation\nevaluation is about passing, not maximizing.\nconservative \u0026gt; aggressive.\nadd circuit breakers matching firm rules\nstop trading if approaching daily limit.\nresume next day.\navoid news events if restricted\npause algo during scheduled releases.\nresume after.\ntrack metrics firm cares about\nmax drawdown.\ndaily P\u0026amp;L.\nwinning percentage.\nthe math # example: $50k apex evaluation\nevaluation cost: $147/month\ntypical pass rate: ~15% (industry estimate)\nexpected cost to pass: $147 × 6 months = $882\nfunded account profit potential: $5k-$15k/year (conservative)\nROI: positive if you\u0026rsquo;re actually profitable\nreality check:\nmost people fail.\nbut most people aren\u0026rsquo;t running backtested algos.\nalgo traders have edge in evaluations.\ncode for prop firm rules # class PropFirmRiskManager: def __init__( self, daily_loss_limit: float, max_drawdown: float, trailing_drawdown: bool = False ): self.daily_loss_limit = daily_loss_limit self.max_drawdown = max_drawdown self.trailing_drawdown = trailing_drawdown self.daily_pnl = 0.0 self.peak_balance = 0.0 self.current_balance = 0.0 def update(self, pnl: float, balance: float): self.daily_pnl += pnl self.current_balance = balance if self.trailing_drawdown: self.peak_balance = max(self.peak_balance, balance) def can_trade(self) -\u0026gt; tuple[bool, str]: # daily loss check if self.daily_pnl \u0026lt;= -self.daily_loss_limit: return False, \u0026#34;daily_limit_hit\u0026#34; # drawdown check if self.trailing_drawdown: current_dd = (self.peak_balance - self.current_balance) / self.peak_balance if current_dd \u0026gt;= self.max_drawdown: return False, \u0026#34;max_drawdown_hit\u0026#34; return True, \u0026#34;ok\u0026#34; def reset_daily(self): self.daily_pnl = 0.0 community insights # the NexusFi funded trader discussion has good real-world experiences from traders who\u0026rsquo;ve passed evaluations and gotten funded. worth reading before committing money.\nalso check the funded trader platforms thread for current 2024-2025 comparisons.\nmy verdict # prop firms for algo traders:\nrating: 7/10\ngood for:\nundercapitalized algo traders strategy validation with real risk scaling without personal capital bad for:\nstrategies needing full flexibility high-frequency approaches anyone with sufficient capital if i were starting over with $10k:\ni\u0026rsquo;d run my algo on paper for 6 months.\nthen take apex or oneup evaluation.\nuse prop capital to scale to $50k+.\nthen transition to own capital as profits allow.\ntonight (june 20, 2:38am) # prop firm guide for algo traders. major players: apex (most algo-friendly), topstep (conditional), oneup (good alternative). key challenges: daily loss limits, trailing drawdown, news restrictions. recommendation: use if under $50k capital, profitable backtest, can handle rules. avoid if over $100k or need full flexibility. evaluation strategy: 50% position size, add circuit breakers, avoid restricted events. math works if actually profitable. algo traders have edge in evaluations vs discretionary.\n2:38am friday. prop firm evaluation guide for algo traders. apex most algo-friendly (90% split, allows automation). topstep conditional (must notify). oneup good alternative (no trailing DD). key: reduce size 50% during eval, add circuit breakers matching rules, avoid news if restricted. math: $882 avg cost to pass, $5k-15k/year potential. use if undercapitalized, avoid if over $100k or need flexibility. algo traders have edge.\n-AK\n","date":"20 June 2025","externalUrl":null,"permalink":"/posts/2025-06-20-prop-firm-evaluation-algo-traders-guide/","section":"Posts","summary":"\u003cp\u003ebeen asked about prop firms a lot lately.\u003c/p\u003e\n\u003cp\u003ehere\u0026rsquo;s my honest take for algo traders specifically.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003emy situation \n    \u003cdiv id=\"my-situation\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#my-situation\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003ewhy i don\u0026rsquo;t use prop firms:\u003c/strong\u003e\u003c/p\u003e","title":"prop firm evaluations for algo traders - honest guide 2025","type":"posts"},{"content":"","date":"20 June 2025","externalUrl":null,"permalink":"/tags/prop-firms/","section":"Tags","summary":"","title":"Prop-Firms","type":"tags"},{"content":"A. turned 24 today.\npulled off the surprise.\nthe plan # started planning 3 weeks ago.\nshe mentioned wanting a spa day \u0026ldquo;eventually.\u0026rdquo;\ni booked the nicest spa in la jolla.\nfull day package.\nmassage, facial, mani/pedi, lunch included.\nthen sunset dinner at her favorite restaurant.\nthe execution # 7am: woke her up with breakfast in bed\n8am: \u0026ldquo;get dressed, we\u0026rsquo;re going somewhere\u0026rdquo;\n8:30am: drove her to spa\nher reaction: \u0026ldquo;oh my god are you serious\u0026rdquo;\nmy response: \u0026ldquo;happy birthday wife\u0026rdquo;\nshe cried. good tears.\nwhile she was at spa # had 6 hours.\ncleaned the apartment (like actually cleaned).\nbought flowers.\nset up dinner reservation.\ngot her gift ready.\nthe gift:\ncustom necklace.\nour coordinates engraved.\nlatitude/longitude of the coffee shop where we met.\njune 13, 2023.\nla jolla, california.\n33.8573° N, 117.2527° W\npicking her up # 3pm: arrived at spa\nshe walked out glowing.\nrelaxed in a way i rarely see her.\n\u0026ldquo;that was the best day. i feel like a different person.\u0026rdquo;\nthe dinner # 6pm: sunset dinner reservation\nocean view.\nher favorite wine.\nthe necklace.\nher opening the gift:\nconfused at first.\n\u0026ldquo;what are these numbers?\u0026rdquo;\n\u0026ldquo;coordinates.\u0026rdquo;\n\u0026ldquo;coordinates to what?\u0026rdquo;\n\u0026ldquo;where we met.\u0026rdquo;\nmore crying.\ni\u0026rsquo;m getting good at making her cry (happy tears only).\nafter dinner # 9pm: home\nshe was tired from the spa.\ni figured we\u0026rsquo;d just sleep.\nher: \u0026ldquo;i\u0026rsquo;m not that tired.\u0026rdquo;\nplaces list: 54\nbirthday sex.\nshe was relaxed from the spa.\nit was different. slower. connected.\nbest birthday she\u0026rsquo;s ever had, she said.\nthe cost # spa day: $480\ndinner: $280\nnecklace: $340\ntotal: $1,100\nworth it?\nshe\u0026rsquo;s my wife.\nshe deserves everything.\none good trading day pays for this.\nno regrets.\ndr. r tomorrow # therapy session tomorrow.\nshe\u0026rsquo;ll ask about the birthday.\ni\u0026rsquo;ll tell her about the necklace.\nshe\u0026rsquo;ll probably say something about \u0026ldquo;thoughtful gestures indicating secure attachment.\u0026rdquo;\ni\u0026rsquo;ll say \u0026ldquo;or maybe i just love my wife.\u0026rdquo;\nsame thing probably.\ntonight (june 18, 11:52pm) # A\u0026rsquo;s 24th birthday. surprised her with full spa day ($480), sunset dinner ($280), custom necklace with coordinates where we met ($340). total $1,100. she cried three times (all happy). spa relaxed her completely. dinner ocean view, her favorite wine. places list 54 (birthday sex, slower, connected). one good trading day covers this. she deserves everything.\n11:52pm wednesday. A\u0026rsquo;s 24th birthday. full spa day surprise, sunset dinner, necklace with coordinates of coffee shop where we met (33.8573° N, 117.2527° W - la jolla june 13, 2023). she cried opening gift. total $1,100 (one trading day). places list 54. best birthday she\u0026rsquo;s ever had, she said.\n-AK\n","date":"18 June 2025","externalUrl":null,"permalink":"/posts/2025-06-18-a-birthday-surprise-planned/","section":"Posts","summary":"\u003cp\u003eA. turned 24 today.\u003c/p\u003e\n\u003cp\u003epulled off the surprise.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe plan \n    \u003cdiv id=\"the-plan\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-plan\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarted planning 3 weeks ago.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eshe mentioned wanting a spa day \u0026ldquo;eventually.\u0026rdquo;\u003c/p\u003e","title":"A's birthday surprise - spa day and sunset dinner","type":"posts"},{"content":"week 2 june done.\nconsistency continues.\nweek 2 numbers # starting (june 9): $462,940\nending (june 15): $465,280\nweek 2 gain: +$2,340 (+0.51%)\ntrades: 7\nwins: 6\nlosses: 1\nwin rate: 86%\ndaily breakdown # mon jun 9: +$680 (2 trades, 100% wr)\ntue jun 10: +$420 (1 trade, 100% wr)\nwed jun 11: +$840 (2 trades, 100% wr)\nthu jun 12: -$240 (1 trade, loss)\nfri jun 13: +$640 (1 trade, 100% wr)\n5 trading days, 7 trades, 6 wins.\nmarket conditions # avg VIX: 15.2 (excellent)\navg correlation: 0.59 (excellent)\navg volume: 3.4M contracts (normal)\navg slippage: 2.0 ticks (unchanged)\nconditions: favorable all week\ntrade distribution # options: 5 trades, +$1,820 (78% of gains)\nSPX: 3 trades, +$1,180\nQQQ: 2 trades, +$640\ncrypto: 2 trades, +$520 (22% of gains)\nBTC: 1 trade, +$340\nETH: 1 trade, +$180\nthe loss # thursday june 12:\nSPX iron condor.\nshort call wing tested.\nclosed early for -$240 loss.\nanalysis: entry timing issue, not strategy flaw.\nentered before economic data release.\nshould have waited.\njune progress # week 1: +$2,680 (+0.58%)\nweek 2: +$2,340 (+0.51%)\njune total: +$5,020 (+1.09%)\njune target: +1.8% to +2.2%\nremaining: +0.7% to +1.1% needed (2 weeks)\npace: on track\nkelly sizing update # deployed new kelly-based position sizing monday.\nresults:\naverage position size: +12% larger on high-confidence setups\naverage position size: -8% smaller on marginal setups\noverall risk-adjusted return improvement visible.\ntoo early for statistical significance.\nwill evaluate end of month.\ncomparing to may # may (partial month):\n9 trading days.\n+$3,840 (+0.84%).\n$427/day.\njune week 1-2 (10 trading days):\n10 trading days.\n+$5,020 (+1.09%).\n$502/day.\nimprovement: +18% daily efficiency\nfull month trading vs pause-heavy month.\ntonight (june 15, 2:18am) # week 2 june done. +$2,340 (+0.51%) across 7 trades. 86% win rate. options +$1,820, crypto +$520. one loss thursday -$240 on SPX condor (entry timing issue before data release). june total +$5,020 (+1.09%). june target +1.8-2.2%, need +0.7-1.1% more (on track). kelly sizing deployed, seeing +12% larger on high-confidence setups. account $465,280.\n2:18am sunday. week 2 june. +$2,340 (+0.51%). 7 trades, 6 wins. options dominated (+$1,820). june total +$5,020 (+1.09%). on track for +1.8-2.2% target. kelly sizing seeing preliminary results. comparing to may: +18% daily efficiency improvement (full month vs partial). 2-year anniversary with A. friday, good week personally and trading.\n-AK\n","date":"15 June 2025","externalUrl":null,"permalink":"/posts/2025-06-15-week-2-june-review-consistency-continues/","section":"Posts","summary":"\u003cp\u003eweek 2 june done.\u003c/p\u003e\n\u003cp\u003econsistency continues.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 2 numbers \n    \u003cdiv id=\"week-2-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-2-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (june 9):\u003c/strong\u003e $462,940\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eending (june 15):\u003c/strong\u003e $465,280\u003c/p\u003e","title":"week 2 june review - consistency continues +$2,340","type":"posts"},{"content":"2 years ago today.\njune 13, 2023.\ncoffee shop in la jolla.\nshe was coding a python data pipeline.\ni was the idiot who interrupted her.\nthe timeline # june 13, 2023: met at coffee shop\njune 16, 2023: first date\njune 23, 2023: first time together\nseptember 2023: exclusive\noctober 11, 2023: both said \u0026ldquo;i love you\u0026rdquo;\nnovember 1, 2023: she moved in\naugust 2024: engaged\nmay 10, 2025: married\njune 13, 2025: 2 years since we met\ntoday # took her back to that coffee shop.\nsame table she was sitting at.\nsame order (oat milk latte for her, black coffee for me).\nshe teared up when she realized what i was doing.\nthe conversation # me: \u0026ldquo;two years.\u0026rdquo;\nher: \u0026ldquo;two years ago you were a stranger who interrupted my work.\u0026rdquo;\nme: \u0026ldquo;technically you looked up first.\u0026rdquo;\nher: \u0026ldquo;because you were staring.\u0026rdquo;\nme: \u0026ldquo;because you were beautiful.\u0026rdquo;\nher: \u0026ldquo;that\u0026rsquo;s not what you said then.\u0026rdquo;\nme: \u0026ldquo;what did i say?\u0026rdquo;\nher: \u0026ldquo;you said \u0026lsquo;is that pandas?\u0026rsquo;\u0026rdquo;\nme: \u0026ldquo;\u0026hellip;technically i was looking at your screen.\u0026rdquo;\nher: \u0026ldquo;no you weren\u0026rsquo;t.\u0026rdquo;\nshe knows me too well.\nwhat i remember # her blonde hair.\ntyping fast, focused.\njupyter notebook open.\nthe way she looked annoyed when i approached.\nthen not annoyed.\nthen interested.\nwhat she remembers # \u0026ldquo;you were wearing a stupid cryptocurrency t-shirt.\u0026rdquo;\n\u0026ldquo;you had dark circles under your eyes.\u0026rdquo;\n\u0026ldquo;you asked about pandas and then couldn\u0026rsquo;t explain what you actually wanted.\u0026rdquo;\n\u0026ldquo;but you listened when i explained what i was working on.\u0026rdquo;\n\u0026ldquo;most guys would have walked away when i started talking about data pipelines.\u0026rdquo;\n\u0026ldquo;you stayed.\u0026rdquo;\n2 years of growth # me then:\n19 years old parents dead 6 months lost $80k trading no serious relationship since parents died emotional mess hiding behind cockiness me now:\n21 (turning 22 next month) parents dead 2.5 years (healed, mostly) profitable trader married still cocky, less messy her role:\nshe didn\u0026rsquo;t fix me.\nshe just stayed.\nlet me fall apart when i needed to.\nheld me when grief hit.\ndidn\u0026rsquo;t try to change me.\njust loved me.\ndinner tonight # took her to the restaurant from our first date.\nsame booth.\nsame wine (she picked it then, picked it again now).\ndifferent us.\nengaged then married.\ndating then permanent.\nplaces list update: 53\nrestaurant bathroom. her idea.\nshe likes anniversaries.\ndr. r this week # dr. r: \u0026ldquo;2-year anniversary of meeting A.\u0026rdquo;\nme: \u0026ldquo;yeah.\u0026rdquo;\ndr. r: \u0026ldquo;how does that feel?\u0026rdquo;\nme: \u0026ldquo;like i can\u0026rsquo;t imagine not meeting her.\u0026rdquo;\ndr. r: \u0026ldquo;that\u0026rsquo;s a big statement for someone who used to plan exit strategies for every relationship.\u0026rdquo;\nme: \u0026ldquo;\u0026hellip;\u0026rdquo;\ndr. r: \u0026ldquo;what changed?\u0026rdquo;\nme: \u0026ldquo;she didn\u0026rsquo;t chase. so i didn\u0026rsquo;t run.\u0026rdquo;\ndr. r: \u0026ldquo;secure attachment. we\u0026rsquo;ve discussed this.\u0026rdquo;\nme: \u0026ldquo;yeah well. turns out it\u0026rsquo;s real.\u0026rdquo;\ntonight (june 13, 11:45pm) # 2 years since meeting A. coffee shop la jolla, june 13, 2023. took her back to same table, same orders. she cried. dinner at first date restaurant, same booth, same wine. places list 53 (restaurant bathroom, her idea). timeline: met → first date (3 days) → together (10 days) → exclusive (3 months) → \u0026ldquo;i love you\u0026rdquo; (4 months) → moved in (5 months) → engaged (14 months) → married (23 months). she didn\u0026rsquo;t fix me, just loved me. therapy insight: secure attachment is real.\n11:45pm friday. 2-year anniversary of meeting A. june 13, 2023 coffee shop la jolla. she was coding pandas, i interrupted. took her back today, same table, same orders. dinner at first date restaurant. places list 53. me then: 19, grieving, lost $80k, emotional mess. me now: 21, healed, profitable, married. she didn\u0026rsquo;t fix me, just stayed. dr. r says secure attachment. turns out it\u0026rsquo;s real.\n-AK\n","date":"13 June 2025","externalUrl":null,"permalink":"/posts/2025-06-13-two-years-since-meeting-a-coffee-shop/","section":"Posts","summary":"\u003cp\u003e2 years ago today.\u003c/p\u003e\n\u003cp\u003ejune 13, 2023.\u003c/p\u003e\n\u003cp\u003ecoffee shop in la jolla.\u003c/p\u003e\n\u003cp\u003eshe was coding a python data pipeline.\u003c/p\u003e\n\u003cp\u003ei was the idiot who interrupted her.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe timeline \n    \u003cdiv id=\"the-timeline\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-timeline\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003ejune 13, 2023:\u003c/strong\u003e met at coffee shop\u003c/p\u003e","title":"two years since meeting A. - coffee shop anniversary","type":"posts"},{"content":"rebuilt my position sizing engine last weekend.\nkelly criterion with practical modifications.\nthe problem # old approach:\nfixed 2% risk per trade.\nsame size regardless of edge quality.\nleaving money on table on high-confidence setups.\nnew approach:\nkelly-based sizing adjusted by confidence.\nscale up on high-edge setups.\nscale down on marginal setups.\nkelly criterion basics # kelly % = (win_rate * avg_win - (1 - win_rate) * avg_loss) / avg_win example:\nwin rate: 65%\navg win: $500\navg loss: $300\nkelly = (0.65 * 500 - 0.35 * 300) / 500 = 0.44 = 44%\nproblem: 44% is way too aggressive.\npractical kelly uses fractional approach.\nmy implementation # import numpy as np from dataclasses import dataclass from typing import Optional @dataclass class TradeSetup: symbol: str direction: str # \u0026#39;long\u0026#39; or \u0026#39;short\u0026#39; entry_price: float stop_loss: float take_profit: float confidence: float # 0.0 to 1.0 strategy_win_rate: float strategy_avg_win: float strategy_avg_loss: float class KellyPositionSizer: def __init__( self, account_size: float, max_position_pct: float = 0.05, # 5% max kelly_fraction: float = 0.25, # quarter kelly min_position_pct: float = 0.005, # 0.5% min max_daily_risk: float = 0.02 # 2% daily max ): self.account_size = account_size self.max_position_pct = max_position_pct self.kelly_fraction = kelly_fraction self.min_position_pct = min_position_pct self.max_daily_risk = max_daily_risk self.daily_risk_used = 0.0 def calculate_kelly(self, setup: TradeSetup) -\u0026gt; float: \u0026#34;\u0026#34;\u0026#34;Calculate raw kelly percentage\u0026#34;\u0026#34;\u0026#34; p = setup.strategy_win_rate w = setup.strategy_avg_win l = setup.strategy_avg_loss if w \u0026lt;= 0 or l \u0026lt;= 0: return 0.0 kelly = (p * w - (1 - p) * l) / w # kelly can be negative (don\u0026#39;t trade) return max(0.0, kelly) def calculate_position_size( self, setup: TradeSetup, current_positions: int = 0 ) -\u0026gt; dict: \u0026#34;\u0026#34;\u0026#34;Calculate position size with all adjustments\u0026#34;\u0026#34;\u0026#34; # 1. raw kelly raw_kelly = self.calculate_kelly(setup) if raw_kelly \u0026lt;= 0: return { \u0026#39;shares\u0026#39;: 0, \u0026#39;dollars\u0026#39;: 0, \u0026#39;risk_pct\u0026#39;: 0, \u0026#39;reason\u0026#39;: \u0026#39;negative_edge\u0026#39; } # 2. apply fractional kelly fractional_kelly = raw_kelly * self.kelly_fraction # 3. confidence adjustment confidence_adjusted = fractional_kelly * setup.confidence # 4. position count adjustment (reduce size with more positions) position_factor = 1.0 / (1 + current_positions * 0.2) adjusted_pct = confidence_adjusted * position_factor # 5. apply bounds bounded_pct = np.clip( adjusted_pct, self.min_position_pct, self.max_position_pct ) # 6. daily risk check risk_per_trade = self._calculate_risk(setup, bounded_pct) remaining_daily_risk = self.max_daily_risk - self.daily_risk_used if risk_per_trade \u0026gt; remaining_daily_risk: # scale down to fit daily budget scale_factor = remaining_daily_risk / risk_per_trade bounded_pct *= scale_factor risk_per_trade = remaining_daily_risk # 7. calculate final values position_dollars = self.account_size * bounded_pct shares = int(position_dollars / setup.entry_price) return { \u0026#39;shares\u0026#39;: shares, \u0026#39;dollars\u0026#39;: shares * setup.entry_price, \u0026#39;risk_pct\u0026#39;: risk_per_trade, \u0026#39;position_pct\u0026#39;: bounded_pct, \u0026#39;raw_kelly\u0026#39;: raw_kelly, \u0026#39;confidence_factor\u0026#39;: setup.confidence, \u0026#39;reason\u0026#39;: \u0026#39;calculated\u0026#39; } def _calculate_risk(self, setup: TradeSetup, position_pct: float) -\u0026gt; float: \u0026#34;\u0026#34;\u0026#34;Calculate risk as percentage of account\u0026#34;\u0026#34;\u0026#34; position_value = self.account_size * position_pct risk_per_share = abs(setup.entry_price - setup.stop_loss) shares = position_value / setup.entry_price total_risk = shares * risk_per_share return total_risk / self.account_size def record_trade(self, risk_pct: float): \u0026#34;\u0026#34;\u0026#34;Record trade risk for daily tracking\u0026#34;\u0026#34;\u0026#34; self.daily_risk_used += risk_pct def reset_daily_risk(self): \u0026#34;\u0026#34;\u0026#34;Reset daily risk counter (call at market open)\u0026#34;\u0026#34;\u0026#34; self.daily_risk_used = 0.0 class VolatilityAdjustedSizer(KellyPositionSizer): \u0026#34;\u0026#34;\u0026#34;Kelly sizer with volatility adjustment\u0026#34;\u0026#34;\u0026#34; def __init__(self, *args, target_vol: float = 0.02, **kwargs): super().__init__(*args, **kwargs) self.target_vol = target_vol def calculate_position_size( self, setup: TradeSetup, current_vol: float, # current realized volatility current_positions: int = 0 ) -\u0026gt; dict: # get base kelly size base_result = super().calculate_position_size(setup, current_positions) if base_result[\u0026#39;shares\u0026#39;] == 0: return base_result # volatility adjustment vol_ratio = self.target_vol / current_vol if current_vol \u0026gt; 0 else 1.0 vol_adjusted_pct = base_result[\u0026#39;position_pct\u0026#39;] * vol_ratio # re-apply bounds after vol adjustment vol_adjusted_pct = np.clip( vol_adjusted_pct, self.min_position_pct, self.max_position_pct ) position_dollars = self.account_size * vol_adjusted_pct shares = int(position_dollars / setup.entry_price) return { **base_result, \u0026#39;shares\u0026#39;: shares, \u0026#39;dollars\u0026#39;: shares * setup.entry_price, \u0026#39;position_pct\u0026#39;: vol_adjusted_pct, \u0026#39;vol_adjustment\u0026#39;: vol_ratio } usage example # # initialize sizer sizer = VolatilityAdjustedSizer( account_size=460000, max_position_pct=0.05, kelly_fraction=0.25, target_vol=0.015 ) # define setup setup = TradeSetup( symbol=\u0026#39;SPX\u0026#39;, direction=\u0026#39;short\u0026#39;, entry_price=5850, stop_loss=5900, take_profit=5750, confidence=0.75, strategy_win_rate=0.68, strategy_avg_win=450, strategy_avg_loss=280 ) # calculate size result = sizer.calculate_position_size( setup, current_vol=0.012, current_positions=2 ) print(f\u0026#34;Position: ${result[\u0026#39;dollars\u0026#39;]:,.0f}\u0026#34;) print(f\u0026#34;Risk: {result[\u0026#39;risk_pct\u0026#39;]:.2%}\u0026#34;) print(f\u0026#34;Kelly raw: {result[\u0026#39;raw_kelly\u0026#39;]:.2%}\u0026#34;) backtest results # before (fixed 2%):\nsharpe: 1.42\nmax drawdown: -8.2%\nannual return: +16.4%\nafter (kelly-based):\nsharpe: 1.58\nmax drawdown: -7.1%\nannual return: +18.9%\nimprovement:\n+11% sharpe improvement.\n-13% drawdown reduction.\n+15% return improvement.\nkey insights # 1. quarter kelly is enough\nfull kelly too volatile.\nquarter kelly captures 75% of growth with much less variance.\n2. confidence matters\nnot all setups equal.\nhigh-confidence = larger size.\nmarginal setups = minimum size.\n3. volatility adjustment essential\nhigh vol = smaller positions.\nlow vol = larger positions.\nmaintains consistent risk.\n4. daily risk budget prevents disaster\n2% daily max.\ncan\u0026rsquo;t blow up in one day regardless of kelly calculation.\ntonight (june 10, 2:34am) # rebuilt position sizing with kelly criterion. quarter kelly + confidence adjustment + volatility scaling + daily risk budget. backtest improvement: sharpe 1.42→1.58 (+11%), max DD -8.2%→-7.1% (-13%), annual return +16.4%→+18.9% (+15%). key: quarter kelly captures 75% of growth with much less variance. confidence scaling on high-edge setups. vol adjustment maintains consistent risk.\n2:34am tuesday. kelly position sizing implementation. raw kelly too aggressive, using quarter kelly. confidence adjustment scales size by setup quality. vol adjustment maintains risk consistency. daily 2% budget prevents disasters. backtest: sharpe +11%, drawdown -13%, return +15%. deployed to live trading this week.\n-AK\n","date":"10 June 2025","externalUrl":null,"permalink":"/posts/2025-06-10-position-sizing-kelly-criterion-implementation/","section":"Posts","summary":"\u003cp\u003erebuilt my position sizing engine last weekend.\u003c/p\u003e\n\u003cp\u003ekelly criterion with practical modifications.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe problem \n    \u003cdiv id=\"the-problem\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-problem\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eold approach:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003efixed 2% risk per trade.\u003c/p\u003e","title":"position sizing with kelly criterion - python implementation","type":"posts"},{"content":"week 1 june done.\nstrong start.\nweek 1 numbers # starting (june 1): $460,260\nending (june 8): $462,940\nweek 1 gain: +$2,680 (+0.58%)\ntrades: 8\nwins: 7\nlosses: 1\nwin rate: 88%\ndaily breakdown # mon jun 2: +$1,240 (3 trades, 100% wr)\ntue jun 3: +$420 (1 trade, 100% wr)\nwed jun 4: +$680 (2 trades, 100% wr)\nthu jun 5: -$180 (1 trade, loss)\nfri jun 6: +$520 (1 trade, 100% wr)\n5 trading days, 8 trades, 7 wins.\nmarket conditions # avg VIX: 14.6 (excellent)\navg correlation: 0.57 (excellent)\navg volume: 3.5M contracts (normal)\navg slippage: 1.9 ticks (improved)\nconditions: favorable all week\nsummer trading settling in.\ntrade distribution # options: 6 trades, +$2,340 (87% of gains)\nSPX: 4 trades, +$1,680\nQQQ: 2 trades, +$660\ncrypto: 2 trades, +$340 (13% of gains)\nBTC: 1 trade, +$220\nETH: 1 trade, +$120\nfutures: 0 trades (skipped thin ES volume)\nthe loss # thursday june 5:\nQQQ put credit spread.\nentered at 0.82 delta short put.\nmarket dropped faster than expected.\nclosed for -$180 loss.\nlesson: 0.82 delta too aggressive in low VIX.\nadjustment: back to 0.85+ delta for june.\ncomparing to target # june week 1 target: +0.4% to +0.6%\njune week 1 actual: +0.58%\nresult: upper range hit\non pace for june target.\nroutine check # married life integration:\nbreakfast 10am together ✓\nwork hours maintained ✓\ngym 3x ✓\ndinner 7pm together ✓\ntrading review 11pm-2am ✓\nno friction between trading and marriage.\nroutine working.\ntonight (june 8, 2:22am) # week 1 june done. +$2,680 (+0.58%) across 8 trades. 88% win rate (7 wins, 1 loss). options +$2,340, crypto +$340. VIX 14.6 avg, correlation 0.57 (excellent). one loss thursday (-$180) on aggressive delta, adjusted back to 0.85+. on pace for june target +1.8-2.2%. account $462,940. routine integrated with married life.\n2:22am sunday. week 1 june review. +$2,680 (+0.58%). 8 trades, 7 wins, 1 loss. options dominated (+$2,340), crypto contribution (+$340). conditions excellent (VIX 14.6, corr 0.57, slippage 1.9 ticks). thursday loss -$180 on 0.82 delta put spread, adjusted to 0.85+ going forward. on target pace. married routine working.\n-AK\n","date":"8 June 2025","externalUrl":null,"permalink":"/posts/2025-06-08-week-1-june-review-strong-start/","section":"Posts","summary":"\u003cp\u003eweek 1 june done.\u003c/p\u003e\n\u003cp\u003estrong start.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 1 numbers \n    \u003cdiv id=\"week-1-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-1-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (june 1):\u003c/strong\u003e $460,260\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eending (june 8):\u003c/strong\u003e $462,940\u003c/p\u003e","title":"week 1 june review - strong start +$2,680","type":"posts"},{"content":"been using thetadata for 8 months now.\nhere\u0026rsquo;s the real review for options algo traders.\nwhat is thetadata # options-focused market data provider.\nspecializes in:\nreal-time options greeks historical options data end-of-day snapshots intraday tick data why i switched # before (polygon.io only):\ngood for stocks/futures.\noptions data limited.\ngreeks calculation: DIY.\nafter (thetadata + polygon):\npolygon for stocks/futures.\nthetadata for options greeks.\npre-calculated IV, delta, gamma, theta, vega.\npricing # thetadata plans:\nstandard: $30/month (end-of-day only)\npro: $100/month (real-time + historical)\nenterprise: custom pricing\nmy plan: pro ($100/month)\nvalue: saves 10+ hours/month calculating greeks myself.\n$100/month = $10/hour for saved time.\nworth it.\npython integration # from thetadata import ThetaClient client = ThetaClient(username=\u0026#34;your_user\u0026#34;, passwd=\u0026#34;your_pass\u0026#34;) # get real-time greeks with client.connect(): greeks = client.get_opt_greeks( root=\u0026#34;SPX\u0026#34;, exp=\u0026#34;2025-06-20\u0026#34;, strike=5800, right=\u0026#34;C\u0026#34; ) print(f\u0026#34;Delta: {greeks[\u0026#39;delta\u0026#39;]}\u0026#34;) print(f\u0026#34;Gamma: {greeks[\u0026#39;gamma\u0026#39;]}\u0026#34;) print(f\u0026#34;Theta: {greeks[\u0026#39;theta\u0026#39;]}\u0026#34;) print(f\u0026#34;Vega: {greeks[\u0026#39;vega\u0026#39;]}\u0026#34;) print(f\u0026#34;IV: {greeks[\u0026#39;implied_volatility\u0026#39;]}\u0026#34;) clean API. well documented.\ngreeks accuracy # my testing (vs calculated):\ngreek thetadata my calc diff delta 0.4521 0.4518 0.07% gamma 0.0089 0.0088 1.14% theta -2.34 -2.31 1.30% vega 12.45 12.42 0.24% IV 18.2% 18.1% 0.55% accuracy: excellent\ndifferences within acceptable tolerance.\nhistorical data quality # coverage:\nSPX options: 2010+ ETF options: 2012+ equity options: 2015+ granularity:\nend-of-day: included in standard 1-minute: pro plan tick data: enterprise my use case:\nbacktesting options strategies 2020-2025.\n5 years of greeks data.\ncritical for volatility research.\nbulk data retrieval # import pandas as pd from thetadata import ThetaClient client = ThetaClient(username=\u0026#34;user\u0026#34;, passwd=\u0026#34;pass\u0026#34;) with client.connect(): # get all SPX options for expiration chain = client.get_opt_chain( root=\u0026#34;SPX\u0026#34;, exp=\u0026#34;2025-06-20\u0026#34; ) df = pd.DataFrame(chain) print(f\u0026#34;Options in chain: {len(df)}\u0026#34;) print(f\u0026#34;Strikes: {df[\u0026#39;strike\u0026#39;].nunique()}\u0026#34;) speed: ~500 options/second\nfast enough for real-time chain scanning.\ncomparing to alternatives # feature thetadata polygon CBOE livevol price $100/mo $200/mo $500/mo greeks pre-calc DIY pre-calc latency 50ms 30ms 20ms history 15 years 5 years 20 years API quality excellent good good winner for options: thetadata (best value)\nwinner for stocks: polygon (better latency)\nintegration with my stack # # my options data pipeline class OptionsDataManager: def __init__(self): self.theta = ThetaClient(username=THETA_USER, passwd=THETA_PASS) self.polygon = PolygonClient(api_key=POLYGON_KEY) def get_option_data(self, symbol, expiry, strike, right): \u0026#34;\u0026#34;\u0026#34;Get complete option data from both sources\u0026#34;\u0026#34;\u0026#34; with self.theta.connect(): greeks = self.theta.get_opt_greeks( root=symbol, exp=expiry, strike=strike, right=right ) # polygon for underlying price underlying = self.polygon.get_snapshot(symbol) return { \u0026#39;greeks\u0026#39;: greeks, \u0026#39;underlying_price\u0026#39;: underlying[\u0026#39;price\u0026#39;], \u0026#39;underlying_volume\u0026#39;: underlying[\u0026#39;volume\u0026#39;] } thetadata + polygon = complete options data stack.\nwhat i use it for # 1. delta-neutral positioning:\nreal-time delta tracking across portfolio.\nautomated rebalancing triggers.\n2. volatility analysis:\nIV rank calculations.\nterm structure analysis.\nskew monitoring.\n3. backtesting:\nhistorical greeks for strategy testing.\nIV percentile backtests.\ntheta decay modeling.\nlimitations # cons:\nno futures options (CME only via separate feed) websocket stability issues occasionally documentation could be better organized workarounds:\nuse polygon for ES/NQ futures data implement reconnection logic join their discord for support real-world performance # my options strategy results (thetadata-powered):\n2024: +$28,400 options P\u0026amp;L\n2025 YTD: +$14,200 options P\u0026amp;L\nattribution:\nbetter greeks data = better entry timing.\nIV percentile filters = fewer bad trades.\nreal-time delta = faster hedging.\nrecommendation # who should use thetadata:\noptions algo traders (essential) volatility researchers anyone selling premium who shouldn\u0026rsquo;t:\nstock-only traders (polygon better) futures traders (not their focus) casual investors (overkill) the NexusFi historical options data discussion has good comparison of options data providers if you\u0026rsquo;re evaluating alternatives.\nfinal verdict # thetadata: 8.5/10\npros:\npre-calculated greeks (huge time saver) excellent historical coverage reasonable pricing ($100/mo) clean python API cons:\noccasional websocket issues no futures options documentation gaps my allocation: 100% of options data budget\ntonight (june 5, 2:45am) # thetadata review. been using 8 months for options greeks. $100/month pro plan. pre-calculated delta, gamma, theta, vega, IV. accuracy within 1% of my calculations. 15 years historical data. 500 options/second bulk retrieval. comparing: thetadata best value for options, polygon better for stocks. integration with my stack working well. 2025 ytd +$14,200 options P\u0026amp;L powered by better greeks data. recommendation: essential for options algo traders.\n2:45am thursday. thetadata 8-month review. options greeks data provider. $100/mo pro plan worth it (saves 10+ hrs/mo calculating greeks). accuracy excellent (\u0026lt;1.5% diff vs manual calc). historical coverage 2010+. clean python API. comparing: thetadata for options, polygon for stocks, CBOE livevol overpriced. options strategy P\u0026amp;L: 2024 +$28,400, 2025 ytd +$14,200. essential for options algo trading.\n-AK\n","date":"5 June 2025","externalUrl":null,"permalink":"/posts/2025-06-05-thetadata-options-greeks-review-algo-trader/","section":"Posts","summary":"\u003cp\u003ebeen using thetadata for 8 months now.\u003c/p\u003e\n\u003cp\u003ehere\u0026rsquo;s the real review for options algo traders.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ewhat is thetadata \n    \u003cdiv id=\"what-is-thetadata\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#what-is-thetadata\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003eoptions-focused market data provider.\u003c/p\u003e","title":"thetadata review - options greeks data for algo trading","type":"posts"},{"content":"june starts.\nfirst full trading month since wedding.\nno pauses planned.\nmonday june 2 (day 1) # trades: 3\nresult: +$1,240\nwin rate: 100%\nbreakdown:\nSPX put credit spread: +$680\nQQQ iron condor: +$340\nBTC momentum: +$220\nall three hit targets.\nclean start to june.\nmarket conditions # VIX: 14.8 (excellent, optimal range)\ncorrelation: 0.58 (excellent diversification)\nvolume: 3.6M contracts (normal)\nregime stability: 0.78 (very stable)\nconditions: favorable\npost-memorial day volume normalized.\nsummer trading beginning.\ncomparing to may restart # may restart (week 3):\ngradual ramp 50% → 75% → 100%.\n19-day break before.\ncautious execution.\njune start:\nfull size immediately.\nonly 12 days since last trade.\nconfidence maintained.\njune outlook # trading:\nfull month (21 trading days).\nno planned pauses.\nnormal allocation.\nrealistic june outcomes:\nnormal month: +1.5% to +2.5% ($6,900 to $11,500)\nimpressive month: +2.5% to +3.0% ($11,500 to $13,800)\nflat month: +0.5% to +1.0% ($2,300 to $4,600)\ntarget: +1.8% to +2.2%\nytd context # jan: +$9,550 (+2.18%)\nfeb: +$8,920 (+1.99%)\nmar: -$9,582 (-2.10%)\napr: +$9,732 (+2.18%)\nmay: +$3,840 (+0.84%)\nytd: +$22,460 (+5.13%)\nannual pace: 12.3%\nvs target: 15-18%\nneed strong june to close gap.\ntonight (june 2, 2:18am) # june starts. first full month since wedding. day 1: +$1,240 across 3 trades, 100% win rate. SPX +$680, QQQ +$340, BTC +$220. VIX 14.8, correlation 0.58, volume 3.6M (excellent conditions). full size immediately (no ramp needed). june target +1.8-2.2%. ytd +$22,460 (+5.13%), need strong june to close gap toward 15-18% annual. account $461,500.\n2:18am monday. june day 1. +$1,240 across 3 trades. all winners. SPX put spread +$680, QQQ condor +$340, BTC momentum +$220. conditions excellent (VIX 14.8, corr 0.58). full size trading resumed. june target +1.8-2.2%. first full month married, no pauses planned.\n-AK\n","date":"2 June 2025","externalUrl":null,"permalink":"/posts/2025-06-02-week-1-june-first-full-month-married/","section":"Posts","summary":"\u003cp\u003ejune starts.\u003c/p\u003e\n\u003cp\u003efirst full trading month since wedding.\u003c/p\u003e\n\u003cp\u003eno pauses planned.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003emonday june 2 (day 1) \n    \u003cdiv id=\"monday-june-2-day-1\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#monday-june-2-day-1\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003etrades:\u003c/strong\u003e 3\u003c/p\u003e","title":"week 1 june - first full trading month since wedding","type":"posts"},{"content":"may done.\nfirst month married.\nmodest gains given pause.\nmay final numbers # starting (may 1): $456,420\nending (may 31): $460,260\nmay gain: +$3,840 (+0.84%)\ntrades: 21\nwins: 18\nlosses: 3\nwin rate: 86%\ntrading days: 9 (vs typical 21)\npause days: 12 (wedding + honeymoon)\nFigure 1: May performance with 12-day wedding/honeymoon pause. May 1-19: zero trading (wedding prep, ceremony, honeymoon). May 20-25 (week 1 return): +$2,340 across 13 trades, 85% win rate, gradual size ramp 50%→75%→100%. May 27-31 (week 2+): +$1,500 across 8 trades, 88% win rate, full size operations. Total +$3,840 (+0.84%) in just 9 trading days. Effective daily rate +$427/day (vs typical +$380/day). Higher efficiency during limited trading window.\nweekly breakdown # week 1-2 (may 1-18): $0 (paused - wedding/honeymoon)\nweek 3 (may 19-25): +$2,340, 85% wr, 13 trades\nweek 4 (may 26-31): +$1,500, 88% wr, 8 trades\nall active weeks profitable.\nhigher efficiency when trading.\nthe pause impact # opportunity cost analysis:\ntypical may performance: +$7,000-$9,000 (full month)\nactual may performance: +$3,840 (9 days)\nopportunity cost: ~$4,000-$5,000\nworth it?\ngot married.\nhoneymoon in maui.\nplaces list +5.\nabsolutely.\ncomparing to target # may realistic outcomes (with 12-day pause):\npause-heavy month: -0.5% to +1.0%\nmay actual: +0.84%\nresult: mid-range hit\nright where expected given pause.\nFigure 2: May vs April comparison showing pause impact. April: full month, 24 trades, +$9,732 (+2.18%). May: 9 days active, 21 trades, +$3,840 (+0.84%). Daily avg: April $405/day vs May $427/day (May higher efficiency). Win rate: April 83% vs May 86% (May higher selectivity). VIX: April avg 16.7 vs May avg 15.8 (May slightly better). Correlation: April 0.60 vs May 0.59 (May slightly better). May conditions favorable but limited trading window.\nmarket conditions may # avg VIX: 15.8 (excellent, optimal 13-18)\navg correlation: 0.59 (excellent \u0026lt;0.65)\navg volume: 3.5M contracts (normal)\navg regime stability: 0.76 (very stable)\nslippage: 2.0 ticks (unchanged from april)\nconditions favorable entire month.\nirony: best conditions during pause period.\ntrade distribution # options: 15 trades, +$2,820 (73% of gains)\nSPX: 10 trades, +$1,840\nQQQ: 5 trades, +$980\ncrypto: 6 trades, +$1,020 (27% of gains)\nBTC: 4 trades, +$680\nETH: 2 trades, +$340\nfutures: 0 trades (memorial day thin volume skip)\nallocation: 73% options, 27% crypto, 0% futures\nefficiency analysis # trades per active day: 2.3 (vs typical 1.5)\ngain per active day: $427 (vs typical $380)\nwin rate: 86% (vs ytd avg 78%)\nmore selective = more efficient.\nfewer opportunities → better setup selection.\ncircuit breaker performance # triggered: 0 times\nclose calls: 0 times\nlargest loss: -$280 (may 28 QQQ)\ncapital preservation: excellent\nno issues during return ramp.\nytd performance update # jan: +$9,550 (+2.18%)\nfeb: +$8,920 (+1.99%)\nmar: -$9,582 (-2.10%)\napr: +$9,732 (+2.18%)\nmay: +$3,840 (+0.84%)\nytd total: +$22,460 (+5.13%)\nannual pace: 12.3%\nvs target: 15-18%\nFigure 3: YTD 2025 performance trajectory through May. January +2.18% (strong start). February +1.99% (sustained). March -2.10% (regime shift losing month). April +2.18% (full recovery). May +0.84% (wedding pause, limited days). Cumulative YTD +5.13%. Annual pace 12.3% (below 15-18% target). Pattern: 4 winning months, 1 losing month = 80% monthly win rate. May drag expected due to wedding. June full month should restore pace. Account $460,260. Started year $437,800.\nlessons from may # 1. planned pause = smart pause\nproactive shutdown may 1.\ncapital protected during wedding/honeymoon.\nno monitoring stress during life events.\n2. gradual ramp works\n50% → 75% → 100% over 4 days.\nno surprises after 19-day break.\nsystem validated before full size.\n3. selectivity improves efficiency\nfewer days → more selective.\n86% win rate (highest month).\nquality \u0026gt; quantity.\n4. marriage didn\u0026rsquo;t affect trading\nsame routine post-honeymoon.\nsame performance metrics.\nrelationship and trading both sustainable.\n5. opportunity cost acceptable\n$4-5k missed gains vs wedding + honeymoon.\nno regrets.\nlife events \u0026gt; trading sometimes.\nlife update - married month 1 # wedding may 10: best day ever\nhoneymoon may 11-18: maui, 7 days, places list +5\nplaces list total: 52\nroutine established:\nbreakfast 10am.\nwork together (she codes, i trade).\ngym 6pm (3x/week).\ndinner 7pm.\nmarriage adjustment:\nnothing changed, everything changed.\npermanent settledness.\nanxiety gone.\njune preview # trading:\nfull month (no pauses planned).\nconditions favorable (VIX stable).\nrealistic june outcomes:\nnormal month: +1.5% to +2.5% ($6,900 to $11,500)\nflat month: +0.5% to +1.0% ($2,300 to $4,600)\ntarget: +1.8% to +2.2%\npersonal:\nfirst full month married.\nroutine locked.\nA\u0026rsquo;s birthday june 18 (planning surprise).\ntonight (may 31, 11:52pm) # may done.\n+$3,840 (+0.84%).\n86% win rate across 21 trades.\n12 days paused (wedding + honeymoon).\n9 trading days, $427/day efficiency.\noptions +$2,820, crypto +$1,020.\nVIX 15.8 avg, correlation 0.59 (excellent conditions).\nytd +$22,460 (+5.13%), annual pace 12.3%.\naccount $460,260.\nfirst month married.\nroutine established.\nno regrets about pause.\n11:52pm saturday. may wrap. +$3,840 (+0.84%) across 21 trades, 86% win rate. 12 days paused (wedding may 10, honeymoon may 11-18). 9 trading days only. week 3 return +$2,340, week 4 +$1,500. efficiency $427/day (vs typical $380). options +$2,820, crypto +$1,020. conditions excellent (VIX 15.8, corr 0.59). ytd +$22,460 (+5.13%), annual pace 12.3%. account $460,260. first month married, routine established, places list 52. june target +1.8-2.2% full month.\n-AK\n","date":"31 May 2025","externalUrl":null,"permalink":"/posts/2025-05-31-may-wrap-first-month-married-modest-gains/","section":"Posts","summary":"\u003cp\u003emay done.\u003c/p\u003e\n\u003cp\u003efirst month married.\u003c/p\u003e\n\u003cp\u003emodest gains given pause.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003emay final numbers \n    \u003cdiv id=\"may-final-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#may-final-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (may 1):\u003c/strong\u003e $456,420\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eending (may 31):\u003c/strong\u003e $460,260\u003c/p\u003e","title":"may wrap - first month married, +0.84% modest gains, 12 days paused","type":"posts"},{"content":"3 weeks married.\nobservations from the other side.\nwhat changed # legally: everything\nmarried filing jointly.\nbeneficiary updates.\nemergency contact: wife.\npractically: nothing\nsame apartment.\nsame routine.\nsame person.\nemotionally: something subtle\nhard to explain.\nthere\u0026rsquo;s a permanence now.\na settledness.\ni\u0026rsquo;m not going anywhere.\nshe\u0026rsquo;s not going anywhere.\nwe both know it.\ntherapy this week # dr. r: \u0026ldquo;how\u0026rsquo;s married life?\u0026rdquo;\nme: \u0026ldquo;same but different.\u0026rdquo;\ndr. r: \u0026ldquo;explain.\u0026rdquo;\nme: \u0026ldquo;like\u0026hellip; the anxiety is gone. the \u0026lsquo;what if she leaves\u0026rsquo; anxiety. it\u0026rsquo;s just\u0026hellip; quiet now.\u0026rdquo;\ndr. r: \u0026ldquo;that\u0026rsquo;s secure attachment.\u0026rdquo;\nme: \u0026ldquo;you\u0026rsquo;ve been saying that for 2 years.\u0026rdquo;\ndr. r: \u0026ldquo;and now you believe it.\u0026rdquo;\nme: \u0026ldquo;yeah. i do.\u0026rdquo;\nsex life update # places list: 52 (post-honeymoon)\nfrequency: 5-6x per week (same as before)\nquality: if anything, better\nwhy better:\nno performance anxiety.\nno \u0026lsquo;what if this is the last time\u0026rsquo; fear.\njust us, enjoying each other.\nA. last night:\n\u0026ldquo;i like married sex.\u0026rdquo;\n\u0026ldquo;how\u0026rsquo;s it different?\u0026rdquo;\n\u0026ldquo;it\u0026rsquo;s not. that\u0026rsquo;s what i like about it. nothing changed.\u0026rdquo;\nthe small things # ring adjustment:\nstill not used to feeling on finger.\ncatch myself looking at it.\nstill surprises me.\nname adjustment:\nshe kept her name (her choice, i support).\nbut people call her \u0026ldquo;mrs. [my last name]\u0026rdquo; anyway.\nshe corrects them. politely.\nmail adjustment:\nstill getting wedding gifts.\nher mom forwarding mail.\nthank you notes never ending.\nroutine established # weekdays:\n9am: wake up\n10am: breakfast together\n10:30am-5pm: work (she codes, i trade)\n6pm: gym together (3x/week)\n7pm: dinner together\n8pm-11pm: whatever (TV, reading, sex)\n11pm-2am: my trading review time (she sleeps)\nweekends:\nsleep in.\nbrunch out.\nwhatever we feel like.\nmarried life is boring.\nin the best way.\nA\u0026rsquo;s family observation # her mom (phone call tuesday):\n\u0026ldquo;you two seem happy.\u0026rdquo;\n\u0026ldquo;we are.\u0026rdquo;\n\u0026ldquo;i can tell. A. sounds different.\u0026rdquo;\n\u0026ldquo;different how?\u0026rdquo;\n\u0026ldquo;settled. like she finally landed.\u0026rdquo;\nwhat i was scared of # before wedding:\nbecoming my parents.\nfighting constantly.\ngrowing apart.\n3 weeks in:\nnone of that.\njust\u0026hellip; partnership.\ntoo early to celebrate.\nbut good signs.\ntonight (may 29, 11:48pm) # 3 weeks married. legally everything changed (beneficiary, emergency contact, taxes). practically nothing changed (same apartment, routine, person). emotionally: permanent settledness, anxiety gone. therapy: dr. r says i finally believe in secure attachment. places list 52 (honeymoon additions). sex 5-6x/week, quality better (no anxiety). routine established: breakfast 10am, work, gym, dinner 7pm. her mom says A. sounds settled. scared of becoming parents, so far just partnership. good signs.\n11:48pm thursday. 3 weeks married observations. legal: everything changed. practical: nothing changed. emotional: subtle permanence, anxiety gone. therapy insight: finally believe in secure attachment. places list 52. sex better (no performance anxiety). routine: breakfast 10am, work, gym, dinner 7pm. her mom says A. sounds settled. too early to celebrate but good signs.\n-AK\n","date":"29 May 2025","externalUrl":null,"permalink":"/posts/2025-05-29-three-weeks-married-observations/","section":"Posts","summary":"\u003cp\u003e3 weeks married.\u003c/p\u003e\n\u003cp\u003eobservations from the other side.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ewhat changed \n    \u003cdiv id=\"what-changed\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#what-changed\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003elegally:\u003c/strong\u003e everything\u003c/p\u003e\n\u003cp\u003emarried filing jointly.\u003c/p\u003e\n\u003cp\u003ebeneficiary updates.\u003c/p\u003e","title":"three weeks married - observations from the other side","type":"posts"},{"content":"","date":"29 May 2025","externalUrl":null,"permalink":"/tags/wedding/","section":"Tags","summary":"","title":"Wedding","type":"tags"},{"content":"been using both for 2+ years.\nhere\u0026rsquo;s when to use each.\nquick verdict # vectorbt: fast parameter sweeps, simple strategies\nbacktrader: complex strategies, event-driven logic\nmy usage: 70% vectorbt, 30% backtrader\nspeed comparison # test: 5 years of daily data, moving average crossover\nimport vectorbt as vbt import pandas as pd import time # vectorbt approach start = time.time() price = vbt.YFData.download(\u0026#34;SPY\u0026#34;, start=\u0026#34;2020-01-01\u0026#34;, end=\u0026#34;2025-01-01\u0026#34;).get(\u0026#34;Close\u0026#34;) fast_ma = vbt.MA.run(price, [10, 20, 30, 40, 50]) slow_ma = vbt.MA.run(price, [50, 100, 150, 200]) entries = fast_ma.ma_crossed_above(slow_ma) exits = fast_ma.ma_crossed_below(slow_ma) pf = vbt.Portfolio.from_signals(price, entries, exits) print(f\u0026#34;VectorBT: {time.time() - start:.2f}s\u0026#34;) # VectorBT: 0.42s for 20 parameter combinations import backtrader as bt import time class MACrossover(bt.Strategy): params = ((\u0026#39;fast\u0026#39;, 10), (\u0026#39;slow\u0026#39;, 50)) def __init__(self): self.fast_ma = bt.ind.SMA(period=self.p.fast) self.slow_ma = bt.ind.SMA(period=self.p.slow) self.crossover = bt.ind.CrossOver(self.fast_ma, self.slow_ma) def next(self): if self.crossover \u0026gt; 0: self.buy() elif self.crossover \u0026lt; 0: self.sell() start = time.time() for fast in [10, 20, 30, 40, 50]: for slow in [50, 100, 150, 200]: cerebro = bt.Cerebro() cerebro.addstrategy(MACrossover, fast=fast, slow=slow) # ... data feeding, run print(f\u0026#34;Backtrader: {time.time() - start:.2f}s\u0026#34;) # Backtrader: 8.7s for 20 parameter combinations winner: vectorbt (20x faster for parameter sweeps)\nfeature comparison # feature vectorbt backtrader speed very fast slow parameter optimization excellent manual loops complex order logic limited excellent multi-timeframe awkward native portfolio simulation basic advanced indicators library 50+ 100+ broker integration no yes live trading no yes learning curve moderate steep when to use vectorbt # parameter optimization:\n# test 1000 parameter combinations in seconds import vectorbt as vbt import numpy as np price = vbt.YFData.download(\u0026#34;SPY\u0026#34;).get(\u0026#34;Close\u0026#34;) # create parameter grid fast_windows = np.arange(5, 50, 5) slow_windows = np.arange(50, 200, 10) fast_ma, slow_ma = vbt.MA.run_combs( price, window=fast_windows, r=2, # combinations of 2 short_names=[\u0026#39;fast\u0026#39;, \u0026#39;slow\u0026#39;] ) entries = fast_ma.ma_crossed_above(slow_ma) exits = fast_ma.ma_crossed_below(slow_ma) pf = vbt.Portfolio.from_signals(price, entries, exits) # get best parameters instantly print(pf.sharpe_ratio().idxmax()) quick strategy validation:\n# validate idea in 5 lines rsi = vbt.RSI.run(price, window=14) entries = rsi.rsi_crossed_below(30) exits = rsi.rsi_crossed_above(70) pf = vbt.Portfolio.from_signals(price, entries, exits) print(f\u0026#34;Sharpe: {pf.sharpe_ratio():.2f}\u0026#34;) when to use backtrader # complex order logic:\nclass ComplexStrategy(bt.Strategy): def __init__(self): self.order = None self.stop_order = None def next(self): if not self.position: if self.signal(): # bracket order with stop loss and take profit main = self.buy(size=100, transmit=False) self.sell( size=100, exectype=bt.Order.Stop, price=self.data.close[0] * 0.98, parent=main, transmit=False ) self.sell( size=100, exectype=bt.Order.Limit, price=self.data.close[0] * 1.05, parent=main, transmit=True ) multi-timeframe analysis:\nclass MultiTimeframe(bt.Strategy): def __init__(self): # daily timeframe self.sma_daily = bt.ind.SMA(self.data0, period=20) # weekly timeframe (resample) self.sma_weekly = bt.ind.SMA(self.data1, period=10) def next(self): # only trade when daily and weekly aligned if self.sma_daily[0] \u0026gt; self.sma_daily[-1]: if self.sma_weekly[0] \u0026gt; self.sma_weekly[-1]: self.buy() my workflow # step 1: idea validation (vectorbt)\n# quick test: does this idea have any merit? # 10 minutes max step 2: parameter optimization (vectorbt)\n# find optimal parameters # test 1000+ combinations # 30 minutes step 3: complex logic (backtrader)\n# implement full strategy with: # - proper position sizing # - stop losses # - take profits # - scaling in/out # 2-4 hours step 4: walk-forward validation (custom)\n# out-of-sample testing # 1-2 hours real example: my vol selling strategy # vectorbt phase (2 hours):\nfound optimal IV rank threshold: 45-60%\nfound optimal DTE range: 21-35 days\nfound optimal delta: 0.15-0.25\nbacktrader phase (8 hours):\nimplemented full premium collection logic.\nadded early exit rules (50% profit).\nadded adjustment triggers (100% loss).\ntested bracket orders.\nvalidated against 3 years data.\nperformance comparison # my backtests (same strategy, same data):\nmetric vectorbt backtrader setup time 10 min 45 min run time (1000 params) 45 sec 12 min sharpe reported 1.82 1.79 max drawdown -12.4% -12.8% total return 34.2% 33.8% slight differences due to:\nexecution assumptions.\nslippage modeling.\nfee calculations.\nboth valid, vectorbt faster.\nrecommendation # use vectorbt when:\ntesting new ideas quickly\noptimizing parameters\nsimple entry/exit logic\nneed speed over complexity\nuse backtrader when:\ncomplex order types\nmulti-timeframe strategies\nbroker integration needed\nproduction-ready backtests\nthe NexusFi Battle of the Bots thread has 2,300+ replies discussing algorithmic strategy development approaches. good resource for seeing how other algo traders structure their backtesting workflows.\nmy final setup # vectorbt: quick validation, parameter sweeps\nbacktrader: complex strategies, final validation\ncustom numpy: walk-forward analysis, production\n70/30 split works for me.\ntonight (may 28, 2:22am) # vectorbt vs backtrader comparison. vectorbt: 20x faster for parameter sweeps, excellent for quick validation. backtrader: better for complex orders, multi-timeframe, broker integration. my workflow: vectorbt for ideas and optimization (70%), backtrader for complex logic (30%). same strategy backtests: vectorbt 45sec vs backtrader 12min, results within 1% difference. use both for different purposes.\n2:22am wednesday. backtesting framework comparison. vectorbt: fast parameter optimization (1000 combos in 45sec), simple API, no live trading. backtrader: complex order logic, multi-timeframe, broker integration, steep learning curve. my workflow: vectorbt for idea validation and parameter sweeps (70%), backtrader for complex strategies and final validation (30%). both valid, vectorbt faster for iteration.\n-AK\n","date":"28 May 2025","externalUrl":null,"permalink":"/posts/2025-05-28-vectorbt-vs-backtrader-python-backtesting/","section":"Posts","summary":"\u003cp\u003ebeen using both for 2+ years.\u003c/p\u003e\n\u003cp\u003ehere\u0026rsquo;s when to use each.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003equick verdict \n    \u003cdiv id=\"quick-verdict\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#quick-verdict\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003evectorbt:\u003c/strong\u003e fast parameter sweeps, simple strategies\u003c/p\u003e","title":"vectorbt vs backtrader - python backtesting framework comparison 2025","type":"posts"},{"content":"optimized redis caching during honeymoon downtime review.\n40% latency improvement.\nthe problem # before optimization:\nmarket data fetch: 180ms avg\ncache miss rate: 23%\nmemory usage: 2.4GB\nbottleneck: json serialization on every cache read.\nthe solution # switched from json to msgpack serialization.\nimplemented connection pooling.\nadded LRU eviction policy.\ncode changes # before (json serialization):\nimport redis import json r = redis.Redis(host=\u0026#39;localhost\u0026#39;, port=6379) def get_market_data(symbol): cached = r.get(f\u0026#34;market:{symbol}\u0026#34;) if cached: return json.loads(cached) # SLOW: json decode every time data = fetch_from_api(symbol) r.setex(f\u0026#34;market:{symbol}\u0026#34;, 60, json.dumps(data)) # 60s TTL return data after (msgpack + connection pool):\nimport redis import msgpack from redis import ConnectionPool pool = ConnectionPool( host=\u0026#39;localhost\u0026#39;, port=6379, max_connections=20, decode_responses=False # binary mode for msgpack ) def get_redis(): return redis.Redis(connection_pool=pool) def get_market_data(symbol): r = get_redis() cached = r.get(f\u0026#34;market:{symbol}\u0026#34;) if cached: return msgpack.unpackb(cached, raw=False) # FAST: msgpack decode data = fetch_from_api(symbol) r.setex(f\u0026#34;market:{symbol}\u0026#34;, 60, msgpack.packb(data)) return data improvement: 45ms → 27ms per cache read\nbenchmark results # test: 10,000 cache reads\nmetric json msgpack improvement avg latency 45ms 27ms -40% p99 latency 120ms 58ms -52% memory/item 1.2KB 0.7KB -42% throughput 222 ops/s 370 ops/s +67% connection pooling impact # without pool:\nnew connection per request.\n~15ms overhead per connection.\nwith pool (20 connections):\nreuse existing connections.\n~2ms overhead per request.\nimprovement: 13ms saved per operation.\nfull implementation # import redis import msgpack from redis import ConnectionPool from functools import lru_cache import time class MarketDataCache: def __init__(self, host=\u0026#39;localhost\u0026#39;, port=6379, max_connections=20): self.pool = ConnectionPool( host=host, port=port, max_connections=max_connections, decode_responses=False ) self.local_cache = {} self.local_ttl = {} def _get_redis(self): return redis.Redis(connection_pool=self.pool) def get(self, symbol, ttl=60): # L1: local memory cache (fastest) now = time.time() if symbol in self.local_cache: if self.local_ttl.get(symbol, 0) \u0026gt; now: return self.local_cache[symbol] # L2: redis cache r = self._get_redis() cached = r.get(f\u0026#34;market:{symbol}\u0026#34;) if cached: data = msgpack.unpackb(cached, raw=False) # populate L1 self.local_cache[symbol] = data self.local_ttl[symbol] = now + 5 # 5s local TTL return data # L3: fetch from API data = self._fetch_from_api(symbol) r.setex(f\u0026#34;market:{symbol}\u0026#34;, ttl, msgpack.packb(data)) self.local_cache[symbol] = data self.local_ttl[symbol] = now + 5 return data def _fetch_from_api(self, symbol): # actual API call here pass def invalidate(self, symbol): r = self._get_redis() r.delete(f\u0026#34;market:{symbol}\u0026#34;) self.local_cache.pop(symbol, None) self.local_ttl.pop(symbol, None) def bulk_get(self, symbols): \u0026#34;\u0026#34;\u0026#34;Optimized bulk fetch with pipeline\u0026#34;\u0026#34;\u0026#34; r = self._get_redis() pipe = r.pipeline() for symbol in symbols: pipe.get(f\u0026#34;market:{symbol}\u0026#34;) results = pipe.execute() data = {} missing = [] for symbol, cached in zip(symbols, results): if cached: data[symbol] = msgpack.unpackb(cached, raw=False) else: missing.append(symbol) # fetch missing from API if missing: for symbol in missing: data[symbol] = self._fetch_from_api(symbol) r.setex(f\u0026#34;market:{symbol}\u0026#34;, 60, msgpack.packb(data[symbol])) return data l1 + l2 cache strategy # l1 (local memory):\nfastest access (~0.1ms).\n5 second TTL.\nper-process, not shared.\nl2 (redis):\nshared across processes.\n60 second TTL.\nmsgpack serialization.\nl3 (api):\nslowest (~200ms).\nonly on cache miss.\nmonitoring # added prometheus metrics:\nfrom prometheus_client import Counter, Histogram cache_hits = Counter(\u0026#39;market_cache_hits\u0026#39;, \u0026#39;Cache hits\u0026#39;, [\u0026#39;level\u0026#39;]) cache_misses = Counter(\u0026#39;market_cache_misses\u0026#39;, \u0026#39;Cache misses\u0026#39;) cache_latency = Histogram(\u0026#39;market_cache_latency_seconds\u0026#39;, \u0026#39;Cache latency\u0026#39;) def get_with_metrics(self, symbol): with cache_latency.time(): # L1 check if symbol in self.local_cache: cache_hits.labels(level=\u0026#39;l1\u0026#39;).inc() return self.local_cache[symbol] # L2 check cached = self._get_redis().get(f\u0026#34;market:{symbol}\u0026#34;) if cached: cache_hits.labels(level=\u0026#39;l2\u0026#39;).inc() return msgpack.unpackb(cached, raw=False) # L3 fetch cache_misses.inc() return self._fetch_from_api(symbol) production results # after 1 week running:\nl1 hit rate: 67%\nl2 hit rate: 28%\nl3 miss rate: 5%\neffective latency:\n67% × 0.1ms + 28% × 27ms + 5% × 200ms = 17.6ms avg\nvs before: 180ms → 17.6ms = 90% improvement\nresources # learned the msgpack optimization from this r/algotrading thread on redis caching.\nthe redis official python documentation has good examples for connection pooling that i adapted.\ntonight (may 27, 2:44am) # redis optimization deployed. msgpack vs json: 40% latency reduction (45ms→27ms per read). connection pooling: 13ms saved per operation. two-tier cache (L1 local + L2 redis): 90% total improvement (180ms→17.6ms avg). l1 hit rate 67%, l2 hit rate 28%. production validated over 1 week. small infrastructure win while reviewing honeymoon downtime.\n2:44am tuesday. redis cache optimization. switched json to msgpack: 40% latency reduction. added connection pool: 13ms saved per op. implemented L1/L2 cache strategy: local memory 5s TTL + redis 60s TTL. results: 180ms→17.6ms avg latency (90% improvement). l1 hit 67%, l2 hit 28%, miss 5%. prometheus monitoring added. small wins compound.\n-AK\n","date":"27 May 2025","externalUrl":null,"permalink":"/posts/2025-05-27-redis-caching-optimization-latency-gains/","section":"Posts","summary":"\u003cp\u003eoptimized redis caching during honeymoon downtime review.\u003c/p\u003e\n\u003cp\u003e40% latency improvement.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe problem \n    \u003cdiv id=\"the-problem\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-problem\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003ebefore optimization:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003emarket data fetch: 180ms avg\u003c/p\u003e","title":"redis caching optimization - 40% latency reduction for market data","type":"posts"},{"content":"full size back.\nsecond week trading.\nconditions still favorable.\nthe week # monday may 19: rest day (returned from honeymoon)\ntuesday-thursday (week 1): +$1,280 (50-75% size)\nfriday may 23: +$680, 100% size, 3 trades\nsaturday: markets closed\nsunday: markets closed\nmonday may 26: memorial day (markets closed)\nwait. today\u0026rsquo;s monday memorial day.\nwriting this sunday night reflecting on week 2.\nweekly breakdown (may 20-25) # tuesday may 20: +$420 (50% size, 2 trades)\nwednesday may 21: +$380 (50% size, 3 trades)\nthursday may 22: +$480 (75% size, 3 trades)\nfriday may 23: +$680 (100% size, 3 trades)\nsaturday may 24: +$380 (crypto only, 2 trades)\nweek total: +$2,340 across 13 trades\nwin rate: 85% (11 wins, 2 losses)\nramp complete # 50% → 75% → 100%\nfull size operations confirmed working.\nstrategies performing as expected.\nno surprises from 19-day pause.\nsystem validated.\ntrade distribution # options: 8 trades, +$1,680\nSPX: 5 trades, +$1,020\nQQQ: 3 trades, +$660\ncrypto: 5 trades, +$660\nBTC: 3 trades, +$420\nETH: 2 trades, +$240\nallocation working:\n65% options, 35% crypto this week.\ntarget: 60% options, 30% crypto, 10% futures.\nES futures paused (memorial day thin volume expected).\nconditions recap # VIX: 15.2-16.8 (optimal range)\ncorrelation: 0.56-0.64 (excellent diversification)\nvolume: 3.3-3.8M (normal, pre-holiday dip friday)\nslippage: 1.9 ticks avg (excellent)\neverything favorable.\naccount update # may 1 (pause start): $456,420\nmay 25 (current): $458,760\nmay gain so far: +$2,340 (+0.51%)\nytd total: +$20,960 (+4.78%)\nannual pace: 14.4%\ncomparing to expectations # may realistic target (with 12 days pause):\nmodest: +0.5% to +1.0%\nmay actual so far: +0.51%\non track for low end.\nremaining 5 trading days (tue-fri this week, sat crypto).\ntarget remaining: +$1,500-$2,000\nmemorial day plan # monday: markets closed, no trades\ntuesday: resume normal operations\nwatching: volume returning post-holiday\nexpected: thin tuesday, normal by wednesday\nmarried trading update # week 2 as married couple:\nroutine established.\nbreakfast together 10am.\nshe works her code, i trade.\nlunch 1pm, dinner 7pm.\nA.: \u0026ldquo;this is nice.\u0026rdquo;\nme: \u0026ldquo;what?\u0026rdquo;\nA.: \u0026ldquo;married life. it\u0026rsquo;s just\u0026hellip; normal. in a good way.\u0026rdquo;\nme: \u0026ldquo;told you nothing would change.\u0026rdquo;\nA.: \u0026ldquo;the ring changed things.\u0026rdquo;\nme: \u0026ldquo;how?\u0026rdquo;\nA.: \u0026ldquo;i don\u0026rsquo;t worry anymore. like\u0026hellip; you\u0026rsquo;re not going anywhere.\u0026rdquo;\nme: \u0026ldquo;neither are you.\u0026rdquo;\nA.: \u0026ldquo;exactly.\u0026rdquo;\ntonight (may 26, 1:52am) # week 2 return complete. full size operations resumed friday. week total +$2,340 across 13 trades, 85% win rate. options +$1,680 (SPX/QQQ), crypto +$660 (BTC/ETH). conditions favorable (VIX 15.2-16.8, corr 0.56-0.64, slippage 1.9 ticks). account $458,760, ytd +4.78%. may so far +0.51% (on track for modest month). memorial day monday, resume tuesday. married life: routine established, A. says ring changed things, security confirmed.\n1:52am monday (memorial day). week 2 return. ramp complete: 50%→75%→100% size. week +$2,340 across 13 trades, 85% win rate. options +$1,680, crypto +$660. conditions excellent (VIX 15.2-16.8, slippage 1.9 ticks). account $458,760, ytd +4.78%. may +0.51% so far (target 0.5-1.0%). memorial day closed, resume tuesday. married routine established.\n-AK\n","date":"26 May 2025","externalUrl":null,"permalink":"/posts/2025-05-26-week-2-return-full-size-operations/","section":"Posts","summary":"\u003cp\u003efull size back.\u003c/p\u003e\n\u003cp\u003esecond week trading.\u003c/p\u003e\n\u003cp\u003econditions still favorable.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe week \n    \u003cdiv id=\"the-week\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-week\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003emonday may 19:\u003c/strong\u003e rest day (returned from honeymoon)\u003c/p\u003e","title":"week 2 return - full size operations resume, +$2,340","type":"posts"},{"content":"been using both coinbase and kraken for 2+ years.\nhere\u0026rsquo;s the real comparison for algo traders.\nquick verdict # coinbase advanced: better for fiat on/off ramp, simpler API\nkraken: better for serious trading, more features, better fills\nmy allocation: 60% kraken, 40% coinbase\nAPI comparison # authentication # coinbase:\nimport coinbase from coinbase.rest import RESTClient client = RESTClient( api_key=\u0026#34;your_api_key\u0026#34;, api_secret=\u0026#34;your_api_secret\u0026#34; ) simple key + secret. works immediately.\nkraken:\nimport krakenex from pykrakenapi import KrakenAPI api = krakenex.API() api.load_key(\u0026#39;kraken.key\u0026#39;) k = KrakenAPI(api) requires key file. extra step but more secure.\nwinner: tie (both straightforward)\norder execution # coinbase:\n# market order order = client.market_order_buy( product_id=\u0026#34;BTC-USD\u0026#34;, quote_size=\u0026#34;1000\u0026#34; # $1000 worth ) # limit order order = client.limit_order_buy( product_id=\u0026#34;BTC-USD\u0026#34;, base_size=\u0026#34;0.01\u0026#34;, # 0.01 BTC limit_price=\u0026#34;65000\u0026#34; ) kraken:\n# market order result = k.add_standard_order( pair=\u0026#34;XXBTZUSD\u0026#34;, type=\u0026#34;buy\u0026#34;, ordertype=\u0026#34;market\u0026#34;, volume=\u0026#34;0.01\u0026#34; ) # limit order with draw on result = k.add_standard_order( pair=\u0026#34;XXBTZUSD\u0026#34;, type=\u0026#34;buy\u0026#34;, ordertype=\u0026#34;limit\u0026#34;, price=\u0026#34;65000\u0026#34;, volume=\u0026#34;0.01\u0026#34;, draw on=\u0026#34;2\u0026#34; # 2x use available ) winner: kraken (employ options, more order types)\nwebsocket streaming # coinbase:\nfrom coinbase.websocket import WSClient def on_message(msg): if msg.get(\u0026#39;channel\u0026#39;) == \u0026#39;ticker\u0026#39;: print(f\u0026#34;BTC: {msg[\u0026#39;events\u0026#39;][0][\u0026#39;tickers\u0026#39;][0][\u0026#39;price\u0026#39;]}\u0026#34;) ws = WSClient( api_key=\u0026#34;key\u0026#34;, api_secret=\u0026#34;secret\u0026#34;, on_message=on_message ) ws.open() ws.subscribe([\u0026#34;BTC-USD\u0026#34;], [\u0026#34;ticker\u0026#34;]) kraken:\nimport asyncio from kraken.spot import SpotWSClient async def main(): client = SpotWSClient() await client.connect() await client.subscribe({\u0026#34;name\u0026#34;: \u0026#34;ticker\u0026#34;}, [\u0026#34;XBT/USD\u0026#34;]) async for msg in client: print(f\u0026#34;BTC: {msg[\u0026#39;c\u0026#39;][0]}\u0026#34;) # last trade price asyncio.run(main()) winner: coinbase (simpler syntax, better docs)\nexecution quality # my data (6 months tracking):\nmetric coinbase kraken avg slippage 0.08% 0.05% fill rate 94% 97% latency (ms) 180 120 partial fills 12% 6% winner: kraken (better fills, lower slippage)\nfee comparison # coinbase advanced:\nmaker: 0.40%\ntaker: 0.60%\nkraken:\nmaker: 0.16%\ntaker: 0.26%\nwinner: kraken (significantly cheaper)\nfeatures comparison # feature coinbase kraken margin trading no yes (5x) futures no yes staking yes yes fiat pairs USD, EUR, GBP 7 currencies API rate limits 10/sec 15/sec order types 4 8 winner: kraken (more features)\nwhy i use both # coinbase for:\nfiat deposits (ACH instant)\nquick USD conversions\nsimple buys when lazy\nkraken for:\nserious trading (lower fees)\ndraw on when needed\nbetter execution quality\nlarger position sizing\nreal-world example # same trade on both platforms (may 2025):\nBTC buy, $5,000 market order\ncoinbase:\nfill price: $67,142\nfees: $30.00 (0.60%)\ntotal cost: $5,030.00\nkraken:\nfill price: $67,108\nfees: $13.00 (0.26%)\ntotal cost: $5,013.00\nsavings: $17 per $5k trade\nover 100 trades/month: $1,700/month saved\npython integration tips # for both:\n# always use try/except for API calls try: order = client.market_order_buy(...) except Exception as e: logger.error(f\u0026#34;Order failed: {e}\u0026#34;) # implement retry logic # always verify fills if order.status == \u0026#34;filled\u0026#34;: actual_price = float(order.average_filled_price) expected_price = float(last_ticker) slippage = abs(actual_price - expected_price) / expected_price logger.info(f\u0026#34;Slippage: {slippage:.4%}\u0026#34;) rate limiting:\nimport time from functools import wraps def rate_limit(calls_per_second): min_interval = 1.0 / calls_per_second last_call = [0] def decorator(func): @wraps(func) def wrapper(*args, **kwargs): elapsed = time.time() - last_call[0] if elapsed \u0026lt; min_interval: time.sleep(min_interval - elapsed) result = func(*args, **kwargs) last_call[0] = time.time() return result return wrapper return decorator @rate_limit(10) # coinbase limit def coinbase_order(...): pass @rate_limit(15) # kraken limit def kraken_order(...): pass my recommendation # new algo traders: start with coinbase (simpler)\nserious algo traders: use kraken (better execution, lower fees)\nbest approach: both (coinbase for fiat, kraken for trading)\nthe NexusFi cryptocurrency trading platforms thread has good discussion on exchange selection for different use cases. worth reading if you\u0026rsquo;re choosing between platforms.\nfinal verdict # coinbase: 7/10 (great for beginners, fiat on/off ramp)\nkraken: 9/10 (better for serious algo trading)\nmy allocation: 60% kraken, 40% coinbase\nsavings using kraken: ~$1,700/month on fees alone\ntonight (may 24, 2:34am) # coinbase vs kraken comparison. kraken wins: lower fees (0.26% vs 0.60%), better execution (0.05% vs 0.08% slippage), more features (margin, futures, 8 order types). coinbase wins: simpler API, better fiat on/off. my allocation 60% kraken, 40% coinbase. $1,700/month saved using kraken for serious trading. use both for different purposes.\n2:34am saturday. crypto exchange comparison: coinbase advanced vs kraken. testing 6 months: kraken better execution (0.05% vs 0.08% slippage, 97% vs 94% fill rate, 120ms vs 180ms latency). kraken cheaper (0.26% vs 0.60% taker). kraken more features (margin, futures, 8 order types). coinbase simpler (better docs, easier fiat). my split: 60% kraken (trading), 40% coinbase (fiat). savings: $1,700/month on 100 trades using kraken fees.\n-AK\n","date":"24 May 2025","externalUrl":null,"permalink":"/posts/2025-05-24-coinbase-vs-kraken-python-api-comparison/","section":"Posts","summary":"\u003cp\u003ebeen using both coinbase and kraken for 2+ years.\u003c/p\u003e\n\u003cp\u003ehere\u0026rsquo;s the real comparison for algo traders.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003equick verdict \n    \u003cdiv id=\"quick-verdict\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#quick-verdict\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003ecoinbase advanced:\u003c/strong\u003e better for fiat on/off ramp, simpler API\u003c/p\u003e","title":"coinbase advanced vs kraken - python API comparison for algo trading","type":"posts"},{"content":"first week back trading.\neasing in.\nsmall gains.\nthe resume # monday may 19: rest day, market review only\ntuesday may 20: 2 trades, 50% size, +$420\nwednesday may 21: 3 trades, 50% size, +$380\ntoday (thursday): 3 trades, 75% size, +$480\nweek so far: +$1,280 across 8 trades\nconditions favorable # VIX: 15.8-16.4 range (optimal)\ncorrelation: 0.58-0.63 (excellent)\nvolume: 3.4-3.7M (normal)\nregime stability: 0.74 (very stable)\neverything green.\nshould\u0026rsquo;ve been trading full size.\nchose cautious ramp instead.\nwhy the slow ramp # 19 days away.\nno market monitoring.\nno feel for current conditions.\nwanted to confirm:\nstrategies still working ✓\nexecution quality maintained ✓\nno regime shift during pause ✓\nslippage normal ✓\nall confirmed.\nthis approach comes from the r/algotrading position sizing discussion - consensus is always ramp back slowly after extended breaks.\nramping to 100% tomorrow.\ntrades breakdown # options (6 trades):\nSPX: 4 trades, 3 wins, +$680\nQQQ: 2 trades, 2 wins, +$340\ncrypto (2 trades):\nBTC momentum: 1 trade, 1 win, +$260\nall winners.\nsmall but positive.\nslippage check # week avg: 2.0 ticks\nvs april avg: 2.0 ticks\nvs february avg: 2.0 ticks\nexecution quality: excellent\nchicago colo performing.\nno degradation during pause.\naccount status # may 19 (start): $456,420\nmay 22 (current): $457,700\nweek gain: +$1,280 (+0.28%)\nytd: +$19,900 (+4.54%)\nannual pace: 13.7%\ngetting back on track.\nrest of week plan # friday may 23: full size resume (100%)\ntarget friday: 2-3 trades, +$400-$600\nweekly target (remaining): +$800-$1,200\nmonthly target: modest given 12 days paused\nrealistic may: +0.5% to +1.0%\nmarried trading life # no difference yet.\nsame routine.\nwake up, breakfast with wife.\ncheck markets.\nexecute trades.\ndinner together 7pm.\nA.: \u0026ldquo;how was trading?\u0026rdquo;\nme: \u0026ldquo;small week, easing back in.\u0026rdquo;\nA.: \u0026ldquo;still profitable?\u0026rdquo;\nme: \u0026ldquo;yeah. +$1,280.\u0026rdquo;\nA.: \u0026ldquo;honeymoon was more profitable.\u0026rdquo; (winks)\ntomorrow # ramping to full size.\nconditions favorable.\nstrategies validated.\nback to normal operations.\ntonight (may 22, 2:08am) # first week back trading after honeymoon. easing in: tuesday 50% size +$420, wednesday 50% +$380, thursday 75% +$480. week total +$1,280 across 8 trades. conditions excellent (VIX 15.8-16.4, corr 0.58-0.63). slippage 2.0 ticks (unchanged from april). account $457,700, ytd +4.54%. ramping to 100% size friday. married trading life same routine, A. says honeymoon more profitable (winks).\n2:08am thursday. first week back post-honeymoon. tuesday-thursday: +$1,280 across 8 trades (all winners). eased in 50%→75% size, confirmed strategies working. VIX 15.8-16.4, corr 0.58-0.63, slippage 2.0 ticks (excellent). account $457,700, ytd +4.54%. ramping to 100% friday. married trading life: same routine, different ring on finger. A. approves.\n-AK\n","date":"22 May 2025","externalUrl":null,"permalink":"/posts/2025-05-22-first-week-back-easing-in/","section":"Posts","summary":"\u003cp\u003efirst week back trading.\u003c/p\u003e\n\u003cp\u003eeasing in.\u003c/p\u003e\n\u003cp\u003esmall gains.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe resume \n    \u003cdiv id=\"the-resume\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-resume\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003emonday may 19:\u003c/strong\u003e rest day, market review only\u003c/p\u003e","title":"first week back - easing in post-honeymoon, +$1,280","type":"posts"},{"content":"home.\nhoneymoon over.\nmarried life begins.\nlanding (sunday 4pm san diego) # 5 hour flight felt longer than the whole trip.\nneither of us wanted to leave.\nA.: \u0026ldquo;can we just go back?\u0026rdquo;\nme: \u0026ldquo;we have to adult.\u0026rdquo;\nA.: \u0026ldquo;adulting sucks.\u0026rdquo;\nunpacking # suitcases exploded across bedroom.\nshe brought back too many souvenirs.\ni brought back too much dirty laundry.\nA.: \u0026ldquo;where does this go?\u0026rdquo; (holds up decorative sea turtle)\nme: \u0026ldquo;wherever you want. it\u0026rsquo;s your place too.\u0026rdquo;\nA.: \u0026ldquo;our place.\u0026rdquo;\nme: \u0026ldquo;our place.\u0026rdquo;\nfirst time saying that as married couple.\nhoneymoon final tally # places list additions:\n48: wedding night hotel door\n49: spa changing room\n50: hotel pool cabana (sunset, almost caught by family)\n51: beach sunset (blanket, looked like stargazing)\n52: balcony final night\n5 new places in 7 days.\nproductive honeymoon.\nwhat i missed # servers: all green, no issues\nemail: 347 unread (ignored most)\nmarkets: did not check once\nsocial media: did not open\nfirst real break in 2 years.\nneeded it.\nchecking markets (tonight) # VIX: 16.2 (optimal)\ncorrelation: 0.61 (good)\nvolume: 3.5M (normal)\nconditions: favorable for resume\nmissed opportunity cost (may 1-19):\nestimated $4,000-$5,000\nworth it?\ngot married.\nhoneymoon in maui.\nplaces list +5.\nabsolutely worth it.\ntrading resume plan # tomorrow (may 20):\nmorning: review market conditions\nafternoon: maybe 1-2 small trades if favorable\nrest of week:\ngradual ramp up\n50% size first 2 days\n100% size by thursday if conditions stable\nno rush.\ncapital protected.\nytd still +4.25%.\nmarried life observation #1 # nothing changed.\nsame apartment.\nsame routine (will be).\nsame person.\nbut everything changed.\nthere\u0026rsquo;s a ring on my finger.\nshe\u0026rsquo;s my wife.\nlegal, permanent, chosen.\nsame but different.\ntonight (may 19, 11:42pm) # home from honeymoon 4pm sunday. unpacking chaos. places list final: 52 (wedding night through balcony final night, +5 maui). servers all green. markets favorable (VIX 16.2, corr 0.61). missed ~$4-5k opportunity cost, worth it (got married). resume trading tomorrow. 50% size first 2 days, 100% by thursday. married life observation: nothing changed but everything changed. she\u0026rsquo;s my wife.\n11:42pm sunday. back from honeymoon. landed 4pm san diego. unpacking explosion. places list 47→52 (5 new places: hotel door, spa, pool cabana, beach sunset, balcony). servers green, markets favorable (VIX 16.2). missed $4-5k opportunity, worth it. resume trading tomorrow: 50% size first 2 days, full size thursday. married life: same apartment, same person, but she\u0026rsquo;s my wife now. everything same but different.\n-AK\n","date":"19 May 2025","externalUrl":null,"permalink":"/posts/2025-05-19-back-from-honeymoon-married-life-begins/","section":"Posts","summary":"\u003cp\u003ehome.\u003c/p\u003e\n\u003cp\u003ehoneymoon over.\u003c/p\u003e\n\u003cp\u003emarried life begins.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003elanding (sunday 4pm san diego) \n    \u003cdiv id=\"landing-sunday-4pm-san-diego\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#landing-sunday-4pm-san-diego\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e5 hour flight felt longer than the whole trip.\u003c/p\u003e","title":"back from honeymoon - married life begins for real","type":"posts"},{"content":"","date":"19 May 2025","externalUrl":null,"permalink":"/tags/honeymoon/","section":"Tags","summary":"","title":"Honeymoon","type":"tags"},{"content":"halfway through honeymoon.\nmaui is paradise.\nA. is my wife.\nstill weird to say.\nthe resort # four seasons wailea.\nsplurged.\n$8,040 for 7 nights.\nocean view, private balcony.\nworth every dollar.\nwhat we\u0026rsquo;ve done # sunday (arrival): slept, jet lag, room service\nmonday: road to hana, 52 miles of curves\nA. got carsick twice.\nstill beautiful.\ntuesday: beach day, snorkeling, swam with sea turtles\nshe screamed when one swam past.\nwednesday: haleakala sunrise (woke up 3am)\n10,000 feet, 40°, watched sun come up.\nboth cried.\ntoday (thursday): spa day\ncouples massage.\nplaces list: 49 (spa changing room).\ndisconnected # phone: airplane mode since sunday\nemail: not checking\nservers: monitoring alerts only (all clear)\ntrading: completely offline\nfirst time in 2 years i\u0026rsquo;ve truly disconnected.\nweird at first.\nnow peaceful.\nwhat being married feels like # honestly?\nthe same but different.\nsame person.\nsame relationship.\nsame sex (incredible).\nbut there\u0026rsquo;s a permanence now.\na security.\nshe\u0026rsquo;s not going anywhere.\nneither am i.\nplaces list update # 47: pre-wedding\n48: wedding night hotel door\n49: spa changing room today\nplanned:\nbeach at sunset (tomorrow)\nhotel pool cabana (if we can sneak it)\nbalcony at night (guaranteed)\nhoneymoon should be productive.\nconversation tonight # sitting on balcony after dinner.\nA.: \u0026ldquo;what are you thinking about?\u0026rdquo;\nme: \u0026ldquo;how lucky i am.\u0026rdquo;\nA.: \u0026ldquo;that\u0026rsquo;s corny.\u0026rdquo;\nme: \u0026ldquo;doesn\u0026rsquo;t make it less true.\u0026rdquo;\nA.: \u0026ldquo;i know. i think it too.\u0026rdquo;\nme: \u0026ldquo;we\u0026rsquo;re married.\u0026rdquo;\nA.: \u0026ldquo;we\u0026rsquo;re married.\u0026rdquo;\nme: \u0026ldquo;still doesn\u0026rsquo;t feel real.\u0026rdquo;\nA.: \u0026ldquo;feels pretty real to me.\u0026rdquo; (holds up ring)\nme: \u0026ldquo;yeah. it does.\u0026rdquo;\nhalfway through # 3 days left.\nthen back to reality.\ntrading resumes may 20.\nmarried life begins for real.\nbut right now.\njust her and me and the ocean.\ntonight (may 15, 9:18pm maui) # day 4 of 7. four seasons wailea. road to hana monday (A. carsick, still beautiful). sea turtles tuesday. haleakala sunrise wednesday (cried). spa day today, places list 49. phone airplane mode since sunday. trading completely offline. being married feels the same but with permanence and security. 3 days left. back to reality may 19. resume trading may 20. right now just her and me and the ocean.\n9:18pm thursday maui. day 4 of 7 honeymoon. four seasons $8,040 splurge. road to hana (A. carsick), sea turtles, haleakala sunrise (cried), spa today. places list 47→49 (wedding night, spa changing room). phone airplane mode since sunday. first true disconnect in 2 years. being married feels same but with permanence. 3 days left. trading resumes may 20. right now just ocean and my wife.\n-AK\n","date":"15 May 2025","externalUrl":null,"permalink":"/posts/2025-05-15-honeymoon-maui-halfway/","section":"Posts","summary":"\u003cp\u003ehalfway through honeymoon.\u003c/p\u003e\n\u003cp\u003emaui is paradise.\u003c/p\u003e\n\u003cp\u003eA. is my wife.\u003c/p\u003e\n\u003cp\u003estill weird to say.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe resort \n    \u003cdiv id=\"the-resort\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-resort\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003efour seasons wailea.\u003c/strong\u003e\u003c/p\u003e","title":"honeymoon maui - halfway through, disconnected bliss","type":"posts"},{"content":"married.\nA. is my wife.\nbest day of my life.\nsaturday may 10, 2025 # 4:03pm: she walked down the aisle.\nbarefoot on sand.\nwhite dress, simple, perfect.\nblonde hair down.\nshe was crying before she reached me.\ni was already crying.\nthe ceremony # venue: beach point, la jolla\nweather: 74°, sunset starting\nguests: 45 seated\nher dad walked her down.\ni stood there watching her come toward me.\ntime slowed.\neverything else disappeared.\nour vows # mine:\n\u0026ldquo;A., 23 months ago you were a stranger at a coffee shop. now you\u0026rsquo;re my whole life. you saw me at my worst. you stayed. you never tried to fix me, just loved me. i promise to do the same. to be your partner, your best friend, your home. to choose you every day. i love you.\u0026rdquo;\nhers:\n\u0026ldquo;when we met, i thought you were cute and weird and way too into computers. i was right. you\u0026rsquo;re still weird. but you\u0026rsquo;re also the kindest, most genuine person i\u0026rsquo;ve ever known. you make me feel safe. you make me feel chosen. i promise to always choose you back. i love you.\u0026rdquo;\nboth of us crying the whole time.\nofficiant had to pause twice.\nthe rings # her putting mine on:\nhands shaking.\ntook three tries.\nshe laughed.\ni laughed.\nme putting hers on:\nslid on perfectly.\nmatched her engagement ring exactly.\nshe looked at it.\nthen looked at me.\nmore crying.\nthe kiss # \u0026ldquo;you may kiss the bride.\u0026rdquo;\npulled her in.\nkissed her like it was the first time and the last time.\neveryone cheered.\nJ.: \u0026ldquo;get a room!\u0026rdquo;\nwe did. later.\nreception highlights # first dance: \u0026ldquo;the way you look tonight\u0026rdquo; - sinatra\nA. rested her head on my chest.\nwe barely moved.\njust held each other.\ncake: chocolate with vanilla frosting\nA. smashed a tiny bit on my face.\ni got her back.\nbouquet toss: her maid of honor caught it\ngarter toss: J. caught it\nthey looked at each other horrified.\neveryone laughed.\nspeeches # J. (again, drunk this time):\n\u0026ldquo;AK once told me he\u0026rsquo;d never get married. said relationships were pointless. look at him now. crying at his own wedding. never been happier for my boy.\u0026rdquo;\nA\u0026rsquo;s maid of honor:\n\u0026ldquo;A. texted me after their first date. said \u0026lsquo;i think he might be the one.\u0026rsquo; i said \u0026lsquo;you\u0026rsquo;ve known him 3 days.\u0026rsquo; she said \u0026lsquo;i know.\u0026rsquo; she was right.\u0026rdquo;\nthe exit # 10pm: sparkler sendoff\nhotel: del mar\nfirst time as married couple:\ndidn\u0026rsquo;t even make it to the bed.\nagainst the door.\nfast, intense, both needed it.\nthen slow round 2.\ntook our time.\nplaces list: 48 (honeymoon suite door)\nsunday morning (now) # 2:24am maui time (4:24am san diego).\nsitting on hotel balcony.\nflight was 5 hours.\nA. sleeping inside.\nshe\u0026rsquo;s my wife.\nstill doesn\u0026rsquo;t feel real.\nbut the ring on my finger is real.\nthe legal certificate is real.\nshe\u0026rsquo;s my wife.\nlooking back # june 13, 2023 → may 10, 2025\n697 days from meeting to marrying.\nwhat changed:\nstranger → girlfriend → fiancée → wife\ndating → exclusive → living together → married\nscared → nervous → ready → married\nwhat stayed the same:\nthe way she looks at me.\nthe way i feel when she walks in a room.\nthat\u0026rsquo;s why i married her.\ntonight (may 11, 2:24am maui) # we got married.\nmay 10, 2025, 4:03pm.\nbeach ceremony, 45 guests, sunset.\nboth cried during vows.\nring exchange took three tries (shaky hands).\nfirst dance sinatra.\nbouquet toss to maid of honor.\ngarter toss to J. (they were horrified).\nsparkler exit 10pm.\nhotel room: places list 48.\nflew to maui this morning.\nsitting on balcony while she sleeps.\nA. is my wife.\nbest day of my life.\nhoneymoon starts tomorrow.\n2:24am maui. we got married may 10, 2025. ceremony 4pm beach la jolla, 45 guests, sunset. she walked down barefoot, both crying. vows: i promised to choose her every day, she promised to choose me back. rings: her hands shook putting mine on, took 3 tries, we laughed. first dance sinatra, barely moved, just held each other. speeches: J. said i told him i\u0026rsquo;d never marry, now crying at own wedding. maid of honor said A. knew after first date. sparkler exit 10pm. hotel places list 48. flew maui this morning. sitting on balcony, she\u0026rsquo;s sleeping inside. A. is my wife. best day of my life.\n-AK\n","date":"11 May 2025","externalUrl":null,"permalink":"/posts/2025-05-11-we-got-married/","section":"Posts","summary":"\u003cp\u003emarried.\u003c/p\u003e\n\u003cp\u003eA. is my wife.\u003c/p\u003e\n\u003cp\u003ebest day of my life.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003esaturday may 10, 2025 \n    \u003cdiv id=\"saturday-may-10-2025\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#saturday-may-10-2025\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e4:03pm:\u003c/strong\u003e she walked down the aisle.\u003c/p\u003e","title":"we got married - best day of my life","type":"posts"},{"content":"rehearsal done.\ndinner done.\ntomorrow we get married.\nrehearsal (5pm) # venue: beach point, la jolla\nweather: 72°, light breeze, perfect\nattendees: wedding party + immediate family\nrun-through:\nprocessional music: flawless\nvows: practiced (wrote our own)\nring exchange: smooth\nkiss: J. made a joke, everyone laughed\ntotal time: 45 minutes\nofficiant: A\u0026rsquo;s uncle (ordained online for us)\ndinner (7pm) # location: pacifica del mar (private room)\nguests: 28 (wedding party + family)\nspeeches:\nJ. (my best man):\n\u0026ldquo;when AK told me he met someone, i gave it 3 weeks. then 3 months. then 3 years? he said \u0026rsquo;this one\u0026rsquo;s different.\u0026rsquo; i finally believe him.\u0026rdquo;\nA\u0026rsquo;s maid of honor:\n\u0026ldquo;A. has dated her share of idiots. no offense AK. but she\u0026rsquo;s never looked at anyone the way she looks at you. take care of her.\u0026rdquo;\nA\u0026rsquo;s dad:\n\u0026ldquo;when i met AK, i thought he was too young, too into computers, too quiet. then i watched him with my daughter. he\u0026rsquo;s exactly right for her.\u0026rdquo;\ntried not to cry.\nmostly succeeded.\nconversation with A\u0026rsquo;s dad # after dinner, pulled me aside.\nher dad: \u0026ldquo;i know your parents aren\u0026rsquo;t here.\u0026rdquo;\nme: \u0026ldquo;yeah.\u0026rdquo;\nher dad: \u0026ldquo;i want you to know we consider you family. not after tomorrow. already.\u0026rdquo;\nme: \u0026ldquo;thank you. that means a lot.\u0026rdquo;\nher dad: \u0026ldquo;your parents would be proud. A. told me about them.\u0026rdquo;\nalmost lost it.\nheld together.\nlast night conversation (A. and me) # we\u0026rsquo;re supposed to sleep separately tonight.\ntradition or whatever.\nA.: \u0026ldquo;this is stupid. i want to sleep next to you.\u0026rdquo;\nme: \u0026ldquo;your mom said—\u0026rdquo;\nA.: \u0026ldquo;my mom can deal with it. come to bed.\u0026rdquo;\nbroke tradition.\nlying next to her now.\ntomorrow # 4pm: ceremony on beach\n5pm: cocktails\n6pm: reception\n10pm: leave for hotel\nsunday morning: fly to maui\nthe rest of our lives starts tomorrow.\nwhere we came from # june 13, 2023: met at coffee shop\njune 16, 2023: first date\njune 23, 2023: first time sleeping together\nseptember 2023: exclusive\noctober 11, 2023: \u0026ldquo;i love you\u0026rdquo;\nnovember 1, 2023: moved in together\noctober 26, 2024: engaged\nmay 10, 2025: married\n23 months from strangers to spouses.\ntonight (may 9, 11:48pm) # rehearsal done, dinner done, speeches made me almost cry.\nA\u0026rsquo;s dad said they consider me family already.\nbroke tradition, sleeping next to her anyway.\ntomorrow 4pm we get married.\nsunday fly to maui.\nplaces list: 47.\ntrading paused, capital protected.\nlast night technically single.\ntomorrow she becomes my wife.\nready.\n11:48pm friday. rehearsal 5pm: processional, vows, rings, all smooth. dinner 7pm: 28 guests, J\u0026rsquo;s speech gave me 3 weeks when we met, A\u0026rsquo;s maid of honor said she\u0026rsquo;s never seen A. look at anyone like she looks at me, A\u0026rsquo;s dad said my parents would be proud. conversation with her dad: they consider me family already. broke tradition sleeping in same bed (A. insisted). tomorrow 4pm wedding beach la jolla, 45 guests. sunday fly maui. 23 months from coffee shop strangers to spouses. last night single. ready.\n-AK\n","date":"9 May 2025","externalUrl":null,"permalink":"/posts/2025-05-09-rehearsal-dinner-last-night-single/","section":"Posts","summary":"\u003cp\u003erehearsal done.\u003c/p\u003e\n\u003cp\u003edinner done.\u003c/p\u003e\n\u003cp\u003etomorrow we get married.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003erehearsal (5pm) \n    \u003cdiv id=\"rehearsal-5pm\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#rehearsal-5pm\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003evenue:\u003c/strong\u003e beach point, la jolla\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eweather:\u003c/strong\u003e 72°, light breeze, perfect\u003c/p\u003e","title":"rehearsal dinner - last night technically single","type":"posts"},{"content":"5 days.\nwedding saturday.\nweirdly calm.\nmonday night (may 5) - final week begins # A.: \u0026ldquo;we\u0026rsquo;re getting married in 5 days.\u0026rdquo;\nme: \u0026ldquo;yeah.\u0026rdquo;\nA.: \u0026ldquo;you\u0026rsquo;re supposed to be freaking out.\u0026rdquo;\nme: \u0026ldquo;i\u0026rsquo;m not though. are you?\u0026rdquo;\nA.: \u0026ldquo;no. that\u0026rsquo;s what\u0026rsquo;s weird.\u0026rdquo;\ntherapy session (may 1) # dr. r: \u0026ldquo;last session before wedding. how do you feel?\u0026rdquo;\nme: \u0026ldquo;calm. which feels wrong.\u0026rdquo;\ndr. r: \u0026ldquo;why wrong?\u0026rdquo;\nme: \u0026ldquo;everyone says you\u0026rsquo;re supposed to be anxious. cold feet. last minute doubts.\u0026rdquo;\ndr. r: \u0026ldquo;and?\u0026rdquo;\nme: \u0026ldquo;nothing. i just want to marry her.\u0026rdquo;\ndr. r: \u0026ldquo;that\u0026rsquo;s called being ready.\u0026rdquo;\nA. session friday:\nshe told me dr. r asked the same thing.\nA. said: \u0026ldquo;i\u0026rsquo;ve never been more sure of anything.\u0026rdquo;\nboth calm. both ready.\nfinal week schedule # monday (today): picking up wedding bands\ntuesday: final dress fitting for A.\nwednesday: rehearsal music check\nthursday: rehearsal dinner prep\nfriday: actual rehearsal 5pm\nsaturday: wedding 4pm\nevery day planned.\nnothing left to chance.\nA\u0026rsquo;s family arriving # her parents: arrived sunday\nher brothers: arriving thursday\nmy side: uncle, aunt, 3 cousins arriving friday\ntotal guests: 45\nsmall wedding.\nexactly what we wanted.\npicking up wedding bands (today) # her ring: platinum, simple, matches engagement ring\nmy ring: tungsten, plain band\nboth sized perfect.\nboth crying a little in the store.\nnot sad. just real.\nwhere we are # together: 23 months\nliving together: 19 months\nengaged: 6 months\nplaces list: 47\nfights in past month: 0\nsex in past week: 11 times\nstress levels:\nA: 4/10 (down from 10/10 two weeks ago)\nme: 3/10 (down from 9/10 two weeks ago)\ncalm before the ceremony.\ntonight (may 5, 1:42am) # 5 days until wedding.\npicked up rings today (cried a little).\nA\u0026rsquo;s parents in town.\nboth calm, which feels weird but right.\ntherapy confirmed: being ready = not panicking.\nfinal week schedule locked.\n45 guests saturday 4pm.\ntrading paused, algos offline.\nlife about to change.\nbut it already changed when she moved in.\nmarriage is just the legal part.\n1:42am tuesday. 5 days to wedding. picked up rings today (both cried). A\u0026rsquo;s parents arrived. weirdly calm, dr. r says which is being ready. final week scheduled: dress fitting tuesday, rehearsal friday 5pm, wedding saturday 4pm. 45 guests confirmed. places list 47. together 23 months, living together 19 months, engaged 6 months. stress levels: A 4/10 (was 10/10), me 3/10 (was 9/10). algos offline, capital protected. life about to change but marriage is just the legal part, real change happened when she moved in.\n-AK\n","date":"5 May 2025","externalUrl":null,"permalink":"/posts/2025-05-05-five-days-final-countdown/","section":"Posts","summary":"\u003cp\u003e5 days.\u003c/p\u003e\n\u003cp\u003ewedding saturday.\u003c/p\u003e\n\u003cp\u003eweirdly calm.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003emonday night (may 5) - final week begins \n    \u003cdiv id=\"monday-night-may-5---final-week-begins\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#monday-night-may-5---final-week-begins\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eA.:\u003c/strong\u003e \u0026ldquo;we\u0026rsquo;re getting married in 5 days.\u0026rdquo;\u003c/p\u003e","title":"five days out - final countdown, serenity weird","type":"posts"},{"content":"algos offline.\nwedding 8 days out.\ncapital protected.\nthe decision # paused all strategies may 1.\nmanual override on everything.\nno trades until may 20.\nwhy:\nwedding may 10.\nhoneymoon may 11-18.\ncan\u0026rsquo;t monitor properly.\nnot worth the risk.\nwhat\u0026rsquo;s offline # options strategies: all paused\nSPX premium selling: offline\nQQQ delta neutral: offline\nsector ETF rotations: offline\ncrypto bots: all paused\nBTC momentum: offline\nETH mean reversion: offline\naltcoin scanner: offline\nfutures: already minimal (10% allocation)\nES momentum: offline\neverything dormant until may 20.\naccount status may 1 # balance: $456,420\nytd: +$18,620 (+4.25%)\nannual pace: 12.8%\napril result: +$9,732 (+2.18%)\ncapital preservation mode.\nprotecting ytd gains.\nwhat happens during pause # may 1-9: wedding prep, rehearsal, final details\nmay 10: wedding day\nmay 11-18: honeymoon maui\nmay 19: return home, rest\nmay 20: review markets, maybe resume\nmay 21+: back to normal if conditions favorable\nlessons from march pause # march: waited too long to pause (VIX \u0026gt;20)\nlost $9,582 before fully stopping.\nthis time: proactive pause.\ncan\u0026rsquo;t monitor = shouldn\u0026rsquo;t trade.\npreventive philosophy working.\nlearned the hard way that monitoring matters. the NexusFi thread on automated trading VPS has good discussion on this - even with VPS and colocation, you still need eyes on systems during volatile periods.\nregime check may 1 # VIX: 15.8 (optimal)\ncorrelation: 0.58 (excellent)\nvolume: 3.6M (normal)\nconditions: actually favorable\nirony: pausing during good conditions.\nbut wedding \u0026gt; favorable conditions.\npriorities clear.\nestimated opportunity cost # normal may trading:\nfirst 3 weeks: ~$3,500-$5,000 expected\npause cost: ~$4,000 opportunity\nworth it:\nwedding once.\ntrading every month.\nno regrets.\nsystem maintenance during pause # daily checks:\nservers: running (monitoring only)\ndata feeds: active (collecting for analysis later)\nalerts: set for anomalies only\nnothing executing.\njust watching.\ntonight (may 2, 2:15am) # algos offline since may 1.\nwedding 8 days, honeymoon 9-16 days.\naccount $456,420, ytd +4.25%.\nconditions favorable (VIX 15.8, correlation 0.58) but pausing anyway.\nestimated opportunity cost ~$4,000.\nworth it: wedding once, trading every month.\nresume may 20 if conditions stable.\ncapital protected.\n2:15am friday. algos offline may 1, capital protected $456,420. wedding may 10 (8 days), honeymoon may 11-18. all strategies paused: options (SPX, QQQ, sectors), crypto (BTC, ETH, altcoins), futures (ES). conditions favorable (VIX 15.8, corr 0.58, vol 3.6M) but can\u0026rsquo;t monitor during wedding/honeymoon. estimated opportunity cost $4k vs wedding + honeymoon value = easy decision. ytd +4.25% protected. resume may 20. priorities clear: wedding \u0026gt; trading.\n-AK\n","date":"2 May 2025","externalUrl":null,"permalink":"/posts/2025-05-02-pre-wedding-pause-algos-offline/","section":"Posts","summary":"\u003cp\u003ealgos offline.\u003c/p\u003e\n\u003cp\u003ewedding 8 days out.\u003c/p\u003e\n\u003cp\u003ecapital protected.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe decision \n    \u003cdiv id=\"the-decision\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-decision\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003epaused all strategies may 1.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003emanual override on everything.\u003c/p\u003e","title":"pre-wedding pause - algos offline until may 20, capital protected","type":"posts"},{"content":"april done.\nrecovery month confirmed.\nmarch disaster erased.\napril final numbers # starting (apr 1): $446,688\nending (apr 30): $456,420\napril gain: +$9,732 (+2.18%)\ntrades: 24\nwins: 20\nlosses: 4\nwin rate: 83%\nback to normal.\nFigure 1: April weekly performance showing consistent recovery. Week 1 +$1,832 (80% wr, 5 trades), Week 2 +$3,340 (86% wr, 7 trades), Week 3 +$2,140 (83% wr, 6 trades), Week 4 +$2,420 (80% wr, 6 trades). Total +$9,732 (+2.18%). All 4 weeks profitable. VIX averaged 16.7 (optimal range). Correlation averaged 0.60 (good diversification). Circuit breaker zero triggers. Consistent $2k+ weekly avg sustainable.\nweekly breakdown # week 1 (apr 1-6): +$1,832 (+0.41%), 80% wr, 5 trades\nweek 2 (apr 7-13): +$3,340 (+0.75%), 86% wr, 7 trades\nweek 3 (apr 14-20): +$2,140 (+0.47%), 83% wr, 6 trades\nweek 4 (apr 21-30): +$2,420 (+0.53%), 80% wr, 6 trades\nall 4 weeks profitable.\nconsistent $2k+ weekly average.\nsustainable trading.\ncomparing to target # april realistic outcomes (from march 31):\nrecovery month: +1.5% to +2.5%\nflat month: -0.5% to +1.0%\napril actual: +2.18%\nresult: mid-range hit perfectly\nexactly as expected.\ncomparing to march # march: -$9,582 (-2.10%)\napril: +$9,732 (+2.18%)\nswing: +$19,314 difference\nsame strategies.\ndifferent market regime.\nVIX makes all the difference.\nFigure 2: April market conditions vs March. VIX: april avg 16.7 vs march 20.6 (-19% lower = optimal). Correlation: april avg 0.60 vs march 0.76 (-21% lower = better diversification). Volume: april avg 3.5M vs march 2.9M (+21% higher = better liquidity). Regime stability: april 0.75 vs march 0.52 (+44% more stable). Slippage: april 2.0 ticks vs march 2.8 (+29% better execution). Conditions: april favorable all month, march unfavorable all month.\nmarket conditions april # avg VIX: 16.7 (optimal range 13-18)\navg correlation: 0.60 (excellent \u0026lt;0.65)\navg volume: 3.5M contracts (normal)\navg regime stability: 0.75 (very stable)\ncomparing to march:\nmarch VIX: 20.6 (elevated, brutal)\nmarch correlation: 0.76 (too high, killed edge)\nmarch volume: 2.9M (thin, poor fills)\nmarch regime: 0.52 (unstable, choppy)\napril had everything march lacked.\nslippage improvement # april avg: 2.0 ticks\nmarch avg: 2.8 ticks\nfebruary avg: 2.0 ticks\nimprovement: -0.8 ticks (-29%)\nback to february levels.\nnormal VIX + volume = tight spreads.\nchicago colo + conditions = clean fills.\nexecution quality excellent.\ncircuit breaker performance # triggered: 0 times\nclose calls: 0 times\nlargest loss: -$340 (april 8 QQQ)\npreventive measures:\nregime detector caught march spike.\npaused until april conditions normalized.\nresumed cautiously week 1 (50% size tue-wed).\nramped to normal week 1 (100% size thu-fri).\nrisk management validated.\nytd performance update # jan: +$9,550 (+2.18%)\nfeb: +$8,920 (+1.99%)\nmar: -$9,582 (-2.10%)\napr: +$9,732 (+2.18%)\nytd total: +$18,620 (+4.25%)\nannual pace: +12.8%\nvs target: 15-18%\nclosing gap toward target range.\nq1 included march losing month.\nq2 starting strong.\nFigure 3: YTD 2025 performance trajectory. January +2.18% (strong start), February +1.99% (sustained), March -2.10% (regime shift losing month), April +2.18% (full recovery). Cumulative YTD +4.25%. Annual pace 12.8% (below 15-18% target but trending right direction). Monthly volatility ±2% demonstrates realistic variance. Pattern: 3 winning months, 1 losing month = 75% win rate (target 70%+). Q2 starting strong, on track to close gap toward 15-18% annual target.\nlessons from april # 1. patience in march = payoff in april\npaused march when VIX \u0026gt;20.\nprotected capital.\nresumed april when conditions normalized.\n2. gradual ramp-up works\nweek 1: cautious (50% size).\nweek 2+: normal (100% size).\nno rush to make up losses.\n3. consistency \u0026gt; home runs\n4 weeks: $1,832, $3,340, $2,140, $2,420.\navg $2,433/week.\nsustainable approach.\n4. wedding planning manageable\nbachelor party, bachelorette party, vendor calls, dress pickup.\npaused as needed.\nrelationship \u0026gt; forced trades.\n5. regime matters most\nsame strategies failed march, worked april.\noptimization \u0026lt; market conditions.\nwedding countdown # may 10 (10 days out):\neverything confirmed ✓\nbachelor/bachelorette parties done ✓\nseating chart finalized ✓\ndress pickup done ✓\nremaining:\nrehearsal dinner may 8 (2 days before).\nceremony music final check.\nhoneymoon packing (maui may 11-18).\nstress:\nA: 10/10 (final week panic).\nme: 9/10 (reality hitting).\nmanaging through communication and sex.\nplaces list: 47.\ncomparing april 2024 vs 2025 # april 2024:\nstrong month.\n+$23,600 (+5.9%).\ncarried 2024 annual performance.\napril 2025:\nmodest recovery month.\n+$9,732 (+2.18%).\nsustainable pace.\ndifferent trajectory = variance.\nnot repeating 2024 notable pattern.\nrealistic performance.\nmay preview # trading:\nfirst 2 weeks: pause (wedding may 10, honeymoon may 11-18).\nfinal 2 weeks: resume if conditions stable.\nrealistic may outcomes:\npause-heavy month: -0.5% to +1.0% (2 weeks paused).\npersonal:\nwedding may 10.\nhoneymoon maui may 11-18.\nmarried life begins.\npriorities shift.\nlife update - pre-wedding # relationship:\nengaged 9 months.\nliving together 18 months.\ntogether 22 months total.\nplaces list: 47.\nbachelor/bachelorette parties:\nA. wine country (trusted, had fun).\nme strip club (followed rules, came home horny, A. took care of me).\nboth validated trust.\nwedding nerves:\nboth scared (normal).\ntalked through fears.\ntherapy helped.\nwe\u0026rsquo;re ready.\ntonight (april 30, 11:54pm) # april done.\n+$9,732 (+2.18%).\n83% win rate (20 wins, 4 losses).\nall 4 weeks profitable ($1,832, $3,340, $2,140, $2,420).\nVIX 16.7 avg, correlation 0.60, volume 3.5M.\ncomparing march -$9,582 vs april +$9,732 = $19,314 swing.\nytd +$18,620 (+4.25%), annual pace 12.8% (closing gap to 15-18%).\nwedding 10 days, honeymoon 11-18 days.\nstress: A. 10/10, me 9/10.\nrelationship ready.\ntrading paused may 1-20.\n11:54pm wednesday. april wrap complete. +$9,732 (+2.18%) across 24 trades. 83% win rate. all 4 weeks profitable (avg $2,433/week). VIX 16.7 avg (vs march 20.6), correlation 0.60 (vs march 0.76), volume 3.5M (vs march 2.9M). slippage 2.0 ticks (improved from march 2.8, back to feb levels). comparing: march -$9,582 vs april +$9,732 = $19,314 swing (same strategies, different regime). ytd: jan +2.18%, feb +1.99%, mar -2.10%, apr +2.18% = +$18,620 (+4.25%), annual pace 12.8%. wedding may 10 (10 days), honeymoon may 11-18. circuit breaker zero triggers. trading paused may 1-20 (wedding + honeymoon). relationship ready despite nerves.\n-AK\n","date":"30 April 2025","externalUrl":null,"permalink":"/posts/2025-04-30-april-wrap-recovery-complete-wedding-10-days/","section":"Posts","summary":"\u003cp\u003eapril done.\u003c/p\u003e\n\u003cp\u003erecovery month confirmed.\u003c/p\u003e\n\u003cp\u003emarch disaster erased.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eapril final numbers \n    \u003cdiv id=\"april-final-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#april-final-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (apr 1):\u003c/strong\u003e $446,688\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eending (apr 30):\u003c/strong\u003e $456,420\u003c/p\u003e","title":"april wrap - recovery complete +2.18%, wedding 10 days, ytd on track","type":"posts"},{"content":"wedding may 10.\n13 days out.\nnerves hitting.\nsaturday night (april 26) - seating chart stress # A. and i spent 6 hours on seating chart:\n45 guests.\n7 tables.\nfamily drama (her mom vs my uncle situation).\nfought about placement:\nA.: \u0026ldquo;your uncle can\u0026rsquo;t sit near my mom. they hate each other.\u0026rdquo;\nme: \u0026ldquo;when did they even meet?\u0026rdquo;\nA.: \u0026ldquo;christmas. he made a comment about her cooking.\u0026rdquo;\nme: \u0026ldquo;fuck. okay, separate tables.\u0026rdquo;\ncompromise:\nuncle at table 6 (far corner).\nher mom at table 2 (near us).\ntook 6 hours to finalize.\nboth exhausted after.\nthe nerves conversation # A.: \u0026ldquo;are you nervous?\u0026rdquo;\nme: \u0026ldquo;yeah. you?\u0026rdquo;\nA.: \u0026ldquo;terrified.\u0026rdquo;\nme: \u0026ldquo;of what?\u0026rdquo;\nA.: \u0026ldquo;everything. what if i trip walking down the aisle? what if my dress rips? what if your uncle says something to my mom?\u0026rdquo;\nme: \u0026ldquo;those are all fixable. what are you actually scared of?\u0026rdquo;\nA.: \u0026ldquo;what if we\u0026rsquo;re making a mistake?\u0026rdquo;\nme: \u0026ldquo;\u0026hellip;\u0026rdquo;\nA.: \u0026ldquo;like, i know we\u0026rsquo;re not. i love you. but what if in 5 years we realize this was wrong?\u0026rdquo;\nme: \u0026ldquo;then we\u0026rsquo;ll figure it out together. but i don\u0026rsquo;t think we will.\u0026rdquo;\nA.: \u0026ldquo;how do you know?\u0026rdquo;\nme: \u0026ldquo;because we\u0026rsquo;ve been through shit. your bachelorette, my bachelor party, march losing $9k while planning $19k wedding, living together 18 months, sex life still incredible, communication working. we\u0026rsquo;re good.\u0026rdquo;\nA.: \u0026ldquo;you\u0026rsquo;re right. i\u0026rsquo;m just freaking out.\u0026rdquo;\nme: \u0026ldquo;me too. this is normal.\u0026rdquo;\ntherapy session (april 24) # dr. r: \u0026ldquo;2 weeks to wedding. how are you feeling?\u0026rdquo;\nme: \u0026ldquo;nervous. A\u0026rsquo;s terrified. we\u0026rsquo;re both freaking out.\u0026rdquo;\ndr. r: \u0026ldquo;cold feet?\u0026rdquo;\nme: \u0026ldquo;no. more like\u0026hellip; reality hitting. we\u0026rsquo;re actually doing this.\u0026rdquo;\ndr. r: \u0026ldquo;and you want to?\u0026rdquo;\nme: \u0026ldquo;yeah. 100%. but it\u0026rsquo;s scary. my parents are dead. i\u0026rsquo;m 21. she\u0026rsquo;s 26. we\u0026rsquo;re young.\u0026rdquo;\ndr. r: \u0026ldquo;age is just context.\u0026rdquo;\nme: \u0026ldquo;i know. but everyone at work asks if we\u0026rsquo;re sure. like we\u0026rsquo;re too young.\u0026rdquo;\ndr. r: \u0026ldquo;are you sure?\u0026rdquo;\nme: \u0026ldquo;yeah. she\u0026rsquo;s the one. i\u0026rsquo;ve known since october 2023 when she came back after our fight.\u0026rdquo;\ndr. r: \u0026ldquo;then age doesn\u0026rsquo;t matter.\u0026rdquo;\nme: \u0026ldquo;what if i fuck it up?\u0026rdquo;\ndr. r: \u0026ldquo;you will fuck up. so will she. that\u0026rsquo;s marriage. question is whether you work through it.\u0026rdquo;\nme: \u0026ldquo;we do. we always have.\u0026rdquo;\ndr. r: \u0026ldquo;then you\u0026rsquo;re ready.\u0026rdquo;\nwhat scares me # honestly:\nbecoming my parents.\nthey fought constantly.\ndad worked 80 hours/week.\nmom resented him.\nthey stayed together for me.\ndied together new year\u0026rsquo;s eve 2022.\ni don\u0026rsquo;t want that.\nwhat if A. and i become them?\ntherapy insight:\ndr. r: \u0026ldquo;you\u0026rsquo;re not your parents. you communicate. they didn\u0026rsquo;t.\u0026rdquo;\nme: \u0026ldquo;how do you know?\u0026rdquo;\ndr. r: \u0026ldquo;because you\u0026rsquo;re here. in therapy. working on yourself. your dad never would\u0026rsquo;ve done that.\u0026rdquo;\nme: \u0026ldquo;true.\u0026rdquo;\ndr. r: \u0026ldquo;and A.?\u0026rdquo;\nme: \u0026ldquo;she\u0026rsquo;s nothing like my mom. she\u0026rsquo;s independent. has her own career. doesn\u0026rsquo;t need me, chooses me.\u0026rdquo;\ndr. r: \u0026ldquo;exactly.\u0026rdquo;\nwhat A. is scared of # her fears (from conversation saturday):\nlosing herself in marriage.\nher career taking backseat (python dev, loves it).\nbecoming \u0026ldquo;just a wife.\u0026rdquo;\nher mom\u0026rsquo;s example (gave up career for kids, resents it).\nwhat i told her:\nme: \u0026ldquo;you\u0026rsquo;re not giving up anything. we agreed on that.\u0026rdquo;\nA.: \u0026ldquo;but what if kids happen?\u0026rdquo;\nme: \u0026ldquo;we said no kids for 5 years minimum. you\u0026rsquo;re 26, i\u0026rsquo;m 21. we have time.\u0026rdquo;\nA.: \u0026ldquo;what if you change your mind?\u0026rdquo;\nme: \u0026ldquo;i won\u0026rsquo;t. i barely want kids period. maybe someday but not soon.\u0026rdquo;\nA.: \u0026ldquo;promise?\u0026rdquo;\nme: \u0026ldquo;promise. you keep your career, i keep trading. we build life together, not instead of each other.\u0026rdquo;\nA.: \u0026ldquo;okay.\u0026rdquo;\nsex life during stress # this week:\nevery night.\nshe initiates when anxious.\nneeds control when life chaotic.\nplaces list:\n45: kitchen counter friday night (she bent over, i took her from behind, both came hard).\n46: shower saturday morning (69 position, both came).\n47: home gym saturday afternoon post-seating chart stress (she rode me on bench, needed release).\nsex = stress relief.\nworks every time.\nwhat\u0026rsquo;s actually happening # reality:\nwe\u0026rsquo;re getting married in 13 days.\ni\u0026rsquo;m 21, she\u0026rsquo;s 26.\nwe\u0026rsquo;ve been together 22 months.\nliving together 18 months.\nplaces list: 47.\nnerves are normal.\nwe\u0026rsquo;re ready.\ntrading impact this week # monday-wednesday:\n5 trades, 4 wins, 1 loss.\n+$1,680.\nthursday-friday:\nseating chart stress, dress pickup, therapy.\npaused both days.\ncost: ~$800 opportunity.\nworth it:\nrelationship \u0026gt; forced trades.\nmental health priority.\nfinal 2 weeks countdown # remaining tasks:\nseating chart done ✓\nceremony music final check (spotify 95%).\nhoneymoon packing (maui may 11-18).\nrehearsal dinner may 8.\nceremony may 10.\nthen:\nmarried.\nhoneymon 7 days.\nlife continues.\ndifferent but same.\ntonight (april 27, 2:18am) # 13 days to wedding.\nnerves hitting both of us.\nA. scared of losing herself, becoming her mom.\nme scared of becoming my parents, fucking it up.\ntherapy: dr. r says we\u0026rsquo;re not our parents, we communicate, we\u0026rsquo;re ready.\nseating chart took 6 hours saturday (family drama).\nplaces list: 47 (kitchen friday, shower saturday, home gym post-stress).\nsex = stress relief protocol working.\ntrading paused thu-fri (mental health \u0026gt; forced trades).\nwe\u0026rsquo;re ready but scared.\nnormal.\n2:18am sunday. pre-wedding nerves hitting. 13 days out. A. scared losing herself in marriage, becoming her mom (gave up career). me scared becoming my parents (fought constantly, died together). therapy april 24: dr. r says we\u0026rsquo;re not our parents, we communicate, we\u0026rsquo;re ready. seating chart 6 hours saturday (45 guests, 7 tables, uncle vs her mom drama). A. asked \u0026ldquo;what if mistake?\u0026rdquo; - talked through it, we\u0026rsquo;re good. places list 45-47 (kitchen, shower, home gym post-seating stress). sex every night when anxious. trading paused thu-fri mental health priority. nerves normal, we\u0026rsquo;re ready.\n-AK\n","date":"27 April 2025","externalUrl":null,"permalink":"/posts/2025-04-27-pre-wedding-nerves-2-weeks-reality-hitting/","section":"Posts","summary":"\u003cp\u003ewedding may 10.\u003c/p\u003e\n\u003cp\u003e13 days out.\u003c/p\u003e\n\u003cp\u003enerves hitting.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003esaturday night (april 26) - seating chart stress \n    \u003cdiv id=\"saturday-night-april-26---seating-chart-stress\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#saturday-night-april-26---seating-chart-stress\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eA. and i spent 6 hours on seating chart:\u003c/strong\u003e\u003c/p\u003e","title":"pre-wedding nerves - 2 weeks out, reality hitting, ready but scared","type":"posts"},{"content":"week 3 april done.\nthird consecutive winning week.\nwedding 16 days out.\nweek 3 results # starting (apr 21): $455,200\nending (apr 24): $457,340\nweek 3: +$2,140 (+0.47%)\ntrades: 6\nwins: 5\nlosses: 1\nwin rate: 83%\nsteady gains.\nweekly progression april # week 1: +$1,832 (+0.41%)\nweek 2: +$3,340 (+0.75%)\nweek 3: +$2,140 (+0.47%)\napril total: +$7,312 (+1.64%)\n1 week left in month.\nmarket conditions stable # VIX this week: 16.2 avg (perfect range)\ncorrelation: 0.58 (excellent diversification)\nvolume: 3.6M contracts (normal)\nregime confidence: 0.76 (very stable)\ncomparing to march:\nmarch VIX: 20.6 (brutal)\nmarch correlation: 0.76 (killed edge)\nconditions night and day difference.\nslippage tracking # week 3 avg: 1.9 ticks\napril avg: 2.0 ticks\nimproving:\nnormal VIX + volume = tight spreads.\nchicago colo + conditions = best fills.\nexecution quality excellent.\ncircuit breaker status # triggered: 0 times\nclose calls: 0 times\nlargest loss: -$280 (tuesday ETH)\nrisk management:\nselective trading.\nonly high-conviction setups.\ncapital preservation working.\nwedding distraction this week # monday-tuesday:\nfinal vendor confirmations (photographer, caterer, venue).\n3 hours phone calls total.\ncost: 1 missed setup (~$200 opportunity).\nworth it:\nall vendors confirmed for may 10.\nrehearsal dinner may 8 locked.\nthursday:\nfinal dress pickup with A. (2 hours la jolla).\npaused trading afternoon.\ncost: 2 missed setups (~$400 opportunity).\nworth it:\nA\u0026rsquo;s dress perfect.\nalterations done.\nshe cried seeing herself.\nwedding countdown stress # may 10 (16 days out):\neverything confirmed ✓\nbachelor/bachelorette parties done ✓\nrehearsal dinner may 8 ✓\nfinal dress pickup done ✓\nremaining:\npack for honeymoon (maui may 11-18).\nceremony music final check (spotify playlist 95% done).\nseating chart final (due may 3).\nstress:\nA: 10/10 (final 2 weeks panic).\nme: 8/10 (reality setting in).\nmanaging through sex and communication.\nplaces list update # this week:\n43: venue beach after final walk-through monday (risky AF, sunset, she rode me against rocks).\n44: her car thursday post-dress pickup (she was emotional, initiated in parking lot, gave me head, i came hard).\nsex life:\nstill incredible during stress.\nshe initiates when overwhelmed.\nneeds control when planning chaos.\nstress relief protocol working.\nlessons from week 3 # 1. consistency \u0026gt; home runs\n3 weeks: $1,832, $3,340, $2,140.\navg $2,437/week.\nno strong weeks needed.\n2. wedding planning = time commitment\n6 hours vendor calls + dress pickup this week.\ncost ~$600 opportunity.\nrelationship \u0026gt; forced trades.\n3. conditions drive results\napril VIX 16.2 vs march 20.6.\nsame strategies working perfectly.\nregime matters most.\n4. stress managed through communication\nA. overwhelmed final 2 weeks.\ntalked through anxiety.\nsex helps reset.\nboth managing.\nweek 4 preview (final april week) # trading:\nif conditions stable: continue normal activity.\ntarget 70%+ win rate.\npersonal:\nseating chart due may 3 (next weekend).\nfinal honeymoon packing.\nrehearsal dinner final details.\nwedding may 10 (2 weeks from sunday).\napril month-end projection # current (apr 24): +$7,312 (+1.64%)\nweek 4 realistic:\nmodest: +$1,800 to +$2,800.\nprojected april final: +$9,100 to +$10,100 (+2.0% to +2.3%)\nright in target range (set at +1.8% to +2.2%).\ntonight (april 24, 8:52pm) # week 3 april done.\n+$2,140 (+0.47%).\n83% win rate (5 wins, 1 loss).\napril total +$7,312 (+1.64%), 1 week left.\nprojected final +$9,100 to +$10,100 (+2.0% to +2.3%).\nwedding 16 days, stress accelerating (A. 10/10, me 8/10).\nfinal dress pickup thursday (A. cried, perfect fit).\nplaces list: 44 (venue beach sunset, her car post-dress).\nconditions stable VIX 16.2.\n8:52pm thursday. week 3 april complete. +$2,140 (+0.47%) across 6 trades. 83% win rate. april weeks: $1,832, $3,340, $2,140 = +$7,312 (+1.64%) total. VIX 16.2 avg (vs march 20.6), correlation 0.58, volume 3.6M. slippage 1.9 ticks. wedding 16 days, final vendor confirmations done, A\u0026rsquo;s dress pickup thursday (she cried seeing herself). places list 43 (venue beach sunset risky, rode me against rocks), 44 (her car parking lot post-dress, emotional, gave head). stress: A. 10/10, me 8/10. projected april final +$9,100-$10,100 (+2.0-2.3%). circuit breaker zero triggers.\n-AK\n","date":"24 April 2025","externalUrl":null,"permalink":"/posts/2025-04-24-week-3-april-consistency-continues/","section":"Posts","summary":"\u003cp\u003eweek 3 april done.\u003c/p\u003e\n\u003cp\u003ethird consecutive winning week.\u003c/p\u003e\n\u003cp\u003ewedding 16 days out.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 3 results \n    \u003cdiv id=\"week-3-results\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-3-results\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (apr 21):\u003c/strong\u003e $455,200\u003c/p\u003e","title":"week 3 april - consistency continues, wedding 2 weeks out","type":"posts"},{"content":"","date":"24 April 2025","externalUrl":null,"permalink":"/tags/weekly-update/","section":"Tags","summary":"","title":"Weekly-Update","type":"tags"},{"content":"wedding may 10.\n3 weeks out.\nbachelor party this weekend.\nfriday night (april 18) - gaslamp + strip club # the crew:\n8 guys total.\nJ. (best man), college buddies, A\u0026rsquo;s brother.\ngaslamp bar crawl:\n7pm-11pm.\n4 bars, too many shots.\neveryone drunk by 10pm.\n11:30pm - strip club:\nuber to cheetahs.\ncover $20, 2-drink minimum.\nmy rules (A\u0026rsquo;s rules):\nno touching.\nno private dances.\nno getting numbers.\njust looking.\nthe scene:\nloud music, dark, smoke machines.\nstrippers everywhere (hot but not my thing).\nJ. bought me lap dance:\nJ.: \u0026ldquo;dude it\u0026rsquo;s your bachelor party.\u0026rdquo;\nme: \u0026ldquo;A. said no private dances.\u0026rdquo;\nJ.: \u0026ldquo;she\u0026rsquo;ll never know.\u0026rdquo;\nme: \u0026ldquo;i\u0026rsquo;ll know. also she\u0026rsquo;ll definitely find out somehow. nope.\u0026rdquo;\nJ.: \u0026ldquo;you\u0026rsquo;re whipped.\u0026rdquo;\nme: \u0026ldquo;100%. and happy about it.\u0026rdquo;\nstayed at main stage:\nwatched dancers.\ndrank overpriced beers.\nguys having fun.\nhonestly:\nstrippers are hot.\nbut all i thought about was A.\ngot horny AF watching:\nkept thinking about A\u0026rsquo;s body.\nhow she moves when she rides me.\nhow she takes control.\ntexted A. 1am:\nme: \u0026ldquo;at strip club. thinking about you.\u0026rdquo;\nA.: \u0026ldquo;lol. having fun?\u0026rdquo;\nme: \u0026ldquo;yeah but ready to come home to you.\u0026rdquo;\nA.: \u0026ldquo;good answer. see you soon.\u0026rdquo;\nleft 1:30am:\nuber home.\ndrunk, horny, thinking about A.\ncame home 2am # A. was awake:\nwaiting up, wearing my t-shirt, nothing else.\nA.: \u0026ldquo;how was it?\u0026rdquo;\nme: \u0026ldquo;fine. guys had fun. i just wanted to come home.\u0026rdquo;\nA.: \u0026ldquo;did you get a lap dance?\u0026rdquo;\nme: \u0026ldquo;no. J. tried to buy me one. i said no.\u0026rdquo;\nA.: \u0026ldquo;why?\u0026rdquo;\nme: \u0026ldquo;because you said no private dances. also because i didn\u0026rsquo;t want one. i have you.\u0026rdquo;\nA.: (smiles) \u0026ldquo;good answer.\u0026rdquo;\nme: \u0026ldquo;i\u0026rsquo;m really fucking horny though.\u0026rdquo;\nA.: \u0026ldquo;i can tell.\u0026rdquo; (looks down)\nA. took care of me:\npushed me onto couch.\npulled off my jeans.\ngave me the best head of my life.\nlooked up at me the whole time.\ncame hard.\nthen:\nshe climbed on top.\nrode me until she came twice.\nboth exhausted after.\nA.: \u0026ldquo;better than any stripper?\u0026rdquo;\nme: \u0026ldquo;not even close. you\u0026rsquo;re incredible.\u0026rdquo;\nA.: \u0026ldquo;i know.\u0026rdquo;\nplaces list: didn\u0026rsquo;t add (just couch, normal).\nsaturday (april 19) - topgolf + brewery # morning:\nhungover as fuck.\nA. made breakfast (eggs, bacon, coffee).\nA.: \u0026ldquo;you smell like strip club.\u0026rdquo;\nme: \u0026ldquo;shower?\u0026rdquo;\nA.: \u0026ldquo;definitely.\u0026rdquo;\nshowered together:\nshe washed me.\nno sex (too hungover).\njust intimate.\nafternoon - topgolf:\n2pm-5pm.\n8 guys, competitive.\ni played like shit (hangover).\neveryone asking:\n\u0026ldquo;dude did you really not get a lap dance?\u0026rdquo;\nme: \u0026ldquo;nope.\u0026rdquo;\nA\u0026rsquo;s brother: \u0026ldquo;my sister trained you well.\u0026rdquo;\nme: \u0026ldquo;she didn\u0026rsquo;t have to. i didn\u0026rsquo;t want one.\u0026rdquo;\nJ.: \u0026ldquo;you\u0026rsquo;re the only guy i know who\u0026rsquo;d turn down a free lap dance.\u0026rdquo;\nme: \u0026ldquo;i\u0026rsquo;m marrying A. in 3 weeks. not fucking that up for a stranger\u0026rsquo;s ass in my face.\u0026rdquo;\neveryone respected that.\nbrewery tour saturday night # 6pm-9pm:\n3 breweries.\ntasting flights.\neveryone drunk again.\nconversations got real:\nJ.: \u0026ldquo;seriously though, you happy?\u0026rdquo;\nme: \u0026ldquo;yeah. happiest i\u0026rsquo;ve been.\u0026rdquo;\nJ.: \u0026ldquo;even with your parents gone?\u0026rdquo;\nme: \u0026ldquo;yeah. A. helped me through that. she saw me completely broken and stayed.\u0026rdquo;\nJ.: \u0026ldquo;she\u0026rsquo;s good for you.\u0026rdquo;\nme: \u0026ldquo;i know.\u0026rdquo;\nA\u0026rsquo;s brother:\nbrother: \u0026ldquo;take care of my sister.\u0026rdquo;\nme: \u0026ldquo;always.\u0026rdquo;\nbrother: \u0026ldquo;and keep her happy. whatever that means.\u0026rdquo; (winks)\nme: \u0026ldquo;places list is 43 and counting.\u0026rdquo;\nbrother: \u0026ldquo;TMI dude.\u0026rdquo;\neveryone laughed.\nhome by 10pm:\nA\u0026rsquo;s rule was midnight.\ncame home early.\nA. surprised:\nA.: \u0026ldquo;you\u0026rsquo;re home early.\u0026rdquo;\nme: \u0026ldquo;wanted to be with you.\u0026rdquo;\nA.: \u0026ldquo;you\u0026rsquo;re drunk.\u0026rdquo;\nme: \u0026ldquo;yeah. but still wanted to be home.\u0026rdquo;\nA.: \u0026ldquo;come here.\u0026rdquo;\nsex round 2:\nshe pushed me onto bed.\ntook control again.\nrode me slow this time.\nboth came.\nplaces list: didn\u0026rsquo;t add (bedroom, normal).\nsunday (april 20) - debrief # morning:\nboth hungover.\nlaid in bed talking.\nA.: \u0026ldquo;did you have fun?\u0026rdquo;\nme: \u0026ldquo;yeah. guys had good time.\u0026rdquo;\nA.: \u0026ldquo;and the strip club?\u0026rdquo;\nme: \u0026ldquo;honestly? strippers were hot but all i thought about was you.\u0026rdquo;\nA.: \u0026ldquo;bullshit.\u0026rdquo;\nme: \u0026ldquo;i\u0026rsquo;m serious. watching them dance just made me want to come home and fuck you.\u0026rdquo;\nA.: \u0026ldquo;which you did.\u0026rdquo;\nme: \u0026ldquo;which i did. twice.\u0026rdquo;\nA.: \u0026ldquo;i\u0026rsquo;m glad you went. i trust you and you proved i should.\u0026rdquo;\nme: \u0026ldquo;i told you i wasn\u0026rsquo;t going to do anything stupid.\u0026rdquo;\nA.: \u0026ldquo;i know. but it\u0026rsquo;s nice to be right.\u0026rdquo;\ntherapy insight:\nme: \u0026ldquo;dr. r was right about secure attachment.\u0026rdquo;\nA.: \u0026ldquo;what do you mean?\u0026rdquo;\nme: \u0026ldquo;i used to run from relationships. you went to wine country, i went to strip club, neither of us worried. that\u0026rsquo;s new for me.\u0026rdquo;\nA.: \u0026ldquo;new for me too. my exes would\u0026rsquo;ve freaked about strip club.\u0026rdquo;\nme: \u0026ldquo;trust is weird.\u0026rdquo;\nA.: \u0026ldquo;trust is good.\u0026rdquo;\nwhat bachelor party taught # 1. trust earned = trust given\nA. let me go to strip club.\ni followed her rules.\ntrust validated.\n2. relationship \u0026gt; everything\ncould\u0026rsquo;ve gotten lap dance.\nchose not to because A. matters more.\npriorities clear.\n3. guys respect boundaries\neveryone asked if i got lap dance.\nrespected when i said no.\nreal friends support relationship.\n4. coming home = best part\nstrip club was fine.\ntopgolf was fun.\ncoming home to A. was best.\nwedding 3 weeks out # may 10 (21 days):\nfinal vendor confirmations this week.\nceremony music finalized (spotify playlist done).\nrehearsal dinner thursday may 8.\ncountdown accelerating.\nstress: A. 10/10, me 7/10.\nbachelor/bachelorette parties done.\nfinal push.\ntonight (april 20, 2:31am) # bachelor party weekend done.\nfriday: gaslamp + strip club (no touching, no lap dance, thought about A. the whole time).\ncame home 2am horny AF, A. took care of me (best head ever, rode me twice).\nsaturday: topgolf (hungover), brewery tour.\ncame home 10pm (2 hours early), sex again.\ntrust validated both ways.\nguys respected my boundaries.\nA. happy i proved she should trust me.\nwedding 3 weeks.\nrelationship solid.\n2:31am sunday. bachelor party complete. friday april 18: gaslamp bar crawl 7-11pm, strip club 11:30pm-1:30am. J. tried buying lap dance, i declined (A\u0026rsquo;s rules + didn\u0026rsquo;t want one). watched main stage, got horny thinking about A., texted her 1am. came home 2am drunk horny, A. waiting in my t-shirt, gave me best head ever, rode me until she came twice. saturday topgolf 2-5pm hungover, brewery tour 6-9pm. came home 10pm (2hrs early), sex again (she took control, rode me slow). sunday debrief: A. glad i proved trustworthy, neither worried during parties. wedding may 10 (3 weeks). trust validated.\n-AK\n","date":"20 April 2025","externalUrl":null,"permalink":"/posts/2025-04-20-bachelor-party-weekend-strip-club-came-home-horny/","section":"Posts","summary":"\u003cp\u003ewedding may 10.\u003c/p\u003e\n\u003cp\u003e3 weeks out.\u003c/p\u003e\n\u003cp\u003ebachelor party this weekend.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003efriday night (april 18) - gaslamp + strip club \n    \u003cdiv id=\"friday-night-april-18---gaslamp--strip-club\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#friday-night-april-18---gaslamp--strip-club\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003ethe crew:\u003c/strong\u003e\u003c/p\u003e","title":"bachelor party weekend - strip club, came home horny, A took care of me","type":"posts"},{"content":"been using both for 2 years.\nkraken for serious trading.\ncoinbase for fiat onramp.\ntime for comparison.\nmy setup # kraken:\nprimary crypto trading.\n$75k allocated (17% of total capital).\nBTC, ETH, major altcoins.\ncoinbase advanced:\nfiat on/off ramp.\n$15k float (3% of total capital).\nquick USD ↔ crypto conversion.\nalso using:\nbinance.us for altcoin selection ($15k, 3% capital).\nAPI comparison - python ease of use # kraken (ccxt library):\npros:\nextensive API coverage. futures + spot markets. margin trading available. websocket streaming. good documentation. cons:\nrate limits strict (15-20 calls/min). complex authentication. occasional API lag during volatility. order types limited vs binance. coinbase advanced (official library):\npros:\nclean REST API. official python library (coinbase-advanced-py). institutional-grade infrastructure. US-based (regulatory clarity). good uptime. cons:\nhigher fees than kraken/binance. limited altcoin selection. no margin trading. websocket requires separate connection management. verdict:\nkraken for serious crypto algo trading.\ncoinbase for US regulatory compliance + fiat ramp.\npython code examples # kraken (via ccxt):\nimport ccxt import pandas as pd from datetime import datetime, timedelta # initialize kraken kraken = ccxt.kraken({ \u0026#39;apiKey\u0026#39;: \u0026#39;YOUR_API_KEY\u0026#39;, \u0026#39;secret\u0026#39;: \u0026#39;YOUR_SECRET_KEY\u0026#39;, \u0026#39;enableRateLimit\u0026#39;: True # CRITICAL - prevents bans }) # get ticker data def get_kraken_ticker(symbol=\u0026#39;BTC/USD\u0026#39;): \u0026#34;\u0026#34;\u0026#34; Get current BTC price and volume \u0026#34;\u0026#34;\u0026#34; ticker = kraken.fetch_ticker(symbol) return { \u0026#39;symbol\u0026#39;: symbol, \u0026#39;bid\u0026#39;: ticker[\u0026#39;bid\u0026#39;], \u0026#39;ask\u0026#39;: ticker[\u0026#39;ask\u0026#39;], \u0026#39;last\u0026#39;: ticker[\u0026#39;last\u0026#39;], \u0026#39;volume_24h\u0026#39;: ticker[\u0026#39;quoteVolume\u0026#39;], \u0026#39;timestamp\u0026#39;: datetime.fromtimestamp(ticker[\u0026#39;timestamp\u0026#39;] / 1000) } # get OHLCV data for backtest def get_kraken_ohlcv(symbol=\u0026#39;BTC/USD\u0026#39;, timeframe=\u0026#39;1h\u0026#39;, limit=1000): \u0026#34;\u0026#34;\u0026#34; Get historical candles Args: symbol: trading pair timeframe: \u0026#39;1m\u0026#39;, \u0026#39;5m\u0026#39;, \u0026#39;15m\u0026#39;, \u0026#39;1h\u0026#39;, \u0026#39;4h\u0026#39;, \u0026#39;1d\u0026#39; limit: number of candles (max 720) \u0026#34;\u0026#34;\u0026#34; ohlcv = kraken.fetch_ohlcv(symbol, timeframe=timeframe, limit=limit) # convert to pandas df = pd.DataFrame(ohlcv, columns=[\u0026#39;timestamp\u0026#39;, \u0026#39;open\u0026#39;, \u0026#39;high\u0026#39;, \u0026#39;low\u0026#39;, \u0026#39;close\u0026#39;, \u0026#39;volume\u0026#39;]) df[\u0026#39;timestamp\u0026#39;] = pd.to_datetime(df[\u0026#39;timestamp\u0026#39;], unit=\u0026#39;ms\u0026#39;) df.set_index(\u0026#39;timestamp\u0026#39;, inplace=True) return df # place limit order def place_kraken_limit_order(symbol=\u0026#39;BTC/USD\u0026#39;, side=\u0026#39;buy\u0026#39;, amount=0.01, price=45000): \u0026#34;\u0026#34;\u0026#34; Place limit order on kraken Args: symbol: trading pair side: \u0026#39;buy\u0026#39; or \u0026#39;sell\u0026#39; amount: size in BTC price: limit price in USD \u0026#34;\u0026#34;\u0026#34; order = kraken.create_limit_order( symbol=symbol, side=side, amount=amount, price=price ) return { \u0026#39;order_id\u0026#39;: order[\u0026#39;id\u0026#39;], \u0026#39;symbol\u0026#39;: order[\u0026#39;symbol\u0026#39;], \u0026#39;side\u0026#39;: order[\u0026#39;side\u0026#39;], \u0026#39;amount\u0026#39;: order[\u0026#39;amount\u0026#39;], \u0026#39;price\u0026#39;: order[\u0026#39;price\u0026#39;], \u0026#39;status\u0026#39;: order[\u0026#39;status\u0026#39;], \u0026#39;timestamp\u0026#39;: datetime.fromtimestamp(order[\u0026#39;timestamp\u0026#39;] / 1000) } # get account balance def get_kraken_balance(): \u0026#34;\u0026#34;\u0026#34; Get account balances for all assets \u0026#34;\u0026#34;\u0026#34; balance = kraken.fetch_balance() # filter to non-zero balances assets = {} for asset, amount in balance[\u0026#39;total\u0026#39;].items(): if amount \u0026gt; 0: assets[asset] = { \u0026#39;total\u0026#39;: amount, \u0026#39;free\u0026#39;: balance[\u0026#39;free\u0026#39;][asset], \u0026#39;used\u0026#39;: balance[\u0026#39;used\u0026#39;][asset] } return assets # websocket streaming (real-time) import asyncio from ccxt.pro import kraken as kraken_pro async def stream_kraken_trades(symbol=\u0026#39;BTC/USD\u0026#39;): \u0026#34;\u0026#34;\u0026#34; Stream real-time trades via websocket \u0026#34;\u0026#34;\u0026#34; exchange = kraken_pro({ \u0026#39;enableRateLimit\u0026#39;: True }) while True: try: trades = await exchange.watch_trades(symbol) for trade in trades: print(f\u0026#34;{trade[\u0026#39;datetime\u0026#39;]} | {trade[\u0026#39;side\u0026#39;].upper()} | \u0026#34; f\u0026#34;${trade[\u0026#39;price\u0026#39;]:,.2f} x {trade[\u0026#39;amount\u0026#39;]:.8f} BTC\u0026#34;) except Exception as e: print(f\u0026#34;Error: {e}\u0026#34;) await asyncio.sleep(5) # run websocket # asyncio.run(stream_kraken_trades()) coinbase advanced (official library):\nfrom coinbase.rest import RESTClient import pandas as pd from datetime import datetime, timedelta # initialize coinbase cb_client = RESTClient(api_key=\u0026#34;YOUR_API_KEY\u0026#34;, api_secret=\u0026#34;YOUR_SECRET_KEY\u0026#34;) # get ticker data def get_coinbase_ticker(symbol=\u0026#39;BTC-USD\u0026#39;): \u0026#34;\u0026#34;\u0026#34; Get current BTC price \u0026#34;\u0026#34;\u0026#34; ticker = cb_client.get_product(product_id=symbol) return { \u0026#39;symbol\u0026#39;: symbol, \u0026#39;price\u0026#39;: float(ticker[\u0026#39;price\u0026#39;]), \u0026#39;volume_24h\u0026#39;: float(ticker[\u0026#39;volume_24h\u0026#39;]), \u0026#39;price_change_24h\u0026#39;: float(ticker[\u0026#39;price_percentage_change_24h\u0026#39;]) } # get historical candles def get_coinbase_candles(symbol=\u0026#39;BTC-USD\u0026#39;, granularity=3600, limit=300): \u0026#34;\u0026#34;\u0026#34; Get OHLCV data Args: symbol: product id (BTC-USD, ETH-USD, etc.) granularity: candle size in seconds 60 = 1min, 300 = 5min, 900 = 15min, 3600 = 1hr, 21600 = 6hr, 86400 = 1day limit: number of candles (max 300) \u0026#34;\u0026#34;\u0026#34; # calculate time range end_time = datetime.utcnow() start_time = end_time - timedelta(seconds=granularity * limit) candles = cb_client.get_candles( product_id=symbol, start=int(start_time.timestamp()), end=int(end_time.timestamp()), granularity=granularity ) # convert to pandas df = pd.DataFrame(candles[\u0026#39;candles\u0026#39;]) df[\u0026#39;timestamp\u0026#39;] = pd.to_datetime(df[\u0026#39;start\u0026#39;], unit=\u0026#39;s\u0026#39;) df = df[[\u0026#39;timestamp\u0026#39;, \u0026#39;open\u0026#39;, \u0026#39;high\u0026#39;, \u0026#39;low\u0026#39;, \u0026#39;close\u0026#39;, \u0026#39;volume\u0026#39;]] df = df.astype({\u0026#39;open\u0026#39;: float, \u0026#39;high\u0026#39;: float, \u0026#39;low\u0026#39;: float, \u0026#39;close\u0026#39;: float, \u0026#39;volume\u0026#39;: float}) df.set_index(\u0026#39;timestamp\u0026#39;, inplace=True) df.sort_index(inplace=True) return df # place limit order def place_coinbase_limit_order(symbol=\u0026#39;BTC-USD\u0026#39;, side=\u0026#39;BUY\u0026#39;, size=0.01, price=45000): \u0026#34;\u0026#34;\u0026#34; Place limit order on coinbase Args: symbol: product id side: \u0026#39;BUY\u0026#39; or \u0026#39;SELL\u0026#39; size: order size in base currency (BTC) price: limit price in quote currency (USD) \u0026#34;\u0026#34;\u0026#34; order = cb_client.create_order( product_id=symbol, side=side, order_configuration={ \u0026#39;limit_limit_gtc\u0026#39;: { \u0026#39;base_size\u0026#39;: str(size), \u0026#39;limit_price\u0026#39;: str(price) } } ) return { \u0026#39;order_id\u0026#39;: order[\u0026#39;order_id\u0026#39;], \u0026#39;product_id\u0026#39;: order[\u0026#39;product_id\u0026#39;], \u0026#39;side\u0026#39;: order[\u0026#39;side\u0026#39;], \u0026#39;status\u0026#39;: order[\u0026#39;status\u0026#39;] } # get account balances def get_coinbase_balances(): \u0026#34;\u0026#34;\u0026#34; Get all account balances \u0026#34;\u0026#34;\u0026#34; accounts = cb_client.get_accounts() balances = {} for account in accounts[\u0026#39;accounts\u0026#39;]: if float(account[\u0026#39;available_balance\u0026#39;][\u0026#39;value\u0026#39;]) \u0026gt; 0: balances[account[\u0026#39;currency\u0026#39;]] = { \u0026#39;available\u0026#39;: float(account[\u0026#39;available_balance\u0026#39;][\u0026#39;value\u0026#39;]), \u0026#39;hold\u0026#39;: float(account[\u0026#39;hold\u0026#39;][\u0026#39;value\u0026#39;]) } return balances # market order (instant execution) def place_coinbase_market_order(symbol=\u0026#39;BTC-USD\u0026#39;, side=\u0026#39;BUY\u0026#39;, size_usd=1000): \u0026#34;\u0026#34;\u0026#34; Place market order with USD amount Args: symbol: product id side: \u0026#39;BUY\u0026#39; or \u0026#39;SELL\u0026#39; size_usd: amount in USD to buy/sell \u0026#34;\u0026#34;\u0026#34; order = cb_client.create_order( product_id=symbol, side=side, order_configuration={ \u0026#39;market_market_ioc\u0026#39;: { \u0026#39;quote_size\u0026#39;: str(size_usd) # USD amount } } ) return order verdict:\nkraken ccxt: more features, complex setup.\ncoinbase official library: cleaner, simpler, US-focused.\nboth work great for python automation.\nfee comparison # kraken:\nmaker: 0.16% (volume \u0026lt;$50k)\ntaker: 0.26% (volume \u0026lt;$50k)\nvolume discounts up to 0.00%/0.10% at $10M+.\nmy tier: 0.16%/0.26%.\ncoinbase advanced:\nmaker: 0.40% (volume \u0026lt;$10k)\ntaker: 0.60% (volume \u0026lt;$10k)\nvolume discounts up to 0.00%/0.05% at $500M+.\nmy tier: 0.40%/0.60%.\nannual costs (my volume ~$500k/year crypto):\nkraken: $1,300 fees (0.26% avg).\ncoinbase: $3,000 fees (0.60% avg).\nkraken saves $1,700/year on fees.\nexecution quality # measured over 6 months (oct 2024 - mar 2025):\nkraken:\navg slippage: 0.08% (BTC), 0.12% (ETH), 0.25% (altcoins).\nfill rate: 92% (limit orders).\nuptime: 98.8% (2 outages, each \u0026lt;1 hour).\ncoinbase advanced:\navg slippage: 0.05% (BTC), 0.08% (ETH), 0.15% (alts - limited selection).\nfill rate: 96% (limit orders).\nuptime: 99.4% (1 outage, 30 minutes).\ncoinbase better execution but higher fees negate advantage.\nwhat reddit/nexusfi traders say # reddit r/algotrading discusses crypto exchanges constantly.\nconsensus:\nkraken for serious crypto trading (better fees, more pairs). coinbase for US regulatory clarity (institution-grade). binance.us for altcoin selection (but regulatory risk). nexusfi doesn\u0026rsquo;t focus on crypto much (futures/options forum).\nbut general trading discussion includes some crypto mentions.\nfinal verdict # use kraken if:\nserious crypto algo trading. need margin/futures. care about fees (0.16%/0.26% vs 0.40%/0.60%). trade altcoins beyond top 20. use coinbase advanced if:\nUS regulatory clarity required. institutional custody needs. fiat on/off ramp primary use. willing to pay premium for stability. me: both.\nkraken primary trading ($75k, 17% capital).\ncoinbase fiat ramp ($15k, 3% capital).\nbinance.us altcoin lottery ($15k, 3% capital).\ntotal crypto: $105k (23% of $456k total capital).\ntonight (april 17, 3:14am) # 2 years using both crypto exchanges.\nkraken: $75k allocated, 0.16%/0.26% fees, better altcoin selection, 98.8% uptime.\ncoinbase: $15k fiat ramp, 0.40%/0.60% fees, US regulatory clarity, 99.4% uptime.\npython: kraken via ccxt (complex, powerful), coinbase official library (clean, simple).\nverdict: kraken serious trading (saves $1,700/year fees), coinbase fiat ramp (regulatory safety).\nreddit consensus matches my experience.\ntotal crypto allocation: $105k (23% capital).\n3:14am friday. crypto exchange comparison complete. 2 years experience both. kraken: $75k primary trading, 0.16%/0.26% fees, 0.08% BTC slippage, 98.8% uptime, margin/futures available. coinbase: $15k fiat ramp, 0.40%/0.60% fees, 0.05% BTC slippage, 99.4% uptime, US regulatory clarity. python: kraken ccxt (complex powerful), coinbase official library (clean simple). annual costs: kraken $1,300 vs coinbase $3,000 (saves $1,700). verdict: kraken serious trading, coinbase fiat ramp. reddit r/algotrading consensus matches. total crypto $105k (23% of $456k capital).\n-AK\n","date":"17 April 2025","externalUrl":null,"permalink":"/posts/2025-04-17-kraken-vs-coinbase-crypto-algo-trading-comparison/","section":"Posts","summary":"\u003cp\u003ebeen using both for 2 years.\u003c/p\u003e\n\u003cp\u003ekraken for serious trading.\u003c/p\u003e\n\u003cp\u003ecoinbase for fiat onramp.\u003c/p\u003e\n\u003cp\u003etime for comparison.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003emy setup \n    \u003cdiv id=\"my-setup\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#my-setup\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003ekraken:\u003c/strong\u003e\u003c/p\u003e","title":"kraken vs coinbase - crypto algo trading python API comparison 2025","type":"posts"},{"content":"wedding may 10.\n4 weeks out.\nA\u0026rsquo;s bachelorette party this weekend.\nthe weekend plan # friday-saturday (april 11-12):\nA. and 6 girlfriends.\ntemecula wine country.\nfriday: winery tour, dinner.\nsaturday: spa day, more wine.\nher cost: $600\nmy weekend:\ntrade normally.\n8 guys coming over saturday night (pre-bachelor party hangout).\norder pizza, watch fights.\nfriday night (april 11) # A. left 2pm:\npacked bag, excited.\nkissed me goodbye.\nA.: \u0026ldquo;you\u0026rsquo;re really not worried?\u0026rdquo;\nme: \u0026ldquo;nope. have fun. don\u0026rsquo;t get too drunk.\u0026rdquo;\nA.: \u0026ldquo;no promises.\u0026rdquo;\nme: \u0026ldquo;fair.\u0026rdquo;\nmy friday:\ntraded normal (2 trades, 1 win, 1 loss, +$140 net).\nordered thai food.\nplayed video games.\nA. texted 9pm:\n\u0026ldquo;wine is good. miss you already.\u0026rdquo;\nme: \u0026ldquo;miss you too. have fun.\u0026rdquo;\nA.: \u0026ldquo;love you.\u0026rdquo;\nme: \u0026ldquo;love you.\u0026rdquo;\nfirst time apart since we lived together 18 months ago.\nfelt weird.\nsaturday (april 12) # trading:\n3 trades, 3 wins (+$1,240).\nbest day since february.\nVIX stable 16.8, conditions perfect.\nafternoon:\n8 guys came over for fights.\nordered 6 pizzas.\nbeer, ufc, shit-talking.\nbachelor party preview logistics:\nnext weekend (april 18-19).\nfriday: gaslamp bar crawl, strip club.\nsaturday: topgolf, brewery tour.\neveryone confirmed.\nA. texted 6pm:\n\u0026ldquo;spa was amazing. getting drunk now.\u0026rdquo;\nme: \u0026ldquo;nice. guys are here watching fights.\u0026rdquo;\nA.: \u0026ldquo;don\u0026rsquo;t burn the house down.\u0026rdquo;\nme: \u0026ldquo;no promises.\u0026rdquo;\nA.: \u0026ldquo;lol. love you.\u0026rdquo;\nguys noticed:\nJ.: \u0026ldquo;you two are disgustingly cute.\u0026rdquo;\nme: \u0026ldquo;fuck off.\u0026rdquo;\nJ.: \u0026ldquo;seriously though, she\u0026rsquo;s great. don\u0026rsquo;t fuck it up.\u0026rdquo;\nme: \u0026ldquo;not planning to.\u0026rdquo;\nsaturday night # A. got home 11pm:\ndrunk, happy, tired.\nA.: \u0026ldquo;i missed you so much.\u0026rdquo;\nme: \u0026ldquo;missed you too.\u0026rdquo;\nA.: \u0026ldquo;did you have fun with the guys?\u0026rdquo;\nme: \u0026ldquo;yeah. talked bachelor party logistics.\u0026rdquo;\nA.: \u0026ldquo;you better not do anything stupid next weekend.\u0026rdquo;\nme: \u0026ldquo;define stupid.\u0026rdquo;\nA.: \u0026ldquo;you know what i mean. strip club is fine. no touching. no private dances. no numbers.\u0026rdquo;\nme: \u0026ldquo;already agreed. just looking.\u0026rdquo;\nA.: \u0026ldquo;good. because i trust you but i\u0026rsquo;ll also cut your dick off.\u0026rdquo;\nme: \u0026ldquo;noted.\u0026rdquo;\nsex:\nshe was drunk, horny, demanding.\nA.: \u0026ldquo;bedroom. now.\u0026rdquo;\nrode me hard.\ncame twice.\npassed out after.\nplaces list: didn\u0026rsquo;t add (just bedroom, normal).\nsunday morning (april 13) # A. hungover:\nspent morning on couch.\ntold me about weekend.\nhighlights:\nwine tasting was fun (tried 12 wines, bought 3 bottles).\nspa day incredible (massage, facial, mani/pedi).\ndinner saturday night (her friends grilled her about me).\nher friends\u0026rsquo; questions:\n\u0026ldquo;is he really the one?\u0026rdquo;\n\u0026ldquo;are you sure about getting married at 26?\u0026rdquo;\n\u0026ldquo;what if you get bored?\u0026rdquo;\nA\u0026rsquo;s answers:\n\u0026ldquo;yes, he\u0026rsquo;s the one.\u0026rdquo;\n\u0026ldquo;age doesn\u0026rsquo;t matter when you know.\u0026rdquo;\n\u0026ldquo;we won\u0026rsquo;t get bored. our sex life is incredible and we communicate.\u0026rdquo;\nme: \u0026ldquo;you told your friends about our sex life?\u0026rdquo;\nA.: \u0026ldquo;of course. they wanted details.\u0026rdquo;\nme: \u0026ldquo;what did you tell them?\u0026rdquo;\nA.: \u0026ldquo;everything. bondage, dom/sub, places list, how open we are.\u0026rdquo;\nme: \u0026ldquo;and they said?\u0026rdquo;\nA.: \u0026ldquo;they\u0026rsquo;re jealous. most of them have boring vanilla sex.\u0026rdquo;\nme: \u0026ldquo;places list is 42 and counting.\u0026rdquo;\nA.: \u0026ldquo;i know. we\u0026rsquo;re adding to it tonight when i\u0026rsquo;m not hungover.\u0026rdquo;\nwhat weekend taught # 1. trust works both ways\nshe went to wine country with girlfriends.\ni had guys over for fights.\nneither worried.\n2. communication is everything\nA. set clear rules for bachelor party.\ni agreed without argument.\nboundaries respected.\n3. missing each other = good sign\nfirst weekend apart in 18 months.\nboth texted \u0026ldquo;miss you\u0026rdquo; multiple times.\nrelationship solid.\n4. her friends approve\ngrilled her about marriage.\nshe defended us confidently.\nexternal validation nice but unnecessary.\nbachelor party next weekend # april 18-19:\n8 guys.\nfriday: gaslamp bar crawl, strip club (no touching, just looking).\nsaturday: topgolf, brewery tour.\nA\u0026rsquo;s rules:\nno touching strippers.\nno private dances.\nno getting numbers.\nback by midnight saturday.\nme: \u0026ldquo;all agreed.\u0026rdquo;\nA.: \u0026ldquo;good. have fun. i trust you.\u0026rdquo;\nme: \u0026ldquo;i know.\u0026rdquo;\ntrading impact weekend # friday-saturday:\n5 trades total.\n4 wins, 1 loss.\n+$1,380 net.\nbest weekend since february.\nVIX stable, conditions perfect.\nno distraction from A. being gone.\nfocused on trading, made money.\ntherapy this week # session wednesday (april 9):\ndr. r: \u0026ldquo;bachelorette party this weekend. how do you feel?\u0026rdquo;\nme: \u0026ldquo;fine. she\u0026rsquo;s going to wine country with friends. i trust her.\u0026rdquo;\ndr. r: \u0026ldquo;no anxiety about her being away?\u0026rdquo;\nme: \u0026ldquo;nope. she\u0026rsquo;s not going to do anything. neither am i during bachelor party.\u0026rdquo;\ndr. r: \u0026ldquo;bachelor party next weekend. strip club involved?\u0026rdquo;\nme: \u0026ldquo;yeah. A. said it\u0026rsquo;s fine as long as no touching.\u0026rdquo;\ndr. r: \u0026ldquo;and you agreed?\u0026rdquo;\nme: \u0026ldquo;yeah. i\u0026rsquo;m going because my friends want to go. i\u0026rsquo;m not interested in strippers. i have A.\u0026rdquo;\ndr. r: \u0026ldquo;secure attachment.\u0026rdquo;\nme: \u0026ldquo;took 18 months but yeah.\u0026rdquo;\ntonight (april 13, 1:55am) # bachelorette weekend done.\nA. had fun wine country (spa, wine, girlfriends).\ni traded well (+$1,380), had guys over saturday.\nfirst weekend apart 18 months.\nboth missed each other.\ntrust working both ways.\nbachelor party next weekend (april 18-19).\nstrip club friday (no touching), topgolf saturday.\nwedding 4 weeks out.\nrelationship solid.\n1:55am sunday. bachelorette weekend complete. A. wine country temecula april 11-12 (6 girlfriends, spa, wine tasting, $600). i traded normally fri-sat (5 trades, 4 wins, +$1,380 best weekend since feb). first weekend apart 18 months, both texted \u0026ldquo;miss you\u0026rdquo; multiple times. saturday 8 guys over watching fights, bachelor party logistics confirmed. A. home 11pm drunk happy, sex (rode me hard, came twice). sunday morning hungover, told me her friends grilled her about marriage (she defended us confidently). bachelor party next weekend april 18-19 (strip club friday no touching, topgolf saturday). wedding 4 weeks. trust working both ways.\n-AK\n","date":"13 April 2025","externalUrl":null,"permalink":"/posts/2025-04-13-bachelorette-party-weekend-a-wine-country-trust/","section":"Posts","summary":"\u003cp\u003ewedding may 10.\u003c/p\u003e\n\u003cp\u003e4 weeks out.\u003c/p\u003e\n\u003cp\u003eA\u0026rsquo;s bachelorette party this weekend.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe weekend plan \n    \u003cdiv id=\"the-weekend-plan\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-weekend-plan\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003efriday-saturday (april 11-12):\u003c/strong\u003e\u003c/p\u003e","title":"bachelorette party weekend - A in wine country, trading alone, trust working","type":"posts"},{"content":"april halfway done.\nrecovery month confirmed.\nconditions stable.\nmid-april numbers # starting (apr 1): $446,688\ncurrent (apr 10): $451,860\napril gain: +$5,172 (+1.16%)\ntrades: 11\nwins: 9\nlosses: 2\nwin rate: 82%\nback to normal.\nweekly breakdown # week 1 (apr 1-6): +$1,832 (+0.41%), 80% wr\nweek 2 (apr 7-10): +$3,340 (+0.75%, partial week)\npattern:\nconsistent winning weeks.\nVIX stable \u0026lt;18.\nnormal conditions = normal results.\ncomparing to march mid-month # march mid-month: -$6,690 (-1.47%)\napril mid-month: +$5,172 (+1.16%)\nswing: +$11,862\nsame strategies.\ndifferent market regime.\nVIX makes all the difference.\nmarket conditions april # avg VIX: 16.8 (optimal range)\navg correlation: 0.61 (good diversification)\navg volume: 3.5M contracts (normal)\nregime stability: 0.74 (very stable)\ncomparing to march:\nmarch VIX: 20.6 (elevated)\nmarch correlation: 0.76 (too high)\nmarch volume: 2.9M (thin)\napril conditions perfect for strategies.\nslippage tracking # april avg: 2.0 ticks\nmarch avg: 2.8 ticks\nimprovement: -0.8 ticks (-29%)\nnormal VIX = tighter spreads.\nnormal volume = better fills.\nexecution quality back to february levels.\ncircuit breaker status # triggered: 0 times\nclose calls: 0 times\nlargest loss: -$340 (wednesday ES)\npreventive measures working:\nregime detector kept me paused when needed.\nresumed only when conditions normalized.\nrisk management validated.\nytd performance update # jan: +$9,550 (+2.18%)\nfeb: +$8,920 (+1.99%)\nmar: -$9,582 (-2.10%)\napr (partial): +$5,172 (+1.16%)\nytd total: +$14,060 (+3.21%)\nannual pace: +9.6%\nvs target: 15-18%\nstill below target but recovery trending right direction.\nprojecting april month-end # current (apr 10): +$5,172 (+1.16%)\nremaining 3 weeks:\nif conditions stay stable: +$4k to $6k more.\nprojected april final: +$9k to $11k (+2.0% to +2.5%)\nright in target range (set at +1.8% to +2.2%).\nlessons from april (so far) # 1. patience in march = payoff in april\npaused march when conditions sucked.\nprotected capital.\nresumed april when conditions improved.\n2. regime detector upgrade working\ndeployed march 17.\ncaught april recovery signal april 1.\nclean transition from pause to trading.\n3. gradual ramp-up validated\nweek 1: cautious (50% size tue-wed, full size thu-fri).\nweek 2: normal (100% size all days).\nno rush to make up march losses.\n4. wedding planning manageable\n4 weeks out, mostly done.\nbachelorette party this weekend.\nbachelor party next weekend.\nrelationship priority maintained.\nwedding countdown # may 10 (30 days out):\neverything booked ✓\nbachelorette april 11-12 (tomorrow) ✓\nbachelor party april 18-19 (next weekend)\nrehearsal dinner may 8 (2 days before)\nfinal vendor confirmations week of may 5\nstress:\nA: 10/10 (final crunch).\nme: 7/10 (bachelor party planning).\nmanaging.\ncomparing to expectations # april realistic outcomes (from march 31):\nrecovery month: +1.5% to +2.5%\nflat month: -0.5% to +1.0%\napril current: +1.16% (halfway)\non pace for: +2.0% to +2.5%\nexactly as expected.\nno surprises.\nweek 3-4 preview # trading:\ncontinue normal activity if VIX \u0026lt;18.\ntarget 70%+ win rate.\npersonal:\nbachelor party april 18-19 (next weekend).\nfinal wedding prep (week of april 21-27).\nvendor confirmations.\nrealistic april:\nfinish +$9k to $11k (+2.0% to +2.5%).\ntonight (april 10, 10:08pm) # mid-april check done.\n+$5,172 (+1.16%) halfway through.\n82% win rate (9 wins, 2 losses).\nVIX 16.8 avg, correlation 0.61, volume 3.5M.\ncomparing march mid-month -$6,690 vs april +$5,172 = $11,862 swing.\nprojected april final: +$9k to $11k (+2.0% to +2.5%).\nytd +$14,060 (+3.21%), annual pace 9.6% (below 15-18% target but recovering).\nwedding 30 days, bachelorette tomorrow, bachelor party next weekend.\nconditions stable.\n10:08pm thursday. mid-april complete. +$5,172 (+1.16%) across 11 trades. 82% win rate. VIX 16.8 avg (vs march 20.6), correlation 0.61 (vs march 0.76), volume 3.5M (vs march 2.9M). slippage 2.0 ticks (improved from march 2.8). week 1 +$1,832, week 2 partial +$3,340. projected april final +$9k-$11k (+2.0-2.5%). ytd +$14,060 (+3.21%), annual pace 9.6% (below 15-18% target). wedding 30 days, bachelorette april 11-12 tomorrow, bachelor party april 18-19 next weekend. circuit breaker zero triggers. conditions stable.\n-AK\n","date":"10 April 2025","externalUrl":null,"permalink":"/posts/2025-04-10-mid-april-check-recovery-on-track/","section":"Posts","summary":"\u003cp\u003eapril halfway done.\u003c/p\u003e\n\u003cp\u003erecovery month confirmed.\u003c/p\u003e\n\u003cp\u003econditions stable.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003emid-april numbers \n    \u003cdiv id=\"mid-april-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#mid-april-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (apr 1):\u003c/strong\u003e $446,688\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ecurrent (apr 10):\u003c/strong\u003e $451,860\u003c/p\u003e","title":"mid-april check - recovery on track, +1.2% ytd, wedding 4 weeks","type":"posts"},{"content":"","date":"10 April 2025","externalUrl":null,"permalink":"/tags/monthly-update/","section":"Tags","summary":"","title":"Monthly-Update","type":"tags"},{"content":"april begins.\nmarch disaster behind.\nVIX normalizing.\nweek 1 results # starting (apr 1): $446,688\nending (apr 6): $448,520\nweek 1: +$1,832 (+0.41%)\ntrades: 5\nwins: 4\nlosses: 1\nwin rate: 80%\nfirst winning week since february.\nwhat changed # market conditions:\nVIX dropped to 17.2 friday (below 18 threshold).\ncorrelation dropped to 0.62 (back to normal).\nvolume recovered to 3.4M contracts.\nregime detector:\nconfidence jumped to 0.72 (above 0.65 threshold).\nresumed trading cautiously tuesday.\nconditions improving.\ntrading approach week 1 # monday (apr 1):\nVIX still 19.4 (paused).\ntuesday-wednesday:\nVIX 18.2, 17.8 (cautious trades, 50% position size).\n2 trades, 2 wins (+$340, +$280).\nthursday-friday:\nVIX 17.5, 17.2 (normal position size).\n3 trades, 2 wins, 1 loss (+$520, +$880, -$188).\ngradual ramp-up working.\ncomparing to march week 1 # march week 1: -$1,090 (50% wr, 6 trades)\napril week 1: +$1,832 (80% wr, 5 trades)\ndifference: +$2,922 swing\nconditions matter more than strategy.\nmarch: VIX 21.2, correlation 0.73 (brutal).\napril: VIX 17.2, correlation 0.62 (normal).\nsame strategies, different results.\ncircuit breaker status # triggered: 0 times\nclose calls: 0 times\nlargest loss: -$188 (friday QQQ)\npreventive filters working:\ndidn\u0026rsquo;t trade until conditions improved.\npatience protected capital.\nslippage improvement # april week 1 avg: 2.1 ticks\nmarch avg: 2.8 ticks\nimprovement: -0.7 ticks (-25%)\nVIX normalization = tighter spreads.\nvolume recovery = better fills.\nchicago colo + normal conditions = clean execution.\nwedding countdown # may 10 (5 weeks out):\neverything booked.\nbachelorette party next weekend (april 11-12).\nbachelor party following weekend (april 18-19).\nfinal vendor confirmations in 3 weeks.\nstress level:\nA: 9/10 (final details crunch).\nme: 6/10 (bachelor party planning active).\nbachelorette party preview # april 11-12 (next weekend):\nA\u0026rsquo;s 6 girlfriends.\nwine country temecula.\nspa day saturday.\nher cost: $600\nmy rules: none, she\u0026rsquo;s an adult.\nA.: \u0026ldquo;you\u0026rsquo;re not worried?\u0026rdquo;\nme: \u0026ldquo;nope. you\u0026rsquo;re not going to do anything stupid.\u0026rdquo;\nA.: \u0026ldquo;what if i did?\u0026rdquo;\nme: \u0026ldquo;then we\u0026rsquo;d have problems. but you won\u0026rsquo;t.\u0026rdquo;\ntrust working.\nbachelor party locked # april 18-19 (2 weeks out):\n8 guys confirmed.\nfriday night: gaslamp bar crawl + strip club.\nsaturday: topgolf afternoon, brewery tour.\nmy cost: $400\nA\u0026rsquo;s rules: no strippers touching (they can dance, no contact).\nme: \u0026ldquo;deal.\u0026rdquo;\ngroup text active daily finalizing logistics.\nlessons from week 1 # 1. patience pays\nwaited until VIX \u0026lt;18 to resume.\nfirst winning week since february.\nprotecting capital \u0026gt; forcing trades.\n2. gradual ramp-up works\ntue-wed: cautious (50% size).\nthu-fri: normal (100% size).\nno rush to make up march losses.\n3. conditions drive results\nsame strategies that failed march working april.\nregime matters more than optimization.\n4. wedding planning = ongoing time sink\n5 weeks out, appointments accelerating.\npaused wednesday afternoon (vendor calls).\nrelationship \u0026gt; forced trades.\nweek 2 preview # trading:\nif VIX stays \u0026lt;18: continue normal activity.\ntarget 6-8 trades, 70%+ win rate.\npersonal:\nA\u0026rsquo;s bachelorette party (april 11-12).\ni\u0026rsquo;ll trade normally while she\u0026rsquo;s gone.\nrealistic week 2:\nmodest gain: +$1,500 to +$2,500.\ntonight (april 6, 9:43pm) # week 1 april done.\n+$1,832 (+0.41%).\n80% win rate (4 wins, 1 loss).\nfirst winning week since february.\nVIX normalized to 17.2, correlation 0.62.\nresumed cautiously tuesday, ramped to normal size friday.\nwedding 5 weeks, bachelorette next weekend, bachelor party 2 weeks.\nconditions improving.\n9:43pm sunday. april week 1 complete. +$1,832 (+0.41%) across 5 trades. 80% win rate. first winning week since feb. VIX normalized 17.2 (from march 20.6), correlation 0.62 (from march 0.76), volume recovered 3.4M. regime detector confidence 0.72. resumed tuesday cautious (50% size), ramped friday normal size. slippage 2.1 ticks (improved from march 2.8). march week 1 -$1,090 vs april week 1 +$1,832 = $2,922 swing (conditions matter). wedding 5 weeks, bachelorette april 11-12 (next weekend), bachelor party april 18-19.\n-AK\n","date":"6 April 2025","externalUrl":null,"permalink":"/posts/2025-04-06-week-1-april-recovery-starting-vix-normalizing/","section":"Posts","summary":"\u003cp\u003eapril begins.\u003c/p\u003e\n\u003cp\u003emarch disaster behind.\u003c/p\u003e\n\u003cp\u003eVIX normalizing.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 1 results \n    \u003cdiv id=\"week-1-results\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-1-results\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (apr 1):\u003c/strong\u003e $446,688\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eending (apr 6):\u003c/strong\u003e $448,520\u003c/p\u003e","title":"week 1 april - recovery starting, VIX normalizing, wedding 5 weeks","type":"posts"},{"content":"march done.\nsecond losing month in 15 months.\nlessons expensive but learned.\nmarch final numbers # starting (mar 1): $456,270\nending (mar 31): $446,688\nmarch loss: -$9,582 (-2.10%)\ntrades: 19\nwins: 6\nlosses: 13\nwin rate: 32%\nbrutal month.\nFigure 1: March weekly breakdown showing consecutive losses. Week 1 -$1,090 (50% wr, 6 trades), Week 2 -$2,720 (29% wr, 7 trades), Week 3 -$2,880 (20% wr, 5 trades - circuit breaker hit), Week 4 -$720 (33% wr, 3 trades paused 4 days), Week 5 -$2,172 (0% wr, 2 trades paused 3 days). Total -$9,582 (-2.10%). Circuit breaker triggered 3x. Regime detector implemented week 3 (saved estimated $3,110).\nweekly breakdown # week 1 (mar 2-8): -$1,090 (-0.24%), 50% wr, 6 trades\nweek 2 (mar 9-15): -$2,720 (-0.60%), 29% wr, 7 trades\nweek 3 (mar 16-22): -$2,880 (-0.63%), 20% wr, 5 trades\nweek 4 (mar 23-29): -$720 (-0.16%), 33% wr, 3 trades\nweek 5 (mar 30-31): -$2,172 (-0.49%), 0% wr, 2 trades\nevery single week lost money.\nno recovery weeks.\nsustained regime shift entire month.\ncomparing to target # march realistic outcomes (from feb 28):\nmodest month: +1.5% to +2.5%\nflat month: +0.5% to +1.2%\nmarch actual: -2.10%\noutside expected range but variance happens.\ncan\u0026rsquo;t win every month.\nFigure 2: March market conditions vs February baseline. VIX: march avg 20.6 vs feb 16.5 (+25% elevation). Correlation: march avg 0.76 vs feb 0.59 (+29% higher - diversification destroyed). Volume: march avg 2.9M vs feb 3.7M (-22% lower liquidity). Regime stability: march 0.52 vs feb 0.73 (-29% more volatile). Slippage: march 2.8 ticks vs feb 2.0 (+40% worse execution). Conditions: unfavorable entire month, no recovery periods.\nwhat went wrong # market conditions:\nVIX averaged 20.6 march (vs feb 16.5).\ncorrelation averaged 0.76 march (vs feb 0.59).\nvolume down 22% march (vs feb baseline).\nregime stability 0.52 march (vs feb 0.73).\nmy strategies optimized for:\nVIX 13-18 range.\ncorrelation \u0026lt;0.65.\nnormal volume \u0026gt;3.5M.\nmarch had none of those.\ntextbook regime mismatch.\nstrategies aren\u0026rsquo;t broken.\nmarket changed.\nFigure 3: March loss attribution by strategy and factor. Strategy failures: mean reversion -$4,100 (high correlation killed edge), volatility selling -$2,800 (VIX spike crushed positions), crypto momentum -$1,900 (thin volume dried up setups), ES futures -$1,400 (whipsaw on fed comments). Total strategy losses -$10,200. Regime detector savings +$3,110 (implemented week 3, prevented further damage). Trading pauses savings +$1,680 (weeks 4-5 selective execution). Net march loss -$9,582. Key insight: strategies lost more than final number shows - pausing/filtering protected capital.\ncircuit breaker performance # triggered: 3 times\nmar 6: 3 consecutive losses (paused 1 day).\nmar 13: -$1,500 single day ES whipsaw (paused 2 days).\nmar 19: 3 consecutive losses (paused rest of week).\nwithout circuit breaker:\nmarch would\u0026rsquo;ve been -$15k+ easily.\ncapital preservation working.\nprevented disaster, couldn\u0026rsquo;t prevent loss.\nregime detector upgrade # old version (weeks 1-2):\n10-day rolling average VIX.\nlagged market changes 5-7 days.\ncost: -$4,200 before catching spike.\nnew version (week 3+):\nspike detection: VIX \u0026gt;20 for 2 days = pause.\nrecovery signal: VIX \u0026lt;18 for 3 days = resume.\nsavings: $3,110 estimated.\ndeployed march 17.\nprevented additional losses weeks 3-5.\nslippage degradation # march avg: 2.8 ticks\nfebruary avg: 2.0 ticks\ndegradation: +0.4 ticks (+40%)\nelevated VIX = wider spreads.\nthin volume = worse fills.\nchicago colo prevented 4.5+ disaster.\nbut can\u0026rsquo;t fix market conditions.\nlessons from march # 1. losing months happen\n2024: 1 losing month (december -1.86%).\n2025: march second losing month.\n2 of 15 months = 13% losing months.\ntarget: 70%+ winning months.\nstill on track long-term.\n2. regime detection critical\nold detector lagged, cost $4,200.\nnew detector catches spikes fast.\nsaves capital when conditions suck.\n3. pausing \u0026gt; forcing trades\nweeks 4-5: paused 7 of 10 days.\nsaved $1,680+ vs forcing trades.\nprotecting capital when edge gone.\n4. circuit breaker prevents disaster\ntriggered 3x, prevented -$15k+ month.\nturned disaster into manageable loss.\nrisk management working.\n5. wedding planning + losing = stress\nlost $9,582 same month planning $19k wedding.\nA. supportive but can tell money stress real.\npriorities: relationship first, trading second.\nytd performance check # jan 1: $437,800\nmar 31: $446,688\nytd gain: +$8,888 (+2.03%)\nytd months:\njan: +2.18%\nfeb: +1.99%\nmar: -2.10%\nannual pace: +8.1%\nvs target: 15-18%\nbelow target but 3 months isn\u0026rsquo;t enough data.\nq1 includes 1 losing month.\nexpecting 70%+ winning months rest of year.\ncomparing march 2024 vs 2025 # march 2024:\nmodest winning month.\n+$8,400 (+2.1%).\nfavorable conditions.\nmarch 2025:\nlosing month.\n-$9,582 (-2.10%).\nelevated VIX entire month.\nswing: -$17,982 difference year-over-year.\nvariance expected.\nnot every year repeats.\nlife update - wedding 5 weeks out # wedding may 10:\n5 weeks remaining.\nbooked:\nvenue, photographer, caterer, flowers, invitations, rehearsal dinner, honeymoon.\nstill need:\nfinalize ceremony music (spotify playlist).\nwedding bands fitting (april 5).\nbachelor/bachelorette parties (april 11-12, 18-19).\nstress level:\nA: 8/10 (final details crunch).\nme: 4/10 (most stuff locked).\nrelationship:\nliving together 17 months.\nengaged 5 months.\nplaces list: 42.\nsex life: incredible stress relief.\nbachelor party april 18-19:\n3 weeks out.\n8 guys, san diego local.\ngaslamp, topgolf, brewery tour.\n$400 cost.\napril preview # trading expectations:\nconditions need to improve (VIX \u0026lt;18).\nif VIX stays elevated: continue pausing.\nrealistic april outcomes:\nrecovery month: +1.5% to +2.5% ($6,700 to $11,200)\nflat month: -0.5% to +1.0% (-$2,200 to +$4,500)\ntarget: +1.8% to +2.2%\nbut only if conditions normalize.\npersonal:\nbachelor party april 18-19.\nbachelorette party april 11-12.\nwedding bands fitting april 5.\nfinal vendor confirmations.\nwedding may 10 (5 weeks).\ntonight (march 31, 11:48pm) # march done.\n-$9,582 (-2.10%).\n32% win rate (6 wins, 13 losses).\nVIX 20.6 avg, correlation 0.76, volume -22%.\ncircuit breaker triggered 3x (prevented -$15k+ disaster).\nregime detector upgraded week 3 (saved $3,110).\npausing weeks 4-5 saved $1,680+.\nytd +$8,888 (+2.03%, below 15-18% target).\nwedding 5 weeks, bachelor party 3 weeks.\nwatching conditions for april recovery.\n11:48pm monday. march wrap complete. -$9,582 (-2.10%) across 19 trades. 32% win rate. VIX 20.6 avg march (vs 16.5 feb), correlation 0.76 (vs 0.59 feb), volume -22%, regime stability 0.52 (vs 0.73 feb). circuit breaker triggered 3x (mar 6, 13, 19) prevented -$15k+ disaster. regime detector upgraded week 3: old version lagged (cost $4,200 weeks 1-2), new version spike detection saved $3,110. slippage 2.8 ticks (vs 2.0 feb). ytd: jan +2.18%, feb +1.99%, mar -2.10% = +$8,888 (+2.03%). wedding may 10 (5 weeks), bachelor party april 18-19. april preview: recovery +1.8-2.2% if conditions normalize.\n-AK\n","date":"31 March 2025","externalUrl":null,"permalink":"/posts/2025-03-31-march-wrap-losing-month-lessons-learned/","section":"Posts","summary":"\u003cp\u003emarch done.\u003c/p\u003e\n\u003cp\u003esecond losing month in 15 months.\u003c/p\u003e\n\u003cp\u003elessons expensive but learned.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003emarch final numbers \n    \u003cdiv id=\"march-final-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#march-final-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (mar 1):\u003c/strong\u003e $456,270\u003c/p\u003e","title":"march wrap - losing month -2.10%, lessons learned, wedding 5 weeks","type":"posts"},{"content":"","date":"29 March 2025","externalUrl":null,"permalink":"/tags/mindset/","section":"Tags","summary":"","title":"Mindset","type":"tags"},{"content":"march ends monday.\nlosing month confirmed.\naccepting variance.\ncurrent state (2 days left) # starting (mar 1): $456,270\ncurrent (mar 29): $447,516\nmarch loss: -$8,754 (-1.92%)\ntrades: 17\nwins: 6\nlosses: 11\nwin rate: 35%\n2 trading days left, won\u0026rsquo;t change much.\ncomparing to expectations # realistic march outcomes (from feb 28):\nmodest month: +1.5% to +2.5%\nflat month: +0.5% to +1.2%\nmarch actual: -1.92% (projected -2.1% final)\nmissed by: 2.4% to 3.6%\nthis is variance.\ncan\u0026rsquo;t win every month.\nwhat i did right # 1. circuit breaker triggered 3x\nprevented -$15k+ disaster.\nturned catastrophe into manageable loss.\n2. upgraded regime detector march 17\nold version lagged (cost $4,200 weeks 1-2).\nnew version caught spikes (saved $3,110 weeks 3-4).\n3. paused when edge gone\nweeks 4-5: paused 11 of 13 days.\nsaved $1,680+ vs forcing trades.\n4. protected relationship\nwedding planning \u0026gt; forced trades.\npaused for ring shopping, rehearsal dinner, vendor meetings.\nA. supported me through losing month.\nwhat i did wrong # 1. didn\u0026rsquo;t pause week 1\nVIX spiked day 1 (21.2).\nshould\u0026rsquo;ve paused immediately.\ninstead: traded 6 days, lost $4,200.\n2. resumed too early after circuit breaker\ntriggered march 6, paused 1 day, resumed march 8.\nshould\u0026rsquo;ve waited 3 days minimum.\n3. ignored warning signs\ncorrelation spiked 0.76 day 1 (vs feb 0.59).\nvolume dropped 22% day 1 (vs feb baseline).\nall signals screamed \u0026ldquo;pause.\u0026rdquo;\ndidn\u0026rsquo;t listen until day 7.\ncomparing to december 2024 # last losing month:\ndecember 2024: -$8,175 (-1.86%).\nmarch 2025: -$8,754 (-1.92%, projected -$9,582 final).\nsimilar magnitude.\nfrequency:\n2 losing months in 15 months = 13% losing rate.\ntarget: 70%+ winning months.\non track: 87% winning months.\nytd reality check # jan: +$9,550 (+2.18%)\nfeb: +$8,920 (+1.99%)\nmar: -$8,754 (-1.92%, projected -$9,582 final)\nytd gain: +$9,716 (+2.22%, projected +$8,888 +2.03% final)\nannual pace: +8.9% (projected +8.1% final)\nvs target: 15-18%\nbelow target but q1 includes losing month.\nneed 3 more quarters data.\nwhat losing month teaches # 1. strategies aren\u0026rsquo;t broken\nworked perfectly january (+2.18%).\nworked perfectly february (+1.99%).\nfailed march because market changed, not strategy failure.\n2. regime detection critical\ncatching market shifts early = capital preservation.\nmarch upgraded detector mid-month.\nshould\u0026rsquo;ve had it january.\n3. pausing \u0026gt; forcing\nweeks 4-5 paused 11 days.\nsaved $1,680+ losses.\nprotecting capital when edge gone.\n4. variance happens\ncan\u0026rsquo;t expect 90%+ winning months.\n70-75% winning rate = 25-30% losing months.\n2 of 15 = 13% = excellent.\ntherapy session (mar 27) # dr. r: \u0026ldquo;how are you handling losing month?\u0026rdquo;\nme: \u0026ldquo;fine. annoying but expected. can\u0026rsquo;t win every month.\u0026rdquo;\ndr. r: \u0026ldquo;and A.? money stress real with wedding coming?\u0026rdquo;\nme: \u0026ldquo;she\u0026rsquo;s been supportive. i told her variance normal, we\u0026rsquo;re still up ytd. she trusts me.\u0026rdquo;\ndr. r: \u0026ldquo;communication working.\u0026rdquo;\nme: \u0026ldquo;yeah. we fuck when stressed. places list: 42 (home gym thursday, she rode me on bench press).\u0026rdquo;\ndr. r: (slight smile) \u0026ldquo;stress relief protocol working.\u0026rdquo;\nme: \u0026ldquo;100%. wedding 6 weeks out, trading losing $9k, bachelor party 3 weeks. sex keeps us sane.\u0026rdquo;\ndr. r: \u0026ldquo;healthy coping.\u0026rdquo;\nwedding countdown # may 10 (6 weeks out):\neverything booked.\nbachelor party april 18-19 (3 weeks).\nbachelorette april 11-12 (4 weeks).\nfinal vendor confirmations week before.\nstress: A. 9/10, me 5/10.\nmanaging through communication and sex.\nplaces list: 42.\nrelationship strong despite losing month.\napril expectations # if VIX normalizes (\u0026lt;18 for 3 days):\nresume trading cautiously.\ntarget +1.8% to +2.2% recovery.\nif VIX stays elevated (\u0026gt;20):\ncontinue pausing.\nprotect capital.\nrealistic:\nVIX probably normalizes mid-april.\nmodest recovery month.\nno pressure to make up march losses.\nlong-term perspective.\nlessons for next losing month # 1. pause immediately when VIX \u0026gt;20 two days\ndon\u0026rsquo;t wait week like march.\ncost: $4,200 march.\n2. stay paused minimum 3 days after circuit breaker\ndon\u0026rsquo;t resume next day.\ncost: $1,800 march.\n3. trust regime detector\nif confidence drops, pause.\ndon\u0026rsquo;t override with discretion.\n4. relationship \u0026gt; forced trades\nA. supported me through march.\npaused for wedding planning.\npriorities aligned.\ntonight (march 29, 10:16pm) # march ends monday.\nprojected final: -$9,582 (-2.10%).\n2 losing months in 15 = 13% losing rate.\ntarget 70%+ winning months = on track 87%.\nytd +$9,716 (+2.22%, projected +$8,888 +2.03%).\nlessons learned: pause immediately VIX \u0026gt;20, stay paused 3 days post circuit breaker, trust regime detector.\nwedding 6 weeks, bachelor party 3 weeks.\nA. supportive despite money stress.\napril: resume if VIX \u0026lt;18 three days, target +1.8-2.2% recovery.\n10:16pm saturday. march pre-month-end reality. current -$8,754 (-1.92%), projected final -$9,582 (-2.10%). 2 days left won\u0026rsquo;t change much. wins: circuit breaker 3x prevented -$15k+, regime detector upgraded mid-month saved $3,110, paused 11 of 13 days weeks 4-5 saved $1,680+. mistakes: didn\u0026rsquo;t pause week 1 cost $4,200, resumed too early post circuit breaker cost $1,800. ytd +$9,716 (+2.22%), below 15-18% target but q1 includes losing month. therapy: dr. r asked coping (places list 42 home gym stress relief). wedding 6 weeks, bachelor party 3 weeks. april: resume if VIX \u0026lt;18 three days.\n-AK\n","date":"29 March 2025","externalUrl":null,"permalink":"/posts/2025-03-29-pre-month-end-accepting-losing-month-variance/","section":"Posts","summary":"\u003cp\u003emarch ends monday.\u003c/p\u003e\n\u003cp\u003elosing month confirmed.\u003c/p\u003e\n\u003cp\u003eaccepting variance.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ecurrent state (2 days left) \n    \u003cdiv id=\"current-state-2-days-left\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#current-state-2-days-left\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (mar 1):\u003c/strong\u003e $456,270\u003c/p\u003e","title":"pre-month-end reality - accepting losing month, variance is normal","type":"posts"},{"content":"","date":"29 March 2025","externalUrl":null,"permalink":"/categories/trading/","section":"Categories","summary":"","title":"Trading","type":"categories"},{"content":"march taught expensive lesson.\nVIX spike = full stop.\ncost $9,582 to learn.\nwhat i knew before march # old rule:\npause if VIX \u0026gt;25 (extreme fear).\nresume when VIX \u0026lt;20.\nproblem:\nVIX 20-25 range still trades.\nmarch VIX averaged 20.6 (right in that zone).\npaid tuition.\nwhat march actually showed # VIX ranges and my strategy performance:\nVIX 13-18 (normal):\nwin rate: 70-75%\navg monthly return: +1.5% to +2.5%\nstrategies work perfectly.\nVIX 18-22 (elevated):\nwin rate: 45-55%\navg monthly return: -1% to +0.5%\nstrategies break even or lose.\nVIX \u0026gt;22 (high fear):\nwin rate: 20-35%\navg monthly return: -2% to -5%\nstrategies get destroyed.\nmarch VIX 20.6 = elevated zone.\nstrategies coin flip at best.\nthe actual march data # march daily VIX:\nday 1: 21.2 (paused 0 days - mistake)\nday 2: 20.8 (paused 0 days - mistake)\nday 3: 21.5 (paused 0 days - mistake)\nday 4: 20.3 (paused 0 days - mistake)\nday 5: 19.9 (paused 0 days - mistake)\nday 6: 21.8 (paused 0 days - mistake)\nday 7: 20.6 (finally paused - too late)\ncost of not pausing days 1-6: -$4,200\nif i\u0026rsquo;d paused day 2 (new rule): -$1,090 total\nsavings: $3,110\nnew rule implemented march 17 # VIX spike detection:\nif VIX \u0026gt;20 for 2 consecutive days: pause all trading.\nrecovery signal:\nif VIX \u0026lt;18 for 3 consecutive days: resume trading.\nimplementation:\nautomated in regime detector.\nno discretion, hard rule.\nbacktesting new rule on march # actual march (old rule):\ntraded days 1-16.\npaused days 17-31 (after losses).\nresult: -$9,582\nhypothetical march (new rule):\npaused day 2 onwards (VIX \u0026gt;20 two days).\ntraded only day 1.\nresult: -$1,090 (day 1 only)\nsavings: $8,492\nthe rule works.\nwhy VIX \u0026gt;20 matters # what VIX measures:\nimplied volatility on S\u0026amp;P 500 options.\nmarket fear gauge.\nVIX 13-18: normal conditions, predictable moves.\nVIX 18-22: elevated fear, whipsaw increases.\nVIX \u0026gt;22: high fear, correlations spike, strategies fail.\nmy strategies rely on:\nlow correlation between assets.\npredictable volatility patterns.\nnormal market structure.\nVIX \u0026gt;20 destroys all three.\ncomparing to other traders # reddit r/algotrading discussions:\ncommon theme: VIX spikes kill algos.\nmost successful traders pause VIX \u0026gt;18-20.\nsome use VIX \u0026gt;15 (ultra conservative).\nmy old threshold (VIX \u0026gt;25):\ntoo high.\ndamage already done by then.\nnew threshold (VIX \u0026gt;20 two days):\nmatches successful traders.\ncatches regime shifts fast.\nexceptions to the rule # when to trade despite VIX \u0026gt;20:\nvolatility-focused strategies (selling premium).\nhedging existing positions.\nopportunistic trades (clear edge).\nmy situation:\ndon\u0026rsquo;t have vol-specific strategies.\ndon\u0026rsquo;t need to hedge (fully automated, can pause).\nno exceptions.\nVIX \u0026gt;20 two days = full stop, no discretion.\nimplementation in code # class VIXFilter: def __init__(self, spike_threshold=20.0, recovery_threshold=18.0, consecutive_days=2, recovery_days=3): \u0026#34;\u0026#34;\u0026#34; VIX-based trading filter Args: spike_threshold: VIX level to trigger pause recovery_threshold: VIX level to resume consecutive_days: Days above spike to pause recovery_days: Days below recovery to resume \u0026#34;\u0026#34;\u0026#34; self.spike_threshold = spike_threshold self.recovery_threshold = recovery_threshold self.consecutive_days = consecutive_days self.recovery_days = recovery_days self.vix_history = [] self.spike_count = 0 self.recovery_count = 0 self.paused = False def update(self, current_vix): \u0026#34;\u0026#34;\u0026#34; Update with daily VIX close \u0026#34;\u0026#34;\u0026#34; self.vix_history.append(current_vix) # track consecutive spikes if current_vix \u0026gt; self.spike_threshold: self.spike_count += 1 self.recovery_count = 0 else: self.spike_count = 0 # track consecutive recovery if current_vix \u0026lt; self.recovery_threshold: self.recovery_count += 1 else: self.recovery_count = 0 # update pause status if self.spike_count \u0026gt;= self.consecutive_days: self.paused = True if self.recovery_count \u0026gt;= self.recovery_days: self.paused = False def should_trade(self): \u0026#34;\u0026#34;\u0026#34; Decision: trade today? \u0026#34;\u0026#34;\u0026#34; return not self.paused # usage vix_filter = VIXFilter(spike_threshold=20.0, recovery_threshold=18.0, consecutive_days=2, recovery_days=3) # daily update before market open vix_filter.update(current_vix=21.2) # day 1 print(f\u0026#34;Day 1 - Trade: {vix_filter.should_trade()}\u0026#34;) # True vix_filter.update(current_vix=20.8) # day 2 print(f\u0026#34;Day 2 - Trade: {vix_filter.should_trade()}\u0026#34;) # False (2 days \u0026gt;20) vix_filter.update(current_vix=19.5) # day 3 print(f\u0026#34;Day 3 - Trade: {vix_filter.should_trade()}\u0026#34;) # False (still paused) vix_filter.update(current_vix=17.8) # day 4 print(f\u0026#34;Day 4 - Trade: {vix_filter.should_trade()}\u0026#34;) # False (need 3 days \u0026lt;18) vix_filter.update(current_vix=17.2) # day 5 print(f\u0026#34;Day 5 - Trade: {vix_filter.should_trade()}\u0026#34;) # False (need 3 days \u0026lt;18) vix_filter.update(current_vix=17.5) # day 6 print(f\u0026#34;Day 6 - Trade: {vix_filter.should_trade()}\u0026#34;) # True (3 days \u0026lt;18, resumed) march final week with new rule # deployed march 17.\nmarch 17-31 VIX:\nall days \u0026gt;19.5, most \u0026gt;20.\nnew rule kept me paused entire final 2 weeks.\ncost: ~$800 opportunity missed (if conditions had been favorable).\nsavings: ~$2,400 losses avoided (conditions were unfavorable).\nnet benefit: +$1,600\nprotecting capital works.\nlessons for april # if VIX starts elevated:\npause immediately (don\u0026rsquo;t wait like march).\nif VIX normalizes:\nresume cautiously (50% position size first week).\nrealistic april expectations:\ndepends entirely on VIX.\nVIX \u0026lt;18: target +1.8% to +2.2%.\nVIX 18-20: target -0.5% to +1.0%.\nVIX \u0026gt;20: pause entirely.\ntonight (march 27, 3:44am) # march taught expensive lesson.\nVIX spike = full stop.\nold rule: pause VIX \u0026gt;25 (too high).\nnew rule: pause VIX \u0026gt;20 two consecutive days, resume VIX \u0026lt;18 three days.\nmarch actual (old rule): -$9,582.\nmarch hypothetical (new rule): -$1,090.\nsavings: $8,492.\ndeployed march 17, kept paused rest of month (saved $1,600).\napril: watching VIX, resume only if \u0026lt;18 three days.\n3:44am thursday. VIX pause protocol post-mortem. old rule: pause VIX \u0026gt;25 (too high, damage done). march VIX 20.6 avg, strategies coin flip 45-55% win rate. cost: -$9,582. new rule: pause VIX \u0026gt;20 two consecutive days, resume \u0026lt;18 three days. backtest march: new rule would\u0026rsquo;ve lost -$1,090 (day 1 only) vs actual -$9,582. savings $8,492. deployed march 17, paused rest of month, saved $1,600 vs forcing trades. reddit r/algotrading consensus: successful traders pause VIX 18-20. april plan: resume only if VIX \u0026lt;18 three days.\n-AK\n","date":"27 March 2025","externalUrl":null,"permalink":"/posts/2025-03-27-vix-spike-trading-pause-lessons-from-march-disaster/","section":"Posts","summary":"\u003cp\u003emarch taught expensive lesson.\u003c/p\u003e\n\u003cp\u003eVIX spike = full stop.\u003c/p\u003e\n\u003cp\u003ecost $9,582 to learn.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ewhat i knew before march \n    \u003cdiv id=\"what-i-knew-before-march\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#what-i-knew-before-march\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eold rule:\u003c/strong\u003e\u003c/p\u003e","title":"VIX spike trading pause - lessons from march disaster, when to stop","type":"posts"},{"content":"week 4 march done.\nmostly paused.\ncapital protected.\nweek 4 results # starting (mar 17): $449,580\nending (mar 23): $448,860\nweek 4: -$720 (-0.16%)\ntrades: 3\nwins: 1\nlosses: 2\nwin rate: 33%\npaused 4 of 5 trading days.\nwhy mostly paused # regime detector (new version):\nVIX \u0026gt;20 for 2 consecutive days = pause.\nthis week:\nmon-tue: VIX 20.1, 20.3 (paused).\nwed: VIX 19.2 (cautious trade, won +$180).\nthu: VIX 20.8 (paused).\nfri: VIX 19.8 (cautious trade, lost -$340).\n3 paused days, 2 cautious trades.\nnew detector working as designed.\ncomparing to unfiltered approach # if i\u0026rsquo;d traded all 5 days (old approach):\nestimated 8-10 trades.\nestimated win rate 30-35% (based on march pattern).\nprojected loss: -$1,800 to -$2,400\nactual loss (filtered): -$720\nsavings: $1,080 to $1,680\nfilter protecting capital.\nmarch total (weeks 1-4) # week 1: -$1,090\nweek 2: -$2,720\nweek 3: -$2,880\nweek 4: -$720\nmarch total: -$7,410 (-1.62%)\n5 trading days left in month.\nwedding distraction this week # tuesday (mar 18):\nrehearsal dinner menu tasting.\nA. and i spent 3 hours at venue.\ncost: 1 missed setup (~$200 opportunity).\nworth it:\nlocked in menu ($1,200 total, 45 guests).\ntacos, craft beer, signature margarita.\nA. happy = priorities aligned.\nfriday (mar 21):\nfinal dress fitting appointment with A.\ndrove to la jolla, waited 2 hours.\npaused trading friday afternoon.\nwedding 6 weeks out.\nplanning accelerating.\nbachelor party update # april 18-19 (4 weeks out):\n8 guys confirmed.\ngaslamp bar crawl friday night.\ntopgolf saturday afternoon.\nbrewery tour saturday evening.\nmy cost: $400\nA\u0026rsquo;s rules: no strippers, no vegas, back by midnight.\neveryone agreed.\nplaces list update # this week:\n39: beach parking lot thursday night (69 position, both came hard).\n40: her car friday morning before dress fitting (quickie, she bent over back seat).\nsex life:\nstill incredible during wedding stress.\nshe initiates when planning chaos hits.\nloves control when life feels uncertain.\ntherapy (mar 20):\ndr. r asked about stress management.\ntold her we fuck when stressed.\nplaces list stress relief protocol.\ndr. r: \u0026ldquo;healthy coping mechanism.\u0026rdquo;\nme: \u0026ldquo;better than drinking.\u0026rdquo;\ndr. r: (slight smile) \u0026ldquo;certainly more fun.\u0026rdquo;\ncircuit breaker status # triggered: 0 times week 4\nclose calls: 0 times\nlargest loss: -$340 (friday cautious trade)\npreventive pausing working:\ndidn\u0026rsquo;t get into trouble this week.\nnew regime detector caught elevated VIX.\nprotected capital before circuit breaker needed.\nlessons from week 4 # 1. pausing works\ntraded 2 of 5 days.\nlost -$720 vs projected -$1,800+ unfiltered.\nfilter saved $1,080+.\n2. cautious trades still lose sometimes\nwed: +$180 (50% position size).\nfri: -$340 (50% position size).\neven filtered, march conditions suck.\n3. wedding planning = time commitment\n6 weeks out, appointments accelerating.\nrehearsal dinner menu locked.\nA\u0026rsquo;s dress fitting done.\nrelationship \u0026gt; forced trades.\nmarch final week preview # conditions:\nVIX needs \u0026lt;18 for 3 consecutive days to resume.\nprojected:\nVIX staying 19-21 range rest of month.\nlikely: pause entire final week.\nmarch projected final: -$8,500 to -$9,500 (-1.9% to -2.1%)\ntonight (march 23, 9:55pm) # week 4 march done.\n-$720 (-0.16%).\npaused 4 of 5 days (VIX \u0026gt;20).\nnew regime detector working (saved $1,080+ vs unfiltered).\nmarch total -$7,410 (-1.62%), 5 days left.\nprojected final: -$9,500 (-2.1%).\nwedding 6 weeks out, bachelor party 4 weeks.\nrehearsal dinner menu locked ($1,200).\nplaces list: 40.\n9:55pm sunday. week 4 march complete. -$720 (-0.16%) across 3 trades (paused 4 of 5 days). new regime detector: VIX \u0026gt;20 two days = pause. mon-tue VIX 20.1/20.3 paused, wed VIX 19.2 cautious trade +$180, thu VIX 20.8 paused, fri VIX 19.8 cautious -$340. filter saved $1,080+ vs projected unfiltered -$1,800+. march total -$7,410 (-1.62%), projected final -$9,500 (-2.1%). wedding 6 weeks, bachelor party 4 weeks. rehearsal dinner menu tasting tuesday locked $1,200. places list 40 (beach parking 69, her car quickie before dress fitting).\n-AK\n","date":"23 March 2025","externalUrl":null,"permalink":"/posts/2025-03-23-week-4-march-mostly-paused-capital-protected/","section":"Posts","summary":"\u003cp\u003eweek 4 march done.\u003c/p\u003e\n\u003cp\u003emostly paused.\u003c/p\u003e\n\u003cp\u003ecapital protected.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 4 results \n    \u003cdiv id=\"week-4-results\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-4-results\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (mar 17):\u003c/strong\u003e $449,580\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eending (mar 23):\u003c/strong\u003e $448,860\u003c/p\u003e","title":"week 4 march - mostly paused, capital protected, wedding 6 weeks","type":"posts"},{"content":"march disaster taught lesson.\nregime detection lagged.\ncost $6,690 before pausing.\nfixing implementation.\nwhat went wrong # my current filter:\nuses 5-day rolling average VIX.\nuses 10-day rolling correlation.\nproblem:\nlags market changes by 5-10 days.\nmarch VIX spiked day 1.\nfilter didn\u0026rsquo;t catch until day 7.\npaid tuition days 1-6.\nold implementation (flawed) # import pandas as pd import numpy as np from datetime import datetime, timedelta class RegimeDetector: def __init__(self, vix_threshold=18.5, corr_threshold=0.65, lookback=10): \u0026#34;\u0026#34;\u0026#34; Detect market regime changes Args: vix_threshold: VIX level above which regime unfavorable corr_threshold: Correlation level above which diversification breaks lookback: Days to use for rolling averages \u0026#34;\u0026#34;\u0026#34; self.vix_threshold = vix_threshold self.corr_threshold = corr_threshold self.lookback = lookback # historical data self.vix_history = [] self.corr_history = [] def update(self, current_vix, current_corr): \u0026#34;\u0026#34;\u0026#34; Update with latest market data \u0026#34;\u0026#34;\u0026#34; self.vix_history.append(current_vix) self.corr_history.append(current_corr) # keep only lookback period if len(self.vix_history) \u0026gt; self.lookback: self.vix_history = self.vix_history[-self.lookback:] self.corr_history = self.corr_history[-self.lookback:] def get_regime(self): \u0026#34;\u0026#34;\u0026#34; Determine current market regime Returns: \u0026#39;favorable\u0026#39;, \u0026#39;caution\u0026#39;, or \u0026#39;unfavorable\u0026#39; \u0026#34;\u0026#34;\u0026#34; if len(self.vix_history) \u0026lt; self.lookback: return \u0026#39;insufficient_data\u0026#39; # rolling averages (THIS IS THE PROBLEM - LAGS) avg_vix = np.mean(self.vix_history) avg_corr = np.mean(self.corr_history) if avg_vix \u0026gt; self.vix_threshold and avg_corr \u0026gt; self.corr_threshold: return \u0026#39;unfavorable\u0026#39; elif avg_vix \u0026gt; self.vix_threshold or avg_corr \u0026gt; self.corr_threshold: return \u0026#39;caution\u0026#39; else: return \u0026#39;favorable\u0026#39; def should_trade(self): \u0026#34;\u0026#34;\u0026#34; Decision: should we trade today? \u0026#34;\u0026#34;\u0026#34; regime = self.get_regime() if regime == \u0026#39;unfavorable\u0026#39;: return False elif regime == \u0026#39;caution\u0026#39;: return True # reduce size but still trade else: return True # usage (OLD WAY - LAGGED) detector = RegimeDetector(vix_threshold=18.5, corr_threshold=0.65, lookback=10) # day 1 march: VIX spikes to 21.2 detector.update(current_vix=21.2, current_corr=0.73) # but detector says \u0026#39;favorable\u0026#39; because previous 9 days were good # DOESN\u0026#39;T CATCH SPIKE UNTIL DAY 7-8 the bug:\nusing rolling average smooths out spikes.\nmarch day 1 VIX 21.2 gets averaged with previous 9 days ~15.\ndetector thinks regime still favorable.\ntrades days 1-6, loses money.\nby day 7, average catches up, flags unfavorable.\ntoo late.\nnew implementation (faster response) # import pandas as pd import numpy as np from datetime import datetime, timedelta from collections import deque class ImprovedRegimeDetector: def __init__(self, vix_threshold=18.5, corr_threshold=0.65, vix_spike_threshold=20.0, # NEW: immediate spike detection consecutive_days=2, # NEW: confirmation period lookback=10): \u0026#34;\u0026#34;\u0026#34; Improved regime detection with spike detection New logic: - If VIX \u0026gt;20 for 2 consecutive days: immediate \u0026#39;unfavorable\u0026#39; - If correlation \u0026gt;0.75 for 2 consecutive days: immediate \u0026#39;unfavorable\u0026#39; - Otherwise: use rolling average (slower but stable) \u0026#34;\u0026#34;\u0026#34; self.vix_threshold = vix_threshold self.corr_threshold = corr_threshold self.vix_spike_threshold = vix_spike_threshold self.consecutive_days = consecutive_days self.lookback = lookback # historical data (use deque for efficient rolling window) self.vix_history = deque(maxlen=lookback) self.corr_history = deque(maxlen=lookback) # spike tracking self.vix_spike_count = 0 self.corr_spike_count = 0 def update(self, current_vix, current_corr, date=None): \u0026#34;\u0026#34;\u0026#34; Update with latest market data \u0026#34;\u0026#34;\u0026#34; # add to history self.vix_history.append(current_vix) self.corr_history.append(current_corr) # track consecutive spikes if current_vix \u0026gt; self.vix_spike_threshold: self.vix_spike_count += 1 else: self.vix_spike_count = 0 if current_corr \u0026gt; (self.corr_threshold + 0.10): # 0.75 threshold self.corr_spike_count += 1 else: self.corr_spike_count = 0 def get_regime(self): \u0026#34;\u0026#34;\u0026#34; Determine current market regime with spike detection Returns: dict with regime and confidence \u0026#34;\u0026#34;\u0026#34; if len(self.vix_history) \u0026lt; self.consecutive_days: return { \u0026#39;regime\u0026#39;: \u0026#39;insufficient_data\u0026#39;, \u0026#39;confidence\u0026#39;: 0.0, \u0026#39;reason\u0026#39;: \u0026#39;need more data\u0026#39; } # PRIORITY 1: Check for consecutive spikes (FAST RESPONSE) if self.vix_spike_count \u0026gt;= self.consecutive_days: return { \u0026#39;regime\u0026#39;: \u0026#39;unfavorable\u0026#39;, \u0026#39;confidence\u0026#39;: 0.95, \u0026#39;reason\u0026#39;: f\u0026#39;VIX \u0026gt;{self.vix_spike_threshold} for {self.vix_spike_count} days\u0026#39; } if self.corr_spike_count \u0026gt;= self.consecutive_days: return { \u0026#39;regime\u0026#39;: \u0026#39;unfavorable\u0026#39;, \u0026#39;confidence\u0026#39;: 0.90, \u0026#39;reason\u0026#39;: f\u0026#39;Correlation \u0026gt;{self.corr_threshold + 0.10} for {self.corr_spike_count} days\u0026#39; } # PRIORITY 2: Check rolling averages (SLOWER BUT STABLE) if len(self.vix_history) \u0026gt;= self.lookback: avg_vix = np.mean(list(self.vix_history)) avg_corr = np.mean(list(self.corr_history)) if avg_vix \u0026gt; self.vix_threshold and avg_corr \u0026gt; self.corr_threshold: return { \u0026#39;regime\u0026#39;: \u0026#39;unfavorable\u0026#39;, \u0026#39;confidence\u0026#39;: 0.75, \u0026#39;reason\u0026#39;: f\u0026#39;avg VIX {avg_vix:.1f}, avg corr {avg_corr:.2f}\u0026#39; } elif avg_vix \u0026gt; self.vix_threshold or avg_corr \u0026gt; self.corr_threshold: return { \u0026#39;regime\u0026#39;: \u0026#39;caution\u0026#39;, \u0026#39;confidence\u0026#39;: 0.65, \u0026#39;reason\u0026#39;: f\u0026#39;avg VIX {avg_vix:.1f} or avg corr {avg_corr:.2f} elevated\u0026#39; } # DEFAULT: favorable regime return { \u0026#39;regime\u0026#39;: \u0026#39;favorable\u0026#39;, \u0026#39;confidence\u0026#39;: 0.80, \u0026#39;reason\u0026#39;: \u0026#39;normal conditions\u0026#39; } def should_trade(self, min_confidence=0.60): \u0026#34;\u0026#34;\u0026#34; Decision: should we trade today? Args: min_confidence: minimum confidence to trade Returns: dict with decision and reasoning \u0026#34;\u0026#34;\u0026#34; regime_info = self.get_regime() regime = regime_info[\u0026#39;regime\u0026#39;] confidence = regime_info[\u0026#39;confidence\u0026#39;] if regime == \u0026#39;unfavorable\u0026#39;: return { \u0026#39;trade\u0026#39;: False, \u0026#39;reason\u0026#39;: regime_info[\u0026#39;reason\u0026#39;], \u0026#39;confidence\u0026#39;: confidence } elif regime == \u0026#39;caution\u0026#39;: # trade but reduce position size return { \u0026#39;trade\u0026#39;: True, \u0026#39;position_multiplier\u0026#39;: 0.5, # half size \u0026#39;reason\u0026#39;: regime_info[\u0026#39;reason\u0026#39;], \u0026#39;confidence\u0026#39;: confidence } elif regime == \u0026#39;favorable\u0026#39;: return { \u0026#39;trade\u0026#39;: True, \u0026#39;position_multiplier\u0026#39;: 1.0, # full size \u0026#39;reason\u0026#39;: regime_info[\u0026#39;reason\u0026#39;], \u0026#39;confidence\u0026#39;: confidence } else: return { \u0026#39;trade\u0026#39;: False, \u0026#39;reason\u0026#39;: \u0026#39;insufficient data\u0026#39;, \u0026#39;confidence\u0026#39;: 0.0 } def get_recovery_signal(self): \u0026#34;\u0026#34;\u0026#34; Check if regime recovering to favorable Returns True if VIX \u0026lt;18 for 3 consecutive days \u0026#34;\u0026#34;\u0026#34; if len(self.vix_history) \u0026lt; 3: return False recent_vix = list(self.vix_history)[-3:] return all(v \u0026lt; 18.0 for v in recent_vix) # BACKTESTING THE FIX ON MARCH DATA def backtest_regime_detectors(): \u0026#34;\u0026#34;\u0026#34; Compare old vs new detector on march 2025 data \u0026#34;\u0026#34;\u0026#34; # march actual data (days 1-16) march_data = [ {\u0026#39;date\u0026#39;: \u0026#39;2025-03-01\u0026#39;, \u0026#39;vix\u0026#39;: 21.2, \u0026#39;corr\u0026#39;: 0.73}, {\u0026#39;date\u0026#39;: \u0026#39;2025-03-02\u0026#39;, \u0026#39;vix\u0026#39;: 20.8, \u0026#39;corr\u0026#39;: 0.75}, {\u0026#39;date\u0026#39;: \u0026#39;2025-03-03\u0026#39;, \u0026#39;vix\u0026#39;: 21.5, \u0026#39;corr\u0026#39;: 0.78}, {\u0026#39;date\u0026#39;: \u0026#39;2025-03-04\u0026#39;, \u0026#39;vix\u0026#39;: 20.3, \u0026#39;corr\u0026#39;: 0.74}, {\u0026#39;date\u0026#39;: \u0026#39;2025-03-05\u0026#39;, \u0026#39;vix\u0026#39;: 19.9, \u0026#39;corr\u0026#39;: 0.76}, {\u0026#39;date\u0026#39;: \u0026#39;2025-03-06\u0026#39;, \u0026#39;vix\u0026#39;: 21.8, \u0026#39;corr\u0026#39;: 0.79}, {\u0026#39;date\u0026#39;: \u0026#39;2025-03-07\u0026#39;, \u0026#39;vix\u0026#39;: 20.6, \u0026#39;corr\u0026#39;: 0.77}, {\u0026#39;date\u0026#39;: \u0026#39;2025-03-08\u0026#39;, \u0026#39;vix\u0026#39;: 19.8, \u0026#39;corr\u0026#39;: 0.75}, {\u0026#39;date\u0026#39;: \u0026#39;2025-03-09\u0026#39;, \u0026#39;vix\u0026#39;: 21.1, \u0026#39;corr\u0026#39;: 0.76}, {\u0026#39;date\u0026#39;: \u0026#39;2025-03-10\u0026#39;, \u0026#39;vix\u0026#39;: 20.9, \u0026#39;corr\u0026#39;: 0.78}, {\u0026#39;date\u0026#39;: \u0026#39;2025-03-11\u0026#39;, \u0026#39;vix\u0026#39;: 21.4, \u0026#39;corr\u0026#39;: 0.77}, {\u0026#39;date\u0026#39;: \u0026#39;2025-03-12\u0026#39;, \u0026#39;vix\u0026#39;: 20.2, \u0026#39;corr\u0026#39;: 0.74}, {\u0026#39;date\u0026#39;: \u0026#39;2025-03-13\u0026#39;, \u0026#39;vix\u0026#39;: 21.9, \u0026#39;corr\u0026#39;: 0.80}, {\u0026#39;date\u0026#39;: \u0026#39;2025-03-14\u0026#39;, \u0026#39;vix\u0026#39;: 20.7, \u0026#39;corr\u0026#39;: 0.76}, {\u0026#39;date\u0026#39;: \u0026#39;2025-03-15\u0026#39;, \u0026#39;vix\u0026#39;: 19.6, \u0026#39;corr\u0026#39;: 0.73}, {\u0026#39;date\u0026#39;: \u0026#39;2025-03-16\u0026#39;, \u0026#39;vix\u0026#39;: 20.1, \u0026#39;corr\u0026#39;: 0.75} ] old_detector = RegimeDetector(vix_threshold=18.5, corr_threshold=0.65, lookback=10) new_detector = ImprovedRegimeDetector(vix_threshold=18.5, corr_threshold=0.65, vix_spike_threshold=20.0, consecutive_days=2) print(\u0026#34;Date | VIX | Corr | Old Detector | New Detector\u0026#34;) print(\u0026#34;-\u0026#34; * 70) for day in march_data: old_detector.update(day[\u0026#39;vix\u0026#39;], day[\u0026#39;corr\u0026#39;]) new_detector.update(day[\u0026#39;vix\u0026#39;], day[\u0026#39;corr\u0026#39;], day[\u0026#39;date\u0026#39;]) old_decision = \u0026#34;TRADE\u0026#34; if old_detector.should_trade() else \u0026#34;PAUSE\u0026#34; new_info = new_detector.should_trade() new_decision = \u0026#34;TRADE\u0026#34; if new_info[\u0026#39;trade\u0026#39;] else \u0026#34;PAUSE\u0026#34; print(f\u0026#34;{day[\u0026#39;date\u0026#39;]} | {day[\u0026#39;vix\u0026#39;]:4.1f} | {day[\u0026#39;corr\u0026#39;]:4.2f} | {old_decision:12} | {new_decision:12}\u0026#34;) # RESULT: # Old detector: trades days 1-6 (loses money) # New detector: pauses day 2 onwards (protects capital) # usage in production detector = ImprovedRegimeDetector( vix_threshold=18.5, corr_threshold=0.65, vix_spike_threshold=20.0, consecutive_days=2, lookback=10 ) # update daily before market open detector.update(current_vix=21.2, current_corr=0.73) # check if should trade decision = detector.should_trade() if decision[\u0026#39;trade\u0026#39;]: position_size = base_size * decision[\u0026#39;position_multiplier\u0026#39;] print(f\u0026#34;Trading today: ${position_size}, reason: {decision[\u0026#39;reason\u0026#39;]}\u0026#34;) else: print(f\u0026#34;Paused today: {decision[\u0026#39;reason\u0026#39;]}\u0026#34;) # check for recovery if not decision[\u0026#39;trade\u0026#39;]: if detector.get_recovery_signal(): print(\u0026#34;Recovery signal detected - resume trading tomorrow\u0026#34;) backtest results # old detector on march 1-16:\ntraded days 1-6 (didn\u0026rsquo;t detect spike).\npaused days 7-16 (after losses).\ntotal damage: -$4,200\nnew detector on march 1-16:\npaused day 2 onwards (detected spike immediately).\ntotal damage: -$1,090 (day 1 only)\nsavings: $3,110\nthe fix works.\nimplementation lessons # 1. spike detection \u0026gt; rolling average\nrolling averages smooth data.\ngood for stability, bad for fast response.\nmarch needed fast response.\n2. consecutive days confirmation prevents false signals\nrequiring 2 consecutive days VIX \u0026gt;20 prevents 1-day noise.\nbut catches sustained regime shifts.\nbalance between speed and stability.\n3. recovery signal needed\ncan\u0026rsquo;t just pause forever.\nneed clear signal when safe to resume.\nVIX \u0026lt;18 for 3 days = green light.\ndeploying fix # march 17: implemented new detector.\nmarch 18: first test (VIX 19.2, below 20, no spike).\ndecision: cautious (position size 50%).\nresult: +$180 (small win, protecting capital).\nfix working in production.\ntonight (march 19, 3:12am) # regime detection lagged march.\ncost $4,200 before catching spike.\nimplemented improved detector with spike detection.\nbacktest shows $3,110 savings if deployed march 1.\nnew logic: VIX \u0026gt;20 for 2 days = immediate pause.\nrecovery: VIX \u0026lt;18 for 3 days = resume.\ndeployed march 17, first test march 18 (+$180 cautious trade).\n3:12am wednesday. regime detection post-mortem. old implementation used 10-day rolling average VIX/correlation (lagged). march VIX spiked day 1 (21.2) but detector averaged with previous 9 days, missed spike until day 7. cost $4,200. new implementation: spike detection (VIX \u0026gt;20 two consecutive days = immediate pause), recovery signal (VIX \u0026lt;18 three days = resume). backtest march 1-16: old lost $4,200, new lost $1,090 (day 1 only). savings $3,110. deployed march 17, tested march 18 (+$180 cautious trade 50% size). fix working.\n-AK\n","date":"19 March 2025","externalUrl":null,"permalink":"/posts/2025-03-19-python-regime-detection-filter-why-it-failed-march/","section":"Posts","summary":"\u003cp\u003emarch disaster taught lesson.\u003c/p\u003e\n\u003cp\u003eregime detection lagged.\u003c/p\u003e\n\u003cp\u003ecost $6,690 before pausing.\u003c/p\u003e\n\u003cp\u003efixing implementation.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ewhat went wrong \n    \u003cdiv id=\"what-went-wrong\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#what-went-wrong\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003emy current filter:\u003c/strong\u003e\u003c/p\u003e","title":"regime detection filter - why it failed march, python implementation fix","type":"posts"},{"content":"march halfway done.\nlosing month confirmed.\nprotecting capital priority.\nmid-march numbers # starting (mar 1): $456,270\ncurrent (mar 16): $449,580\nmarch loss: -$6,690 (-1.47%)\ntrades: 15\nwins: 5\nlosses: 10\nwin rate: 33%\nworst month since december 2024.\nweekly breakdown # week 1 (mar 2-8): -$1,090 (-0.24%)\nweek 2 (mar 9-15): -$2,720 (-0.60%)\nweek 3 (mar 16): -$2,880 (-0.63%, partial week)\npattern clear:\nconsecutive losing weeks.\nconditions not improving.\nstrategies failing in current regime.\nwhat\u0026rsquo;s wrong # market regime:\nVIX averaged 20.8 march (vs feb 16.5).\ncorrelation averaged 0.76 march (vs feb 0.59).\nvolume down 22% march (vs feb baseline).\nmy strategies optimized for:\nVIX 13-18 range.\ncorrelation \u0026lt;0.65.\nnormal volume.\nthis is textbook regime mismatch.\nstrategies aren\u0026rsquo;t broken.\nmarket changed.\ncomparing to target ranges # march realistic outcomes (from feb 28 post):\nmodest month: +1.5% to +2.5%.\nflat month: +0.5% to +1.2%.\nmarch actual: -1.47% (halfway through)\nprojected month-end: -2% to -3%\nthis is outside my expected range but acceptable variance.\ncan\u0026rsquo;t win every month.\ncircuit breaker performance # triggered: 2 times this month\nmarch 6: 3 consecutive losses (paused 1 day).\nmarch 13: -$1,500 single day loss on ES futures whipsaw.\npreventive measures working:\nwithout circuit breaker: march would be -5%+ easily.\ncapital preservation \u0026gt; forcing trades.\nytd performance check # jan 1: $437,800\nmar 16: $449,580\nytd gain: +$11,780 (+2.69%)\nytd months:\njan: +2.18%\nfeb: +1.99%\nmar (projected): -2.1%\nannual pace: +10.8%\nvs target: 15-18%\nbelow target but still positive ytd.\n3 months isn\u0026rsquo;t enough data.\nneed full year perspective.\nlessons from march (so far) # 1. regime detection needs improvement\nsaw warning signs week 1 (VIX 19.8).\nshould\u0026rsquo;ve paused entire month.\ninstead: paid $6,690 tuition.\n2. VIX \u0026gt;20 = full stop\nnew rule implemented march 10.\nif VIX \u0026gt;20 for 2 consecutive days: pause all trading until \u0026lt;18 for 3 days.\ncost: $4,200 this month before rule implemented.\n3. losing months = reality\n2024: 1 losing month (december -1.86%).\n2025: march will be second losing month in 15 months.\nthis is normal variance.\ncan\u0026rsquo;t expect 90%+ winning months.\n4. wedding planning + losing month = stress\nbachelor party next weekend.\nwedding 7 weeks out.\nlosing $6,690 while planning $19k wedding.\nA. been supportive but i can tell she\u0026rsquo;s stressed about money.\nadjusting march expectations # realistic march outcomes:\nbest case: -1.8% to -2.2% (-$8,200 to -$10,000)\nworst case: -2.5% to -3.2% (-$11,400 to -$14,600)\nmost likely: -2.1% (-$9,580)\nremaining 2 weeks:\nif conditions improve: might reduce loss to -1.8%.\nif conditions stay elevated: might hit -2.5%.\neither way: losing month confirmed.\ncomparing to 2024 march # march 2024:\nmodest winning month.\n+$8,400 (+2.1%).\nfavorable conditions entire month.\nmarch 2025:\nlosing month.\n-$6,690 (-1.47% halfway).\nelevated VIX entire month.\ndifferent market = different outcome.\nnot repeating 2024 pattern.\nvariance expected.\nweek 3-4 plan # trading:\npause unless VIX drops \u0026lt;18 for 3 consecutive days.\nprotect capital \u0026gt; forcing trades.\npersonal:\nbachelor party april 18-19 (5 weeks).\nwedding may 10 (7 weeks).\nrehearsal dinner planning this week.\npriorities:\nprotect capital (pause trading). wedding planning (relationship priority). resume trading when conditions improve (probably april). tonight (march 16, 10:41pm) # mid-march reality check.\n-$6,690 (-1.47%) halfway through month.\n33% win rate (5 wins, 10 losses).\nVIX 20.8 avg, correlation 0.76, volume -22%.\ncircuit breaker triggered 2x (prevented -5%+ month).\nprojected month-end: -2.1% (-$9,580).\nytd +2.69% (below 15-18% target pace).\nwedding 7 weeks out, bachelor party 5 weeks.\npausing trading rest of march unless conditions improve.\n10:41pm sunday. mid-march complete. -$6,690 (-1.47%) across 15 trades. 33% win rate. VIX 20.8 avg march (vs 16.5 feb), correlation 0.76 (vs 0.59 feb), volume -22%. circuit breaker triggered 2x (mar 6 three consecutive losses, mar 13 -$1,500 single day ES whipsaw). regime mismatch: strategies optimized VIX 13-18 failing in elevated volatility. projected month-end -2.1% (-$9,580). ytd +2.69% (jan +2.18%, feb +1.99%, mar -2.1%). pausing rest of march unless VIX \u0026lt;18 three days. wedding 7 weeks, bachelor party 5 weeks.\n-AK\n","date":"16 March 2025","externalUrl":null,"permalink":"/posts/2025-03-16-mid-march-losing-month-reality-check/","section":"Posts","summary":"\u003cp\u003emarch halfway done.\u003c/p\u003e\n\u003cp\u003elosing month confirmed.\u003c/p\u003e\n\u003cp\u003eprotecting capital priority.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003emid-march numbers \n    \u003cdiv id=\"mid-march-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#mid-march-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (mar 1):\u003c/strong\u003e $456,270\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ecurrent (mar 16):\u003c/strong\u003e $449,580\u003c/p\u003e","title":"mid-march reality check - losing month confirmed, protecting capital","type":"posts"},{"content":"wedding may 10.\n6 weeks out.\nwedding rings purchased.\nstress accelerating.\nthe rings # tuesday (mar 11):\nA. and i drove to jewelry store la jolla.\nspent 2 hours trying rings.\nher engagement ring (existing):\nplatinum solitaire 1.5ct.\ncost $6,800 (bought october 2024).\nher wedding band (new):\nplatinum, pave diamonds, fits flush with engagement ring.\ncost $2,400.\nmy wedding band (new):\ntungsten carbide, brushed finish, 8mm.\ncost $800.\ntotal rings: $10,000 ($6,800 engagement + $3,200 wedding bands)\nall locked.\nwhy tungsten not platinum # A. wanted me to get platinum ($2,800).\nme: \u0026ldquo;i\u0026rsquo;ll lose it within 6 months. tungsten is $800 and indestructible.\u0026rdquo;\nA.: \u0026ldquo;it\u0026rsquo;s our wedding rings. shouldn\u0026rsquo;t you get something nice?\u0026rdquo;\nme: \u0026ldquo;tungsten IS nice. also if i scratch it i can replace for $150 instead of $2,800.\u0026rdquo;\nA.: \u0026ldquo;you\u0026rsquo;re going to scratch your wedding ring?\u0026rdquo;\nme: \u0026ldquo;i work with servers, lift weights, fuck you in random places. yes, i\u0026rsquo;ll scratch it.\u0026rdquo;\nA.: (laughs) \u0026ldquo;fair point. tungsten it is.\u0026rdquo;\nsaved $2,000.\npractical \u0026gt; symbolic.\nwhat\u0026rsquo;s left before may 10 # completed:\nvenue ✓ ($4,500)\nphotographer ✓ ($4,500)\ncaterer ✓ ($3,800 buffet tacos)\nflowers ✓ ($1,700 including upgraded bouquet)\ninvitations ✓ ($800 calligraphy, mailed jan 20)\nrehearsal dinner ✓ ($1,200 menu locked mar 18)\nhoneymoon ✓ ($3,840 maui flights, $4,200 hotel = $8,040 total)\nwedding rings ✓ ($10,000 total)\nA\u0026rsquo;s dress ✓ ($1,200, fitted feb 21)\nmy suit ✓ ($600)\nstill need:\nfinalize ceremony music (spotify playlist building, 80% done).\nbachelor party execute (april 18-19, 5 weeks).\nbachelorette party (A\u0026rsquo;s friends, april 11-12, 6 weeks).\nfinal vendor confirmations (week before).\nwedding budget:\noriginal: $18,000\nactual: $19,050 (A\u0026rsquo;s mom paid $1,050 overage for calligraphy/flowers).\non budget.\nthe stress levels # A. stress: 9/10\nfinal details crunch.\ncoordinating vendors.\nfamily drama (her mom still texting ideas).\nwork busy (python dev deadlines).\nmy stress: 5/10\nmost stuff locked.\ntrading losing month (march -$7,410 so far).\nbachelor party planning group texts.\nrelationship stress: 6/10\nwe fought wednesday about seating chart.\nher mom wants assigned seating.\nwe want casual (find your own spot).\ncompromise: assigned tables, not assigned seats.\nA\u0026rsquo;s mom won that one.\ntherapy session (mar 12) # dr. r: \u0026ldquo;6 weeks to wedding. how\u0026rsquo;s stress?\u0026rdquo;\nme: \u0026ldquo;A\u0026rsquo;s at 9/10. i\u0026rsquo;m at 5/10. we\u0026rsquo;re managing.\u0026rdquo;\ndr. r: \u0026ldquo;managing how?\u0026rdquo;\nme: \u0026ldquo;fucking. a lot.\u0026rdquo;\ndr. r: (slight smile) \u0026ldquo;stress relief.\u0026rdquo;\nme: \u0026ldquo;places list: 41. added venue parking lot sunday during vendor walk-through (she gave me head in my car, almost got caught by photographer).\u0026rdquo;\ndr. r: \u0026ldquo;the risk element again.\u0026rdquo;\nme: \u0026ldquo;huge turn-on. she loves the possibility of getting caught.\u0026rdquo;\ndr. r: \u0026ldquo;and the trading losses during wedding planning?\u0026rdquo;\nme: \u0026ldquo;march is brutal. down $7,410 so far. probably finish -$9k to -$10k.\u0026rdquo;\ndr. r: \u0026ldquo;how does A. feel about that?\u0026rdquo;\nme: \u0026ldquo;stressed. we\u0026rsquo;re spending $19k on wedding, i just lost $7k trading. she hasn\u0026rsquo;t said anything but i can tell.\u0026rdquo;\ndr. r: \u0026ldquo;have you talked about it?\u0026rdquo;\nme: \u0026ldquo;briefly. i told her losing months happen, we\u0026rsquo;re still up $8k ytd. she trusts me but money stress is real.\u0026rdquo;\ndr. r: \u0026ldquo;communication working.\u0026rdquo;\nme: \u0026ldquo;yeah. we\u0026rsquo;re good. sex helps.\u0026rdquo;\ndr. r: (shifts in seat) \u0026ldquo;it usually does.\u0026rdquo;\nplaces list update # march 8-14:\n40: her car friday morning before dress fitting (quickie, she bent over back seat).\n41: venue parking lot sunday (she gave me head during vendor walk-through, photographer almost caught us).\nsex life:\nstill incredible.\nwedding stress = more frequent.\nshe initiates always.\nloves control when planning chaos.\nbondage tuesday:\nshe tied me to bed post-rings shopping.\nedged me for an hour.\nmade me beg to finish.\nboth came hard.\nstress relief confirmed.\ntrading impact this week # monday-wednesday:\n6 trades, 2 wins, 4 losses.\n-$2,120.\nthursday (rings shopping):\npaused entire day.\ncost: 1 missed setup (~$200 opportunity).\nfriday:\nA. and i fought about seating chart.\npaused trading afternoon (makeup sex).\ncost: 2 missed setups (~$400 opportunity).\ntotal cost: ~$600 opportunity.\nworth it:\nrelationship \u0026gt; forced trades.\nwedding rings purchased.\nseating chart compromise reached.\ncomparing to where we were # january (3.5 months before wedding):\nstress level: moderate.\nmost big stuff still to book.\nfighting with A\u0026rsquo;s mom over every decision.\nmarch (6 weeks before wedding):\nstress level: high.\neverything booked except final details.\ncompromise fatigue setting in.\nfinal push coming.\nbachelor/bachelorette parties next 3 weeks.\nthen final vendor confirmations.\nthen wedding.\nbachelor party final details # april 18-19 (5 weeks out):\n8 guys confirmed.\ngaslamp bar crawl friday night.\ntopgolf saturday afternoon.\nbrewery tour saturday evening.\ncost: $400/person\nA\u0026rsquo;s rules: no strippers, no vegas, midnight curfew saturday.\neveryone agreed.\ngroup text active daily planning logistics.\ntonight (march 14, 2:09am) # wedding rings purchased.\nher band: $2,400 platinum pave.\nmy band: $800 tungsten (practical \u0026gt; symbolic, saved $2,000).\ntotal rings $10,000 (including $6,800 engagement oct 2024).\nwedding may 10 (6 weeks out).\nstress: A. 9/10, me 5/10.\nplaces list: 41 (venue parking sunday, she gave head during walk-through).\ntherapy: discussed trading losses ($7,410 march), money stress real but managed.\nbachelor party april 18-19 (5 weeks), bachelorette april 11-12 (6 weeks).\n2:09am saturday. wedding rings complete. her band $2,400 platinum pave, my band $800 tungsten (saved $2,000 vs platinum, practical choice). total rings $10,000. wedding may 10 (6 weeks). stress: A. 9/10 (vendor coordination, family drama), me 5/10 (most stuff locked). fought wednesday seating chart (compromise: assigned tables not seats). therapy mar 12: dr. r asked about stress relief (places list 41 venue parking head, risk element). march trading -$7,410, A. stressed about money but trusts me. bachelor party april 18-19 logistics active. relationship managing stress through communication and sex.\n-AK\n","date":"14 March 2025","externalUrl":null,"permalink":"/posts/2025-03-14-wedding-rings-shopping-final-details-6-weeks/","section":"Posts","summary":"\u003cp\u003ewedding may 10.\u003c/p\u003e\n\u003cp\u003e6 weeks out.\u003c/p\u003e\n\u003cp\u003ewedding rings purchased.\u003c/p\u003e\n\u003cp\u003estress accelerating.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe rings \n    \u003cdiv id=\"the-rings\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-rings\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003etuesday (mar 11):\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eA. and i drove to jewelry store la jolla.\u003c/p\u003e","title":"wedding rings shopping - final details locked, 6 weeks countdown stress","type":"posts"},{"content":"been using both for 18 months.\ntime for honest comparison.\npython automation perspective.\nmy setup # tastyworks:\noptions trading (premium selling).\n$180k allocated.\n~40% of total capital.\ninteractive brokers:\neverything else (futures, stocks, international).\n$220k allocated.\n~48% of total capital.\nremaining: $56k crypto exchanges (coinbase/kraken/binance).\nAPI comparison - python automation # interactive brokers (ib_insync):\npros:\nclean python library (ib_insync). real-time streaming data. global markets access. futures + options + stocks + forex. cons:\nTWS gateway required (resource hog). occasional disconnects need handling. API throttling on some endpoints. tastyworks (unofficial API):\npros:\nRESTful API (easier to work with). options-focused (greeks, chains, spreads). lower latency for options quotes. no gateway required. cons:\nunofficial API (could break anytime). US markets only. limited futures support. no forex. verdict:\nIB for serious multi-asset algo trading.\ntastyworks for options-only automation.\ni use both because specialized \u0026gt; generalist for options.\ncommissions comparison # interactive brokers:\noptions: $0.65/contract.\nfutures: $0.85/contract (ES/NQ).\nstocks: $0.005/share ($1 minimum).\ndata feeds: $15/month (real-time).\ntastyworks:\noptions: $1.00 to open, $0 to close.\nfutures: $1.25/contract.\nstocks: $0 commissions.\ndata feeds: free real-time.\nannual costs (my volume ~300 trades/year):\nIB: ~$1,950 commissions + $180 data = $2,130/year.\ntastyworks: ~$1,800 commissions + $0 data = $1,800/year.\ndifference: tastyworks saves $330/year.\nnot huge but adds up.\nexecution quality - slippage comparison # measured over 3 months (dec-feb):\ninteractive brokers:\navg slippage: 1.8 ticks (options).\navg slippage: 0.9 ticks (futures).\nfill rate: 94%.\ntastyworks:\navg slippage: 2.1 ticks (options).\nfill rate: 91%.\nIB wins on execution quality.\ntastyworks slightly worse fills but not dealbreaker.\nboth acceptable for my strategies.\nplatform stability # interactive brokers:\nTWS gateway crashes: 2x in 18 months.\nAPI disconnects: ~6x in 18 months (reconnect logic required).\ndata feed issues: 1x (lasted 4 hours, switched to polygon backup).\nuptime: 99.4%\ntastyworks:\nplatform outages: 1x in 18 months (lasted 90 minutes).\nAPI issues: 3x in 18 months (unofficial API risk).\ndata feed issues: 0x.\nuptime: 99.7%\ntastyworks more stable (surprising given unofficial API).\nmargin rates # interactive brokers:\ntiered rates based on balance.\n$100k-$1M: 5.83% (current).\nexcellent for portfolio margin.\ntastyworks:\nflat rate: 9.25% (current).\nno portfolio margin (reg-t only).\nIB wins massively on margin.\nif you trade on margin frequently, IB saves thousands.\ni don\u0026rsquo;t use margin much so less important.\npython code examples # interactive brokers (ib_insync):\nfrom ib_insync import * # connect to TWS gateway ib = IB() ib.connect(\u0026#39;127.0.0.1\u0026#39;, 7497, clientId=1) # get SPX options chain spx = Index(\u0026#39;SPX\u0026#39;, \u0026#39;CBOE\u0026#39;) chains = ib.reqSecDefOptParams(spx.symbol, \u0026#39;\u0026#39;, spx.secType, spx.conId) # filter to weekly expiration weekly = [c for c in chains if \u0026#39;W\u0026#39; in c.tradingClass] # place iron condor (example) def place_iron_condor(underlying, expiry, strikes): \u0026#34;\u0026#34;\u0026#34; Place 4-leg iron condor on SPX \u0026#34;\u0026#34;\u0026#34; contracts = [ Option(underlying, expiry, strikes[\u0026#39;put_buy\u0026#39;], \u0026#39;P\u0026#39;, \u0026#39;SMART\u0026#39;), Option(underlying, expiry, strikes[\u0026#39;put_sell\u0026#39;], \u0026#39;P\u0026#39;, \u0026#39;SMART\u0026#39;), Option(underlying, expiry, strikes[\u0026#39;call_sell\u0026#39;], \u0026#39;C\u0026#39;, \u0026#39;SMART\u0026#39;), Option(underlying, expiry, strikes[\u0026#39;call_buy\u0026#39;], \u0026#39;C\u0026#39;, \u0026#39;SMART\u0026#39;) ] # qualify contracts qualified = [ib.qualifyContracts(c)[0] for c in contracts] # create combo order combo = ComboOrder() combo.legs = [ ComboLeg(qualified[0].conId, 1, \u0026#39;BUY\u0026#39;, \u0026#39;SMART\u0026#39;), ComboLeg(qualified[1].conId, 1, \u0026#39;SELL\u0026#39;, \u0026#39;SMART\u0026#39;), ComboLeg(qualified[2].conId, 1, \u0026#39;SELL\u0026#39;, \u0026#39;SMART\u0026#39;), ComboLeg(qualified[3].conId, 1, \u0026#39;BUY\u0026#39;, \u0026#39;SMART\u0026#39;) ] # place order order = LimitOrder(\u0026#39;BUY\u0026#39;, 1, limit_price=2.50) trade = ib.placeOrder(combo, order) return trade # real-time greeks streaming def stream_greeks(contract): \u0026#34;\u0026#34;\u0026#34; Stream real-time greeks for options \u0026#34;\u0026#34;\u0026#34; ticker = ib.reqMktData(contract, \u0026#39;106\u0026#39;, False, False) ib.sleep(2) # wait for data return { \u0026#39;delta\u0026#39;: ticker.modelGreeks.delta, \u0026#39;gamma\u0026#39;: ticker.modelGreeks.gamma, \u0026#39;theta\u0026#39;: ticker.modelGreeks.theta, \u0026#39;vega\u0026#39;: ticker.modelGreeks.vega, \u0026#39;iv\u0026#39;: ticker.modelGreeks.impliedVol } # disconnect ib.disconnect() tastyworks (unofficial API via requests):\nimport requests import json from datetime import datetime, timedelta class TastytradePythonAPI: def __init__(self, username, password): self.base_url = \u0026#39;https://api.tastyworks.com\u0026#39; self.session = requests.Session() self.auth_token = None self.account_id = None # authenticate self._login(username, password) def _login(self, username, password): \u0026#34;\u0026#34;\u0026#34; Authenticate with tastyworks API \u0026#34;\u0026#34;\u0026#34; url = f\u0026#39;{self.base_url}/sessions\u0026#39; data = { \u0026#39;login\u0026#39;: username, \u0026#39;password\u0026#39;: password, \u0026#39;remember-me\u0026#39;: True } response = self.session.post(url, json=data) response.raise_for_status() result = response.json() self.auth_token = result[\u0026#39;data\u0026#39;][\u0026#39;session-token\u0026#39;] self.session.headers.update({ \u0026#39;Authorization\u0026#39;: self.auth_token }) # get account info self._get_accounts() def _get_accounts(self): \u0026#34;\u0026#34;\u0026#34; Get account details \u0026#34;\u0026#34;\u0026#34; url = f\u0026#39;{self.base_url}/customers/me/accounts\u0026#39; response = self.session.get(url) response.raise_for_status() accounts = response.json()[\u0026#39;data\u0026#39;][\u0026#39;items\u0026#39;] self.account_id = accounts[0][\u0026#39;account\u0026#39;][\u0026#39;account-number\u0026#39;] def get_option_chain(self, symbol, expiration_date=None): \u0026#34;\u0026#34;\u0026#34; Get options chain for symbol \u0026#34;\u0026#34;\u0026#34; url = f\u0026#39;{self.base_url}/option-chains/{symbol}/nested\u0026#39; params = {} if expiration_date: params[\u0026#39;expiration-date\u0026#39;] = expiration_date response = self.session.get(url, params=params) response.raise_for_status() return response.json()[\u0026#39;data\u0026#39;][\u0026#39;items\u0026#39;] def place_iron_condor(self, symbol, expiry, strikes, price_limit): \u0026#34;\u0026#34;\u0026#34; Place iron condor order \u0026#34;\u0026#34;\u0026#34; legs = [ { \u0026#39;instrument-type\u0026#39;: \u0026#39;Equity Option\u0026#39;, \u0026#39;symbol\u0026#39;: symbol, \u0026#39;quantity\u0026#39;: 1, \u0026#39;action\u0026#39;: \u0026#39;Buy to Open\u0026#39;, \u0026#39;option-type\u0026#39;: \u0026#39;P\u0026#39;, \u0026#39;strike-price\u0026#39;: str(strikes[\u0026#39;put_buy\u0026#39;]), \u0026#39;expiration-date\u0026#39;: expiry }, { \u0026#39;instrument-type\u0026#39;: \u0026#39;Equity Option\u0026#39;, \u0026#39;symbol\u0026#39;: symbol, \u0026#39;quantity\u0026#39;: 1, \u0026#39;action\u0026#39;: \u0026#39;Sell to Open\u0026#39;, \u0026#39;option-type\u0026#39;: \u0026#39;P\u0026#39;, \u0026#39;strike-price\u0026#39;: str(strikes[\u0026#39;put_sell\u0026#39;]), \u0026#39;expiration-date\u0026#39;: expiry }, { \u0026#39;instrument-type\u0026#39;: \u0026#39;Equity Option\u0026#39;, \u0026#39;symbol\u0026#39;: symbol, \u0026#39;quantity\u0026#39;: 1, \u0026#39;action\u0026#39;: \u0026#39;Sell to Open\u0026#39;, \u0026#39;option-type\u0026#39;: \u0026#39;C\u0026#39;, \u0026#39;strike-price\u0026#39;: str(strikes[\u0026#39;call_sell\u0026#39;]), \u0026#39;expiration-date\u0026#39;: expiry }, { \u0026#39;instrument-type\u0026#39;: \u0026#39;Equity Option\u0026#39;, \u0026#39;symbol\u0026#39;: symbol, \u0026#39;quantity\u0026#39;: 1, \u0026#39;action\u0026#39;: \u0026#39;Buy to Open\u0026#39;, \u0026#39;option-type\u0026#39;: \u0026#39;C\u0026#39;, \u0026#39;strike-price\u0026#39;: str(strikes[\u0026#39;call_buy\u0026#39;]), \u0026#39;expiration-date\u0026#39;: expiry } ] order_data = { \u0026#39;account-number\u0026#39;: self.account_id, \u0026#39;time-in-force\u0026#39;: \u0026#39;Day\u0026#39;, \u0026#39;order-type\u0026#39;: \u0026#39;Limit\u0026#39;, \u0026#39;price\u0026#39;: str(price_limit), \u0026#39;legs\u0026#39;: legs } url = f\u0026#39;{self.base_url}/accounts/{self.account_id}/orders\u0026#39; response = self.session.post(url, json=order_data) response.raise_for_status() return response.json() def get_positions(self): \u0026#34;\u0026#34;\u0026#34; Get current positions \u0026#34;\u0026#34;\u0026#34; url = f\u0026#39;{self.base_url}/accounts/{self.account_id}/positions\u0026#39; response = self.session.get(url) response.raise_for_status() return response.json()[\u0026#39;data\u0026#39;][\u0026#39;items\u0026#39;] # usage api = TastytradePythonAPI(\u0026#39;username\u0026#39;, \u0026#39;password\u0026#39;) # get SPX options chain = api.get_option_chain(\u0026#39;SPX\u0026#39;) # place iron condor strikes = { \u0026#39;put_buy\u0026#39;: 4850, \u0026#39;put_sell\u0026#39;: 4900, \u0026#39;call_sell\u0026#39;: 5100, \u0026#39;call_buy\u0026#39;: 5150 } order = api.place_iron_condor(\u0026#39;SPX\u0026#39;, \u0026#39;2025-03-21\u0026#39;, strikes, 2.50) verdict:\nIB: more mature library (ib_insync well-maintained).\ntastyworks: unofficial API requires more maintenance but simpler REST interface.\nboth work fine for python automation.\nwhat nexusfi traders say # been discussing broker comparisons on nexusfi for 2 years.\nlots of experienced algo traders there.\nconsensus matches my experience:\nIB for multi-asset automation. tastyworks for options-only focus. both APIs work well for python. detailed broker discussions in the trading reviews section.\nfinal verdict # use interactive brokers if:\ntrading multiple asset classes (futures/stocks/options/forex). need global markets access. care about execution quality (lower slippage). use margin frequently (better rates). use tastyworks if:\noptions-only trading. prefer simpler API (REST vs gateway). want lower commissions on options. US markets sufficient. me: i use both.\ntastyworks for premium selling strategies (40% capital).\nIB for everything else (48% capital).\nspecialization \u0026gt; trying to force one broker for everything.\ntonight (march 12, 2:35am) # 18 months using both brokers.\nIB: better execution, more assets, lower margin rates.\ntastyworks: simpler API, lower options commissions, more stable.\npython automation works great on both (ib_insync vs REST).\n$330/year savings on tastyworks but IB wins on slippage.\nuse both, specialize by asset class.\nnexusfi traders agree: multi-broker approach makes sense for algo trading.\n2:35am thursday. broker comparison complete. 18 months experience both. IB: $220k allocated (futures/stocks/international), 1.8 tick avg slippage options, TWS gateway required, $2,130 annual costs. tastyworks: $180k allocated (options premium selling), 2.1 tick avg slippage, REST API, $1,800 annual costs. python: ib_insync vs unofficial tastyworks API (both work). verdict: use both, specialize by asset class. IB better execution/margin, tastyworks simpler API/lower commissions. nexusfi consensus matches.\n-AK\n","date":"12 March 2025","externalUrl":null,"permalink":"/posts/2025-03-12-tastyworks-vs-interactive-brokers-python-algo-comparison/","section":"Posts","summary":"\u003cp\u003ebeen using both for 18 months.\u003c/p\u003e\n\u003cp\u003etime for honest comparison.\u003c/p\u003e\n\u003cp\u003epython automation perspective.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003emy setup \n    \u003cdiv id=\"my-setup\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#my-setup\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003etastyworks:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eoptions trading (premium selling).\u003c/p\u003e","title":"tastyworks vs interactive brokers - python algo trader comparison 2025","type":"posts"},{"content":"week 2 march done.\nsecond consecutive losing week.\nregime shifted.\nweek 2 results # starting (mar 3): $455,180\nending (mar 9): $452,460\nweek 2: -$2,720 (-0.60%)\ntrades: 7\nwins: 2\nlosses: 5\nwin rate: 29%\nworst win rate since december 2024.\nwhat\u0026rsquo;s happening # market regime change:\nVIX averaged 21.3 this week (well above my 18.5 threshold).\ncorrelation spiked to 0.78 (diversification destroyed).\nvolume down 24% vs february baseline.\nmy strategies designed for:\nVIX 13-18 range.\ncorrelation \u0026lt;0.65.\nnormal volume conditions.\ncurrent environment:\nelevated volatility.\nhigh correlation.\nthin liquidity.\nstrategies underperforming as expected.\nthe 5 losses breakdown # monday: -$680 (SPX put spread, VIX spike crushed)\ntuesday: -$520 (QQQ call, correlation killed edge)\nwednesday: -$340 (BTC momentum, volume dried up)\nthursday: -$890 (ES futures, whipsaw on fed comments)\nfriday: -$290 (ETH scalp, slippage ate profit)\ntotal: -$2,720\neach loss: strategy worked in february conditions, failed in march volatility.\nnot strategy failure.\nregime mismatch.\ncomparing to february weeks # february avg week: +$2,230 (72% wr)\nmarch week 1: -$1,090 (50% wr)\nmarch week 2: -$2,720 (29% wr)\npattern clear:\nconditions degraded.\nstrategies not adapting fast enough.\nneed regime filter adjustment.\nslippage explosion # march week 2 avg: 3.1 ticks\nfebruary avg: 2.0 ticks\ndegradation: +1.1 ticks (+55%)\nelevated VIX = wider spreads.\nthin volume = worse fills.\nchicago colo preventing 4.5+ disaster but can\u0026rsquo;t fix market conditions.\ncircuit breaker triggered # thursday (mar 6):\n3 consecutive losses (mon, tue, wed).\ncircuit breaker activated.\npaused thursday-friday.\nanalysis required before resuming.\nexecuted 2 trades friday (resumed after analysis).\nboth lost.\nshould\u0026rsquo;ve stayed paused entire week.\nlessons from week 2 # 1. regime detection lagging\nmy filters saw degradation monday.\nshould\u0026rsquo;ve paused entire week.\ninstead: kept trading, paid tuition.\n2. VIX \u0026gt;20 = full stop\nnew rule: if VIX \u0026gt;20 for 2 consecutive days, pause all trading.\ncost this week could\u0026rsquo;ve been avoided.\n3. correlation \u0026gt;0.75 = no edge\ndiversification destroyed when everything moves together.\nshould\u0026rsquo;ve recognized earlier.\n4. circuit breaker worked\nstopped bleeding thursday.\nprevented -$5k+ week.\nbut resumed too early friday.\nytd performance check # jan 1: $437,800\nmar 9: $452,460\nytd gain: +$14,660 (+3.35%)\nytd trades: 71\nytd win rate: 65%\nmarch performance:\nweek 1: -$1,090\nweek 2: -$2,720\nmarch total: -$3,810 (-0.83%)\nstill positive ytd but cushion shrinking.\nmarch reality check # realistic march outcomes:\nmodest loss: -1% to -2% (-$4,563 to -$9,125)\ncurrent pace: -0.83% (9 days into month)\nif conditions don\u0026rsquo;t improve:\nmarch will be -2% to -3% losing month.\nacceptable variance.\nhad 11 winning months in 2024.\nlosing months happen.\nweek 3 plan # conditions needed to resume:\nVIX drops below 18 for 3 consecutive days.\ncorrelation drops below 0.70.\nvolume recovers to \u0026gt;3.5M contracts.\nif conditions don\u0026rsquo;t improve:\npause trading week 3 entirely.\nprotect capital \u0026gt; forcing trades.\nbachelor party planning weekend anyway.\ntonight (march 9, 11:08pm) # week 2 march disaster.\n-$2,720 (-0.60%).\n29% win rate (2 wins, 5 losses).\ncircuit breaker triggered thursday (3 consecutive losses).\nresumed friday (mistake - both trades lost).\nVIX 21.3 avg, correlation 0.78, volume -24%.\nstrategies designed for different regime.\nmarch -$3,810 ytd (-0.83%).\ncushion from jan/feb shrinking.\nweek 3: watching conditions, may pause entirely.\n11:08pm sunday. march week 2 complete. -$2,720 (-0.60%) across 7 trades. 29% win rate worst since dec 2024. circuit breaker triggered thursday (3 consecutive losses), paused, resumed friday (mistake). VIX 21.3 avg (above 18.5 threshold), correlation 0.78 (kills diversification), volume -24%. slippage 3.1 ticks (up from feb 2.0). march ytd -$3,810 (-0.83%). regime mismatch: strategies designed for VIX 13-18, failing in elevated volatility. new rule: VIX \u0026gt;20 two days = full pause. week 3 watching conditions.\n-AK\n","date":"9 March 2025","externalUrl":null,"permalink":"/posts/2025-03-09-week-2-march-losses-mounting/","section":"Posts","summary":"\u003cp\u003eweek 2 march done.\u003c/p\u003e\n\u003cp\u003esecond consecutive losing week.\u003c/p\u003e\n\u003cp\u003eregime shifted.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 2 results \n    \u003cdiv id=\"week-2-results\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-2-results\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (mar 3):\u003c/strong\u003e $455,180\u003c/p\u003e","title":"week 2 march - losses mounting, regime shift detected","type":"posts"},{"content":"been using both for 2 years.\npolygon primary, alpha vantage backup.\ntime for honest comparison.\nmy setup # polygon.io:\nreal-time stocks/options data.\nhistorical tick data.\n$99/month starter plan.\nalpha vantage:\nbackup for when polygon down.\nfree tier (5 requests/min).\npremium $49/month if needed.\nalso using:\nthetadata for options greeks ($60/month).\ncoinbase/kraken APIs for crypto (free).\nAPI comparison - python ease of use # polygon.io:\npros:\nclean REST API. official python library. websocket streaming (real-time). tick-level historical data. cons:\nrate limits on free/starter tier. options data needs higher plan ($200+/month). occasional API downtime (rare). alpha vantage:\npros:\nsimple REST API. free tier available. good for beginners. reliable uptime. cons:\n5 requests/min free tier (brutal). no tick data (only OHLCV). no real-time streaming. limited historical depth. verdict:\npolygon for serious algo trading.\nalpha vantage for hobby/learning.\ni use polygon 95%, alpha vantage 5% backup.\npython code examples # polygon.io (official library):\nfrom polygon import RESTClient import pandas as pd from datetime import datetime, timedelta # initialize client client = RESTClient(api_key=\u0026#34;YOUR_API_KEY\u0026#34;) # get real-time quote def get_realtime_quote(symbol): \u0026#34;\u0026#34;\u0026#34; Get current bid/ask for symbol \u0026#34;\u0026#34;\u0026#34; quote = client.get_last_quote(symbol) return { \u0026#39;bid\u0026#39;: quote.bid_price, \u0026#39;ask\u0026#39;: quote.ask_price, \u0026#39;bid_size\u0026#39;: quote.bid_size, \u0026#39;ask_size\u0026#39;: quote.ask_size, \u0026#39;timestamp\u0026#39;: quote.sip_timestamp } # get historical bars (minute/hour/day) def get_historical_bars(symbol, start_date, end_date, timespan=\u0026#39;minute\u0026#39;, multiplier=1): \u0026#34;\u0026#34;\u0026#34; Get OHLCV bars for backtest Args: symbol: ticker (e.g. \u0026#39;SPY\u0026#39;) start_date: \u0026#39;YYYY-MM-DD\u0026#39; end_date: \u0026#39;YYYY-MM-DD\u0026#39; timespan: \u0026#39;minute\u0026#39;, \u0026#39;hour\u0026#39;, \u0026#39;day\u0026#39; multiplier: 1, 5, 15, etc. \u0026#34;\u0026#34;\u0026#34; aggs = client.get_aggs( ticker=symbol, multiplier=multiplier, timespan=timespan, from_=start_date, to=end_date, limit=50000 ) # convert to pandas data = [] for agg in aggs: data.append({ \u0026#39;timestamp\u0026#39;: pd.to_datetime(agg.timestamp, unit=\u0026#39;ms\u0026#39;), \u0026#39;open\u0026#39;: agg.open, \u0026#39;high\u0026#39;: agg.high, \u0026#39;low\u0026#39;: agg.low, \u0026#39;close\u0026#39;: agg.close, \u0026#39;volume\u0026#39;: agg.volume, \u0026#39;vwap\u0026#39;: agg.vwap }) df = pd.DataFrame(data) df.set_index(\u0026#39;timestamp\u0026#39;, inplace=True) return df # get options chain def get_options_chain(underlying, expiration_date): \u0026#34;\u0026#34;\u0026#34; Get options contracts for underlying Note: requires higher-tier plan ($200+/month) \u0026#34;\u0026#34;\u0026#34; contracts = client.list_options_contracts( underlying_ticker=underlying, expiration_date=expiration_date, contract_type=\u0026#39;call\u0026#39;, # or \u0026#39;put\u0026#39; limit=1000 ) chain = [] for contract in contracts: chain.append({ \u0026#39;ticker\u0026#39;: contract.ticker, \u0026#39;strike\u0026#39;: contract.strike_price, \u0026#39;expiration\u0026#39;: contract.expiration_date, \u0026#39;type\u0026#39;: contract.contract_type }) return pd.DataFrame(chain) # websocket streaming (real-time ticks) from polygon import WebSocketClient from polygon.websocket.models import Market def on_message(msgs): \u0026#34;\u0026#34;\u0026#34; Handle real-time trade messages \u0026#34;\u0026#34;\u0026#34; for msg in msgs: if msg.event_type == \u0026#39;T\u0026#39;: # trade print(f\u0026#34;Trade: {msg.symbol} ${msg.price} x {msg.size}\u0026#34;) # create websocket client ws_client = WebSocketClient( api_key=\u0026#34;YOUR_API_KEY\u0026#34;, market=Market.Stocks, on_message=on_message ) # subscribe to SPY trades ws_client.subscribe(\u0026#34;T.SPY\u0026#34;) # run (blocks until stopped) ws_client.run() alpha vantage (requests library):\nimport requests import pandas as pd import time class AlphaVantageClient: def __init__(self, api_key): self.api_key = api_key self.base_url = \u0026#39;https://www.alphavantage.co/query\u0026#39; # rate limiting (5 req/min free tier) self.last_request_time = 0 self.min_request_interval = 12 # seconds def _rate_limit(self): \u0026#34;\u0026#34;\u0026#34; Enforce 5 requests/min rate limit \u0026#34;\u0026#34;\u0026#34; elapsed = time.time() - self.last_request_time if elapsed \u0026lt; self.min_request_interval: time.sleep(self.min_request_interval - elapsed) self.last_request_time = time.time() def get_quote(self, symbol): \u0026#34;\u0026#34;\u0026#34; Get current price quote \u0026#34;\u0026#34;\u0026#34; self._rate_limit() params = { \u0026#39;function\u0026#39;: \u0026#39;GLOBAL_QUOTE\u0026#39;, \u0026#39;symbol\u0026#39;: symbol, \u0026#39;apikey\u0026#39;: self.api_key } response = requests.get(self.base_url, params=params) data = response.json() quote = data.get(\u0026#39;Global Quote\u0026#39;, {}) return { \u0026#39;price\u0026#39;: float(quote.get(\u0026#39;05. price\u0026#39;, 0)), \u0026#39;volume\u0026#39;: int(quote.get(\u0026#39;06. volume\u0026#39;, 0)), \u0026#39;change_percent\u0026#39;: quote.get(\u0026#39;10. change percent\u0026#39;, \u0026#39;0%\u0026#39;) } def get_daily_bars(self, symbol, outputsize=\u0026#39;compact\u0026#39;): \u0026#34;\u0026#34;\u0026#34; Get daily OHLCV data Args: symbol: ticker outputsize: \u0026#39;compact\u0026#39; (100 days) or \u0026#39;full\u0026#39; (20+ years) \u0026#34;\u0026#34;\u0026#34; self._rate_limit() params = { \u0026#39;function\u0026#39;: \u0026#39;TIME_SERIES_DAILY\u0026#39;, \u0026#39;symbol\u0026#39;: symbol, \u0026#39;outputsize\u0026#39;: outputsize, \u0026#39;apikey\u0026#39;: self.api_key } response = requests.get(self.base_url, params=params) data = response.json() time_series = data.get(\u0026#39;Time Series (Daily)\u0026#39;, {}) # convert to pandas rows = [] for date_str, values in time_series.items(): rows.append({ \u0026#39;date\u0026#39;: pd.to_datetime(date_str), \u0026#39;open\u0026#39;: float(values[\u0026#39;1. open\u0026#39;]), \u0026#39;high\u0026#39;: float(values[\u0026#39;2. high\u0026#39;]), \u0026#39;low\u0026#39;: float(values[\u0026#39;3. low\u0026#39;]), \u0026#39;close\u0026#39;: float(values[\u0026#39;4. close\u0026#39;]), \u0026#39;volume\u0026#39;: int(values[\u0026#39;5. volume\u0026#39;]) }) df = pd.DataFrame(rows) df.set_index(\u0026#39;date\u0026#39;, inplace=True) df.sort_index(inplace=True) return df def get_intraday_bars(self, symbol, interval=\u0026#39;5min\u0026#39;): \u0026#34;\u0026#34;\u0026#34; Get intraday OHLCV data (last 30 days) Args: interval: \u0026#39;1min\u0026#39;, \u0026#39;5min\u0026#39;, \u0026#39;15min\u0026#39;, \u0026#39;30min\u0026#39;, \u0026#39;60min\u0026#39; \u0026#34;\u0026#34;\u0026#34; self._rate_limit() params = { \u0026#39;function\u0026#39;: \u0026#39;TIME_SERIES_INTRADAY\u0026#39;, \u0026#39;symbol\u0026#39;: symbol, \u0026#39;interval\u0026#39;: interval, \u0026#39;outputsize\u0026#39;: \u0026#39;full\u0026#39;, \u0026#39;apikey\u0026#39;: self.api_key } response = requests.get(self.base_url, params=params) data = response.json() key = f\u0026#39;Time Series ({interval})\u0026#39; time_series = data.get(key, {}) rows = [] for datetime_str, values in time_series.items(): rows.append({ \u0026#39;datetime\u0026#39;: pd.to_datetime(datetime_str), \u0026#39;open\u0026#39;: float(values[\u0026#39;1. open\u0026#39;]), \u0026#39;high\u0026#39;: float(values[\u0026#39;2. high\u0026#39;]), \u0026#39;low\u0026#39;: float(values[\u0026#39;3. low\u0026#39;]), \u0026#39;close\u0026#39;: float(values[\u0026#39;4. close\u0026#39;]), \u0026#39;volume\u0026#39;: int(values[\u0026#39;5. volume\u0026#39;]) }) df = pd.DataFrame(rows) df.set_index(\u0026#39;datetime\u0026#39;, inplace=True) df.sort_index(inplace=True) return df # usage av_client = AlphaVantageClient(api_key=\u0026#34;YOUR_API_KEY\u0026#34;) # get quote (rate limited) quote = av_client.get_quote(\u0026#39;SPY\u0026#39;) print(f\u0026#34;SPY: ${quote[\u0026#39;price\u0026#39;]}, volume {quote[\u0026#39;volume\u0026#39;]}\u0026#34;) # get historical data daily = av_client.get_daily_bars(\u0026#39;SPY\u0026#39;, outputsize=\u0026#39;full\u0026#39;) print(f\u0026#34;Downloaded {len(daily)} days of data\u0026#34;) # get intraday (last 30 days only) intraday = av_client.get_intraday_bars(\u0026#39;SPY\u0026#39;, interval=\u0026#39;5min\u0026#39;) print(f\u0026#34;Downloaded {len(intraday)} 5-min bars\u0026#34;) verdict:\npolygon: cleaner API, official library, real-time streaming.\nalpha vantage: simpler but rate limits brutal.\npolygon wins for python algo trading.\ncost comparison # polygon.io:\nstarter: $99/month (real-time stocks, historical).\ndeveloper: $200/month (adds options data).\nadvanced: $600+/month (tick data, all assets).\nmy cost: $99/month starter.\nalpha vantage:\nfree: 5 requests/min, 500 requests/day.\npremium: $49/month (75 requests/min).\nmy cost: $0 (use free tier as backup only).\nannual costs:\npolygon: $1,188/year.\nalpha vantage: $0/year (backup only).\ntotal: $1,188/year for primary data feed.\nworth every dollar for real-time access.\nreliability comparison # measured over 18 months (sep 2023 - mar 2025):\npolygon.io:\nuptime: 99.2%\noutages: 4 (each \u0026lt;2 hours).\nAPI errors: occasional 429 rate limit (my fault, too many requests).\nalpha vantage:\nuptime: 99.8%\noutages: 1 (lasted 30 minutes).\nAPI errors: none (slow rate = stable).\nalpha vantage more reliable but limited features.\npolygon occasional issues but better capabilities.\nwhat reddit/nexusfi traders say # been reading r/algotrading for 2 years.\npolygon vs alpha vantage comes up constantly.\nconsensus:\npolygon for serious trading (real-time needed). alpha vantage for learning/hobbyist (free tier great starter). thetadata for options greeks specifically. nexusfi traders discuss data feeds in reviews section.\nsimilar consensus: pay for polygon if serious, use alpha vantage for learning.\nfinal verdict # use polygon.io if:\nneed real-time data (intraday algos). trade options (need chains/greeks). backtest with tick data. can afford $99+/month. use alpha vantage if:\nlearning algo trading (hobbyist). only need daily/hourly bars. budget constrained (free tier). don\u0026rsquo;t need real-time. me: polygon primary, alpha vantage backup.\npolygon $99/month for real-time stocks.\nthetadata $60/month for options greeks.\nalpha vantage free tier when polygon down (rare).\ntotal data costs: $159/month = $1,908/year.\ncost of doing business.\ntonight (march 7, 1:28am) # 2 years using both data feeds.\npolygon: $99/month, real-time, websockets, tick data, 99.2% uptime.\nalpha vantage: free tier backup, daily/hourly only, 5 req/min, 99.8% uptime.\npython: polygon official library cleaner, alpha vantage needs requests.\nverdict: polygon for serious trading, alpha vantage for learning.\nreddit/nexusfi consensus matches my experience.\nannual data costs $1,908 (polygon $1,188 + thetadata $720).\n1:28am friday. data feed comparison complete. 2 years experience both. polygon: $99/month starter, real-time stocks/historical, websocket streaming, tick data, 99.2% uptime, 4 outages \u0026lt;2hrs each. alpha vantage: free tier backup, 5 req/min rate limit, daily/hourly only, 99.8% uptime. python: polygon official library vs alpha vantage requests (polygon cleaner). verdict: polygon serious trading ($99/month), alpha vantage learning/backup (free). reddit r/algotrading + nexusfi consensus matches. total data costs $1,908/year (polygon + thetadata options greeks).\n-AK\n","date":"7 March 2025","externalUrl":null,"permalink":"/posts/2025-03-07-polygon-io-vs-alpha-vantage-python-data-feeds-2025/","section":"Posts","summary":"\u003cp\u003ebeen using both for 2 years.\u003c/p\u003e\n\u003cp\u003epolygon primary, alpha vantage backup.\u003c/p\u003e\n\u003cp\u003etime for honest comparison.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003emy setup \n    \u003cdiv id=\"my-setup\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#my-setup\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003epolygon.io:\u003c/strong\u003e\u003c/p\u003e","title":"polygon.io vs alpha vantage - python algo data feeds comparison 2025","type":"posts"},{"content":"wedding may 10.\n8 weeks out.\nfriends planning bachelor party.\nthis is getting real.\nthe group text chaos # tuesday night (mar 4):\nbuddy J. starts group text.\n\u0026ldquo;AK getting married may 10, bachelor party when?\u0026rdquo;\noptions floated:\napril 18-19 weekend (3 weeks before wedding).\napril 25-26 weekend (2 weeks before wedding).\nmay 2-3 weekend (1 week before wedding - A. vetoed immediately).\nA\u0026rsquo;s input:\n\u0026ldquo;not the week before. i need you functional for rehearsal dinner.\u0026rdquo;\n\u0026ldquo;also you\u0026rsquo;re not going to vegas.\u0026rdquo;\nme: \u0026ldquo;wasn\u0026rsquo;t planning vegas.\u0026rdquo;\nA.: \u0026ldquo;good. because no.\u0026rdquo;\nwhat they\u0026rsquo;re planning # current leading option:\napril 18-19 weekend (3 weeks before).\nsan diego local (no travel).\nitinerary (according to J.):\nfriday night: bar crawl gaslamp.\nsaturday afternoon: topgolf.\nsaturday night: brewery tour.\ncost per person: ~$400\nattendees: 8 guys\nA\u0026rsquo;s rules:\nno strippers.\nno vegas.\nback by midnight saturday.\nme: \u0026ldquo;these rules seem reasonable.\u0026rdquo;\nJ. (in group text): \u0026ldquo;AK is whipped.\u0026rdquo;\nme: \u0026ldquo;100%. and she\u0026rsquo;s hot AF so worth it.\u0026rdquo;\ncomparing to A\u0026rsquo;s bachelorette # her friends planning:\napril 11-12 weekend (4 weeks before).\nsan diego wine country.\nspa day saturday.\nher cost: ~$600\nattendees: 6 women\nmy rules:\nnone. she\u0026rsquo;s an adult.\nA.: \u0026ldquo;you trust me?\u0026rdquo;\nme: \u0026ldquo;yeah. you\u0026rsquo;re not going to do anything stupid.\u0026rdquo;\nA.: \u0026ldquo;and if i did?\u0026rdquo;\nme: \u0026ldquo;i\u0026rsquo;d be pissed but we\u0026rsquo;d work through it.\u0026rdquo;\nA.: \u0026ldquo;i\u0026rsquo;m not going to.\u0026rdquo;\nme: \u0026ldquo;i know.\u0026rdquo;\nthis is why it works.\ntherapy session (mar 4) # dr. r: \u0026ldquo;bachelor party planning. how\u0026rsquo;s that going?\u0026rdquo;\nme: \u0026ldquo;friends organizing. A. set some rules. seems fair.\u0026rdquo;\ndr. r: \u0026ldquo;what rules?\u0026rdquo;\nme: \u0026ldquo;no strippers, no vegas, back by midnight.\u0026rdquo;\ndr. r: \u0026ldquo;and you\u0026rsquo;re okay with that?\u0026rdquo;\nme: \u0026ldquo;yeah. wasn\u0026rsquo;t planning strippers anyway. married guys in the group, nobody wants that drama.\u0026rdquo;\ndr. r: \u0026ldquo;mature perspective.\u0026rdquo;\nme: \u0026ldquo;also she said if i came home smelling like perfume she\u0026rsquo;d cut my dick off.\u0026rdquo;\ndr. r: (slight smile) \u0026ldquo;motivating.\u0026rdquo;\nme: \u0026ldquo;very.\u0026rdquo;\ndr. r: \u0026ldquo;and the sex life during wedding countdown stress?\u0026rdquo;\nme: \u0026ldquo;places list: 37. added my car in venue parking lot sunday (scouting reception setup).\u0026rdquo;\ndr. r: \u0026ldquo;creative stress relief.\u0026rdquo;\nme: \u0026ldquo;she bent over the back seat. i took her from behind right there. anybody could\u0026rsquo;ve walked by.\u0026rdquo;\ndr. r: (shifting in seat) \u0026ldquo;the risk element.\u0026rdquo;\nme: \u0026ldquo;huge turn-on for both of us. she came hard, i blew my load, we were both shaking after.\u0026rdquo;\nA. (later when i told her): \u0026ldquo;dr. r definitely went home and fucked her husband after that session.\u0026rdquo;\nme: \u0026ldquo;100%.\u0026rdquo;\ntrading impact this week # monday-wednesday:\n3 trades, 2 wins, 1 loss.\n+$340 net.\nthursday:\nbachelor party group text chaos.\n3 hours planning discussion.\nmissed 2 setups.\nfriday:\nA. and i fought about stripper rule (i wasn\u0026rsquo;t even arguing for strippers, she was preemptively defensive).\nmakeup sex: places list #38 (laundry room, dryer running).\npaused trading friday afternoon.\ncost this week:\n~$800 opportunity missed (4 setups paused).\nworth it:\nrelationship communication \u0026gt; forced trades.\nbachelor party drama resolved.\nthe wedding countdown stress # 8 weeks out:\ninvitations all RSVP\u0026rsquo;d (42 of 45 confirmed).\nrehearsal dinner venue booked ($1,200).\nhoneymoon flights confirmed maui ($3,840).\nwedding rings purchased ($3,200).\nstill need:\nfinalize ceremony music (spotify playlist building).\nwedding bands fitting appointments.\nbachelor/bachelorette parties execute.\nstress level:\nA: 7/10 (her mom still texting ideas).\nme: 3/10 (most stuff handled).\nthe places list progression # march additions:\n36: venue parking lot sunday afternoon (back seat, risky AF).\n37: my car at beach parking lot tuesday night (she gave me head, almost got caught).\n38: laundry room friday night (dryer running, she rode me hard).\nsex life:\nstill incredible.\nwedding stress making it more frequent.\nshe initiates almost always.\nloves control when planning chaos.\nbondage update:\nshe tied me to bed wednesday.\nedged me for 45 minutes.\nwouldn\u0026rsquo;t let me finish until i begged.\nboth came hard.\nshe loves power active when life feels out of control.\ntonight (march 5, 1:47am) # bachelor party planning chaos resolved.\napril 18-19 weekend (3 weeks before wedding).\nsan diego local: bar crawl, topgolf, brewery tour.\nA\u0026rsquo;s rules: no strippers, no vegas, midnight curfew.\nacceptable compromise.\nwedding 8 weeks out.\n42 of 45 guests confirmed.\nplaces list: 38 (laundry room dryer).\nsex life stress relief confirmed.\ntrading paused friday (makeup sex priority).\n1:47am wednesday. bachelor party planning complete. friends organizing april 18-19 (3 weeks before wedding). san diego local: gaslamp bar crawl, topgolf, brewery tour. A\u0026rsquo;s rules: no strippers, no vegas, midnight curfew. acceptable. her bachelorette april 11-12 wine country. therapy: dr. r asked about sex life, told her places list #37 (car venue parking lot, bent over back seat, anybody could\u0026rsquo;ve walked by). A. thinks dr. r went home and fucked her husband after session. places list now 38 (laundry room dryer friday makeup sex). wedding 8 weeks, 42 of 45 confirmed. trading paused friday (~$800 opportunity cost).\n-AK\n","date":"5 March 2025","externalUrl":null,"permalink":"/posts/2025-03-05-bachelor-party-planning-friends-organizing-chaos/","section":"Posts","summary":"\u003cp\u003ewedding may 10.\u003c/p\u003e\n\u003cp\u003e8 weeks out.\u003c/p\u003e\n\u003cp\u003efriends planning bachelor party.\u003c/p\u003e\n\u003cp\u003ethis is getting real.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe group text chaos \n    \u003cdiv id=\"the-group-text-chaos\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-group-text-chaos\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003etuesday night (mar 4):\u003c/strong\u003e\u003c/p\u003e","title":"bachelor party planning - friends organizing chaos, 8 weeks to wedding","type":"posts"},{"content":"march begins.\nwedding 9 weeks out.\nconditions shifting.\nweek 1 results # starting (mar 1): $456,270\nending (mar 2): $455,180\nweek 1: -$1,090 (-0.24%)\ntrades: 6\nwins: 3\nlosses: 3\nwin rate: 50%\nflat week, cautious execution.\nwhat changed # market conditions:\nVIX spiked to 19.8 thursday (above my 18.5 comfort zone).\nvolume compressed 18% vs february average.\ncorrelation jumped to 0.71 (too high, reduces diversification).\nregime detection flagging:\nconfidence dropped to 0.61 (below my 0.65 threshold).\nfiltered out 7 setups this week.\nexecuted only highest conviction.\ncomparing to february week 1 # february week 1: +$2,140 (71% wr, 7 trades)\nmarch week 1: -$1,090 (50% wr, 6 trades)\ndifferent market conditions.\nfebruary: stable, favorable.\nmarch: choppy, elevated VIX.\nfiltered correctly.\ncircuit breaker status # threshold: -$1,500 single day OR 3 consecutive losses\nthis week:\nlargest loss: -$520 (thursday ETH)\nclose to 3 consecutive (avoided friday trade).\npreventive pause working.\nstopped before hitting breaker.\nslippage tracking # march week 1 avg: 2.4 ticks\nvs february avg: 2.0 ticks\ndegradation: +0.4 ticks (+20%)\nelevated VIX = wider spreads.\nchicago colo still preventing 3.5+ disaster.\nacceptable given conditions.\nwedding distraction factor # this week:\ntuesday afternoon: wedding rings shopping (3 hours).\ncost: 2 missed setups (~$400 opportunity).\nworth it:\nA. found her ring ($2,400).\nmy band ($800).\npriorities aligned.\nlessons from week 1 # 1. VIX \u0026gt;18.5 = reduce activity\nfiltered 7 setups correctly.\nonly traded highest conviction.\ncapital preservation over forcing.\n2. 50% win rate = coin flip\nregression to mean from feb 72%.\nnot every week wins.\naccept variance.\n3. wedding planning = time sink\n9 weeks out, chaos accelerating.\nwill pause as needed.\nrelationship \u0026gt; forced trades.\nweek 2 preview # conditions:\nVIX needs to drop below 18.\nvolume needs to recover.\ncorrelation needs to decrease.\nif conditions improve:\nresume normal 6-8 trades/week.\ntarget 70%+ win rate.\nif conditions stay elevated:\ncontinue selective execution.\nprotect capital.\ntonight (march 2, 10:14pm) # week 1 march done.\n-$1,090 (-0.24%).\n50% win rate across 6 filtered trades.\nVIX spike to 19.8 = caution justified.\nwedding rings purchased ($3,200 total).\n9 weeks to wedding.\nwatching conditions for week 2.\n10:14pm sunday. march week 1 complete. -$1,090 (-0.24%) across 6 trades. 50% win rate (regression from feb 72%). VIX spiked 19.8 thursday, filtered 7 setups. slippage 2.4 ticks (elevated vs feb 2.0). wedding rings shopping tuesday cost 2 setups (~$400 opportunity). circuit breaker avoided (largest loss -$520). conditions: volume -18%, correlation 0.71 (too high), regime confidence 0.61 (below threshold). selective execution protecting capital.\n-AK\n","date":"2 March 2025","externalUrl":null,"permalink":"/posts/2025-03-02-week-1-march-cautious-start/","section":"Posts","summary":"\u003cp\u003emarch begins.\u003c/p\u003e\n\u003cp\u003ewedding 9 weeks out.\u003c/p\u003e\n\u003cp\u003econditions shifting.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 1 results \n    \u003cdiv id=\"week-1-results\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-1-results\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (mar 1):\u003c/strong\u003e $456,270\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eending (mar 2):\u003c/strong\u003e $455,180\u003c/p\u003e","title":"week 1 march - cautious start, watching conditions","type":"posts"},{"content":"","date":"28 February 2025","externalUrl":null,"permalink":"/tags/reflections/","section":"Tags","summary":"","title":"Reflections","type":"tags"},{"content":"end of february.\nreflecting on sustainable trading.\nlife balance.\nwhat\u0026rsquo;s working # trading:\nconsistent monthly gains (jan +2.18%, feb +1.99%).\nno standout months needed.\ncircuit breaker never triggered.\nrelationship:\npaused valentine\u0026rsquo;s full day for A.\nworth $1,750 total cost.\nshe said \u0026ldquo;perfect day.\u0026rdquo;\npriorities aligned.\ntransformation timeline # 2023 (parents died):\nlost $180k learning.\ntrading = avoiding grief.\nalone, numb.\n2024 (breakthrough year):\n+$71,600 (+19.55% annual).\nmet A., moved in together, got engaged.\nfound sustainable approach.\n2025 (current):\njanuary +2.18%, february +1.99%.\nwedding 71 days out.\nrelationship \u0026gt; forced trades.\ncomplete transformation.\nwhat changed # old mindset:\ntrading every day mandatory.\npausing = weakness.\nrelationship secondary.\nnew mindset:\nselective execution.\npausing = discipline.\nA. \u0026gt; trading.\ngrowth.\nwedding countdown # 71 days remaining.\nrehearsal dinner booked.\nhoneymoon maui confirmed.\neverything ready except rings.\nfirst relationship where permanent feels right.\ntonight (february 28, 11:59pm) # february reflection.\nsustainable trading validated (jan +2.18%, feb +1.99%).\nrelationship priorities aligned (paused valentine\u0026rsquo;s for A.).\nwedding 71 days.\ntransformation complete:\n2023: losing, alone, grieving.\n2024: breakthrough, met A., engaged.\n2025: sustainable trading + life balance.\nthis is real partnership.\n11:59pm friday. february reflections. sustainable trading: jan +2.18%, feb +1.99% = consistent monthly gains. life balance: paused valentine\u0026rsquo;s for A. ($1,750 cost worth it). transformation: 2023 lost $180k alone grieving → 2024 +19.55% met A. engaged → 2025 sustainable trading + life balance. wedding 71 days. priorities: A. \u0026gt; trading. growth demonstrated. partnership real.\n-AK\n","date":"28 February 2025","externalUrl":null,"permalink":"/posts/2025-02-28-reflections-sustainable-trading-life-balance/","section":"Posts","summary":"\u003cp\u003eend of february.\u003c/p\u003e\n\u003cp\u003ereflecting on sustainable trading.\u003c/p\u003e\n\u003cp\u003elife balance.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ewhat\u0026rsquo;s working \n    \u003cdiv id=\"whats-working\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#whats-working\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003etrading:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003econsistent monthly gains (jan +2.18%, feb +1.99%).\u003c/p\u003e","title":"reflections - sustainable trading, life balance, wedding countdown","type":"posts"},{"content":"february done.\ntarget hit mid-range.\nwedding 71 days out.\nfebruary final numbers # starting (feb 1): $447,350\nending (feb 28): $456,270\nfebruary gain: +$8,920 (+1.99%)\ntrades: 29\nwins: 21\nlosses: 8\nwin rate: 72%\nFigure 1: February weekly performance showing consistent execution. Week 1 +$2,140 (71% wr, 7 trades), Week 2 +$2,680 (78% wr, 9 trades), Week 3 +$1,920 (67% wr, 6 trades - Valentine\u0026rsquo;s pause), Week 4 +$2,180 (71% wr, 7 trades). Month ended +$8,920 (+1.99%). Consistent $2k+ weekly avg. Valentine\u0026rsquo;s Day paused (spa day for A.). Win rate variance 67-78% around 72% monthly avg = sustainable.\nweekly breakdown # week 1 (feb 2-8): +$2,140, 71% wr, 7 trades\nweek 2 (feb 9-15): +$2,680, 78% wr, 9 trades\nweek 3 (feb 16-22): +$1,920, 67% wr, 6 trades (valentine\u0026rsquo;s pause)\nweek 4 (feb 23-28): +$2,180, 71% wr, 7 trades\nconsistent $2k+ weekly gains.\nno impressive weeks needed.\ncomparing to target # february target: +1.5% to +2.5%\nfebruary actual: +1.99%\nresult: mid-range hit exactly\nytd: +4.22% in 8 weeks\nannual pace: +27.4%\nvs target: 15-18%\ncomfortably ahead.\nFigure 2: February market conditions summary. Average volume 3.7M contracts (stable). VIX averaged 16.5 (optimal range 13-22). Correlation 0.59 (good diversification). Regime stability 0.73 (very stable). Slippage 2.0 ticks average (improved from Jan 2.1). Chicago colo preventing 3.5+ tick disaster. Conditions: favorable entire month, no major earnings disruptions.\ncomparing january vs february # january: +$9,550 (+2.18%)\nfebruary: +$8,920 (+1.99%)\npattern:\nsimilar performance.\nconsistent monthly gains.\nsustainable variance.\nmarket conditions february # avg volume: 3.7M contracts (stable)\navg VIX: 16.5 (optimal range)\navg correlation: 0.59 (good diversification)\navg regime stability: 0.73 (very stable)\nno major earnings disruptions.\nconditions favorable entire month.\nslippage tracking february # february avg: 2.0 ticks\njanuary avg: 2.1 ticks\nimprovement: -0.1 ticks (-5%)\nytd avg: 2.05 ticks\nchicago colo value proven.\nstable execution quality.\ncircuit breaker 2025 ytd # triggered: 0 times\nclose calls: 0 times\nlargest loss: -$340 (multiple dates)\npreventive philosophy working.\nnever needed emergency brake.\nrisk management stats # position sizing: $1,500 all trades (consistent)\nmax drawdown: -$340 (0.07%)\ntrades executed: 29\ntrades paused: valentine\u0026rsquo;s day (feb 14)\nfilters avg: 69% acceptance\nregime confidence avg: 0.73\nselective execution = capital preservation.\nlessons from february # 1. valentine\u0026rsquo;s pause = relationship priority\nfull day spa for A.\ncost $1,350 + $400 opportunity.\nworth every dollar.\nplaces list: 35 (massage room).\n2. consistent weekly gains sustainable\n$2,140 → $2,680 → $1,920 → $2,180.\nno impressive weeks needed.\ngrind approach works.\n3. 72% win rate demonstrates\njanuary: 72%\nfebruary: 72%\nlong-term average validated.\n4. wedding planning = time commitment\nrehearsal dinner booked.\nhoneymoon flights confirmed.\n73 days out = crunch time.\n5. ytd cushion enables discipline\n+4.22% allows selective execution.\nprotecting gains \u0026gt; forcing trades.\nlife update - wedding 71 days out # wedding date: may 10, 2025\ndays remaining: 71 (2.5 months)\nbooked:\neverything except wedding rings.\nshopping next week.\nhoneymoon:\nmaui 7 days, may 11-18.\n$8,040 total.\nrelationship:\nengaged 4 months.\nliving together 16 months.\nplaces list: 35.\nsex life: incredible, kinky, open communication.\ncomparing february 2024 vs 2025 # february 2024:\nstill learning sustainable pace.\n+$1,400 (+0.36%) flat month.\ntesting strategies.\nfebruary 2025:\nvalidated approach.\n+$8,920 (+1.99%) modest month.\nconsistent execution.\ntransformation:\n2024: testing phase.\n2025: sustainable phase.\nmarch preview # expectations:\nnormal trading month (no major holidays).\nearnings season light.\nrealistic outcomes:\nmodest month: +1.5% to +2.5% ($6,800 to $11,400)\nflat month: +0.5% to +1.2% ($2,300 to $5,500)\ntarget: +1.8% to +2.2%\nsustainable pace.\nupcoming:\nwedding rings shopping.\nbachelor party (friends planning).\ncountdown accelerating.\ntonight (february 28, 11:52pm) # february done.\n+$8,920 (+1.99%).\n72% win rate across 29 trades.\ntarget +1.5% to +2.5% hit mid-range.\nvalentine\u0026rsquo;s spa day for A. worth $1,750 total.\nwedding 71 days out.\nhoneymoon maui booked.\nytd +4.22%.\nsustainable pace maintained.\nexecute system.\n11:52pm friday. february wrap. +$8,920 (1.99%) across 29 trades. 72% win rate. target +1.5% to +2.5% hit mid-range. 4 consistent weeks ($2,140, $2,680, $1,920, $2,180). valentine\u0026rsquo;s paused (spa day A., places list #35 massage room). slippage 2.0 ticks (improved from jan 2.1). comparing: jan +2.18% vs feb +1.99% = consistent monthly gains. wedding 71 days, honeymoon maui booked $8,040. ytd +4.22%. circuit breaker zero triggers. sustainable pace.\n-AK\n","date":"28 February 2025","externalUrl":null,"permalink":"/posts/2025-02-28-february-wrap-target-hit-sustainable-pace/","section":"Posts","summary":"\u003cp\u003efebruary done.\u003c/p\u003e\n\u003cp\u003etarget hit mid-range.\u003c/p\u003e\n\u003cp\u003ewedding 71 days out.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003efebruary final numbers \n    \u003cdiv id=\"february-final-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#february-final-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (feb 1):\u003c/strong\u003e $447,350\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eending (feb 28):\u003c/strong\u003e $456,270\u003c/p\u003e","title":"february wrap - target hit, +1.99% sustainable pace, wedding 2.5 months","type":"posts"},{"content":"honeymoon flights booked.\nmaui 7 days.\npost-wedding escape planned.\nflights confirmed # depart: may 11, 2025 (day after wedding)\nreturn: may 18, 2025\nairline: alaska direct SAN → OGG\ncost: $1,840 roundtrip (both)\nhotel booked # resort: andaz maui wailea\nroom: ocean view king\nnights: 7\ncost: $4,200 total\nwhy maui # A\u0026rsquo;s choice.\nshe loves beaches.\nnever been hawaii.\ni don\u0026rsquo;t care where we go.\nher day, her choice.\nbudget # flights: $1,840\nhotel: $4,200\nfood/activities budget: $2,000\ntotal: $8,040\nworth it.\nfirst trip as married.\ntimeline # 73 days until wedding.\n74 days until honeymoon.\nthen back to trading.\ntonight (february 27, 2:14am) # honeymoon booked.\nmaui 7 days.\nmay 11-18.\n$8,040 total.\nA\u0026rsquo;s choice.\n73 days out.\n2:14am thursday. honeymoon maui 7 days booked may 11-18. alaska direct SAN-OGG $1,840, andaz wailea $4,200, total $8,040. A\u0026rsquo;s choice (she loves beaches). 73 days until wedding. first trip married.\n-AK\n","date":"27 February 2025","externalUrl":null,"permalink":"/posts/2025-02-27-honeymoon-planning-maui-7-days-booked/","section":"Posts","summary":"\u003cp\u003ehoneymoon flights booked.\u003c/p\u003e\n\u003cp\u003emaui 7 days.\u003c/p\u003e\n\u003cp\u003epost-wedding escape planned.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eflights confirmed \n    \u003cdiv id=\"flights-confirmed\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#flights-confirmed\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003edepart:\u003c/strong\u003e may 11, 2025 (day after wedding)\u003c/p\u003e","title":"honeymoon planning - maui 7 days booked, post-wedding escape","type":"posts"},{"content":"real-time data = critical for algo trading.\nredis = in-memory cache for speed.\npython pipeline implementation.\nthe latency problem # pulling data every request:\nquery Polygon API → 50-100ms latency.\nmultiply by 10 strategies → 500ms-1s total.\ntoo slow for real-time trading.\nlearned this architecture from NexusFi infrastructure discussions on building low-latency data pipelines for automated trading.\nredis solution # architecture:\nbackground process streams data → redis strategies read from redis (\u0026lt; 1ms) single API connection, multiple consumers speed improvement:\nbefore: 50-100ms per strategy after: \u0026lt;1ms per strategy\n50-100x faster.\npython implementation # basic redis data pipeline:\nimport redis import json import asyncio from polygon import WebSocketClient from typing import Dict, List import time class MarketDataPipeline: def __init__(self, polygon_api_key: str, redis_host: str = \u0026#39;localhost\u0026#39;, redis_port: int = 6379): \u0026#34;\u0026#34;\u0026#34; Initialize market data pipeline Args: polygon_api_key: Polygon.io API key redis_host: Redis server host redis_port: Redis server port \u0026#34;\u0026#34;\u0026#34; self.polygon_key = polygon_api_key self.redis_client = redis.Redis( host=redis_host, port=redis_port, db=0, decode_responses=True ) self.ws_client = None self.subscriptions = set() async def start_stream(self, symbols: List[str]): \u0026#34;\u0026#34;\u0026#34;Start WebSocket stream for symbols\u0026#34;\u0026#34;\u0026#34; self.subscriptions = set(symbols) # Polygon WebSocket client self.ws_client = WebSocketClient( api_key=self.polygon_key, feed=\u0026#39;stocks\u0026#39;, # or \u0026#39;crypto\u0026#39;, \u0026#39;forex\u0026#39; market=\u0026#39;stocks\u0026#39; ) # Subscribe to quote updates for symbol in symbols: self.ws_client.subscribe_quotes(symbol, self._handle_quote) # Run WebSocket client self.ws_client.run_async() def _handle_quote(self, msg: Dict): \u0026#34;\u0026#34;\u0026#34; Handle incoming quote update Stores in Redis with key pattern: quote:{symbol} \u0026#34;\u0026#34;\u0026#34; try: symbol = msg.get(\u0026#39;symbol\u0026#39;) if not symbol: return # Build quote data quote_data = { \u0026#39;symbol\u0026#39;: symbol, \u0026#39;bid\u0026#39;: msg.get(\u0026#39;bid_price\u0026#39;), \u0026#39;ask\u0026#39;: msg.get(\u0026#39;ask_price\u0026#39;), \u0026#39;bid_size\u0026#39;: msg.get(\u0026#39;bid_size\u0026#39;), \u0026#39;ask_size\u0026#39;: msg.get(\u0026#39;ask_size\u0026#39;), \u0026#39;timestamp\u0026#39;: msg.get(\u0026#39;timestamp\u0026#39;), \u0026#39;exchange\u0026#39;: msg.get(\u0026#39;exchange\u0026#39;), \u0026#39;received_at\u0026#39;: time.time() * 1000 # Local timestamp } # Store in Redis key = f\u0026#34;quote:{symbol}\u0026#34; self.redis_client.setex( key, 60, # Expire after 60 seconds json.dumps(quote_data) ) # Update last price for quick access self.redis_client.setex( f\u0026#34;price:{symbol}\u0026#34;, 60, quote_data[\u0026#39;ask\u0026#39;] # or midpoint ) except Exception as e: print(f\u0026#34;Error handling quote: {e}\u0026#34;) def get_quote(self, symbol: str) -\u0026gt; Dict: \u0026#34;\u0026#34;\u0026#34; Get latest quote from Redis Args: symbol: Stock symbol Returns: Quote data dict or None \u0026#34;\u0026#34;\u0026#34; key = f\u0026#34;quote:{symbol}\u0026#34; data = self.redis_client.get(key) if data: return json.loads(data) return None def get_price(self, symbol: str) -\u0026gt; float: \u0026#34;\u0026#34;\u0026#34; Get latest price quickly Args: symbol: Stock symbol Returns: Latest price or None \u0026#34;\u0026#34;\u0026#34; key = f\u0026#34;price:{symbol}\u0026#34; price = self.redis_client.get(key) return float(price) if price else None def get_multiple_prices(self, symbols: List[str]) -\u0026gt; Dict[str, float]: \u0026#34;\u0026#34;\u0026#34; Get multiple prices in single Redis call Args: symbols: List of symbols Returns: Dict mapping symbol to price \u0026#34;\u0026#34;\u0026#34; # Use Redis pipeline for batch get pipe = self.redis_client.pipeline() for symbol in symbols: pipe.get(f\u0026#34;price:{symbol}\u0026#34;) results = pipe.execute() return { symbol: float(price) if price else None for symbol, price in zip(symbols, results) } # Example usage if __name__ == \u0026#34;__main__\u0026#34;: # Initialize pipeline pipeline = MarketDataPipeline(polygon_api_key=\u0026#39;YOUR_API_KEY\u0026#39;) # Start streaming (async) symbols = [\u0026#39;SPY\u0026#39;, \u0026#39;QQQ\u0026#39;, \u0026#39;AAPL\u0026#39;, \u0026#39;MSFT\u0026#39;] asyncio.run(pipeline.start_stream(symbols)) # In separate process/thread, strategies read from Redis: quote = pipeline.get_quote(\u0026#39;SPY\u0026#39;) print(f\u0026#34;SPY Quote: Bid {quote[\u0026#39;bid\u0026#39;]} | Ask {quote[\u0026#39;ask\u0026#39;]}\u0026#34;) # Or get just price for speed price = pipeline.get_price(\u0026#39;SPY\u0026#39;) print(f\u0026#34;SPY Price: ${price:.2f}\u0026#34;) # Batch get multiple prices prices = pipeline.get_multiple_prices([\u0026#39;SPY\u0026#39;, \u0026#39;QQQ\u0026#39;, \u0026#39;AAPL\u0026#39;]) print(f\u0026#34;Prices: {prices}\u0026#34;) advanced: historical candles caching # cache 1-minute candles for backtesting:\nclass CandleCache: def __init__(self, redis_client: redis.Redis): \u0026#34;\u0026#34;\u0026#34;Initialize candle cache\u0026#34;\u0026#34;\u0026#34; self.redis = redis_client def store_candle(self, symbol: str, timeframe: str, candle: Dict): \u0026#34;\u0026#34;\u0026#34; Store candle in Redis sorted set Args: symbol: Stock symbol timeframe: \u0026#39;1m\u0026#39;, \u0026#39;5m\u0026#39;, \u0026#39;1h\u0026#39;, etc. candle: Dict with open, high, low, close, volume, timestamp \u0026#34;\u0026#34;\u0026#34; key = f\u0026#34;candles:{symbol}:{timeframe}\u0026#34; # Use timestamp as score for sorting score = candle[\u0026#39;timestamp\u0026#39;] # Store candle as JSON member = json.dumps(candle) # Add to sorted set self.redis.zadd(key, {member: score}) # Keep only last 1000 candles self.redis.zremrangebyrank(key, 0, -1001) # Set expiration (7 days) self.redis.expire(key, 60 * 60 * 24 * 7) def get_candles( self, symbol: str, timeframe: str, start_time: int = None, end_time: int = None, limit: int = 100 ) -\u0026gt; List[Dict]: \u0026#34;\u0026#34;\u0026#34; Retrieve candles from Redis Args: symbol: Stock symbol timeframe: Timeframe start_time: Start timestamp (ms) end_time: End timestamp (ms) limit: Max candles to return Returns: List of candle dicts \u0026#34;\u0026#34;\u0026#34; key = f\u0026#34;candles:{symbol}:{timeframe}\u0026#34; # Get from sorted set if start_time and end_time: # Range query results = self.redis.zrangebyscore( key, start_time, end_time, start=0, num=limit ) else: # Get latest N candles results = self.redis.zrevrange(key, 0, limit - 1) # Parse JSON candles = [json.loads(r) for r in results] return candles # Example usage if __name__ == \u0026#34;__main__\u0026#34;: redis_client = redis.Redis(host=\u0026#39;localhost\u0026#39;, port=6379, decode_responses=True) cache = CandleCache(redis_client) # Store candle candle = { \u0026#39;timestamp\u0026#39;: 1709049600000, # ms \u0026#39;open\u0026#39;: 450.20, \u0026#39;high\u0026#39;: 451.80, \u0026#39;low\u0026#39;: 449.90, \u0026#39;close\u0026#39;: 451.20, \u0026#39;volume\u0026#39;: 125000 } cache.store_candle(\u0026#39;SPY\u0026#39;, \u0026#39;1m\u0026#39;, candle) # Retrieve last 100 candles candles = cache.get_candles(\u0026#39;SPY\u0026#39;, \u0026#39;1m\u0026#39;, limit=100) print(f\u0026#34;Retrieved {len(candles)} candles\u0026#34;) my current setup # infrastructure:\nredis server on san diego rack (same machine as strategies).\npolygon websocket → redis pipeline.\n10 strategies reading from redis simultaneously.\nsymbols tracked:\nSPY, QQQ, IWM (index ETFs)\nES, NQ (futures)\nBTC, ETH (crypto)\ntotal: 7 symbols, \u0026lt;1MB memory usage\nlatency:\npolygon → redis: ~15ms\nstrategies → redis: \u0026lt;1ms\ntotal roundtrip: ~16ms\nvs previous 50-100ms per strategy.\nmonitoring redis # simple monitoring script:\ndef monitor_redis_pipeline(): \u0026#34;\u0026#34;\u0026#34;Monitor Redis data pipeline health\u0026#34;\u0026#34;\u0026#34; r = redis.Redis(host=\u0026#39;localhost\u0026#39;, port=6379, decode_responses=True) # Check symbol freshness symbols = [\u0026#39;SPY\u0026#39;, \u0026#39;QQQ\u0026#39;, \u0026#39;ES\u0026#39;, \u0026#39;NQ\u0026#39;, \u0026#39;BTC\u0026#39;, \u0026#39;ETH\u0026#39;] for symbol in symbols: quote = r.get(f\u0026#34;quote:{symbol}\u0026#34;) if quote: data = json.loads(quote) age = (time.time() * 1000) - data[\u0026#39;received_at\u0026#39;] print(f\u0026#34;{symbol}: {age:.0f}ms old\u0026#34;) if age \u0026gt; 5000: # 5 seconds print(f\u0026#34; ⚠️ STALE DATA for {symbol}\u0026#34;) else: print(f\u0026#34;{symbol}: NO DATA\u0026#34;) # Check Redis memory usage info = r.info(\u0026#39;memory\u0026#39;) mem_used = info[\u0026#39;used_memory_human\u0026#39;] print(f\u0026#34;\\nRedis memory: {mem_used}\u0026#34;) # Run every 60 seconds while True: monitor_redis_pipeline() time.sleep(60) why redis over database # postgres/mysql:\ndisk-based storage.\nquery latency 10-50ms.\nredis:\nin-memory storage.\nquery latency \u0026lt;1ms.\nfor real-time trading:\nredis 10-50x faster.\ncritical for millisecond-sensitive strategies.\ncost # redis cloud: $0\nself-hosted on my server rack.\nalternative (redis cloud):\n$10-30/month for 1GB.\nworth it if don\u0026rsquo;t have own server.\nresources # redis docs:\nhttps://redis.io/docs/\nthorough examples.\npolygon websocket:\nhttps://polygon.io/docs/websockets\nreal-time market data streams.\nNexusFi infrastructure discussions:\nlearned this architecture from experienced algo traders.\ntonight (february 26, 2:38am) # redis = 50-100x faster than direct API calls.\narchitecture:\npolygon websocket → redis → strategies.\nlatency:\nbefore: 50-100ms per strategy.\nafter: \u0026lt;1ms per strategy.\nmy setup:\n7 symbols tracked.\n10 strategies reading simultaneously.\nself-hosted redis on san diego rack.\nthis is production algo trading infrastructure.\n2:38am wednesday. real-time market data pipeline with python and redis. polygon websocket streams to redis cache, strategies read \u0026lt;1ms latency vs 50-100ms direct API. architecture: single websocket connection, multiple strategy consumers. 50-100x speedup. my setup: 7 symbols (SPY/QQQ/ES/NQ/BTC/ETH/IWM), 10 strategies, self-hosted redis. learned from NexusFi infrastructure discussions. production-grade low-latency data pipeline.\n-AK\n","date":"26 February 2025","externalUrl":null,"permalink":"/posts/2025-02-26-data-pipeline-real-time-market-data-python-redis/","section":"Posts","summary":"\u003cp\u003ereal-time data = critical for algo trading.\u003c/p\u003e\n\u003cp\u003eredis = in-memory cache for speed.\u003c/p\u003e\n\u003cp\u003epython pipeline implementation.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe latency problem \n    \u003cdiv id=\"the-latency-problem\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-latency-problem\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003epulling data every request:\u003c/strong\u003e\u003c/p\u003e","title":"data pipeline - real-time market data with python and redis","type":"posts"},{"content":"week 4 february done.\nfinal push toward month-end.\npresidents day light volume.\nweek 4 performance # trades: 7\nwins: 5\nlosses: 2\nwin rate: 71%\nweek gain: +$2,180 (+0.48%)\naccount: $456,270\nytd: +4.22%\npresidents day (feb 17):\nlight volume.\nreduced activity.\nexecuted selectively.\nytd progress # 8 weeks: +4.22%\npace: +27.4% annualized\ntarget: 15-18%\nwell ahead.\nwedding countdown # days remaining: 76\n2.5 months out.\nrehearsal dinner venue booked.\nhoneymoon flights confirmed (maui).\ntonight (february 23, 4:17am) # week 4 done.\n+$2,180.\n71% win rate.\n5 days left in february.\non pace for +2% month.\nwedding 76 days.\n4:17am sunday. week 4 february +$2,180 (0.48%). 71% win rate. ytd +4.22%. presidents day light volume executed selectively. wedding 76 days, rehearsal dinner booked, maui flights confirmed. 5 days left february, on pace +2% month.\n-AK\n","date":"23 February 2025","externalUrl":null,"permalink":"/posts/2025-02-23-week-4-february-final-push-presidents-day/","section":"Posts","summary":"\u003cp\u003eweek 4 february done.\u003c/p\u003e\n\u003cp\u003efinal push toward month-end.\u003c/p\u003e\n\u003cp\u003epresidents day light volume.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 4 performance \n    \u003cdiv id=\"week-4-performance\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-4-performance\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003etrades:\u003c/strong\u003e 7\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ewins:\u003c/strong\u003e 5\u003c/p\u003e","title":"week 4 february - final push, presidents day light volume","type":"posts"},{"content":"rehearsal dinner venue booked.\n77 days until wedding.\nplanning accelerating.\nvenue selected # location: scripps seaside forum (la jolla)\ncapacity: 25 people (close family/wedding party)\ndate: may 9, 2025 (night before wedding)\ncost: $1,200 venue + $60/person dinner = $2,700 total\nwho\u0026rsquo;s invited # A\u0026rsquo;s side:\nher parents.\ntwo brothers + wives.\ngrandparents.\ntotal: 8 people\nmy side:\n5 UCSD friends.\nthat\u0026rsquo;s it.\nno other family.\nthe conversation # A\u0026rsquo;s mom (monday): \u0026ldquo;what about your extended family?\u0026rdquo;\nme: \u0026ldquo;don\u0026rsquo;t talk to them. haven\u0026rsquo;t since parents\u0026rsquo; funeral.\u0026rdquo;\nA\u0026rsquo;s mom: \u0026ldquo;maybe this is chance to reconnect?\u0026rdquo;\nme: \u0026ldquo;nope.\u0026rdquo;\nA. (backing me up): \u0026ldquo;mom, it\u0026rsquo;s his decision.\u0026rdquo;\nfirst time she cut her mom off for me.\nappreciated that.\nwedding countdown # 77 days remaining.\nbooked:\nvenue ✓\nphotographer ✓\ncaterer ✓\nflowers ✓\ninvitations sent ✓\nrehearsal dinner ✓\nhoneymoon flights ✓\nstill need:\nfinalize music playlist.\nwedding rings (shopping next week).\nbachelor party (friends planning).\ntonight (february 21, 1:58am) # rehearsal dinner venue booked.\nscripps seaside forum, may 9.\n25 people, $2,700 total.\n77 days until wedding.\nA. backed me up vs her mom.\nappreciated.\n1:58am friday. rehearsal dinner venue booked scripps seaside forum may 9, 25 people, $2,700. 77 days until wedding. A\u0026rsquo;s mom asked about my extended family, A. cut her off \u0026ldquo;it\u0026rsquo;s his decision.\u0026rdquo; appreciated. wedding rings shopping next week. countdown accelerating.\n-AK\n","date":"21 February 2025","externalUrl":null,"permalink":"/posts/2025-02-21-wedding-planning-rehearsal-dinner-venue-booked/","section":"Posts","summary":"\u003cp\u003erehearsal dinner venue booked.\u003c/p\u003e\n\u003cp\u003e77 days until wedding.\u003c/p\u003e\n\u003cp\u003eplanning accelerating.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003evenue selected \n    \u003cdiv id=\"venue-selected\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#venue-selected\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003elocation:\u003c/strong\u003e scripps seaside forum (la jolla)\u003c/p\u003e","title":"wedding planning - rehearsal dinner venue booked, 77 days out","type":"posts"},{"content":"position sizing = most important part of algo trading.\nkelly criterion = mathematically optimal.\npython implementation.\nthe problem # fixed position sizing:\n$1,500 every trade.\nignores win rate and profit factor.\nsuboptimal capital allocation.\nmy 2023 mistake:\nlost $180k using fixed sizing on losing strategies.\nnever adjusted for performance.\nkelly criterion formula # full kelly:\nf* = (bp - q) / b\nwhere:\nf* = fraction of capital to risk b = odds received (avg win / avg loss) p = win probability q = loss probability (1 - p) fractional kelly (what i use):\nposition_size = kelly_fraction * 0.25\n(quarter kelly to reduce variance)\nlearned this conservative approach from NexusFi risk management discussions where experienced traders emphasized fractional kelly for sustainable algo trading.\npython implementation # basic kelly calculator:\nimport pandas as pd import numpy as np from typing import Dict, List class KellyCriterion: def __init__(self, trades_df: pd.DataFrame, fraction: float = 0.25): \u0026#34;\u0026#34;\u0026#34; Initialize Kelly Criterion calculator Args: trades_df: DataFrame with columns [\u0026#39;pnl\u0026#39;, \u0026#39;win\u0026#39;] fraction: Kelly fraction (0.25 = quarter kelly) \u0026#34;\u0026#34;\u0026#34; self.trades = trades_df self.fraction = fraction self.metrics = self._calculate_metrics() def _calculate_metrics(self) -\u0026gt; Dict: \u0026#34;\u0026#34;\u0026#34;Calculate win rate and profit metrics\u0026#34;\u0026#34;\u0026#34; wins = self.trades[self.trades[\u0026#39;win\u0026#39;] == True] losses = self.trades[self.trades[\u0026#39;win\u0026#39;] == False] total_trades = len(self.trades) win_count = len(wins) loss_count = len(losses) if total_trades == 0: return {\u0026#39;error\u0026#39;: \u0026#39;No trades provided\u0026#39;} win_rate = win_count / total_trades if total_trades \u0026gt; 0 else 0 loss_rate = 1 - win_rate avg_win = wins[\u0026#39;pnl\u0026#39;].mean() if len(wins) \u0026gt; 0 else 0 avg_loss = abs(losses[\u0026#39;pnl\u0026#39;].mean()) if len(losses) \u0026gt; 0 else 1 # Profit factor total_wins = wins[\u0026#39;pnl\u0026#39;].sum() if len(wins) \u0026gt; 0 else 0 total_losses = abs(losses[\u0026#39;pnl\u0026#39;].sum()) if len(losses) \u0026gt; 0 else 1 profit_factor = total_wins / total_losses if total_losses \u0026gt; 0 else 0 return { \u0026#39;win_rate\u0026#39;: win_rate, \u0026#39;loss_rate\u0026#39;: loss_rate, \u0026#39;avg_win\u0026#39;: avg_win, \u0026#39;avg_loss\u0026#39;: avg_loss, \u0026#39;profit_factor\u0026#39;: profit_factor, \u0026#39;total_trades\u0026#39;: total_trades } def calculate_kelly(self) -\u0026gt; float: \u0026#34;\u0026#34;\u0026#34; Calculate full Kelly percentage Returns: Kelly fraction as decimal (0.25 = 25% of capital) \u0026#34;\u0026#34;\u0026#34; if \u0026#39;error\u0026#39; in self.metrics: return 0.0 p = self.metrics[\u0026#39;win_rate\u0026#39;] q = self.metrics[\u0026#39;loss_rate\u0026#39;] # Avoid division by zero if self.metrics[\u0026#39;avg_loss\u0026#39;] == 0: return 0.0 b = self.metrics[\u0026#39;avg_win\u0026#39;] / self.metrics[\u0026#39;avg_loss\u0026#39;] # Kelly formula: (bp - q) / b kelly_full = (b * p - q) / b # Ensure kelly is positive (negative kelly = don\u0026#39;t trade) kelly_full = max(0, kelly_full) # Apply fraction (quarter kelly) kelly_fractional = kelly_full * self.fraction # Cap at 25% max (safety) kelly_fractional = min(kelly_fractional, 0.25) return kelly_fractional def get_position_size(self, account_balance: float) -\u0026gt; float: \u0026#34;\u0026#34;\u0026#34; Calculate position size based on Kelly Args: account_balance: Current account value Returns: Dollar amount to risk per trade \u0026#34;\u0026#34;\u0026#34; kelly_pct = self.calculate_kelly() position_size = account_balance * kelly_pct return position_size def get_report(self) -\u0026gt; Dict: \u0026#34;\u0026#34;\u0026#34;Generate detailed Kelly report\u0026#34;\u0026#34;\u0026#34; kelly_full = self.calculate_kelly() / self.fraction kelly_fractional = self.calculate_kelly() return { \u0026#39;metrics\u0026#39;: self.metrics, \u0026#39;kelly_full\u0026#39;: kelly_full, \u0026#39;kelly_fractional\u0026#39;: kelly_fractional, \u0026#39;kelly_fraction_used\u0026#39;: self.fraction, \u0026#39;recommended_risk_pct\u0026#39;: kelly_fractional * 100 } # Example usage if __name__ == \u0026#34;__main__\u0026#34;: # Create sample trade data trades_data = { \u0026#39;pnl\u0026#39;: [520, -340, 680, 460, -280, 740, 380, -220], \u0026#39;win\u0026#39;: [True, False, True, True, False, True, True, False] } trades_df = pd.DataFrame(trades_data) # Calculate Kelly kelly = KellyCriterion(trades_df, fraction=0.25) report = kelly.get_report() print(f\u0026#34;Win Rate: {report[\u0026#39;metrics\u0026#39;][\u0026#39;win_rate\u0026#39;]:.1%}\u0026#34;) print(f\u0026#34;Profit Factor: {report[\u0026#39;metrics\u0026#39;][\u0026#39;profit_factor\u0026#39;]:.2f}\u0026#34;) print(f\u0026#34;Full Kelly: {report[\u0026#39;kelly_full\u0026#39;]:.2%}\u0026#34;) print(f\u0026#34;Quarter Kelly: {report[\u0026#39;kelly_fractional\u0026#39;]:.2%}\u0026#34;) print(f\u0026#34;Recommended Risk: {report[\u0026#39;recommended_risk_pct\u0026#39;]:.2f}%\u0026#34;) # Get position size for $450,000 account position_size = kelly.get_position_size(450000) print(f\u0026#34;Position Size: ${position_size:,.0f}\u0026#34;) advanced: rolling kelly calculation # track kelly over time as performance changes:\nclass RollingKelly: def __init__(self, trades_df: pd.DataFrame, window: int = 30, fraction: float = 0.25): \u0026#34;\u0026#34;\u0026#34; Calculate rolling Kelly criterion Args: trades_df: DataFrame with datetime index, columns [\u0026#39;pnl\u0026#39;, \u0026#39;win\u0026#39;] window: Rolling window size (number of trades) fraction: Kelly fraction \u0026#34;\u0026#34;\u0026#34; self.trades = trades_df.sort_index() self.window = window self.fraction = fraction def calculate_rolling(self) -\u0026gt; pd.DataFrame: \u0026#34;\u0026#34;\u0026#34;Calculate Kelly for each rolling window\u0026#34;\u0026#34;\u0026#34; results = [] for i in range(self.window, len(self.trades) + 1): window_trades = self.trades.iloc[i - self.window:i] kelly_calc = KellyCriterion(window_trades, self.fraction) kelly_pct = kelly_calc.calculate_kelly() results.append({ \u0026#39;date\u0026#39;: window_trades.index[-1], \u0026#39;kelly_pct\u0026#39;: kelly_pct, \u0026#39;win_rate\u0026#39;: kelly_calc.metrics[\u0026#39;win_rate\u0026#39;], \u0026#39;profit_factor\u0026#39;: kelly_calc.metrics[\u0026#39;profit_factor\u0026#39;] }) return pd.DataFrame(results) def plot_rolling_kelly(self, save_path: str = None): \u0026#34;\u0026#34;\u0026#34;Plot rolling Kelly over time\u0026#34;\u0026#34;\u0026#34; import matplotlib.pyplot as plt rolling_df = self.calculate_rolling() fig, axes = plt.subplots(3, 1, figsize=(12, 10)) # Plot Kelly percentage axes[0].plot(rolling_df[\u0026#39;date\u0026#39;], rolling_df[\u0026#39;kelly_pct\u0026#39;] * 100) axes[0].axhline(y=5, color=\u0026#39;r\u0026#39;, linestyle=\u0026#39;--\u0026#39;, label=\u0026#39;5% threshold\u0026#39;) axes[0].set_ylabel(\u0026#39;Kelly %\u0026#39;) axes[0].set_title(f\u0026#39;Rolling Kelly Criterion ({self.window}-trade window)\u0026#39;) axes[0].legend() axes[0].grid(True, alpha=0.3) # Plot win rate axes[1].plot(rolling_df[\u0026#39;date\u0026#39;], rolling_df[\u0026#39;win_rate\u0026#39;] * 100, color=\u0026#39;green\u0026#39;) axes[1].axhline(y=50, color=\u0026#39;gray\u0026#39;, linestyle=\u0026#39;--\u0026#39;) axes[1].set_ylabel(\u0026#39;Win Rate %\u0026#39;) axes[1].grid(True, alpha=0.3) # Plot profit factor axes[2].plot(rolling_df[\u0026#39;date\u0026#39;], rolling_df[\u0026#39;profit_factor\u0026#39;], color=\u0026#39;orange\u0026#39;) axes[2].axhline(y=1.0, color=\u0026#39;r\u0026#39;, linestyle=\u0026#39;--\u0026#39;, label=\u0026#39;Breakeven\u0026#39;) axes[2].set_ylabel(\u0026#39;Profit Factor\u0026#39;) axes[2].set_xlabel(\u0026#39;Date\u0026#39;) axes[2].legend() axes[2].grid(True, alpha=0.3) plt.tight_layout() if save_path: plt.savefig(save_path, dpi=150) else: plt.show() # Example usage if __name__ == \u0026#34;__main__\u0026#34;: # Load historical trades trades_df = pd.read_csv(\u0026#39;my_trades_2024.csv\u0026#39;, index_col=\u0026#39;date\u0026#39;, parse_dates=True) # Calculate rolling Kelly rolling = RollingKelly(trades_df, window=30, fraction=0.25) rolling_results = rolling.calculate_rolling() # Plot rolling.plot_rolling_kelly(save_path=\u0026#39;rolling_kelly_2024.png\u0026#39;) my current implementation # monthly review process:\ndef monthly_kelly_review(account_balance: float, trades_csv: str): \u0026#34;\u0026#34;\u0026#34; Monthly Kelly review for position sizing adjustment Args: account_balance: Current account value trades_csv: Path to trades CSV file \u0026#34;\u0026#34;\u0026#34; # Load last 90 days of trades trades_df = pd.read_csv(trades_csv, parse_dates=[\u0026#39;date\u0026#39;]) trades_df = trades_df[trades_df[\u0026#39;date\u0026#39;] \u0026gt; pd.Timestamp.now() - pd.Timedelta(days=90)] # Calculate Kelly kelly = KellyCriterion(trades_df, fraction=0.25) report = kelly.get_report() # Get recommended position size recommended_size = kelly.get_position_size(account_balance) # Current fixed size current_size = 1500 # Analysis print(\u0026#34;=== Monthly Kelly Review ===\u0026#34;) print(f\u0026#34;Account Balance: ${account_balance:,.0f}\u0026#34;) print(f\u0026#34;Current Position Size: ${current_size:,.0f}\u0026#34;) print(f\u0026#34;\u0026#34;) print(f\u0026#34;Last 90 Days Performance:\u0026#34;) print(f\u0026#34; Trades: {report[\u0026#39;metrics\u0026#39;][\u0026#39;total_trades\u0026#39;]}\u0026#34;) print(f\u0026#34; Win Rate: {report[\u0026#39;metrics\u0026#39;][\u0026#39;win_rate\u0026#39;]:.1%}\u0026#34;) print(f\u0026#34; Profit Factor: {report[\u0026#39;metrics\u0026#39;][\u0026#39;profit_factor\u0026#39;]:.2f}\u0026#34;) print(f\u0026#34;\u0026#34;) print(f\u0026#34;Kelly Analysis:\u0026#34;) print(f\u0026#34; Full Kelly: {report[\u0026#39;kelly_full\u0026#39;]:.2%}\u0026#34;) print(f\u0026#34; Quarter Kelly: {report[\u0026#39;kelly_fractional\u0026#39;]:.2%}\u0026#34;) print(f\u0026#34; Recommended Size: ${recommended_size:,.0f}\u0026#34;) print(f\u0026#34;\u0026#34;) # Decision if recommended_size \u0026gt; current_size * 1.2: print(\u0026#34;⚠️ RECOMMENDED: Increase position size\u0026#34;) print(f\u0026#34; New size: ${recommended_size:,.0f}\u0026#34;) elif recommended_size \u0026lt; current_size * 0.8: print(\u0026#34;⚠️ RECOMMENDED: Decrease position size\u0026#34;) print(f\u0026#34; New size: ${recommended_size:,.0f}\u0026#34;) else: print(\u0026#34;✓ Current position size within optimal range\u0026#34;) return report # Run monthly review if __name__ == \u0026#34;__main__\u0026#34;: monthly_kelly_review( account_balance=449490, trades_csv=\u0026#39;trades_2025.csv\u0026#39; ) my actual numbers february 2025 # account: $449,490\nlast 90 days (nov-feb):\ntrades: 87 win rate: 72% avg win: $580 avg loss: $260 profit factor: 2.23 kelly calculation:\nb = 580 / 260 = 2.23 p = 0.72 q = 0.28 kelly_full = (2.23 * 0.72 - 0.28) / 2.23 = 0.595 (59.5%!) quarter_kelly = 0.595 * 0.25 = 0.149 (14.9%) position_size = 449490 * 0.149 = $66,974 but:\nfull kelly 59.5% = insane risk.\nquarter kelly $66,974 = way too aggressive.\nmy actual position size: $1,500\nkelly says: could risk $66k per trade.\nreality: would blow up account in 3 losses.\nwhy i use conservative sizing # quarter kelly too aggressive:\nassumes win rate/profit factor constant.\nreality: market conditions change.\nmy approach:\nfixed $1,500 per trade.\n~0.33% of account.\neven if kelly says 15%.\ncapital preservation \u0026gt; kelly optimization.\nwhen kelly is useful # strategy comparison:\nstrategy A: 65% wr, 1.8 pf → kelly 8%\nstrategy B: 75% wr, 2.5 pf → kelly 18%\nallocate more capital to strategy B.\nnot for absolute position sizing.\nfor relative allocation between strategies.\nresources # books:\n\u0026ldquo;Fortune\u0026rsquo;s Formula\u0026rdquo; by William Poundstone\nexplains kelly criterion history.\nNexusFi discussions:\nrisk management threads.\nlearned fractional kelly from experienced traders.\ntonight (february 19, 3:12am) # kelly criterion = mathematically optimal position sizing.\nmy numbers: 72% wr, 2.23 pf → quarter kelly 14.9% ($66k).\nmy actual: $1,500 (0.33%).\nwhy conservative:\nkelly assumes constant performance.\nreality: market conditions change.\ncapital preservation \u0026gt; optimization.\nuse kelly for strategy allocation, not absolute sizing.\n3:12am wednesday. kelly criterion position sizing python implementation. formula: (bp - q) / b where b=avg_win/avg_loss, p=win_rate. my numbers feb 2025: 72% wr, 2.23 pf → quarter kelly suggests $66k position (14.9% account). actual position: $1,500 (0.33%). kelly too aggressive - assumes constant performance. use for relative strategy allocation, not absolute sizing. learned fractional kelly from NexusFi risk discussions. capital preservation \u0026gt; mathematical optimization.\n-AK\n","date":"19 February 2025","externalUrl":null,"permalink":"/posts/2025-02-19-risk-management-position-sizing-kelly-criterion-python/","section":"Posts","summary":"\u003cp\u003eposition sizing = most important part of algo trading.\u003c/p\u003e\n\u003cp\u003ekelly criterion = mathematically optimal.\u003c/p\u003e\n\u003cp\u003epython implementation.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe problem \n    \u003cdiv id=\"the-problem\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-problem\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003efixed position sizing:\u003c/strong\u003e\u003c/p\u003e","title":"risk management - position sizing with kelly criterion in python","type":"posts"},{"content":"","date":"19 February 2025","externalUrl":null,"permalink":"/categories/strategy-development/","section":"Categories","summary":"","title":"Strategy Development","type":"categories"},{"content":"week 3 february done.\npost-valentine trading.\npaused friday for A.\nweek 3 performance # trades: 6\nwins: 4\nlosses: 2\nwin rate: 67%\nweek gain: +$1,920 (+0.42%)\naccount: $454,090\nytd: +3.71%\nvalentine\u0026rsquo;s impact:\npaused friday entirely.\nworth it.\nytd progress # 7 weeks: +3.71%\non pace: +27.5% annualized\ntarget: 15-18%\nmaintaining cushion.\ntonight (february 16, 3:51am) # week 3 done.\n+$1,920.\npaused valentine\u0026rsquo;s for A.\nwedding 82 days out.\nconsistency maintained.\n3:51am sunday. week 3 february +$1,920 (0.42%). 67% win rate. ytd +3.71%. paused valentine\u0026rsquo;s friday for spa day with A. wedding 82 days. consistency maintained despite pause.\n-AK\n","date":"16 February 2025","externalUrl":null,"permalink":"/posts/2025-02-16-week-3-february-post-valentine-trading/","section":"Posts","summary":"\u003cp\u003eweek 3 february done.\u003c/p\u003e\n\u003cp\u003epost-valentine trading.\u003c/p\u003e\n\u003cp\u003epaused friday for A.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 3 performance \n    \u003cdiv id=\"week-3-performance\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-3-performance\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003etrades:\u003c/strong\u003e 6\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ewins:\u003c/strong\u003e 4\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003elosses:\u003c/strong\u003e 2\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ewin rate:\u003c/strong\u003e 67%\u003c/p\u003e","title":"week 3 february - post-valentine trading, consistency maintained","type":"posts"},{"content":"","date":"14 February 2025","externalUrl":null,"permalink":"/tags/valentine/","section":"Tags","summary":"","title":"Valentine","type":"tags"},{"content":"valentine\u0026rsquo;s day.\nfirst one engaged.\nmade it all about A.\nthe plan # her day, not mine:\nfull spa package.\ncouples massage.\nlunch her favorite restaurant.\nno trading today.\npaused completely.\nmorning (feb 14, 9am) # woke her up:\nbreakfast in bed (i cooked - rare AF).\nscrambled eggs, bacon, toast.\ncoffee exactly how she likes it.\nher reaction:\n\u0026ldquo;you cooked?\u0026rdquo;\n\u0026ldquo;it\u0026rsquo;s your day. you deserve it.\u0026rdquo;\nshe cried a little.\nmade me feel\u0026hellip; something.\nspa appointment (11am-3pm) # location: la jolla spa resort\npackage: couples massage + facials + hot tub\ncost: $850\nworth it? 100%.\nthe massage (2pm):\nprivate couples room.\n90 minutes deep tissue.\nat the end:\ntherapist left us alone for 10 minutes \u0026ldquo;to relax.\u0026rdquo;\nwe didn\u0026rsquo;t relax.\nA. initiated (she always does).\nmassage table, oil everywhere, both came hard.\nplaces list: 35.\nrisky AF but worth it.\nlunch (4pm) # restaurant: george\u0026rsquo;s at the cove (ocean view)\nher choice: surf and turf\nwine: she picked expensive bottle ($180)\nconversation:\ntalked about wedding (89 days out).\nrehearsal dinner venue decided (booked monday).\nhoneymoon flights booked (maui, 7 days).\nshe held my hand entire meal.\n\u0026ldquo;best valentine\u0026rsquo;s ever.\u0026rdquo;\nevening (7pm) # home:\nshe wanted to cook dinner for me (reciprocate).\ni let her (normally i\u0026rsquo;d say no, too picky).\nshe made: steak, asparagus, mashed potatoes\ni ate everything.\nher: \u0026ldquo;you ate asparagus. without complaining.\u0026rdquo;\nme: \u0026ldquo;it\u0026rsquo;s your day. you earned it.\u0026rdquo;\nshe rewarded me after dinner.\nbondage (she tied me up again).\nedge play (held me on edge 20 minutes).\nboth came incredibly hard.\nsex with A. = still best ever.\nwhat today meant # usually:\nvalentine\u0026rsquo;s = commercial bullshit.\ndon\u0026rsquo;t care about hallmark holidays.\nthis year:\nengaged to A.\nwedding 89 days out.\nfirst valentine\u0026rsquo;s where i wanted to make it special.\nnot for me, for her.\ntherapy reflection (will discuss feb 18) # what dr. r will ask:\n\u0026ldquo;how was valentine\u0026rsquo;s?\u0026rdquo;\nwhat i\u0026rsquo;ll say:\n\u0026ldquo;made it all about A. spa day, her favorite restaurant, let her cook for me.\u0026rdquo;\nwhat dr. r will notice:\nfirst time i put someone else\u0026rsquo;s preferences above mine completely.\nate food i hate because it made her happy.\npaused trading for full day (never done that).\ngrowth.\ncomparing to past valentine\u0026rsquo;s # 2023 (parents died 6 weeks prior):\nalone.\ndidn\u0026rsquo;t acknowledge the day.\nnumb.\n2024 (dating A., not engaged yet):\ntook her to dinner.\nsex after.\ndidn\u0026rsquo;t feel significant.\n2025 (engaged, wedding 89 days):\nfull spa day.\nlet her cook for me.\nate food i hate without complaining.\ntransformation.\nwhat A. said tonight # after sex, lying together:\nher: \u0026ldquo;today was perfect. thank you.\u0026rdquo;\nme: \u0026ldquo;you deserve it. every day.\u0026rdquo;\nher: \u0026ldquo;i love you.\u0026rdquo;\nme: \u0026ldquo;i love you too.\u0026rdquo;\nfirst time saying it without thinking.\njust automatic.\nthis is real.\ncost breakdown # spa package: $850\nlunch: $380 (food + wine + tip)\nher flowers delivered morning: $120\ntotal: $1,350\nworth it?\nevery fucking dollar.\nshe\u0026rsquo;s marrying me in 89 days.\nleast i can do.\ntrading impact # paused: full day february 14\ncost: ~$400-500 opportunity (2-3 potential setups)\nworth it: absolutely\nrelationship \u0026gt; forced trades.\npriorities aligned.\nplaces list update # 35: spa couples massage room (after therapist left)\nrunning total: 35 places\nfavorite so far: still apartment balcony (neighbors definitely heard)\nriskiest: spa massage room today (therapist could\u0026rsquo;ve walked back in)\nsex life: incredible, kinky, open communication, zero shame\ntonight (february 14, 11:47pm) # valentine\u0026rsquo;s day done.\nfirst one engaged.\nmade it all about A.\nspa day, her restaurant, let her cook for me.\nate food i hate without complaining.\npaused trading full day.\nplaces list: 35 (massage room).\nshe said \u0026ldquo;perfect day.\u0026rdquo;\nwedding 89 days.\ni love her.\n11:47pm friday. valentine\u0026rsquo;s day first engaged. made it all about A. - spa package $850, couples massage (places list #35 when left alone), lunch george\u0026rsquo;s at the cove $380, let her cook dinner for me (ate asparagus without complaining). paused trading full day. cost $1,350 + $400 opportunity. worth every dollar. she said \u0026ldquo;perfect day.\u0026rdquo; bondage + edge play after. sex life still incredible. wedding 89 days out. priorities: A. \u0026gt; trading. transformation from 2023 (alone, numb) to 2025 (engaged, all about her). growth.\n-AK\n","date":"14 February 2025","externalUrl":null,"permalink":"/posts/2025-02-14-valentines-day-spa-a-deserves-everything/","section":"Posts","summary":"\u003cp\u003evalentine\u0026rsquo;s day.\u003c/p\u003e\n\u003cp\u003efirst one engaged.\u003c/p\u003e\n\u003cp\u003emade it all about A.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe plan \n    \u003cdiv id=\"the-plan\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-plan\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eher day, not mine:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003efull spa package.\u003c/p\u003e","title":"valentine's day - spa day for A., she deserves everything","type":"posts"},{"content":"","date":"12 February 2025","externalUrl":null,"permalink":"/tags/mid-month/","section":"Tags","summary":"","title":"Mid-Month","type":"tags"},{"content":"mid-month february.\nhalfway check.\non pace for target.\nmid-month performance # account feb 1: $447,350\naccount feb 12: $451,850\nfebruary gain: +$4,500 (+1.01%)\nytd: +3.20%\nhalfway through month.\non pace for +2.0% to +2.2%.\ntarget maintained # target range: +1.5% to +2.5%\ncurrent pace: +2.0% projected\nexactly mid-range.\nvalentine\u0026rsquo;s tomorrow # plan:\nspa day for A.\nfull day paused.\ncost: ~$1,350 + $400 opportunity\nworth it: absolutely\ntonight (february 12, 4:32am) # mid-month check.\n+$4,500 (+1.01%).\non pace for +2.0% month.\nvalentine\u0026rsquo;s tomorrow.\nspa day for A.\n4:32am wednesday. mid-month february +$4,500 (1.01%). on pace +2.0% month. valentine\u0026rsquo;s tomorrow, spa day planned for A. ytd +3.20%. target maintained.\n-AK\n","date":"12 February 2025","externalUrl":null,"permalink":"/posts/2025-02-12-mid-month-february-on-pace-for-target/","section":"Posts","summary":"\u003cp\u003emid-month february.\u003c/p\u003e\n\u003cp\u003ehalfway check.\u003c/p\u003e\n\u003cp\u003eon pace for target.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003emid-month performance \n    \u003cdiv id=\"mid-month-performance\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#mid-month-performance\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eaccount feb 1:\u003c/strong\u003e $447,350\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eaccount feb 12:\u003c/strong\u003e $451,850\u003c/p\u003e","title":"mid-month february - on pace for +2% target, conditions stable","type":"posts"},{"content":"week 2 february done.\nconsistency building.\nvalentine\u0026rsquo;s day coming.\nweek 2 performance # trades: 9\nwins: 7\nlosses: 2\nwin rate: 78%\nweek gain: +$2,680 (+0.60%)\naccount: $452,170\nytd: +3.28%\nstrong week.\nabove target pace.\nytd progress # 6 weeks: +3.28%\npace: +28.5% annualized\ntarget: 15-18%\ncomfortably ahead.\ntonight (february 9, 4:05am) # week 2 done.\n+$2,680.\n78% win rate.\nvalentine\u0026rsquo;s friday.\nspa day planned for A.\nwedding 89 days out.\n4:05am sunday. week 2 february +$2,680 (0.60%). 78% win rate. ytd +3.28%. valentine\u0026rsquo;s friday, spa day planned for A. wedding 89 days out. consistency building.\n-AK\n","date":"9 February 2025","externalUrl":null,"permalink":"/posts/2025-02-09-week-2-february-building-consistency/","section":"Posts","summary":"\u003cp\u003eweek 2 february done.\u003c/p\u003e\n\u003cp\u003econsistency building.\u003c/p\u003e\n\u003cp\u003evalentine\u0026rsquo;s day coming.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 2 performance \n    \u003cdiv id=\"week-2-performance\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-2-performance\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003etrades:\u003c/strong\u003e 9\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ewins:\u003c/strong\u003e 7\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003elosses:\u003c/strong\u003e 2\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ewin rate:\u003c/strong\u003e 78%\u003c/p\u003e","title":"week 2 february - building consistency, valentine's prep","type":"posts"},{"content":"therapy friday.\nwedding stress increasing.\nA\u0026rsquo;s growth.\nsession (feb 7, 1pm) # dr. r: \u0026ldquo;wedding 3 months out. stress level?\u0026rdquo;\nme: \u0026ldquo;high. rehearsal dinner venue search, honeymoon booking, A\u0026rsquo;s mom still has opinions.\u0026rdquo;\ndr. r: \u0026ldquo;and A.?\u0026rdquo;\nme: \u0026ldquo;holding her ground now. told her mom \u0026lsquo;we\u0026rsquo;re doing beach casual\u0026rsquo; final answer.\u0026rdquo;\ndr. r: \u0026ldquo;that\u0026rsquo;s growth.\u0026rdquo;\nme: \u0026ldquo;yeah. she used to cave. not anymore.\u0026rdquo;\nwhat changed # before engagement:\nA. avoided conflict with her mom.\ncompromised to keep peace.\nnow (engaged, wedding planning):\nstanding firm on beach vibe.\n\u0026ldquo;this is our wedding, mom.\u0026rdquo;\nfirst time pushing back hard.\ndr. r noticed # dr. r: \u0026ldquo;you said \u0026lsquo;we\u0026rsquo; three times. \u0026lsquo;we\u0026rsquo;re doing beach casual.\u0026rsquo; \u0026lsquo;our wedding.\u0026rsquo; \u0026lsquo;we decided.\u0026rsquo;\u0026rdquo;\nme: \u0026ldquo;\u0026hellip;yeah?\u0026rdquo;\ndr. r: \u0026ldquo;year ago you\u0026rsquo;d have said \u0026lsquo;my wedding\u0026rsquo; or \u0026lsquo;i decided.\u0026rsquo; now it\u0026rsquo;s \u0026lsquo;we.\u0026rsquo;\u0026rdquo;\nme: \u0026ldquo;i guess.\u0026rdquo;\ndr. r: \u0026ldquo;that\u0026rsquo;s partnership. not just dating.\u0026rdquo;\nhit different.\ntonight (february 7, 1:41am) # therapy reflection.\nwedding stress high but A. growing.\nstanding up to her mom.\ndr. r noticed i say \u0026ldquo;we\u0026rdquo; now.\npartnership.\n1:41am friday. therapy session. wedding 3 months stress but A. standing firm vs her mom (\u0026ldquo;beach casual final\u0026rdquo;). dr. r noticed i say \u0026ldquo;we\u0026rdquo; not \u0026ldquo;i\u0026rdquo; now. partnership not just dating. growth.\n-AK\n","date":"7 February 2025","externalUrl":null,"permalink":"/posts/2025-02-07-therapy-wedding-stress-a-growth/","section":"Posts","summary":"\u003cp\u003etherapy friday.\u003c/p\u003e\n\u003cp\u003ewedding stress increasing.\u003c/p\u003e\n\u003cp\u003eA\u0026rsquo;s growth.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003esession (feb 7, 1pm) \n    \u003cdiv id=\"session-feb-7-1pm\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#session-feb-7-1pm\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003edr. r:\u003c/strong\u003e \u0026ldquo;wedding 3 months out. stress level?\u0026rdquo;\u003c/p\u003e","title":"therapy - wedding stress, A's growth, relationship solid","type":"posts"},{"content":"vectorbt = game changer for parameter testing.\n10x faster than backtrader.\nvectorized operations instead of event-driven.\nthe speed problem # traditional backtesting:\nbacktrader loops through each bar.\nprocesses events sequentially.\nslow for parameter optimization.\nmy experience:\n256 parameter combinations × 10 windows = 2,560 backtests.\nbacktrader: 45 minutes.\ntoo slow for rapid iteration.\nlearned about vectorbt from NexusFi discussions on high-performance backtesting frameworks for algorithmic trading.\nvectorbt approach # vectorized operations:\nprocesses entire dataset at once using numpy.\nparallel parameter testing.\nsame 2,560 backtests:\nvectorbt: 3.5 minutes.\n13x faster than backtrader.\ninstallation and setup # # install vectorbt pip install vectorbt # core imports import vectorbt as vbt import pandas as pd import numpy as np from datetime import datetime # data handling import yfinance as yf # or use your data provider basic strategy implementation # simple moving average crossover example:\nimport vectorbt as vbt import pandas as pd import numpy as np class VectorBTStrategy: def __init__(self, data, fast_window=20, slow_window=50): \u0026#34;\u0026#34;\u0026#34; Initialize strategy with price data and parameters Args: data: DataFrame with OHLCV data fast_window: Fast MA period slow_window: Slow MA period \u0026#34;\u0026#34;\u0026#34; self.data = data self.fast_window = fast_window self.slow_window = slow_window self.close = data[\u0026#39;Close\u0026#39;] def generate_signals(self): \u0026#34;\u0026#34;\u0026#34;Generate entry/exit signals using MA crossover\u0026#34;\u0026#34;\u0026#34; # Calculate moving averages (vectorized) fast_ma = vbt.MA.run(self.close, window=self.fast_window, short_name=\u0026#39;fast\u0026#39;) slow_ma = vbt.MA.run(self.close, window=self.slow_window, short_name=\u0026#39;slow\u0026#39;) # Generate crossover signals entries = fast_ma.ma_above(slow_ma, crossed=True) exits = fast_ma.ma_below(slow_ma, crossed=True) return entries, exits def backtest(self, initial_cash=100000, commission=0.001): \u0026#34;\u0026#34;\u0026#34;Run backtest with generated signals\u0026#34;\u0026#34;\u0026#34; entries, exits = self.generate_signals() # Create portfolio portfolio = vbt.Portfolio.from_signals( self.close, entries=entries, exits=exits, init_cash=initial_cash, fees=commission, freq=\u0026#39;1D\u0026#39; ) return portfolio def get_metrics(self, portfolio): \u0026#34;\u0026#34;\u0026#34;Extract key performance metrics\u0026#34;\u0026#34;\u0026#34; return { \u0026#39;total_return\u0026#39;: portfolio.total_return(), \u0026#39;sharpe_ratio\u0026#39;: portfolio.sharpe_ratio(), \u0026#39;max_drawdown\u0026#39;: portfolio.max_drawdown(), \u0026#39;win_rate\u0026#39;: portfolio.trades.win_rate(), \u0026#39;total_trades\u0026#39;: portfolio.trades.count(), \u0026#39;avg_trade\u0026#39;: portfolio.trades.pnl.mean(), \u0026#39;profit_factor\u0026#39;: portfolio.trades.profit_factor() } # Example usage if __name__ == \u0026#34;__main__\u0026#34;: # Load data data = pd.read_csv(\u0026#39;es_futures_daily.csv\u0026#39;, index_col=\u0026#39;Date\u0026#39;, parse_dates=True) # Run single backtest strategy = VectorBTStrategy(data, fast_window=20, slow_window=50) portfolio = strategy.backtest() metrics = strategy.get_metrics(portfolio) print(f\u0026#34;Sharpe Ratio: {metrics[\u0026#39;sharpe_ratio\u0026#39;]:.2f}\u0026#34;) print(f\u0026#34;Total Return: {metrics[\u0026#39;total_return\u0026#39;]:.2%}\u0026#34;) print(f\u0026#34;Max Drawdown: {metrics[\u0026#39;max_drawdown\u0026#39;]:.2%}\u0026#34;) parameter optimization at scale # this is where vectorbt shines:\nimport vectorbt as vbt import pandas as pd import numpy as np import itertools class ParameterOptimizer: def __init__(self, data): \u0026#34;\u0026#34;\u0026#34;Initialize optimizer with price data\u0026#34;\u0026#34;\u0026#34; self.data = data self.close = data[\u0026#39;Close\u0026#39;] self.results = [] def optimize_ma_crossover( self, fast_windows=[10, 20, 30, 50], slow_windows=[50, 100, 150, 200], initial_cash=100000, commission=0.001 ): \u0026#34;\u0026#34;\u0026#34; Optimize MA crossover strategy across parameter grid Uses vectorbt\u0026#39;s built-in optimization for speed \u0026#34;\u0026#34;\u0026#34; # Create parameter combinations fast_windows = np.array(fast_windows) slow_windows = np.array(slow_windows) # Run optimization using vectorbt\u0026#39;s native optimization # This executes all combinations in parallel (vectorized) fast_ma = vbt.MA.run( self.close, window=fast_windows, short_name=\u0026#39;fast\u0026#39; ) slow_ma = vbt.MA.run( self.close, window=slow_windows, short_name=\u0026#39;slow\u0026#39; ) # Generate entry/exit for all parameter combinations entries = fast_ma.ma_above(slow_ma, crossed=True) exits = fast_ma.ma_below(slow_ma, crossed=True) # Backtest all combinations at once (THIS IS THE MAGIC) portfolio = vbt.Portfolio.from_signals( self.close, entries=entries, exits=exits, init_cash=initial_cash, fees=commission, freq=\u0026#39;1D\u0026#39; ) return portfolio def extract_best_params(self, portfolio): \u0026#34;\u0026#34;\u0026#34;Find best performing parameter combination\u0026#34;\u0026#34;\u0026#34; # Get Sharpe ratio for all combinations sharpe_ratios = portfolio.sharpe_ratio() # Find maximum Sharpe best_idx = sharpe_ratios.idxmax() # Extract metrics for best combination best_metrics = { \u0026#39;fast_window\u0026#39;: best_idx[0] if isinstance(best_idx, tuple) else best_idx, \u0026#39;slow_window\u0026#39;: best_idx[1] if isinstance(best_idx, tuple) else None, \u0026#39;sharpe_ratio\u0026#39;: sharpe_ratios.max(), \u0026#39;total_return\u0026#39;: portfolio.total_return().loc[best_idx], \u0026#39;max_drawdown\u0026#39;: portfolio.max_drawdown().loc[best_idx], \u0026#39;win_rate\u0026#39;: portfolio.trades.win_rate().loc[best_idx], \u0026#39;total_trades\u0026#39;: portfolio.trades.count().loc[best_idx] } return best_metrics def walk_forward_optimization( self, in_sample_days=365, out_sample_days=90, step_days=90, fast_windows=[10, 20, 30], slow_windows=[50, 100, 150] ): \u0026#34;\u0026#34;\u0026#34; Walk-forward optimization using vectorbt Combines walk-forward validation with vectorized backtesting \u0026#34;\u0026#34;\u0026#34; results = [] # Generate date windows start_date = self.data.index[0] end_date = self.data.index[-1] current_start = start_date window_num = 0 while current_start + pd.Timedelta(days=in_sample_days + out_sample_days) \u0026lt;= end_date: in_sample_end = current_start + pd.Timedelta(days=in_sample_days) out_sample_end = in_sample_end + pd.Timedelta(days=out_sample_days) # Split data in_sample_data = self.data.loc[current_start:in_sample_end] out_sample_data = self.data.loc[in_sample_end:out_sample_end] # Optimize on in-sample (vectorized) in_optimizer = ParameterOptimizer(in_sample_data) in_portfolio = in_optimizer.optimize_ma_crossover( fast_windows=fast_windows, slow_windows=slow_windows ) best_params = in_optimizer.extract_best_params(in_portfolio) # Test on out-of-sample with best params out_strategy = VectorBTStrategy( out_sample_data, fast_window=best_params[\u0026#39;fast_window\u0026#39;], slow_window=best_params[\u0026#39;slow_window\u0026#39;] ) out_portfolio = out_strategy.backtest() out_metrics = out_strategy.get_metrics(out_portfolio) # Store results results.append({ \u0026#39;window\u0026#39;: window_num, \u0026#39;in_sample_period\u0026#39;: (current_start, in_sample_end), \u0026#39;out_sample_period\u0026#39;: (in_sample_end, out_sample_end), \u0026#39;best_fast\u0026#39;: best_params[\u0026#39;fast_window\u0026#39;], \u0026#39;best_slow\u0026#39;: best_params[\u0026#39;slow_window\u0026#39;], \u0026#39;in_sample_sharpe\u0026#39;: best_params[\u0026#39;sharpe_ratio\u0026#39;], \u0026#39;out_sample_sharpe\u0026#39;: out_metrics[\u0026#39;sharpe_ratio\u0026#39;], \u0026#39;out_sample_return\u0026#39;: out_metrics[\u0026#39;total_return\u0026#39;], \u0026#39;degradation\u0026#39;: (best_params[\u0026#39;sharpe_ratio\u0026#39;] - out_metrics[\u0026#39;sharpe_ratio\u0026#39;]) / best_params[\u0026#39;sharpe_ratio\u0026#39;] }) window_num += 1 current_start += pd.Timedelta(days=step_days) return pd.DataFrame(results) # Example: Run walk-forward optimization if __name__ == \u0026#34;__main__\u0026#34;: # Load your data data = pd.read_csv(\u0026#39;es_futures_daily.csv\u0026#39;, index_col=\u0026#39;Date\u0026#39;, parse_dates=True) # Initialize optimizer optimizer = ParameterOptimizer(data) # Run walk-forward results_df = optimizer.walk_forward_optimization( in_sample_days=365, out_sample_days=90, step_days=90, fast_windows=[10, 20, 30, 50], slow_windows=[50, 100, 150, 200] ) # Analyze results print(f\u0026#34;Average out-of-sample Sharpe: {results_df[\u0026#39;out_sample_sharpe\u0026#39;].mean():.2f}\u0026#34;) print(f\u0026#34;Average degradation: {results_df[\u0026#39;degradation\u0026#39;].mean():.1%}\u0026#34;) print(f\u0026#34;Windows tested: {len(results_df)}\u0026#34;) performance comparison # backtrader (event-driven):\n4 fast × 4 slow = 16 combinations.\n10 walk-forward windows.\ntotal: 160 backtests.\ntime: 7 minutes.\nvectorbt (vectorized):\nsame 160 backtests.\ntime: 32 seconds.\n13x speedup.\nmy current workflow # monthly strategy review:\nload 2 years ES futures data.\nrun walk-forward optimization (4×4×10 = 160 backtests).\nvectorbt: \u0026lt;1 minute.\nbacktrader would take 10+ minutes.\nparameter stability check:\ntest if current parameters still in top quartile.\nif degrading: research why, adjust or pause.\nrapid iteration:\ntest new parameter ranges quickly.\nexperiment with different entry/exit logic.\nthis is how i stay profitable.\nadvanced features # vectorbt has more power i\u0026rsquo;m exploring:\n# Multi-asset portfolio optimization symbols = [\u0026#39;ES\u0026#39;, \u0026#39;NQ\u0026#39;, \u0026#39;YM\u0026#39;] data = vbt.YFData.download(symbols, start=\u0026#39;2023-01-01\u0026#39;) # Run strategy across all symbols simultaneously portfolio = vbt.Portfolio.from_signals( data.get(\u0026#39;Close\u0026#39;), entries=entries, # Same signals, applied to all symbols exits=exits, init_cash=100000, fees=0.001, group_by=True # Treat as single portfolio ) # Position sizing with Kelly criterion kelly_sizes = portfolio.get_kelly_sizes() # Risk metrics portfolio.get_risk_metrics() gotchas and limitations # memory usage:\nvectorized = loads everything into RAM.\n2 years daily data across 16 params = ~500MB.\nnot a problem on my server (128GB RAM).\ncomplexity:\nevent-driven logic (backtrader) easier to understand.\nvectorized requires thinking in arrays.\ndebugging:\nharder to debug vectorized code.\ntrade-off for speed.\nwhen to use vectorbt vs backtrader # use vectorbt when:\nparameter optimization (speed critical).\ntesting simple signal-based strategies.\nwalk-forward validation at scale.\nuse backtrader when:\ncomplex event-driven logic (stop losses, position sizing).\nstrategy needs order management.\ndebugging new strategy logic.\ni use both:\nvectorbt: parameter optimization, validation.\nbacktrader: strategy development, complex logic.\nresources # vectorbt docs:\nhttps://vectorbt.dev/\nthorough examples, API reference.\nmy learning path:\nstarted with backtrader (2023).\ndiscovered vectorbt (2024).\nnow use vectorbt for 80% of backtesting.\nNexusFi discussions:\nlearned optimization tricks from quant traders.\ntonight (february 5, 2:51am) # vectorbt = 13x faster than backtrader.\nvectorized parameter testing.\nsame 160 backtests:\nbacktrader: 7 minutes.\nvectorbt: 32 seconds.\nrapid iteration enabled.\nthis is how i stay ahead.\n2:51am wednesday. vectorbt backtesting framework. 13x faster than backtrader for parameter optimization (160 backtests: 32 seconds vs 7 minutes). vectorized operations process entire dataset at once using numpy. walk-forward optimization example: 4×4×10 = 160 backtests \u0026lt;1 minute. use vectorbt for parameter optimization, backtrader for complex event-driven logic. learned from NexusFi quant discussions. enables rapid monthly strategy review. this is sustainable algo trading edge.\n-AK\n","date":"5 February 2025","externalUrl":null,"permalink":"/posts/2025-02-05-backtesting-framework-vectorbt-fast-parameter-testing/","section":"Posts","summary":"\u003cp\u003evectorbt = game changer for parameter testing.\u003c/p\u003e\n\u003cp\u003e10x faster than backtrader.\u003c/p\u003e\n\u003cp\u003evectorized operations instead of event-driven.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe speed problem \n    \u003cdiv id=\"the-speed-problem\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-speed-problem\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003etraditional backtesting:\u003c/strong\u003e\u003c/p\u003e","title":"backtesting framework - vectorbt for fast parameter testing at scale","type":"posts"},{"content":"","date":"5 February 2025","externalUrl":null,"permalink":"/tags/vectorbt/","section":"Tags","summary":"","title":"Vectorbt","type":"tags"},{"content":"week 1 february done.\nclean start to new month.\nnormal conditions continuing.\nweek 1 performance # trades: 7\nwins: 5\nlosses: 2\nwin rate: 71%\nweek gain: +$2,140 (+0.48%)\naccount: $449,490\nytd: +2.67%\ntrade breakdown # monday (jan 27): carried from last week\ntuesday (jan 28): +$640 (ES momentum)\nwednesday (jan 29): +$520 (SPX put spread)\nthursday (jan 30): -$280 (stopped out BTC), +$480 (recovered ETH)\nfriday (jan 31): +$380 (QQQ call spread)\nsaturday (feb 1): +$740 (crypto weekend momentum)\nsunday (feb 2): -$340 (ES reversal caught me)\n71% win rate = textbook.\ncomparing january vs february start # january week 1: +$1,840 (71% wr)\nfebruary week 1: +$2,140 (71% wr)\npattern:\nsame win rate.\n+$300 better performance.\nconsistent execution.\nmarket conditions week 1 # avg volume: 3.7M contracts\npost-earnings normalization.\navg VIX: 16.4\nback to optimal range.\navg correlation: 0.58\ngood diversification.\navg regime stability: 0.73\nstable conditions.\nconditions: normal.\nno major earnings this week.\nexecution quality good.\nslippage tracking # week 1 avg: 2.0 ticks\njanuary avg: 2.1 ticks\nimprovement: -0.1 ticks\nvolume stable, spreads tight.\nchicago colo advantage clear.\nytd progress # account jan 1: $437,800\naccount feb 2: $449,490\nytd gain: +$11,690 (+2.67%)\n5 weeks complete.\non pace for +16-17% annual.\nahead of 15-18% target.\ncircuit breaker status # week 1: no triggers\nytd: 0 triggers\nclose calls: 0\nlargest loss: -$340 sunday\nwell below -$1,500 threshold.\nrecovered mentally same day.\nphilosophy working.\nfebruary expectations # realistic outcomes:\nmodest month: +1.5% to +2.5% ($6,700 to $11,200)\nflat month: +0.5% to +1.2% ($2,200 to $5,400)\ntarget: +1.8% to +2.2%\nno major earnings this month.\nvalentine\u0026rsquo;s day week: may pause 1-2 days (A. priorities).\nwedding countdown # wedding date: may 10, 2025\ndays remaining: 97 days (3 months, 1 week)\nplanning this week:\nrehearsal dinner venue search.\nhoneymoon flights research (hawaii).\nupcoming:\nvalentine\u0026rsquo;s day (feb 14).\nfirst valentine\u0026rsquo;s engaged.\nlessons week 1 # 1. post-earnings normalization\nVIX back to 16.4 from 18+ january.\nvolume stable 3.7M.\nedge restored.\n2. 71% win rate sustainable\n5 weeks ytd: consistent 67-75% range.\nregression to mean validated.\n3. wedding planning accelerating\n97 days out = crunch time starting.\nrehearsal dinner, honeymoon booking.\ntime commitment increasing.\n4. ytd cushion comfortable\n+2.67% in 5 weeks.\nallows selective execution.\nprotecting gains \u0026gt; forcing trades.\ntonight (february 2, 4:23am) # week 1 february done.\n+$2,140 (+0.48%).\n71% win rate across 7 trades.\nytd: +2.67%.\nnormal conditions.\nwedding 97 days out.\nexecute system.\n4:23am sunday. week 1 february complete. +$2,140 (0.48%) across 7 trades. 71% win rate = textbook. ytd +2.67% ($11,690 gain). post-earnings normalization: VIX 16.4, volume 3.7M stable. slippage 2.0 ticks. wedding may 10 now 97 days out (3 months, 1 week). rehearsal dinner venue search, honeymoon flights research. valentine\u0026rsquo;s first engaged. circuit breaker zero triggers. normal conditions continuing.\n-AK\n","date":"2 February 2025","externalUrl":null,"permalink":"/posts/2025-02-02-week-1-february-clean-start/","section":"Posts","summary":"\u003cp\u003eweek 1 february done.\u003c/p\u003e\n\u003cp\u003eclean start to new month.\u003c/p\u003e\n\u003cp\u003enormal conditions continuing.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 1 performance \n    \u003cdiv id=\"week-1-performance\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-1-performance\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003etrades:\u003c/strong\u003e 7\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ewins:\u003c/strong\u003e 5\u003c/p\u003e","title":"week 1 february - clean start, normal conditions continuing","type":"posts"},{"content":"january done.\n2025 started.\ntarget hit.\nsustainable approach validated.\njanuary final numbers # starting (jan 1): $437,800\nending (jan 31): $447,350\njanuary gain: +$9,550 (+2.18%)\ntrades: 29\nwins: 21\nlosses: 8\nwin rate: 72%\nFigure 1: January weekly performance showing consistent execution. Week 1 +$1,840 (71% wr, 7 trades), Week 2 +$2,280 (75% wr, 8 trades), Week 3 +$2,120 (67% wr, 6 trades), Week 4 +$2,840 (71% wr, 7 trades), Week 5 partial +$470 (67% wr, 3 trades mon-wed, paused thu-fri major earnings). Month ended +$9,550 (+2.18%). Consistent $2k+ weekly avg. Win rate variance 67-75% around 72% monthly avg = sustainable.\nweekly breakdown # Figure 2: Earnings season impact on January trading activity. Normal conditions weeks 1-2 (VIX 15.9-16.8, volume 3.6-3.8M). Earnings volatility week 3-4 (VIX peaked 20.1 jan 23, volume compressed 3.4M). Paused 3 days total: jan 22-23 (NFLX/TSLA), jan 29-30 (MSFT/AAPL/AMZN/META). Red zones = earnings pauses. Normal trading 26 days, paused 5 days. Pause decisions saved estimated -$3,200 potential losses during VIX spikes.\nweek 1 (jan 2-5): +$1,840, 71% wr, 7 trades\nweek 2 (jan 9-12): +$2,280, 75% wr, 8 trades\nweek 3 (jan 16-19): +$2,120, 67% wr, 6 trades\nweek 4 (jan 23-26): +$2,840, 71% wr, 7 trades\nweek 5 (jan 30-31): +$470, 67% wr, 3 trades (partial week, paused thu-fri earnings)\nconsistent weekly gains.\nno single strong week needed.\nthis is sustainable trading.\ncomparing to target # january target: +1.8% to +2.4%\njanuary actual: +2.18%\nresult: mid-range hit\nannual pace: +2.18% × 12 = +26.2%\nvs annual target: 15-18%\nahead of pace (expected - some months will be flat/losing).\ncomparing to 2024 january # 2024 january:\nstrong month.\n+$27,200 (+7.4%).\n2 explosive weeks carried month.\nset unrealistic pace.\n2025 january:\nmodest month.\n+$9,550 (+2.18%).\n4 consistent weeks, no explosions.\nsustainable pace.\ndifferent trajectory = expected.\nnot repeating 2024 strong january.\nrealistic variance.\nmarket conditions january # Figure 3: January market conditions summary. Average volume 3.6M contracts (stable post-holiday). VIX averaged 17.1 (optimal range 13-22, peak 20.1 jan 23 earnings). Correlation 0.60 (acceptable diversification). Regime stability 0.71 (stable). Slippage 2.1 ticks average (best 1.9 week 2, worst 2.3 week 4 earnings). Chicago colo preventing 3.5+ tick disaster. Conditions: favorable 80% of month, degraded 20% during earnings (paused correctly).\navg volume: 3.6M contracts\npost-holiday recovery stable.\navg VIX: 17.1\npeaked 20.1 during earnings (paused correctly).\navg correlation: 0.60\nacceptable diversification maintained.\navg regime stability: 0.71\nstable conditions most of month.\nearnings volatility:\npaused 3 days (jan 22-23, jan 29-30).\nVIX \u0026gt;19 both periods.\npause decisions validated.\nslippage tracking january # january avg: 2.1 ticks\nbest week: 1.9 ticks (week 2)\nworst week: 2.3 ticks (week 4 earnings)\nvs december avg: 2.5 ticks\nimprovement: -0.4 ticks (-16%)\npost-holiday liquidity returned.\nchicago colo + volume = clean fills.\nexecution quality excellent.\ncircuit breaker 2025 performance # triggered: 0 times\nclose calls: 0 times\nlargest loss: -$340 (jan 19 ETH)\npreventive measures:\npaused 3 days earnings volatility.\nfiltered out 18 marginal setups.\ncapital preserved.\ncircuit breaker never needed.\nphilosophy validated.\nrisk management stats # position sizing: $1,500 all trades (consistent)\nmax drawdown: -$340 (0.08%)\ntrades executed: 29\ntrades paused: 5 days (earnings)\nfilters avg: 68% acceptance\nregime confidence avg: 0.71\nselective execution = sustainable.\nlessons from january # 1. consistency \u0026gt; impressive\n4 weeks: $1,840, $2,280, $2,120, $2,840.\nstable $2k+ avg, no home runs needed.\nsustainable approach works.\n2. earnings pause = capital preservation\npaused 3 days VIX \u0026gt;19.\ncost ~$1,200 opportunity.\nsaved -$3,200+ potential losses.\nnet benefit +$2,000.\n3. 72% win rate sustainable\nweekly variance: 67% to 75% around 72% avg.\nregression to mean demonstrated.\nlong-term average validated.\n4. wedding planning = ongoing time sink\npaused 1 afternoon (invitations).\nrehearsal dinner planning upcoming.\nfamily \u0026gt; forced trades.\n5. post-holiday normalization\ndecember -1.86% losing month.\njanuary +2.18% modest recovery.\nvariance cycle normal.\nlife update - wedding 3.5 months out # planning progress:\ninvitations mailed jan 20 (45 guests).\nvenue confirmed (beach, may 2025).\nphotographer booked.\ncaterer locked (buffet tacos).\nupcoming:\nrehearsal dinner planning february.\nhoneymoon booking (hawaii).\nA\u0026rsquo;s mom compromised on most decisions.\nrelationship:\nliving together 15 months.\nengaged 3 months.\nplaces list: 34 (added home gym friday, risky during workout).\nsex life:\nstill incredible.\nwedding planning stress → more frequent.\nshe loves control when life chaotic.\nboth dealing with stress well.\ncomparing january 2023 vs 2024 vs 2025 # january 2023:\nlearning year.\nlost money.\nno confidence.\nemotional trading.\njanuary 2024:\nnotable month.\n+$27,200 (+7.4%).\n2 explosive weeks.\nset unrealistic pace.\njanuary 2025:\nsustainable month.\n+$9,550 (+2.18%).\n4 consistent weeks.\nrealistic pace.\ntransformation complete:\n2023: learning and losing.\n2024: standout but unsustainable.\n2025: modest and sustainable.\nthis is long-term algo trading.\nfebruary preview # expectations:\nnormal trading month (no major holidays).\nearnings season winding down.\nrealistic outcomes:\nmodest month: +1.5% to +2.5% ($6,700 to $11,200)\nflat month: -0.5% to +1.0% (-$2,200 to +$4,500)\ntarget: +1.8% to +2.2%\nsustainable pace.\nupcoming:\nrehearsal dinner planning.\nhoneymoon booking.\nnormal market conditions expected.\ntonight (january 31, 23:56pm) # january done.\n+$9,550 (+2.18%).\n72% win rate across 29 trades.\ntarget +1.8% to +2.4% hit mid-range.\n4 consistent weeks, no home runs needed.\npaused 3 days earnings (saved -$3.2k+ potential losses).\ncircuit breaker zero triggers.\nwedding 3.5 months out.\n2025 sustainable start.\nexecute system.\naccept variance.\nfamily \u0026gt; forced trades.\n11:56pm friday. january wrap. +$9,550 (2.18%) across 29 trades. 72% win rate. target +1.8% to +2.4% hit mid-range. 4 consistent weeks ($1,840, $2,280, $2,120, $2,840) + partial week 5 (+$470). paused 3 days earnings volatility (jan 22-23, 29-30) saved -$3,200 losses. slippage 2.1 ticks avg (improved from dec 2.5). comparing: jan 2024 notable +7.4% vs jan 2025 sustainable +2.18%. circuit breaker zero triggers. wedding may 2025 (3.5 months), invitations mailed, rehearsal dinner planning next. relationship stable, places list 34. sustainable start to 2025.\n-AK\n","date":"31 January 2025","externalUrl":null,"permalink":"/posts/2025-01-31-january-wrap-target-hit-sustainable-start/","section":"Posts","summary":"\u003cp\u003ejanuary done.\u003c/p\u003e\n\u003cp\u003e2025 started.\u003c/p\u003e\n\u003cp\u003etarget hit.\u003c/p\u003e\n\u003cp\u003esustainable approach validated.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ejanuary final numbers \n    \u003cdiv id=\"january-final-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#january-final-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (jan 1):\u003c/strong\u003e $437,800\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eending (jan 31):\u003c/strong\u003e $447,350\u003c/p\u003e","title":"january wrap - target hit, +2.18% sustainable start to 2025","type":"posts"},{"content":"week 4 january.\nfinal push toward month-end.\nearnings pause executed wednesday-thursday.\nweek 4 performance # trades: 7\nwins: 5\nlosses: 2\nwin rate: 71%\nweek gain: +$2,840 (+0.64%)\naccount: $446,880\nytd: +2.07%\ntrade breakdown # monday (jan 20): +$740 (ES momentum post-holiday)\ntuesday (jan 21): +$520 (SPX put spread)\nwednesday (jan 22): paused (earnings: NFLX, TSLA reports - VIX spiked 18.2)\nthursday (jan 23): paused (earnings volatility continuing)\nfriday (jan 24): +$860 (BTC recovery after earnings selloff)\nsaturday (jan 25): -$180 (stopped out ETH), +$620 (QQQ call spread)\nsunday (jan 26): +$280 (small ES momentum), -$140 (crypto alt reversal)\n71% win rate = back to average.\nearnings pause prevented potential disaster.\nearnings week volatility # major earnings this week:\nNFLX tuesday PM: missed, stock -12%.\nTSLA wednesday PM: beat, stock +8% (then reversed -5% thursday).\nVIX reaction:\ntuesday close: 16.8\nwednesday spike: 19.4 (+2.6 points)\nthursday peak: 20.1 (+3.3 from tuesday)\nmy action:\npaused wednesday-thursday (VIX \u0026gt;19).\nwaited for normalization.\nresumed friday (VIX back to 17.2).\ncost of pause: ~$800 opportunity (2-3 missed setups)\nvalue of pause: prevented potential -$2,000+ loss during volatility spike\nnet benefit: +$1,200\ncomparing weeks 1-2-3-4 # week 1: +$1,840, 71% wr, 7 trades\nweek 2: +$2,280, 75% wr, 8 trades\nweek 3: +$2,120, 67% wr, 6 trades\nweek 4: +$2,840, 71% wr, 7 trades\npattern:\nwin rates: 71% → 75% → 67% → 71% (variance around 71% avg).\nweekly gains: $1,840 → $2,280 → $2,120 → $2,840 (consistent $2k+ avg).\nsustainable monthly performance.\nmarket conditions week 4 # avg volume: 3.4M contracts (earnings week typical)\navg VIX: 18.3 (elevated from 17.4 week 3)\navg correlation: 0.64 (higher during earnings)\navg regime stability: 0.66 (lowest of month)\nconditions: degraded during earnings\nwednesday-thursday volatility spike.\nnormalized friday-sunday.\npause decision validated.\nslippage tracking week 4 # week 4 avg: 2.3 ticks\nytd avg: 2.1 ticks\ndegradation during earnings expected.\nfriday-sunday: 1.9 ticks (back to normal).\nwednesday-thursday paused: avoided 3.5+ tick disaster.\nchicago colo value proven again.\nytd progress final week # account jan 1: $437,800\naccount jan 26: $446,880\nytd gain: +$9,080 (+2.07%)\n4 weeks complete.\ntarget range: +1.8% to +2.4%\nhit target mid-range.\ncircuit breaker status # week 4: no triggers\nytd: 0 triggers\nclose calls: 0\nlargest loss: -$340 (jan 19 ETH)\npreventive philosophy:\npaused wednesday-thursday earnings.\nprevented circuit breaker activation.\nzero emergency brakes needed.\nupcoming month-end # remaining days: mon jan 27 - fri jan 31\nrealistic outcomes:\nconservative: +0 to +0.3% ($0 to $1,300) = finish +2.1% to +2.4%\nnormal: +0.3% to +0.5% ($1,300 to $2,200) = finish +2.4% to +2.6%\nmost likely: finish +2.2% to +2.4% month\nfinal account forecast: $447,400 to $448,300\ntarget achieved.\nlessons week 4 # 1. earnings pause = capital preservation\nVIX spiked 19.4 → 20.1 wednesday-thursday.\npaused both days.\nmissed ~$800 opportunity but avoided -$2k+ potential loss.\nnet benefit +$1,200.\n2. patience during volatility\ndidn\u0026rsquo;t force trades thursday when VIX elevated.\nwaited for friday normalization.\ndiscipline \u0026gt; FOMO.\n3. 71% win rate sustainable\n4-week variance: 71% → 75% → 67% → 71%.\nregression to mean demonstrated.\nlong-term average holds.\n4. consistent weekly gains\n$1,840 → $2,280 → $2,120 → $2,840 = $9,080 total.\nno single impressive week needed.\ngrind approach works.\n5. upcoming major earnings\nMSFT, AAPL, AMZN, META all report jan 29-30.\nplan: pause if VIX \u0026gt;20.\ncapital preservation priority.\ntonight (january 26, 4:19am) # week 4 january done.\n+$2,840 (+0.64%).\n71% win rate across 7 trades.\nytd: +2.07%.\nearnings pause wed-thu saved -$2k+ potential loss.\n5 days remaining january.\ntarget +2.2% to +2.4% achievable.\ncircuit breaker zero triggers.\nsustainable trading demonstrated.\n4:19am sunday. week 4 january complete. +$2,840 (0.64%) across 7 trades. 71% win rate back to avg. ytd +2.07% ($9,080 gain). paused wed-thu earnings volatility (NFLX, TSLA) - VIX spiked 19.4 → 20.1. pause cost ~$800 opportunity, saved -$2k+ potential loss, net +$1,200 benefit. slippage 2.3 ticks week (earnings), normalized 1.9 ticks fri-sun. 5 days remaining january, forecast finish +2.2% to +2.4%. major earnings jan 29-30 (MSFT, AAPL, AMZN, META). circuit breaker zero triggers.\n-AK\n","date":"26 January 2025","externalUrl":null,"permalink":"/posts/2025-01-26-week-4-january-final-push-earnings-pause/","section":"Posts","summary":"\u003cp\u003eweek 4 january.\u003c/p\u003e\n\u003cp\u003efinal push toward month-end.\u003c/p\u003e\n\u003cp\u003eearnings pause executed wednesday-thursday.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 4 performance \n    \u003cdiv id=\"week-4-performance\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-4-performance\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003etrades:\u003c/strong\u003e 7\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ewins:\u003c/strong\u003e 5\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003elosses:\u003c/strong\u003e 2\u003c/p\u003e","title":"week 4 january - final push before month-end, earnings pause executed","type":"posts"},{"content":"2 years with Interactive Brokers as primary broker.\ntime for honest review.\npython algo trading perspective.\nwhy IB for algo trading # chose IB january 2023 for 3 reasons:\nbest API documentation.\nglobal market access.\nlow commissions ($0.65/contract futures, $0.25/contract options).\nalternatives considered:\nTastyworks: options-focused, weaker API.\nTradeStation: good API, higher fees.\nTD Ameritrade: API getting deprecated (now Schwab).\nIB won on API quality + global access.\nthe API experience # ib_insync python library:\nclean wrapper around IB\u0026rsquo;s TWS API.\nasync/await support (critical for my setup).\nreal-time data streaming.\nconnection stability:\n99.7% uptime 2 years.\n3 disconnections total (all during TWS updates).\nreconnect logic handles automatically.\nexecution quality:\navg fill within 100ms.\nslippage tracking: 2.0 ticks avg with IB.\ncomparable to other brokers before chicago colo.\ndata quality:\nreal-time quotes solid.\nhistorical data sometimes gaps (use Polygon.io instead).\noverall API: 9/10\nclean, stable, well-documented.\nlearned a lot from NexusFi discussions about optimizing IB API connections for automated trading.\ncommission structure breakdown # futures (ES, NQ):\n$0.65 per contract.\n312 contracts traded 2024.\ntotal futures commissions 2024: $203\noptions (SPX, QQQ):\n$0.25 per contract ($0.50 round trip).\nestimate 180 option contracts traded 2024.\ntotal options commissions 2024: $45\ncrypto:\ndon\u0026rsquo;t trade crypto through IB (use Coinbase/Kraken).\nannual commission total: ~$250\nvs alternatives:\nTastyworks: $1/contract options = $180 vs IB $45.\nTradeStation: $1.50/contract futures = $468 vs IB $203.\nIB saves ~$400/year in commissions.\nworth it.\nmargin rates # current margin rate: 5.83% (tier 1: $0-$100k)\nmy usage:\nrarely use margin.\noccasional overnight futures positions.\n2024 margin interest paid: $47\nnegligible cost.\nbenefit:\nportfolio margin available (not using yet).\nallows complex option strategies.\nplatform quirks # trader workstation (TWS):\nugly AF interface (looks like windows 95).\ncrashes occasionally during updates.\nbut:\nAPI access stable (what matters).\ndon\u0026rsquo;t use TWS for trading (all python).\ngateway mode:\nheadless API server.\nruns on chicago colo server.\nzero crashes 9 months.\npreferred over TWS for automation.\ncustomer service # used 3 times 2 years:\nmargin call question (answered in 20 min).\nAPI connection issue (resolved same day).\ntax document question (answered next day).\nresponse times acceptable.\nphone support: haven\u0026rsquo;t used (API issues resolved via chat).\ndata fees # IB charges monthly data fees:\nUS equity real-time: $10/month.\nfutures real-time: $4.50/month.\nannual data cost: $174\nvs alternatives:\nPolygon.io subscription: $200/month ($2,400/year).\nIB data fees negligible compared.\nbut:\nhistorical data quality lower.\nuse Polygon for backtesting.\nIB for real-time execution only.\nsecurity \u0026amp; trust # regulatory:\nSEC registered, FINRA member.\nSIPC insured ($500k).\naccount security:\n2FA required.\nIP whitelist available.\ntrust level: high\nheld $400k+ without concern.\nwhat i\u0026rsquo;d change # historical data quality:\ngaps in minute-level data.\nforces external data provider (Polygon).\nTWS interface:\nembarrassingly ugly.\nneeds redesign (won\u0026rsquo;t happen).\nmobile app:\nclunky for monitoring.\nuse for account value check only.\nAPI rate limits:\n50 requests/second.\nhit occasionally during rapid development.\ncomparing to other brokers # vs Tastyworks:\nIB wins: API quality, commissions, global access.\nTastyworks wins: options-focused tools, UI.\nvs TradeStation:\nIB wins: commissions, global access.\nTradeStation wins: built-in backtesting, charting.\nvs Coinbase (crypto):\nIB loses: crypto selection weak.\nCoinbase wins: dedicated crypto platform.\nuse IB for traditional, Coinbase for crypto.\n2 year stats # account growth:\njan 2023: $400k starting.\njan 2025: $437.8k current.\ncommissions paid:\n2023: ~$280\n2024: ~$250\ntotal: $530 in 2 years\non $400k+ account = 0.13% total cost.\nnegligible.\nwould i switch? # no.\nIB API quality too good.\ncommissions too low.\nglobal access valuable (even if not using yet).\nstaying with IB.\nfor algo traders considering IB # pros:\nbest API documentation.\nib_insync python library excellent.\nlow commissions ($0.65 futures, $0.25 options).\nglobal market access.\n99.7% uptime.\nportfolio margin available.\ncons:\nTWS interface ugly (doesn\u0026rsquo;t matter for algo trading).\nhistorical data gaps (use external provider).\ndata fees monthly (but low vs alternatives).\nverdict: highly recommend\nif you\u0026rsquo;re coding python algos, IB is top choice.\ncommission savings alone worth it.\nresources that helped # ib_insync documentation:\nhttps://ib-insync.readthedocs.io/\ncomplete examples, async support.\nIB API docs:\nofficial TWS API reference.\ndense but thorough.\nNexusFi broker discussions:\nlearned optimization tricks from experienced algo traders.\nreddit r/algotrading:\nIB API troubleshooting threads.\ntonight (january 23, 2:34am) # 2 years with Interactive Brokers.\nAPI: 9/10 (clean, stable, well-documented).\ncommissions: $250/year (vs $650+ alternatives).\nuptime: 99.7% (3 disconnections total).\nstaying with IB.\nhighly recommend for python algo traders.\n2:34am thursday. Interactive Brokers 2-year review. API 9/10 (ib_insync library excellent, 99.7% uptime). commissions $250/year futures+options (saves $400 vs alternatives). margin rate 5.83%, used $47 interest 2024. quirks: TWS ugly, historical data gaps (use Polygon), monthly data fees $174/year. security: SEC/FINRA/SIPC, held $400k+ without concern. verdict: highly recommend for python algo traders. commission savings + API quality = staying with IB.\n-AK\n","date":"23 January 2025","externalUrl":null,"permalink":"/posts/2025-01-23-interactive-brokers-2-years-review-algo-trader-perspective/","section":"Posts","summary":"\u003cp\u003e2 years with Interactive Brokers as primary broker.\u003c/p\u003e\n\u003cp\u003etime for honest review.\u003c/p\u003e\n\u003cp\u003epython algo trading perspective.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ewhy IB for algo trading \n    \u003cdiv id=\"why-ib-for-algo-trading\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#why-ib-for-algo-trading\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003echose IB january 2023\u003c/strong\u003e for 3 reasons:\u003c/p\u003e","title":"interactive brokers - 2 years review from algo trader perspective","type":"posts"},{"content":"week 3 january done.\nconsistency maintained.\nearnings volatility starting.\nweek 3 performance # trades: 6\nwins: 4\nlosses: 2\nwin rate: 67%\nweek gain: +$2,120 (+0.48%)\naccount: $444,040\nytd: +1.43%\ntrade breakdown # monday (jan 13): +$520 (ES momentum continuation from friday)\ntuesday (jan 14): +$680 (SPX put credit spread)\nwednesday (jan 15): -$220 (stopped out QQQ call - earnings jitters)\nthursday (jan 16): paused (wedding planning - invitations finalized)\nfriday (jan 17): +$660 (crypto alt recovery)\nsaturday (jan 18): +$820 (BTC weekend momentum)\nsunday (jan 19): -$340 (ETH reversal caught me)\n67% win rate = regression to mean.\nexpected and healthy.\ncomparing weeks 1-2-3 # week 1: +$1,840, 71% wr, 7 trades\nweek 2: +$2,280, 75% wr, 8 trades\nweek 3: +$2,120, 67% wr, 6 trades\npattern:\nwin rate regressing (75% → 67%).\ngains stable ($1,840 → $2,280 → $2,120).\ntrades selective (7 → 8 → 6).\nsustainable consistency.\nmarket conditions week 3 # avg volume: 3.5M contracts (-0.1M from week 2)\nearnings season starting.\navg VIX: 17.4 (+1.5 from week 2)\nvolatility uptick expected.\navg correlation: 0.61 (+0.05 from week 2)\ndiversification reducing slightly.\navg regime stability: 0.69 (-0.07 from week 2)\nearnings uncertainty increasing.\nconditions: still acceptable but degrading.\nwatching for VIX \u0026gt;22 (pause threshold).\nslippage tracking week 3 # week 3 avg: 2.2 ticks\nweek 2 avg: 1.9 ticks\ndegradation: +0.3 ticks\nearnings weeks = wider spreads.\nexpected pattern.\nstill acceptable range.\nchicago colo preventing 3.5+ tick disaster.\nytd progress # account jan 1: $437,800\naccount jan 19: $444,040\nytd gain: +$6,240 (+1.43%)\n3 weeks complete.\non pace for +1.9% to +2.1% month.\ntarget range maintained.\ncircuit breaker status # week 3: no triggers\nclose calls: 0\nlargest loss: -$340 sunday ETH\nwell below -$1,500 threshold.\nrecovered mentally same day.\nphilosophy working.\nearnings season impact # major earnings this week:\nNFLX tuesday (caused wednesday pause).\nTSLA wednesday (volatility spike).\nupcoming major earnings:\nMSFT jan 29\nAAPL jan 30\nAMZN jan 30\nMETA jan 29\nplan:\nmonitor VIX daily.\nif VIX \u0026gt;22: pause trading.\ncapital preservation \u0026gt; forcing trades.\nwedding planning impact # thursday paused:\ninvitations finalized.\nA\u0026rsquo;s mom compromised on wording.\nmailed saturday jan 20.\ntime cost:\nmissed 2 potential setups thursday.\nestimated ~$400 opportunity cost.\nworth it:\nrelationship priorities maintained.\nA. appreciated backup vs her mom.\nrealistic january forecast update # current pace: +$6,240 in 3 weeks\nremaining: 1.5 weeks\nif sustained: +$9,360 full month (+2.14%)\nlikely outcomes:\ntarget hit: +2.0% to +2.3% ($8,800 to $10,100)\nearnings pause: +1.7% to +1.9% ($7,400 to $8,300)\nmost likely: +2.1% ($9,200 final)\non track.\nlessons week 3 # 1. win rate regression normal\n75% week 2 → 67% week 3.\nreturning to 65-72% long-term avg.\nvariance demonstrated.\n2. earnings weeks predictable\nVIX uptick, volume stable, correlation up.\ndegraded conditions.\nexpected pattern.\n3. wedding planning = ongoing time sink\nthursday pause necessary.\nmore coming (rehearsal dinner, honeymoon planning).\nfamily \u0026gt; forced trades.\n4. slippage variance acceptable\n1.9 ticks → 2.2 ticks with earnings.\nstill better than home setup (3.5+ ticks).\ncolo value proven.\n5. consistency \u0026gt; standout\n3 weeks: $1,840, $2,280, $2,120.\nstable gains, no home runs needed.\nthis is sustainable trading.\ntonight (january 19, 3:41am) # week 3 january done.\n+$2,120 (+0.48%).\n67% win rate across 6 trades.\nytd: +1.43%.\non pace for +2.1% month.\nearnings volatility arriving.\nVIX 17.4 watching for \u0026gt;22.\nwedding invitations mailed.\nconsistency maintained.\n3:41am sunday. week 3 january complete. +$2,120 (0.48%) across 6 trades. 67% win rate = regression from 75% week 2. ytd +1.43% on pace for +2.1% month. earnings season starting: VIX 17.4 (+1.5 from week 2), slippage 2.2 ticks (+0.3 from 1.9). major earnings upcoming (MSFT, AAPL, AMZN, META jan 29-30). paused thursday wedding invitations finalized, mailed jan 20. consistency over standout. sustainable trading.\n-AK\n","date":"19 January 2025","externalUrl":null,"permalink":"/posts/2025-01-19-week-3-january-consistency-maintained/","section":"Posts","summary":"\u003cp\u003eweek 3 january done.\u003c/p\u003e\n\u003cp\u003econsistency maintained.\u003c/p\u003e\n\u003cp\u003eearnings volatility starting.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 3 performance \n    \u003cdiv id=\"week-3-performance\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-3-performance\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003etrades:\u003c/strong\u003e 6\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ewins:\u003c/strong\u003e 4\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003elosses:\u003c/strong\u003e 2\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ewin rate:\u003c/strong\u003e 67%\u003c/p\u003e","title":"week 3 january - consistency maintained, earnings volatility arriving","type":"posts"},{"content":"mid-month january.\nhalfway point check.\non pace for target.\nmid-month performance # account jan 1: $437,800\naccount jan 17: $443,560\nytd gain: +$5,760 (+1.32%)\ntrades ytd: 19\nwins: 14\nlosses: 5\nwin rate: 74%\nhalfway through month.\npace: +2.6% if sustained.\ntarget range: +1.8% to +2.4%.\nweek 3 so far (jan 13-17) # trades: 4\nwins: 3\nlosses: 1\nweek gain: +$1,640 (+0.37%)\nmonday: +$520 (ES momentum)\ntuesday: +$680 (SPX put spread)\nwednesday: -$220 (stopped out QQQ)\nfriday: +$660 (crypto alt recovery)\npacing well.\nmarket conditions mid-month # avg volume: 3.6M contracts (stable)\navg VIX: 16.2 (optimal range)\navg correlation: 0.58 (good diversification)\navg regime stability: 0.74 (very stable)\nearnings season starting:\nvolatility uptick expected.\nwatching for VIX \u0026gt;22 (pause threshold).\nconditions: still favorable.\nslippage tracking ytd # january avg: 2.0 ticks\nbest week: 1.9 ticks (week 2)\nworst week: 2.1 ticks (week 1)\nvariance minimal.\nchicago colo advantage clear.\nliquidity + low latency = consistent execution.\ncomparing to 2024 january # 2024 jan mid-month:\nstrong pace.\n+$18,400 (+5.0% ytd).\non track for +7.4% month.\n2025 jan mid-month:\nmodest pace.\n+$5,760 (+1.32% ytd).\non track for +2.2% month.\ndifferent trajectory = expected.\nnot repeating 2024 strong january.\nsustainable variance.\ncircuit breaker status ytd # triggered: 0 times\nclose calls: 0 times\nlargest loss: -$340 (jan 5)\nwell below -$1,500 threshold.\npreventive philosophy working.\nrealistic january forecast update # current pace: +$5,760 in 2.5 weeks\nif sustained: +$9,216 full month (+2.1%)\nrealistic outcomes:\ntarget hit: +2.0% to +2.3% ($8,800 to $10,100)\nmodest overshoot: +2.4% to +2.6% ($10,500 to $11,400)\nslight miss: +1.7% to +1.9% ($7,400 to $8,300)\nmost likely: +2.1% to +2.3%\nexactly where i want to be.\nwhat\u0026rsquo;s working ytd # 1. consistent execution\n19 trades in 2.5 weeks.\nselective filtering (prevented ~15 marginal setups).\nquality maintained.\n2. 74% win rate sustainable\nabove 65-72% long-term avg.\nsome positive variance.\nexpect slight regression.\n3. position sizing discipline\n$1,500 all trades.\nno variance.\nrisk controlled.\n4. wedding pause acceptance\npaused friday jan 10 (invitations).\nchose relationship over forcing trades.\npriorities aligned.\nsecond half january plan # 2 weeks remaining:\nexpect 12-15 trades.\nmaintain 65-75% win rate.\nearnings volatility:\nwatching major tech earnings (MSFT, AAPL, AMZN late jan).\nmay pause if VIX spikes \u0026gt;22.\nwedding time sink:\ninvitations mailed jan 20.\nrehearsal dinner planning next week.\nmay pause 1-2 days as needed.\nlessons mid-month # 1. sustainable pace working\n+1.32% halfway = realistic.\nnot forcing notable performance.\n2. conditions favorable\nvolume stable, VIX optimal, correlation good.\nedge present, executing when available.\n3. wedding planning = time commitment\npaused 1 afternoon so far.\nexpect more pauses second half.\nfamily \u0026gt; forced trades.\n4. 74% win rate won\u0026rsquo;t sustain\npositive variance.\n65-72% more realistic long-term.\naccepting variance.\ntonight (january 17, 4:08am) # mid-month january check.\n+$5,760 (+1.32% ytd).\n74% win rate across 19 trades.\non pace for +2.1% to +2.3% month.\nconditions stable.\nearnings volatility coming.\nwedding planning accelerating.\nsustainable approach maintained.\n4:08am friday. mid-month january checkpoint. +$5,760 (1.32% ytd) across 19 trades. 74% win rate above avg. on pace for +2.1% to +2.3% full month (target range). conditions stable: VIX 16.2, volume 3.6M, correlation 0.58. slippage 2.0 ticks ytd avg. comparing 2024 jan +5.0% mid-month notable vs 2025 +1.32% modest sustainable. earnings volatility coming, wedding invitations mailed jan 20. circuit breaker zero triggers. realistic pace.\n-AK\n","date":"17 January 2025","externalUrl":null,"permalink":"/posts/2025-01-17-mid-month-check-on-pace-for-target/","section":"Posts","summary":"\u003cp\u003emid-month january.\u003c/p\u003e\n\u003cp\u003ehalfway point check.\u003c/p\u003e\n\u003cp\u003eon pace for target.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003emid-month performance \n    \u003cdiv id=\"mid-month-performance\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#mid-month-performance\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eaccount jan 1:\u003c/strong\u003e $437,800\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eaccount jan 17:\u003c/strong\u003e $443,560\u003c/p\u003e","title":"mid-month check - on pace for +2.2% target, conditions stable","type":"posts"},{"content":"wedding may 2025.\n3.5 months out.\nplanning chaos accelerating.\nA\u0026rsquo;s mom has opinions.\nthe vision clash # our plan:\ncasual beach wedding.\n45 people.\nbarefoot in sand.\ncraft beer + tacos.\nsunset ceremony.\nA\u0026rsquo;s mom wants:\nformal invitations (calligraphy $800).\nsit-down dinner ($125/person vs our $85 buffet).\nopen bar premium liquor ($3,500 vs our beer/wine $1,200).\nprofessional DJ ($1,800 vs our spotify playlist).\ncurrent war zone:\ninvitations (she won - ordered calligraphy).\ndinner style (we\u0026rsquo;re winning - buffet locked).\nbar selection (compromise - beer/wine + signature cocktail).\nDJ vs spotify (ongoing battle).\nthe numbers # original budget: $18,000\nvenue: $4,500\nphotographer: $4,500\ncaterer buffet: $3,800 (45 × $85)\nbeer/wine bar: $1,200\nflowers/decor: $1,500\nA\u0026rsquo;s dress: $1,200\nmy suit: $600\ninvitations DIY: $200\ntotal: $17,500\nA\u0026rsquo;s mom additions pushing:\ncalligraphy invites: +$600\npremium bar: +$2,300\nDJ: +$1,800\nupgraded flowers: +$800\nnew total would be: $23,000\nover budget $5,000.\nnope.\nfriday night (jan 10) - the argument # A\u0026rsquo;s mom: \u0026ldquo;weddings are once in a lifetime, you can\u0026rsquo;t do spotify.\u0026rdquo;\nme: \u0026ldquo;we literally can. it\u0026rsquo;s our wedding.\u0026rdquo;\nA\u0026rsquo;s mom: \u0026ldquo;what will people think?\u0026rdquo;\nA.: \u0026ldquo;mom, we want casual. this is us.\u0026rdquo;\nA\u0026rsquo;s mom: \u0026ldquo;you\u0026rsquo;ll regret not having a real DJ.\u0026rdquo;\nme: \u0026ldquo;i\u0026rsquo;ll regret spending $1,800 on someone to play the same songs i can queue.\u0026rdquo;\nA. (to me later): \u0026ldquo;thank you for backing me up. she\u0026rsquo;s a lot.\u0026rdquo;\nme: \u0026ldquo;we\u0026rsquo;re not doing formal wedding. beach, barefoot, tacos, done.\u0026rdquo;\nA.: \u0026ldquo;exactly. fuck the DJ.\u0026rdquo;\nthis is why i\u0026rsquo;m marrying her.\nwhat we agreed to # compromises made:\ncalligraphy invitations ($800 total).\nA\u0026rsquo;s mom paying difference above DIY budget.\nsignature cocktail at bar (+$350).\nupgraded bouquet for A. (+$200).\nour wins:\nbuffet dinner locked.\nbeer/wine bar (no premium).\nspotify playlist (fuck the DJ).\nbarefoot ceremony.\ncasual dress code.\ntotal budget: $19,050\nA\u0026rsquo;s mom covering: $1,050 overage\nwe\u0026rsquo;re paying: $18,000 (original budget)\nacceptable outcome.\ntherapy session (jan 14) # dr. r: \u0026ldquo;wedding planning. how\u0026rsquo;s that going?\u0026rdquo;\nme: \u0026ldquo;A\u0026rsquo;s mom wants formal, we want casual. fighting over every decision.\u0026rdquo;\ndr. r: \u0026ldquo;who\u0026rsquo;s winning?\u0026rdquo;\nme: \u0026ldquo;we are. mostly. gave her invitations and flowers. keeping everything else.\u0026rdquo;\ndr. r: \u0026ldquo;and how\u0026rsquo;s A. handling her mom?\u0026rdquo;\nme: \u0026ldquo;backing me up. told her mom \u0026lsquo;it\u0026rsquo;s our wedding.\u0026rsquo; first time i\u0026rsquo;ve seen her push back hard.\u0026rdquo;\ndr. r: \u0026ldquo;growth.\u0026rdquo;\nme: \u0026ldquo;yeah. usually she caves. not this time.\u0026rdquo;\ndr. r: \u0026ldquo;you two aligned on the vision.\u0026rdquo;\nme: \u0026ldquo;100%. beach, casual, us. not doing some formal bullshit to impress her mom\u0026rsquo;s friends.\u0026rdquo;\ndr. r: \u0026ldquo;and the sex life during stress?\u0026rdquo;\nme: \u0026ldquo;places list: 32. added her parents\u0026rsquo; pool house after christmas dinner (they were inside watching TV).\u0026rdquo;\ndr. r: (slight smile) \u0026ldquo;stress relief.\u0026rdquo;\nme: \u0026ldquo;best stress relief.\u0026rdquo;\ntrading impact # last week:\nmonday-thursday: normal trading.\nfriday afternoon: 3 hours invitations argument.\npaused trading friday.\nmissed 2 potential setups.\ncost: ~$600 opportunity.\nworth it:\nrelationship \u0026gt; forced trades.\nA. needed backup vs her mom.\npriorities aligned.\nwhat\u0026rsquo;s left to plan # booked already:\nvenue ✓\nphotographer ✓\ncaterer ✓\nflowers ✓ (upgraded bouquet)\ninvitations ✓ (calligraphy, mailed jan 20)\nstill need:\nfinalize bar menu (signature cocktail decision).\nmusic playlist (building spotify queue).\nrehearsal dinner plan (day before, small group).\nhoneymoon (thinking hawaii, 5 days).\n3.5 months to go.\ncomparing to A\u0026rsquo;s vision vs mine # A. wants:\nbeach ceremony sunset.\nbarefoot in sand.\nclose friends/family only.\ncasual vibe.\ngreat food (tacos/buffet).\nme:\nexactly same.\nwe\u0026rsquo;re aligned.\nA\u0026rsquo;s mom wants different wedding.\nnot happening.\nthe places list update # recent additions:\n31: new year\u0026rsquo;s eve balcony (neighbors definitely heard).\n32: her parents\u0026rsquo; pool house christmas night (risky AF).\n33: my home office desk friday morning (desk broke - fixed saturday).\nsex life:\nstill incredible.\nstress makes it better somehow.\nshe initiates more when wedding planning stresses her out.\nbondage last night:\nshe tied me up.\nedge play (holding back).\nshe loves control when life feels chaotic.\nboth came hard.\nstress relief confirmed.\ntonight (january 15, 1:23am) # wedding planning war zone.\nA\u0026rsquo;s mom wants formal.\nwe want casual beach vibe.\ncompromises made:\ngave her invitations ($800 calligraphy).\ngave her upgraded flowers (+$200).\nsignature cocktail at bar (+$350).\nour wins:\nbuffet dinner locked.\nbeer/wine bar (no premium).\nspotify playlist (no DJ).\nbarefoot ceremony.\ntotal: $19,050 (A\u0026rsquo;s mom paying $1,050 overage).\nA. backing me up vs her mom = growth.\npriorities: relationship \u0026gt; her mom\u0026rsquo;s vision.\n3.5 months to wedding.\n1:23am wednesday. wedding may 2025 planning chaos. A\u0026rsquo;s mom wants formal (DJ, premium bar, sit-down dinner). we want casual beach (spotify, beer/wine, buffet tacos). compromises: gave her calligraphy invitations ($800), upgraded flowers (+$200), signature cocktail (+$350). our wins: buffet locked, no DJ, beer/wine bar, barefoot ceremony. total $19,050, A\u0026rsquo;s mom paying $1,050 overage. A. pushed back against her mom (first time hard pushback). therapy: dr. r noted growth. places list: 33 (home office desk broke friday). sex life stress relief confirmed. 3.5 months out.\n-AK\n","date":"15 January 2025","externalUrl":null,"permalink":"/posts/2025-01-15-wedding-planning-stress-a-mom-vs-beach-vibe/","section":"Posts","summary":"\u003cp\u003ewedding may 2025.\u003c/p\u003e\n\u003cp\u003e3.5 months out.\u003c/p\u003e\n\u003cp\u003eplanning chaos accelerating.\u003c/p\u003e\n\u003cp\u003eA\u0026rsquo;s mom has opinions.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe vision clash \n    \u003cdiv id=\"the-vision-clash\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-vision-clash\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eour plan:\u003c/strong\u003e\u003c/p\u003e","title":"wedding planning stress - A's mom vs our beach vibe vision","type":"posts"},{"content":"week 2 january done.\nconsistency building.\nno home runs, just base hits.\nweek 2 performance # trades: 8\nwins: 6\nlosses: 2\nwin rate: 75%\nweek gain: +$2,280 (+0.52%)\naccount: $441,920\nytd: +0.94%\ntrade breakdown # monday (jan 6): +$340 (SPX put credit spread)\ntuesday: +$520 (ES momentum continuation)\nwednesday: -$240 (BTC reversal caught me), +$380 (recovered ETH long)\nthursday: +$460 (QQQ call spread)\nfriday: -$180 (stopped out ES), +$620 (crypto alt momentum), +$380 (end-of-week SPX)\n75% win rate = above long-term avg.\nsustainable pace.\ncomparing week 1 vs week 2 # week 1: +$1,840 (71% wr, 7 trades)\nweek 2: +$2,280 (75% wr, 8 trades)\nimprovement:\n+$440 more (+24%).\nwin rate +4%.\ntrades +1.\nbuilding consistency.\nmarket conditions week 2 # avg volume: 3.8M contracts\navg VIX: 15.9 (-0.9 from week 1)\navg correlation: 0.56\navg regime stability: 0.76\nconditions: improving\nliquidity strong.\nvolatility normalizing.\ndiversification good.\nedge present.\nslippage tracking # week 2 avg: 1.9 ticks\nweek 1 avg: 2.1 ticks\nimprovement: -0.2 ticks\nvolume increasing = tighter spreads.\nchicago colo advantage clear.\nexecution quality excellent.\nytd progress # account jan 1: $437,800\naccount jan 12: $441,920\nytd gain: +$4,120 (+0.94%)\n2 weeks complete.\non pace for +2.0% to +2.3% month.\nexactly target range.\ncircuit breaker status # week 2: no triggers\nclose calls: 0\nlargest loss: -$240 wednesday\nwell below -$1,500 threshold.\nrecovered same day.\nphilosophy working.\nwhat\u0026rsquo;s working # 1. selective execution\n15 total trades 2 weeks.\nfiltered out 12 marginal setups.\nquality \u0026gt; quantity.\n2. quick recovery\nwednesday -$240 BTC loss.\nrecovered +$380 ETH same day.\nmoved on immediately.\n3. consistent position sizing\n$1,500 all trades.\nno variance in risk.\ndiscipline maintained.\n4. regime awareness\nVIX 13-19 range = optimal.\ncorrelation \u0026lt;0.60 = diversified.\nonly trading when edge clear.\nwhat i\u0026rsquo;m watching # earnings season starting:\nvolatility could spike mid-month.\nplanning to pause if VIX \u0026gt;22.\ncrypto correlation increasing:\nBTC/ETH moving together more.\ndiversification benefit reducing.\nmay reduce crypto allocation.\nwedding planning stress:\ninvitations ordered friday.\nA\u0026rsquo;s mom won half the arguments.\ntime sink increasing.\nmay pause days as needed.\nrealistic january forecast update # current pace: +$4,120 in 2 weeks\nif sustained: +$8,240 full month (+1.88%)\nrealistic range: +1.8% to +2.4%\nmid-point: +2.1% = +$9,200\ntarget maintained.\nlessons week 2 # 1. consistency \u0026gt; home runs\n8 trades, 6 wins, modest gains.\nno standout days needed.\nsustainable approach.\n2. 75% win rate above avg\nlong-term target: 65-72%.\n75% = positive variance.\nexpect regression.\n3. recovery matters\n-$240 loss wednesday.\n+$380 recovery same day.\nnet positive.\n4. conditions improving\nvolume up, VIX down, correlation good.\njanuary shaping up well.\n5. wedding planning = grind\nfriday afternoon: 3 hours invitations.\nA. stressed, i helped.\npriorities.\ntonight (january 12, 3:55am) # week 2 january done.\n+$2,280 (+0.52%).\n75% win rate across 8 trades.\nytd: +0.94%.\non pace for +2.1% month.\nconsistency building.\nno home runs needed.\nexecute system.\n3:55am sunday. week 2 january complete. +$2,280 (0.52%) across 8 trades. 75% win rate above long-term avg. ytd +0.94% on pace for +2.1% month. slippage improved 2.1 → 1.9 ticks as volume increased. conditions improving: VIX normalizing, correlation good. wedding invitations ordered friday (A\u0026rsquo;s mom won half arguments). consistency over home runs. sustainable pace.\n-AK\n","date":"12 January 2025","externalUrl":null,"permalink":"/posts/2025-01-12-week-2-january-building-momentum/","section":"Posts","summary":"\u003cp\u003eweek 2 january done.\u003c/p\u003e\n\u003cp\u003econsistency building.\u003c/p\u003e\n\u003cp\u003eno home runs, just base hits.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 2 performance \n    \u003cdiv id=\"week-2-performance\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-2-performance\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003etrades:\u003c/strong\u003e 8\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ewins:\u003c/strong\u003e 6\u003c/p\u003e","title":"week 2 january - building momentum, consistency over home runs","type":"posts"},{"content":"parameter optimization = dangerous.\neasy to overfit historical data.\nwalk-forward validation = solution.\nthe overfitting problem # traditional optimization:\ntest parameters on full historical dataset.\npick best performing parameters.\ndeploy live.\nresult:\nparameters fit noise, not signal.\nlive performance tanks.\nclassic mistake.\nwalk-forward validation approach # concept:\nsplit data into chunks.\noptimize on in-sample period.\ntest on out-of-sample period.\nroll forward, repeat.\nprevents overfitting:\nparameters never see future data.\ntests solidness across different market regimes.\nthis is how real algo traders validate.\nlearned this approach on NexusFi from experienced quants discussing proper backtesting methodology.\nimplementation in python # basic walk-forward structure i use:\nimport pandas as pd import numpy as np from backtrader import Cerebro, Strategy from datetime import datetime, timedelta class WalkForwardOptimizer: def __init__( self, strategy_class, data, param_ranges, in_sample_days=365, out_sample_days=90, step_days=90 ): self.strategy_class = strategy_class self.data = data self.param_ranges = param_ranges self.in_sample_days = in_sample_days self.out_sample_days = out_sample_days self.step_days = step_days self.results = [] def generate_windows(self): \u0026#34;\u0026#34;\u0026#34;Create rolling in-sample and out-of-sample windows\u0026#34;\u0026#34;\u0026#34; start_date = self.data.index[0] end_date = self.data.index[-1] windows = [] current_start = start_date while current_start + timedelta(days=self.in_sample_days + self.out_sample_days) \u0026lt;= end_date: in_sample_end = current_start + timedelta(days=self.in_sample_days) out_sample_end = in_sample_end + timedelta(days=self.out_sample_days) windows.append({ \u0026#39;in_sample\u0026#39;: (current_start, in_sample_end), \u0026#39;out_sample\u0026#39;: (in_sample_end, out_sample_end) }) current_start += timedelta(days=self.step_days) return windows def optimize_parameters(self, data_slice): \u0026#34;\u0026#34;\u0026#34;Grid search optimization on in-sample data\u0026#34;\u0026#34;\u0026#34; best_params = None best_sharpe = -np.inf # Grid search over parameter ranges param_combinations = self._generate_param_grid() for params in param_combinations: cerebro = Cerebro() cerebro.addstrategy(self.strategy_class, **params) cerebro.adddata(data_slice) cerebro.broker.setcash(100000) # Run backtest results = cerebro.run() sharpe = self._calculate_sharpe(cerebro) if sharpe \u0026gt; best_sharpe: best_sharpe = sharpe best_params = params return best_params, best_sharpe def validate_parameters(self, params, data_slice): \u0026#34;\u0026#34;\u0026#34;Test parameters on out-of-sample data\u0026#34;\u0026#34;\u0026#34; cerebro = Cerebro() cerebro.addstrategy(self.strategy_class, **params) cerebro.adddata(data_slice) cerebro.broker.setcash(100000) results = cerebro.run() sharpe = self._calculate_sharpe(cerebro) total_return = (cerebro.broker.getvalue() - 100000) / 100000 return { \u0026#39;sharpe\u0026#39;: sharpe, \u0026#39;return\u0026#39;: total_return, \u0026#39;final_value\u0026#39;: cerebro.broker.getvalue() } def run_walk_forward(self): \u0026#34;\u0026#34;\u0026#34;Execute complete walk-forward validation\u0026#34;\u0026#34;\u0026#34; windows = self.generate_windows() for i, window in enumerate(windows): print(f\u0026#34;Window {i+1}/{len(windows)}\u0026#34;) # Get in-sample and out-of-sample data in_start, in_end = window[\u0026#39;in_sample\u0026#39;] out_start, out_end = window[\u0026#39;out_sample\u0026#39;] in_sample_data = self.data.loc[in_start:in_end] out_sample_data = self.data.loc[out_start:out_end] # Optimize on in-sample best_params, in_sample_sharpe = self.optimize_parameters(in_sample_data) # Validate on out-of-sample out_sample_results = self.validate_parameters(best_params, out_sample_data) # Store results self.results.append({ \u0026#39;window\u0026#39;: i + 1, \u0026#39;in_sample_period\u0026#39;: (in_start, in_end), \u0026#39;out_sample_period\u0026#39;: (out_start, out_end), \u0026#39;params\u0026#39;: best_params, \u0026#39;in_sample_sharpe\u0026#39;: in_sample_sharpe, \u0026#39;out_sample_sharpe\u0026#39;: out_sample_results[\u0026#39;sharpe\u0026#39;], \u0026#39;out_sample_return\u0026#39;: out_sample_results[\u0026#39;return\u0026#39;] }) return self.results def _generate_param_grid(self): \u0026#34;\u0026#34;\u0026#34;Generate all parameter combinations\u0026#34;\u0026#34;\u0026#34; import itertools keys = self.param_ranges.keys() values = self.param_ranges.values() combinations = [dict(zip(keys, v)) for v in itertools.product(*values)] return combinations def _calculate_sharpe(self, cerebro): \u0026#34;\u0026#34;\u0026#34;Calculate Sharpe ratio from backtest results\u0026#34;\u0026#34;\u0026#34; # Get returns from cerebro portfolio value portfolio_values = cerebro.broker.get_value_history() returns = pd.Series(portfolio_values).pct_change().dropna() if len(returns) == 0 or returns.std() == 0: return 0 sharpe = (returns.mean() / returns.std()) * np.sqrt(252) return sharpe # Example usage if __name__ == \u0026#34;__main__\u0026#34;: # Load market data data = pd.read_csv(\u0026#39;es_futures_5min.csv\u0026#39;, index_col=\u0026#39;datetime\u0026#39;, parse_dates=True) # Define parameter ranges to test param_ranges = { \u0026#39;lookback_period\u0026#39;: [10, 20, 30, 50], \u0026#39;volatility_threshold\u0026#39;: [0.5, 1.0, 1.5, 2.0], \u0026#39;stop_loss_pct\u0026#39;: [1.0, 1.5, 2.0], \u0026#39;take_profit_pct\u0026#39;: [2.0, 3.0, 4.0] } # Run walk-forward optimization optimizer = WalkForwardOptimizer( strategy_class=MyStrategy, data=data, param_ranges=param_ranges, in_sample_days=365, # 1 year in-sample out_sample_days=90, # 3 months out-of-sample step_days=90 # Roll forward 3 months ) results = optimizer.run_walk_forward() # Analyze results results_df = pd.DataFrame(results) print(f\u0026#34;Average out-of-sample Sharpe: {results_df[\u0026#39;out_sample_sharpe\u0026#39;].mean():.2f}\u0026#34;) print(f\u0026#34;Average out-of-sample return: {results_df[\u0026#39;out_sample_return\u0026#39;].mean():.2%}\u0026#34;) code doesn\u0026rsquo;t need to compile.\ndemonstrates architecture.\nwhat this prevents # overfitting example:\ntest lookback parameter from 5 to 100.\nbest in-sample: lookback=37 (sharpe 3.2).\nwalk-forward reveals:\nout-of-sample sharpe: 0.4 (terrible).\nparameter fit noise, not edge.\nreliable parameter example:\nlookback=20 in-sample sharpe: 1.8.\nout-of-sample sharpe: 1.6.\nslight degradation = expected.\nthis parameter is strong.\nmy parameter selection criteria # 1. stability across windows\nparameter performs consistently.\nnot strong one window, terrible next.\n2. degradation \u0026lt; 30%\nout-of-sample sharpe within 30% of in-sample.\nexample: in-sample 1.8, out-of-sample 1.3 = acceptable.\n3. positive in all windows\nnever negative out-of-sample sharpe.\neven during 2022 bear market.\n4. logical parameter values\nlookback=20 makes sense (4 week rolling).\nlookback=37 arbitrary = overfitting.\nreal-world adjustments # commission and slippage:\nadd realistic costs to backtest.\n2.5 ticks slippage avg (my chicago colo experience).\n$2.50 commission per contract.\nprevents strategies that look great on paper but fail live.\nposition sizing:\nfixed $1,500 position size.\nmatches live trading exactly.\nregime filters:\nonly trade when VIX 13-22.\npause when correlation \u0026gt;0.70.\nthese filters added AFTER parameter optimization.\ncomputational cost # full grid search:\n4 params × 4 values each = 256 combinations.\n10 walk-forward windows.\ntotal backtests: 2,560\nruntime: ~45 minutes on my san diego server rack.\nworth it:\nprevents deploying overfit garbage.\nmistakes i made early # 2023 mistake:\noptimized on full 2020-2023 dataset.\nfound \u0026ldquo;perfect\u0026rdquo; parameters.\ndeployed january 2024.\nlost $12k first month.\nparameters fit 2023 bull market.\n2024 regime change destroyed them.\nlesson learned:\nwalk-forward validation mandatory.\nnever trust single-period optimization.\ncurrent process # monthly:\nrun walk-forward validation on latest 2 years data.\ncheck parameter stability.\nif parameters degrading:\nresearch why (regime change? competition? slippage?).\nadjust or pause strategy.\nif parameters stable:\ncontinue trading.\nmonitor daily.\nthis is sustainable algo trading.\nresources that helped # books:\n\u0026ldquo;Evidence-Based Technical Analysis\u0026rdquo; by Aronson\n\u0026ldquo;Quantitative Trading\u0026rdquo; by Ernest Chan\nonline:\nNexusFi quant strategy discussions\nr/algotrading parameter optimization threads\npersonal experience:\n$180k tuition 2023 taught me this lesson hard.\ntonight (january 9, 2:48am) # walk-forward validation = mandatory.\nprevents overfitting.\ntests parameter robustness.\ncomputational cost worth it.\nsaved me from deploying overfit strategies multiple times.\nthis is how real algo traders validate.\n2:48am thursday. parameter optimization walk-forward validation. prevents overfitting by testing parameters on rolling out-of-sample windows. my process: 365-day in-sample optimization, 90-day out-of-sample validation, roll forward 90 days. criteria: degradation \u0026lt;30%, positive all windows, logical values. computational cost ~45 minutes for 2,560 backtests. lesson from 2023: lost $12k deploying overfit parameters. walk-forward mandatory now.\n-AK\n","date":"9 January 2025","externalUrl":null,"permalink":"/posts/2025-01-09-parameter-tuning-avoiding-overfitting-practical-approach/","section":"Posts","summary":"\u003cp\u003eparameter optimization = dangerous.\u003c/p\u003e\n\u003cp\u003eeasy to overfit historical data.\u003c/p\u003e\n\u003cp\u003ewalk-forward validation = solution.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe overfitting problem \n    \u003cdiv id=\"the-overfitting-problem\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-overfitting-problem\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003etraditional optimization:\u003c/strong\u003e\u003c/p\u003e","title":"parameter tuning - avoiding overfitting with walk-forward validation","type":"posts"},{"content":"week 1 january done.\nmodest start.\nconditions normalizing post-holidays.\nweek 1 performance # trades: 7\nwins: 5\nlosses: 2\nwin rate: 71%\nweek gain: +$1,840 (+0.42%)\naccount: $439,640\nytd: +0.42%\ntrade breakdown # monday (jan 2): +$620 (ES momentum)\ntuesday: +$240 (SPX put spread)\nwednesday: -$180 (stopped out QQQ call)\nthursday: +$480 (crypto alt momentum)\nfriday: -$340 (ES reversal caught me), +$720 (recovered BTC long), +$300 (end-of-week SPX)\nexactly 71% win rate = textbook.\nmarket conditions week 1 # avg volume: 3.4M contracts\npost-holiday recovery.\navg VIX: 16.8\nelevated from december 15.1.\navg correlation: 0.59\nacceptable diversification.\navg regime stability: 0.71\nstable post-election continuing.\nconditions: normal.\nliquidity returned.\nspreads tightened.\nexecution quality good.\ncomparing to 2024 january week 1 # 2024 jan week 1:\nnotable start.\n+$6,400 first week.\nset tone for +7.4% month.\n2025 jan week 1:\nmodest start.\n+$1,840 first week.\nrealistic pace.\nnot repeating 2024 standout january.\nsustainable variance.\nslippage tracking # week 1 avg: 2.1 ticks\nvs dec avg: 2.5 ticks\nimprovement: -0.4 ticks\nliquidity returned post-holidays.\nchicago colo + volume = clean fills.\nexpected range.\nwhat\u0026rsquo;s different january 2025 # mindset:\nzero pressure to repeat 2024.\naccept modest gains as success.\nexecution:\nselective (7 trades vs potential 15).\nfilters prevented 8 marginal setups.\npriorities:\nwedding planning starting (may 2025).\nA. stressed about invitations.\npaused thursday afternoon to help.\nrealistic january forecast # current pace: +$1,840 week 1\nif sustained: 4 weeks × $1,840 = $7,360 (+1.68%)\nrealistic outcomes:\nmodest month: +1.5% to +2.5% ($6,600 to $11,000)\nflat month: +0% to +1% ($0 to $4,400)\ntarget: finish +1.5% to +2.2%\nacceptable range.\ncircuit breaker status # week 1: no triggers\nclose calls: 0\nfriday loss -$340 well below -$1,500 threshold.\nrecovered same day (+$720 BTC).\nphilosophy working.\nlessons week 1 # 1. conditions matter\npost-holiday volume returned.\nexecution quality improved.\nedge restored.\n2. 71% win rate sustainable\nnot 92% like november.\nnot 28% like december.\ntextbook long-term average.\n3. selective execution prevents mistakes\n7 trades executed.\n8 filtered out.\nprotecting gains \u0026gt; quantity.\n4. wedding planning = time sink\nthursday afternoon: invitations with A.\nher mom wants formal, we want casual.\nwill compromise (we\u0026rsquo;ll win).\n5. modest start acceptable\n+0.42% first week = sustainable.\nnot forcing impressive performance.\nthis is long-term trading.\ntonight (january 5, 4:12am) # week 1 january done.\n+$1,840 (+0.42%).\n71% win rate across 7 trades.\nmodest start, normal conditions.\nytd: +0.42%.\nzero pressure.\nexecute system.\naccept variance.\n4:12am sunday. week 1 january complete. +$1,840 (0.42%) across 7 trades. 71% win rate = textbook sustainable. post-holiday volume returned, slippage improved 2.5 → 2.1 ticks. wedding planning starting (may 2025 - 4 months out), paused thursday afternoon for invitations with A. realistic january forecast: +1.5% to +2.2%. circuit breaker not triggered. modest start acceptable, not forcing impressive performance.\n-AK\n","date":"5 January 2025","externalUrl":null,"permalink":"/posts/2025-01-05-week-1-january-modest-start/","section":"Posts","summary":"\u003cp\u003eweek 1 january done.\u003c/p\u003e\n\u003cp\u003emodest start.\u003c/p\u003e\n\u003cp\u003econditions normalizing post-holidays.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 1 performance \n    \u003cdiv id=\"week-1-performance\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-1-performance\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003etrades:\u003c/strong\u003e 7\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ewins:\u003c/strong\u003e 5\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003elosses:\u003c/strong\u003e 2\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ewin rate:\u003c/strong\u003e 71%\u003c/p\u003e","title":"week 1 january - modest start, normal conditions returning","type":"posts"},{"content":"2025 begins.\ndecember losing month behind.\nannual 2024 +19.55% locked.\nclean slate.\n2024 final scorecard # starting (jan 1, 2024): $366,200\nending (dec 31, 2024): $437,800\nannual gain: +$71,600 (+19.55%)\ntotal trades: 312\nwin rate: 71%\nstrong months: 2 (jan, apr)\nmodest months: 9\nlosing months: 1 (dec)\ntarget range: 15-18%\nexceeded by: 1.55%\nsustainable variance demonstrated.\nwhat 2024 taught # lesson 1: 2 strong months carry the year\njanuary +7.4% and april +5.9% = $50,660 total.\n71% of annual gains from 2 months.\nother 10 months: grind modest gains, accept occasional loss.\nlesson 2: forced trades = disaster\ndecember paused 5 days (christmas, new year\u0026rsquo;s).\nchose family over forcing trades.\nstill lost -1.86% but minimized damage.\ncould\u0026rsquo;ve been -5%+ if forced 50 trades.\nlesson 3: circuit breaker philosophy works\ntriggered: 0 times entire year.\nclose calls: 3 times (may, oct, dec).\npreventive filters + voluntary pauses = capital preserved.\nnever needed emergency brake.\nlesson 4: infrastructure matters\nchicago colocation: $6,360 annual cost.\nslippage savings: $4,695 annual.\nnet cost: -$1,665/year.\nworth it:\ndisaster prevention (august saved $350+).\npsychological confidence.\nscalability for growth.\nlesson 5: relationship \u0026gt; everything\nchose A\u0026rsquo;s family thanksgiving over trading.\npaused christmas/new year\u0026rsquo;s for first time.\npriorities shifted.\nfirst year where life \u0026gt; forced trading.\n2025 starting point # account balance: $437,800\nytd: +0% (clean slate)\nwedding: may 2025 (4 months out)\nrelationship: engaged, living together 14 months\ninfrastructure: validated, stable\nstrategies: proven, sustainable\nmindset: zero pressure\njanuary expectations # realistic outcomes:\nmodest month: +1% to +2.5% ($4,400 to $11,000)\nflat month: -0.5% to +0.5% (-$2,200 to +$2,200)\nunlikely but possible:\nsignificant month: +3% to +5% ($13,000 to $22,000)\nlosing month: -1% to -3% (-$4,400 to -$13,000)\nmost likely: modest gain +1.5% to +2.2%\nzero pressure to repeat 2024.\ntarget: 15-18% annual again.\nwhat changed december → january # december:\n5 consecutive losing weeks.\n28% win rate (mean reversion from nov 92%).\nvolume -41% vs november.\npaused 5 days family time.\njanuary:\nvolume returning post-holidays.\nconditions normalizing.\nnormal activity resuming.\nexpect 65-75% win rate.\n25-30 trades projected.\ncircuit breaker reset # threshold unchanged:\n-$1,500 single day OR 3 consecutive losses.\npreventive measures:\nfilters avg acceptance: 70%\nregime confidence minimum: 0.65\nVIX range: 13-22 (pause outside)\nphilosophy validated 2024:\nzero triggers entire year.\n3 close calls prevented correctly.\ncontinuing 2025.\nlife priorities 2025 # old mindset (2023):\ntrading \u0026gt; everything.\nforce trades daily.\navoid feelings through work.\nnew mindset (2025):\nA. \u0026gt; trading.\nselective execution.\naccept variance, move on.\nwedding may 2025:\n4 months out.\nplanning chaos starting.\nwill pause days as needed.\nfamily \u0026gt; forced trades.\ntonight (jan 2, 3:27am) # 2025 begins.\n2024 +19.55% completed.\ndecember losing month accepted.\njanuary clean slate.\nzero pressure.\nrealistic expectations.\nsustainable mindset.\nexecute system.\naccept variance.\n3:27am thursday. 2025 trading year begins. 2024 closed +19.55% (+$71,600) exceeding 15-18% target. december -1.86% losing month demonstrated variance. january clean slate starting $437,800. realistic expectations: modest gain +1.5% to +2.2% likely. circuit breaker philosophy validated zero triggers 2024. wedding may 2025 (4 months). priorities: A. \u0026gt; trading, family \u0026gt; forced trades. sustainable mindset continuing.\n-AK\n","date":"2 January 2025","externalUrl":null,"permalink":"/posts/2025-01-02-new-year-trading-restart-clean-slate/","section":"Posts","summary":"\u003cp\u003e2025 begins.\u003c/p\u003e\n\u003cp\u003edecember losing month behind.\u003c/p\u003e\n\u003cp\u003eannual 2024 +19.55% locked.\u003c/p\u003e\n\u003cp\u003eclean slate.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003e2024 final scorecard \n    \u003cdiv id=\"2024-final-scorecard\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#2024-final-scorecard\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (jan 1, 2024):\u003c/strong\u003e $366,200\u003c/p\u003e","title":"new year trading restart - clean slate, zero pressure","type":"posts"},{"content":"2024 complete.\ntransformation year.\nlooking back, looking forward.\nthe numbers - 2024 annual # starting balance (jan 1): $366,200\nending balance (dec 31): $437,800\nannual gain: +$71,600 (+19.55%)\nannual target: +15-18%\nresult: exceeded by +1.55%\ntotal trades: 312\nwinning trades: 221\nlosing trades: 91\nwin rate: 71%\nmax monthly gain: +$27,200 (jan, +7.4%)\nmax monthly loss: -$8,300 (dec, -1.86%)\nbest month: april (+$23,460, +5.9%)\nworst month: december (-$8,300, -1.86%)\ncircuit breaker triggers: 0\n2024 monthly breakdown # impressive months (2):\njanuary: +$27,200 (+7.4%)\napril: +$23,460 (+5.9%)\ncombined: +$50,660 (71% of annual gains)\nmodest/normal months (7):\nfebruary: +$1,400 (+0.36%)\nmarch: +$1,100 (+0.28%)\nmay: +$3,500 (+0.83%)\njune: +$8,320 (+1.97%)\njuly: +$2,720 (+0.63%)\noctober: +$3,120 (+0.71%)\nnovember: +$1,320 (+0.30%)\ncombined: +$21,480 (30% of annual gains)\nsurvival month (1):\naugust: +$900 (+0.21%)\nlosing month (1):\ndecember: -$8,300 (-1.86%)\npattern:\n2 notable months carried year.\n7 modest months added steady gains.\n1 survival month preserved capital.\n1 losing month demonstrated variance.\nsustainable and realistic.\ncomparing 2023 vs 2024 # 2023 - learning year:\nstarted: $400,000 (inheritance post-parents death)\nended: $366,200\nresult: -$34,000 (-8.5%)\npaid $180k total tuition learning.\nemotional trading.\nno circuit breaker.\nsmall position sizes.\ndidn\u0026rsquo;t understand seasonality.\n2024 - transformation year:\nstarted: $366,200\nended: $437,800\nresult: +$71,600 (+19.55%)\ndisciplined execution.\ncircuit breaker active (never triggered).\nfull position sizes.\nfilters adapted to conditions.\n$105,600 swing (+19.55% vs -8.5%).\ntransformation complete.\nwhat changed - trading # 2023 mistakes:\nforced trades in bad conditions.\nrevenge trading after losses.\nno risk management.\nemotional decisions.\n2024 improvements:\nselective execution (filters working).\ncircuit breaker philosophy (preventive).\nposition sizing consistent.\nemotional control.\nsystem validated.\nwhat changed - personal # 2023:\nparents died december 31, 2022.\ninheritance $2M received january 2023.\nalone most of year.\nmet A. june 2023 (casual at first).\n2024:\nliving with A. (moved in nov 1, 2023).\nexclusive relationship (sept 2023).\nsaid \u0026ldquo;i love you\u0026rdquo; (oct 2023).\nproposed october 26, 2024.\nwedding may 2025 booked.\nfirst relationship thinking permanent.\nsystem performance analysis # win rate by month:\njan-apr: 76% avg (strong conditions)\nmay-aug: 68% avg (normal conditions)\nsep-nov: 74% avg (solid conditions)\ndecember: 28% (variance)\nannual average: 71%\ntarget: 65-75%\nright in middle of range.\nslippage performance:\nbest (april): 1.7 ticks avg\nworst (december): 2.5 ticks avg\nannual avg: 2.1 ticks\nchicago colocation roi validated.\nwithout colo: estimated 3.5+ ticks avg.\n$450-600/month colo cost = saved $3,000+ annually.\nfilter acceptance:\nhighest (june): 64% acceptance\nlowest (august): 39% acceptance\nannual avg: 56% acceptance\nfilters correctly adapted to seasonal conditions.\ncircuit breaker analysis 2024 # philosophy:\npreventive not reactive.\nfilters + voluntary pauses.\nperformance:\ntriggers: 0\nclose calls: 3\nmay week 3: -$1,420 (within $80)\noctober week 2: -$1,240 (within $260)\ndecember week 2: -$1,280 (within $220)\nall 3 stopped correctly before threshold.\nmax single day loss: -$1,700 (dec 31)\nthreshold: -$1,500 (came within $200)\npreventive philosophy working.\nfilters preventing disasters.\nvoluntary pauses preserving capital.\nnever let losses spiral.\nseasonal patterns discovered # strong months:\njanuary (post-holiday volume return): +7.4%\napril (optimal conditions): +5.9%\nseptember (post-labor day): +1.58%\nweak months:\naugust (summer doldrums): +0.21%\ndecember (holiday): -1.86%\npattern:\navoid forcing trades august/december.\ncapitalize jan/apr/sep opportunities.\npredictable seasonality.\nportfolio evolution 2024 # allocation changes:\njanuary: 60% options, 10% futures, 30% crypto\ndecember: 65% options, 10% futures, 25% crypto\nreasoning:\ncrypto correlation increasing.\nvolatility exhausting.\noptions more predictable.\n2025 target: maintain 65/10/25.\nrelationship transformation # june 2023: met A. at coffee shop\nseptember 2023: exclusive\noctober 2023: \u0026ldquo;i love you\u0026rdquo;\nnovember 2023: moved in together\noctober 2024: proposed\nmay 2025: wedding booked\nprogression:\nplayer lifestyle (multiple girlfriends, none \u0026gt;6 months).\n→ serious relationship (14+ months exclusive).\n→ living together (13+ months).\n→ engaged (2+ months).\n→ marriage ahead (4 months).\nfirst relationship no exit strategy.\ntherapy insights 2024 # dr. r key observations:\n\u0026ldquo;you\u0026rsquo;re choosing boring over exciting\u0026rdquo; (portfolio rebalance).\n\u0026ldquo;priorities shifted\u0026rdquo; (family \u0026gt; forced trades).\n\u0026ldquo;that\u0026rsquo;s growth\u0026rdquo; (wedding planning calm vs trading calm).\n\u0026ldquo;you\u0026rsquo;re not spiraling\u0026rdquo; (december losses accepted).\nmajor breakthrough:\nchristmas 2023: alone, traded to avoid feeling, lost $1,200.\nchristmas 2024: with A\u0026rsquo;s family, paused trading, lost -$8,300 total month but chose family time.\npriorities changed.\ngrowth.\nplaces list 2024 update # started year: ~10 places\nended year: 30 places\nnotable additions:\nmall parking garage (christmas shopping).\nwedding venue storage room (checking setup).\nher parents\u0026rsquo; guest room (christmas).\nbalcony new year\u0026rsquo;s countdown.\nsex life:\nbest either of us have had.\nopen communication about fantasies/limits.\nfrequency up 40% since engagement (wedding stress).\nrelationship:\nkinky, adventurous, trusting.\nbondage, dom/sub (switch), toys, public play.\ntotal openness.\nlessons learned 2024 # 1. notable months carry the year\njan +7.4% + apr +5.9% = 71% of annual gains.\ndon\u0026rsquo;t need every month strong.\n2. modest months compound\n7 modest months averaging +1% each.\n+1% × 12 months = 12% annual.\nboring but sustainable.\n3. losing months acceptable\ndecember -1.86% didn\u0026rsquo;t break year.\nannual still +19.55%.\nvariance is normal.\n4. circuit breaker philosophy works\nnever triggered but prevented disasters.\nfilters + voluntary pauses.\npreventive \u0026gt; reactive.\n5. seasonal patterns real\naugust/december weak.\njan/apr/sep strong.\nplan so.\n6. family \u0026gt; trading\npaused 5 days christmas/new year\u0026rsquo;s.\nchose A\u0026rsquo;s family time.\npriorities shifted.\ngrowth.\nmistakes made 2024 # 1. december forced some trades\n25 trades vs optimal 15-20.\ncould\u0026rsquo;ve paused more days.\nlesson: be even more selective holidays.\n2. crypto rebalance delayed\nshould\u0026rsquo;ve reduced july-august.\nwaited until december.\nlesson: execute rebalances faster.\n3. slippage acceptance\n2.5 ticks december = too high.\nshould\u0026rsquo;ve paused more.\nlesson: zero edge = don\u0026rsquo;t trade.\nwhat i\u0026rsquo;m proud of 2024 # trading:\n+19.55% annual exceeded target.\ncircuit breaker never triggered.\ndisciplined execution maintained.\nseasonal patterns learned.\npersonal:\nproposed to A.\nwedding may 2025 booked.\nchristmas with her family (first since parents died).\nchose family over trading multiple times.\ngrowth:\nemotional control improved.\npriorities shifted.\nthinking long-term not short-term.\ntransformation complete.\nlooking ahead - 2025 targets # trading:\nannual target: +15-18% (same as 2024)\nmaintain 65/10/25 allocation\nselective execution (quality \u0026gt; quantity)\ncontinue circuit breaker philosophy\npersonal:\nwedding may 2025\nhoneymoon planning\ncontinue therapy weekly\nrelationship:\nmarriage ahead\nA. becomes wife\nher family becomes my family officially\nrealistic expectations:\n2024 +19.55% was strong.\n2025 target +15-18% more sustainable.\noccasional losing months acceptable.\nfocus on long-term consistency.\nfinal thoughts - 2 years transformation # december 31, 2022:\nparents killed in car crash.\nreceived $2M inheritance.\nage 19, alone, grieving.\ndecember 31, 2023:\nlost $180k learning to trade.\nmet A. june 2023 (casual).\nage 20, hopeful but uncertain.\ndecember 31, 2024:\n+$71,600 trading profit.\nengaged to A.\nage 21, certain about future.\nwedding may 2025.\n2 years:\nfrom grief to growth.\nfrom loss to profit.\nfrom alone to engaged.\nfrom uncertain to certain.\ntransformation complete.\ntonight (january 1, 2:34am) # 2024 done.\n+$71,600 (+19.55%).\n312 trades, 71% win rate.\ncircuit breaker never triggered.\n2 significant months carried year.\n7 modest months compounded.\n1 survival month preserved capital.\n1 losing month demonstrated variance.\nengaged to A.\nwedding may 2025.\nchristmas with her family (first since parents died).\npriorities shifted:\nfamily \u0026gt; trading.\nrelationship \u0026gt; career.\nlong-term \u0026gt; short-term.\n2025 begins.\nrealistic targets.\nsustainable approach.\nwedding ahead.\ntransformation complete.\n2:34am wednesday. 2024 year-end review. annual +$71,600 (19.55%) exceeded 15-18% target. 312 trades, 71% win rate, 0 circuit breaker triggers. 2 strong months (jan +7.4%, apr +5.9%) carried 71% of gains. 7 modest months compounded. 1 losing month (dec -1.86%) demonstrated variance. engaged october 26, wedding may 2025 booked. christmas with A\u0026rsquo;s family (first real christmas since parents died). 2 years transformation: from $400k inheritance to $438k account, from grief to engaged, from alone to family. priorities shifted: chose family over forced trades december. 2025 target 15-18% annual, maintain discipline, wedding ahead. transformation complete.\n-AK\n","date":"1 January 2025","externalUrl":null,"permalink":"/posts/2025-01-01-year-end-2024-review-transformation-complete/","section":"Posts","summary":"\u003cp\u003e2024 complete.\u003c/p\u003e\n\u003cp\u003etransformation year.\u003c/p\u003e\n\u003cp\u003elooking back, looking forward.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe numbers - 2024 annual \n    \u003cdiv id=\"the-numbers---2024-annual\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-numbers---2024-annual\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting balance (jan 1):\u003c/strong\u003e $366,200\u003c/p\u003e","title":"2024 year-end review - transformation complete, wedding ahead","type":"posts"},{"content":"","date":"1 January 2025","externalUrl":null,"permalink":"/tags/annual-review/","section":"Tags","summary":"","title":"Annual-Review","type":"tags"},{"content":"december done.\n2024 done.\nfirst losing month since learning.\nannual still notable.\ndecember final numbers # starting (dec 1): $446,100\nending (dec 31): $437,800\ndecember loss: -$8,300 (-1.86%)\ntrades: 25\nwins: 7\nlosses: 18\nwin rate: 28%\nFigure 1: December weekly performance - five consecutive losing weeks. Week 1 -$820 (50% wr, 6 trades), Week 2 -$1,760 (29% wr, 7 trades), Week 3 -$2,340 (40% wr, 5 trades), Week 4 -$1,260 (33% wr, 3 trades - Christmas pause), Week 5 -$2,120 (25% wr, 4 trades - New Year\u0026rsquo;s). Month ended -$8,300 (-1.86%). Win rate collapsed from November 92% to December 28% = mean reversion. All five weeks losing = variance clustering.\nweekly breakdown # Figure 2: Holiday impact on December volume. Gradual decline Dec 1-23 from 3.2M to 2.4M avg daily contracts. Christmas week (Dec 24-26) dropped to 1.5M avg (-50% vs month start). New Year\u0026rsquo;s Eve (Dec 31) recovered to 2.0M. Month averaged 2.3M contracts vs November 3.9M (-41% decline). Red zone = Christmas pause. Orange zone = New Year\u0026rsquo;s pause. Holiday liquidity drought compressed edge.\nweek 1 (dec 2-6): -$820, 50% wr, 6 trades\nweek 2 (dec 9-13): -$1,760, 29% wr, 7 trades\nweek 3 (dec 16-20): -$2,340, 40% wr, 5 trades\nweek 4 (dec 23-27): -$1,260, 33% wr, 3 trades (christmas pause)\nweek 5 (dec 30-31): -$2,120, 25% wr, 4 trades (new year\u0026rsquo;s)\n5 consecutive losing weeks.\nlongest losing streak 2024.\ncomparing to previous months 2024 # january: +$27,200 (+7.4%) - strong\nfebruary: +$1,400 (+0.36%) - flat\nmarch: +$1,100 (+0.28%) - testing\napril: +$23,460 (+5.9%) - notable\nmay: +$3,500 (+0.83%) - normal\njune: +$8,320 (+1.97%) - modest\njuly: +$2,720 (+0.63%) - modest\naugust: +$900 (+0.21%) - survival\nseptember: +$6,860 (+1.58%) - modest\noctober: +$3,120 (+0.71%) - modest\nnovember: +$1,320 (+0.30%) - flat\ndecember: -$8,300 (-1.86%) - losing\npattern consistent:\n2 impressive.\n7 modest/flat/survival.\n1 losing.\nsustainable variance demonstrated.\nannual 2024 final # Figure 3: Year-to-date 2024 monthly progression final. Two notable months (Jan +7.4%, Apr +5.9%) carried year at +$50,660 combined (71% of annual gains). Seven modest/flat months (Feb-Nov excluding Apr) added +$29,200 total. One losing month (Dec -1.86%) demonstrated realistic variance. Annual total +$71,600 (+19.55%). Target range 15-18% (green zone) exceeded by 1.55%. Sustainable pattern: rely on occasional impressive months, grind modest months, accept occasional losses.\nstarting balance (jan 1): $366,200\nending balance (dec 31): $437,800\nannual gain: +$71,600 (+19.55%)\nannual target: 15-18%\nexceeded by: 1.55%\ntotal trades: 312\nwins: 221\nlosses: 91\nannual win rate: 71%\ncircuit breaker 2024 performance # triggered: 0 times\nclose calls:\nmay week 3: -$1,420 (within $80)\noctober week 2: -$1,240 (within $260)\ndecember week 2: -$1,280 (within $220)\npreventive measures worked.\nfilters adapted correctly.\nstopped losses before spiral.\ncircuit breaker philosophy validated.\nmarket conditions december # avg volume: 2.3M contracts (-41% vs nov)\nholiday liquidity drought.\navg VIX: 17.2 (elevated from nov 15.1)\navg correlation: 0.64 (higher than normal)\navg regime stability: 0.62 (lowest 2024)\nworst conditions of year.\nholiday trading = edge compressed.\nslippage tracking december # december avg: 2.5 ticks\nnovember avg: 1.9 ticks (+32% worse)\nannual best (april): 1.7 ticks (+47% worse)\nlow volume = wider spreads.\nchicago colo preventing 4+ tick disaster.\nbut can\u0026rsquo;t overcome liquidity drought.\nlessons from december # 1. losing months happen\nfirst losing month since 2023 learning.\n-1.86% acceptable variance.\nannual +19.55% makes december irrelevant.\n2. mean reversion is real\nnovember: 92% win rate.\ndecember: 28% win rate.\nregression to 71% annual avg.\n3. holiday conditions predictable\nvolume -41%, VIX elevated, correlation high.\nedge = zero.\npausing 5 days correct decision.\n4. circuit breaker philosophy working\n3 close calls, 0 triggers.\npreventive filters + voluntary pauses.\ncapital preserved.\n5. family \u0026gt; forced trades\npaused christmas/new year\u0026rsquo;s.\nchose time with A\u0026rsquo;s family.\npriorities shifted.\ngrowth.\ncomparing december 2023 vs 2024 # december 2023:\nstill learning.\nemotional trading.\nchristmas alone (traded to avoid feeling).\nlost $1,200 christmas eve/day.\ndecember 2024:\nvalidated strategies.\ndisciplined execution.\nchristmas with A\u0026rsquo;s family (paused 3 days).\nlost -$8,300 total month.\nloss larger but experience completely different.\nchose family over forcing trades.\ngrowth.\ntherapy reflection (12/28) # dr. r: \u0026ldquo;december rough. -$8,300. thoughts?\u0026rdquo;\nme: \u0026ldquo;first losing month since learning. sucks but acceptable. annual still +19.6%.\u0026rdquo;\ndr. r: \u0026ldquo;you\u0026rsquo;re not spiraling.\u0026rdquo;\nme: \u0026ldquo;nope. variance happens. december always rough (holidays). paused 5 days for family time. chose right.\u0026rdquo;\ndr. r: \u0026ldquo;year ago you\u0026rsquo;d have forced trades.\u0026rdquo;\nme: \u0026ldquo;year ago i did force trades. christmas 2023 alone, lost $1,200. this year with A\u0026rsquo;s family, lost more but felt better.\u0026rdquo;\ndr. r: \u0026ldquo;priorities.\u0026rdquo;\nexactly.\nwhat december taught me # old mindset:\nlosing = failure.\nmust fix immediately.\nforce trades until winning.\nnew mindset:\nlosing = variance.\naccept and move on.\nforcing trades = certain disaster.\ndecember:\n5 consecutive losing weeks.\ncould\u0026rsquo;ve forced 50+ trades.\nchose:\naccepted variance.\nselective execution (25 trades vs 40+).\npaused 5 days family time.\nminimized damage.\n-1.86% vs potential -5%+.\nlife update - engaged # wedding planning:\nmay 2025 (5 months out).\nvenue booked, caterer booked, photographer booked.\ninvitations designed (casual beach vibe won).\nrelationship:\n14 months living together.\n2 months engaged.\nplaces list: 30 (balcony new year\u0026rsquo;s countdown).\nfirst relationship thinking permanent.\ntonight (december 31, 11:58pm) # december done.\n-$8,300 (-1.86%).\n28% win rate.\n5 consecutive losing weeks.\nfirst losing month since 2023.\nannual 2024:\n+$71,600 (+19.55%).\nexceeded 15-18% target.\n312 trades, 71% win rate.\ncircuit breaker never triggered.\nengaged to A.\nwedding may 2025.\nchristmas with her family (first real christmas since parents died).\n2 years transformation complete.\n2025 begins tomorrow.\n11:58pm tuesday. december wrap. -$8,300 (1.86%). 28% win rate across 25 trades. five consecutive losing weeks (longest streak 2024). mean reversion from november 92% wr. volume -41% vs november. paused 5 days christmas/new year\u0026rsquo;s with A\u0026rsquo;s family. annual 2024 +$71,600 (19.55%) exceeded target. 2 notable months, 7 modest, 1 losing = sustainable variance. circuit breaker never triggered. engaged to A., wedding may 2025. priorities shifted: family \u0026gt; forced trades. transformation complete.\n-AK\n","date":"31 December 2024","externalUrl":null,"permalink":"/posts/2024-12-31-december-wrap-losing-month-annual-exceptional/","section":"Posts","summary":"\u003cp\u003edecember done.\u003c/p\u003e\n\u003cp\u003e2024 done.\u003c/p\u003e\n\u003cp\u003efirst losing month since learning.\u003c/p\u003e\n\u003cp\u003eannual still notable.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003edecember final numbers \n    \u003cdiv id=\"december-final-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#december-final-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (dec 1):\u003c/strong\u003e $446,100\u003c/p\u003e","title":"december wrap - first losing month since 2023, annual still standout","type":"posts"},{"content":"final week 2024 done.\nnew year\u0026rsquo;s approaching.\nyear ends strong despite december.\nweek 5 numbers # starting (dec 30): $439,920\nending (dec 31): $437,800\nweek gain: -$2,120 (-0.48%)\ntrades: 4\nwins: 1\nlosses: 3\nwin rate: 25%\npattern:\ntraded mon-tue (dec 30-31).\npaused wed (jan 1 new year\u0026rsquo;s).\nshortest week.\ndaily breakdown # monday (dec 30): -$840, 2 trades, 0% wr\nboth setups failed.\nyear-end position squaring.\ntuesday (dec 31): -$1,280, 2 trades, 50% wr\n+$420 first trade.\n-$1,700 second trade (stopped out).\nfinal trade 2024: -$1,700 loss.\nwednesday (jan 1): paused, new year\u0026rsquo;s day\n2 trading days, 4 trades total.\ndecember final (5 weeks) # week 1: -$820 (-0.18%)\nweek 2: -$1,760 (-0.40%)\nweek 3: -$2,340 (-0.53%)\nweek 4: -$1,260 (-0.29%)\nweek 5: -$2,120 (-0.48%)\ndecember total: -$8,300 (-1.86%)\ndecember as expected: losing month.\nyear-end numbers 2024 # starting balance (jan 1, 2024): $366,200\nending balance (dec 31, 2024): $437,800\nannual gain: +$71,600 (+19.55%)\nannual target: 15-18%\nexceeded target by: 1.55%\n2024 = success.\nmarket conditions week 5 # volume: 2.1M contracts avg\nslightly better than christmas week.\nstill -43% vs november.\nVIX: 17.9 (elevated)\nyear-end positioning:\ninstitutions squaring books.\nretail light participation.\nedge compressed.\n2024 monthly breakdown # january: +$27,200 (+7.4%) - impressive\nfebruary: +$1,400 (+0.36%) - flat\nmarch: +$1,100 (+0.28%) - testing\napril: +$23,460 (+5.9%) - standout\nmay: +$3,500 (+0.83%) - normal\njune: +$8,320 (+1.97%) - modest\njuly: +$2,720 (+0.63%) - modest\naugust: +$900 (+0.21%) - survival\nseptember: +$6,860 (+1.58%) - modest\noctober: +$3,120 (+0.71%) - modest\nnovember: +$1,320 (+0.30%) - flat\ndecember: -$8,300 (-1.86%) - losing\npattern:\n2 significant months (jan, apr).\n7 modest/normal/flat months (feb, mar, may, jun, jul, oct, nov).\n1 survival month (aug).\n1 losing month (dec).\nsustainable variance demonstrated.\n2024 win rate stats # total trades: 312\nwins: 221\nlosses: 91\nannual win rate: 71%\ntarget: 65-75%\nright in middle of range.\ncircuit breaker 2024 summary # triggered: 0 times\nclose calls: 3\nmay week 3: -$1,420 (within $80)\noct week 2: -$1,240 (within $260)\ndec week 2: -$1,280 (within $220)\npreventive measures worked.\nfilters adapted correctly.\nnever let losses spiral.\nlessons from december # 1. losing months happen\nfirst losing month since learning curve 2023.\n-1.86% acceptable variance.\nannual +19.55% still notable.\n2. holiday conditions predictable\nvolume -43% vs normal.\nVIX elevated.\nedge compressed december.\n3. selective execution critical\ndecember: 30 trades vs normal 35-40/month.\nfilters rejected 68% setups.\ncapital preserved.\n4. family \u0026gt; forced trades\npaused 5 days christmas/new year\u0026rsquo;s.\nchose A\u0026rsquo;s family time.\npriorities shifted.\ngrowth.\ncomparing 2023 vs 2024 # 2023:\nstarted: $400k (inheritance).\nended: $366,200.\nresult: -$34k (-8.5%).\npaid $180k in tuition learning.\n2024:\nstarted: $366,200.\nended: $437,800.\nresult: +$71,600 (+19.55%).\ntransformation complete.\nwhat changed 2023 → 2024 # 2023:\nemotional trading.\nno circuit breaker.\nforced trades in bad conditions.\nsmall position sizes (learning).\n2024:\ndisciplined execution.\ncircuit breaker active (never triggered).\nfilters adapted to conditions.\nfull position size.\nsystem validated.\nnew year\u0026rsquo;s eve with A. # plan:\nquiet night at apartment.\nno parties (we\u0026rsquo;re old now apparently).\n10pm:\nchampagne toast.\n10:30pm:\nsex (places list #30 - balcony, new year\u0026rsquo;s countdown).\nmidnight:\nwatched fireworks from balcony.\nsimple.\nperfect.\nreflection - 2 years since parents died # december 31, 2022:\nparents killed in car crash.\nreceived $2M inheritance.\ndecember 31, 2023:\nlost $180k learning to trade.\nalone on new year\u0026rsquo;s.\nA. existed but not living together yet.\ndecember 31, 2024:\n+$71,600 trading profit.\nengaged to A.\nwedding may 2025.\ntransformation.\ntonight (december 30, 11:41pm) # final week 2024 done.\n-$2,120 (-0.48%).\n25% win rate across 4 trades.\ndecember final: -$8,300 (-1.86%).\n2024 annual: +$71,600 (+19.55%).\nexceeded 15-18% target.\n2 notable months.\n7 modest months.\n1 survival month.\n1 losing month.\nsustainable variance.\nsystem validated.\nengaged to A.\nwedding may 2025.\n2025 begins tomorrow.\n11:41pm monday. final week 2024. -$2,120 (0.48%). 25% win rate across 4 trades. december final -$8,300 (1.86%) - first losing month since 2023 learning. 2024 annual +$71,600 (19.55%) exceeded target by 1.55%. 2 standout months, 7 modest, 1 survival, 1 losing = sustainable variance. annual win rate 71% (target 65-75%). circuit breaker never triggered. engaged to A., wedding may 2025. 2 years since parents died. transformation complete.\n-AK\n","date":"30 December 2024","externalUrl":null,"permalink":"/posts/2024-12-30-week-5-new-years-final-week-year-end/","section":"Posts","summary":"\u003cp\u003efinal week 2024 done.\u003c/p\u003e\n\u003cp\u003enew year\u0026rsquo;s approaching.\u003c/p\u003e\n\u003cp\u003eyear ends strong despite december.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 5 numbers \n    \u003cdiv id=\"week-5-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-5-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (dec 30):\u003c/strong\u003e $439,920\u003c/p\u003e","title":"week 5 new year's - final week 2024, small loss, year ends strong","type":"posts"},{"content":"christmas week done.\npaused dec 24-26 as planned.\nsmall loss acceptable.\nweek 4 numbers # starting (dec 23): $441,180\nending (dec 27): $439,920\nweek gain: -$1,260 (-0.29%)\ntrades: 3\nwins: 1\nlosses: 2\nwin rate: 33%\npattern:\ntraded mon-tue (dec 23-24).\npaused wed-fri (dec 25-27 christmas).\nresumed friday afternoon (1 trade).\nselective execution.\ndaily breakdown # monday (dec 23): -$680, 1 trade, 0% wr\npre-christmas volatility.\nstopped out.\ntuesday (dec 24): +$340, 1 trade, 100% wr\nchristmas eve morning only.\npaused 12pm for family time.\nwednesday (dec 25): $0, 0 trades\nchristmas day - family time with A\u0026rsquo;s family.\nthursday (dec 26): $0, 0 trades\nboxing day - extended family time.\nfriday (dec 27): -$920, 1 trade, 0% wr\npost-christmas resume.\nsingle setup failed.\n3 trades total vs normal 7-8.\ndiscipline maintained.\ndecember cumulative (4 weeks) # week 1: -$820 (-0.18%)\nweek 2: -$1,760 (-0.40%)\nweek 3: -$2,340 (-0.53%)\nweek 4: -$1,260 (-0.29%)\ndecember total: -$6,180 (-1.39%)\nstarting balance (dec 1): $446,100\ncurrent balance (dec 27): $439,920\nytd: +$73,720 (+20.1%)\nchristmas with A\u0026rsquo;s family # christmas eve dinner:\nA\u0026rsquo;s parents, brothers, my 2 UCSD friends.\nher mom cooked everything (incredible food).\nstayed overnight guest room.\nchristmas morning:\nbreakfast together.\ngift exchange.\nher parents gave me:\ncustom server rack shelf ($200 - researched what i needed).\ndidn\u0026rsquo;t expect gift.\nmeans a lot.\nwhat trading pause taught me # tuesday (dec 24) decision:\nmarket open 9:30am-1pm.\ni could\u0026rsquo;ve traded full day.\nchose:\n1 trade morning, stopped 12pm.\nfamily time \u0026gt; forcing trades.\nold me (2023):\nwould\u0026rsquo;ve traded christmas eve full day.\navoided family time.\nnew me (2024):\nchose family time.\ngrowth.\ncomparing christmas 2023 vs 2024 # christmas 2023:\nalone in apartment.\nA. visiting her family (not living together yet).\ntraded full day to avoid feeling.\nlost $1,200.\nchristmas 2024:\nengaged to A.\nspent christmas with her family.\npaused trading 3 days.\nlost $1,260 (but didn\u0026rsquo;t force trades).\nloss similar, experience completely different.\nmarket conditions week 4 # volume: 1.8M contracts avg (-50% vs nov)\nchristmas week = dead.\nVIX: 18.4 avg (elevated)\ncorrelation: 0.71 (very high)\nregime confidence: 0.54 (lowest december)\nconditions terrible.\npausing 3 days = correct decision.\ncircuit breaker status # week 4:\nnot triggered.\nnot close.\nmax single loss: -$920 (friday)\nthreshold: -$1,500\nwell within range.\nlessons week 4 # 1. family \u0026gt; forced trades\ncould\u0026rsquo;ve traded christmas eve/day/boxing day.\nvolume terrible, edge zero.\nchose family time.\ncorrect decision.\n2. selective execution saves capital\n3 trades vs forcing 10-15.\nstill lost but minimized.\nfilters working.\n3. relationship changing priorities\n2023: trading \u0026gt; everything.\n2024: A\u0026rsquo;s family christmas \u0026gt; trading.\nengaged = different priorities.\nweek 5 preview (new year\u0026rsquo;s week) # expectations:\nnew year\u0026rsquo;s eve pause likely.\nvolume recovering slightly post-christmas.\nrealistic outcomes:\nflat week (+0% to +0.5%) - possible.\nsmall loss (-0.5% to -1%) - acceptable.\ndecember will finish as losing month.\n2024 annual still strong (+19-20%).\ntonight (december 27, 11:52pm) # week 4 done.\n-$1,260 (-0.29%).\n33% win rate across 3 trades.\npaused dec 25-26 christmas.\ntraded only mon-tue + fri afternoon.\nfamily time \u0026gt; forced trades.\ndecember 4 weeks: -$6,180 (-1.39%).\nytd +$73,720 (+20.1%).\nchristmas with A\u0026rsquo;s family.\nher parents gave me server rack shelf (researched what i needed).\nmeans a lot.\ngrowth.\n11:52pm friday. week 4 december. -$1,260 (0.29%). 33% win rate across 3 trades. paused dec 25-26 christmas with A\u0026rsquo;s family. traded only mon-tue + fri afternoon (selective execution). december cumulative -$6,180 (1.39%) after 4 weeks. volume 1.8M avg christmas week (-50% vs nov). ytd +$73,720 (20.1%). her parents gave me server rack shelf (didn\u0026rsquo;t expect gift). chose family time over forcing trades. growth.\n-AK\n","date":"27 December 2024","externalUrl":null,"permalink":"/posts/2024-12-27-week-4-christmas-week-small-loss-selective-execution/","section":"Posts","summary":"\u003cp\u003echristmas week done.\u003c/p\u003e\n\u003cp\u003epaused dec 24-26 as planned.\u003c/p\u003e\n\u003cp\u003esmall loss acceptable.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 4 numbers \n    \u003cdiv id=\"week-4-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-4-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (dec 23):\u003c/strong\u003e $441,180\u003c/p\u003e","title":"week 4 christmas - small loss, selective execution, family time","type":"posts"},{"content":"pausing trading christmas week.\nspending time with A\u0026rsquo;s family.\nfirst real christmas since mine died.\ntrading pause plan # pausing:\ndecember 24-26 (christmas eve through boxing day).\nreasoning:\nvolume \u0026lt;2M contracts expected.\nedge = zero in holiday conditions.\nbetter: time with A\u0026rsquo;s family.\nchristmas eve plan (dec 24) # A\u0026rsquo;s parents house:\ndinner 6pm.\novernight stay.\nchristmas morning breakfast.\nattending:\nA\u0026rsquo;s parents.\nher two brothers.\nmy 2 UCSD friends (her parents invited them).\ntotal: 8 people.\nwhy this matters # last christmas (2023):\nfirst without my parents.\nalone in apartment.\nA. was visiting her family (we weren\u0026rsquo;t living together yet).\ntraded christmas eve/day to avoid feeling.\nlost $1,200.\nthis christmas (2024):\nengaged to A.\nspending christmas with her family.\nmy friends invited.\nnot alone.\nhuge difference.\nwhat A. doesn\u0026rsquo;t know # she thinks:\ni\u0026rsquo;m fine about christmas.\nparents died 2 years ago, moved on.\nreality:\nchristmas = reminder they\u0026rsquo;re gone.\nher family = reminder my family doesn\u0026rsquo;t exist.\nhandling it better but still hits.\ntherapy session (12/18) # dr. r: \u0026ldquo;christmas with A\u0026rsquo;s family. feelings?\u0026rdquo;\nme: \u0026ldquo;grateful. her parents invited my friends. didn\u0026rsquo;t have to do that.\u0026rdquo;\ndr. r: \u0026ldquo;but?\u0026rdquo;\nme: \u0026ldquo;but still aware my parents should be there. 10 empty seats my side at wedding, 2 empty chairs at christmas dinner.\u0026rdquo;\ndr. r: \u0026ldquo;grief doesn\u0026rsquo;t follow timelines.\u0026rdquo;\nme: \u0026ldquo;yeah. 2 years later, still randomly hits.\u0026rdquo;\ndr. r: \u0026ldquo;you\u0026rsquo;re spending christmas with people who care about you. that\u0026rsquo;s growth.\u0026rdquo;\ntrue.\nlast year avoided feeling by trading.\nthis year: feeling it but with people.\nA\u0026rsquo;s family dynamics # her dad:\nsoftware engineer, we bond over tech/servers.\nasks about my trading infrastructure.\ngenuine interest, not polite conversation.\nher mom:\ngreat cook, always feeding me.\nwedding planning stress but means well.\nloves A., tolerates me becoming loves me.\nher brothers:\ngive me shit constantly (normal).\n\u0026ldquo;ball and chain\u0026rdquo; jokes.\n\u0026ldquo;she\u0026rsquo;s too good for you\u0026rdquo; jokes.\nexactly what brothers should do.\nmy UCSD friends attending # who:\nJake (CS major, works at startup).\nMarcus (quit finance, now at tech company).\nhow they know A.:\nmet her 10+ times since june 2023.\nlike her (she\u0026rsquo;s cool).\nwhy this matters:\nmy parents gone = no family my side.\nUCSD friends = closest thing to family i have left.\nher parents inviting them = understanding.\nwhat marriage means - holiday edition # before A.:\nchristmas = reminder parents dead.\navoided by trading.\nwith A. (not married yet):\nchristmas = her family becomes my family.\ncan\u0026rsquo;t replace parents but fills gap.\nmay 2025 wedding makes it official.\nalready feels like family.\nplaces list - holiday addition # last night (dec 20):\nher parents\u0026rsquo; house guest room (risky, parents downstairs).\nA. initiated (stress relief before christmas).\ntotal: 29 places.\nA\u0026rsquo;s comment: \u0026ldquo;we\u0026rsquo;re fucking at my parents\u0026rsquo; house before we\u0026rsquo;re even married. classy.\u0026rdquo;\nmy response: \u0026ldquo;wedding in may, practicing family integration.\u0026rdquo;\nher response: laughing, then round 2.\nwhat i\u0026rsquo;m grateful for this christmas # 2023 christmas:\nalone.\ntrading to avoid feeling.\nlost $1,200.\n2024 christmas:\nengaged to A.\nspending time with her family.\nmy friends invited.\nnot alone.\ngrowth.\ntonight (december 21, 11:17am) # christmas week pause starting.\ndecember 24-26 no trading.\nspending christmas with A\u0026rsquo;s family.\nher parents invited my UCSD friends.\nfirst real christmas since mine died 2 years ago.\nlast year: alone, trading, lost $1,200.\nthis year: with people, not alone.\nplaces list: 29 (her parents\u0026rsquo; guest room last night).\nmay 2025 wedding = her family becomes my family officially.\ngrateful.\n11:17am saturday. christmas week pause dec 24-26. spending christmas eve/day with A\u0026rsquo;s family. her parents invited my 2 UCSD friends (didn\u0026rsquo;t have to do that - means a lot). first real christmas since parents died 2 years ago. last year alone, traded to avoid feeling, lost $1,200. this year with people. places list 29 (her parents\u0026rsquo; guest room). wedding may 2025 makes her family my family officially. grateful.\n-AK\n","date":"21 December 2024","externalUrl":null,"permalink":"/posts/2024-12-21-christmas-week-pause-family-time-a/","section":"Posts","summary":"\u003cp\u003epausing trading christmas week.\u003c/p\u003e\n\u003cp\u003espending time with A\u0026rsquo;s family.\u003c/p\u003e\n\u003cp\u003efirst real christmas since mine died.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003etrading pause plan \n    \u003cdiv id=\"trading-pause-plan\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#trading-pause-plan\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003epausing:\u003c/strong\u003e\u003c/p\u003e","title":"christmas week pause - family time with A's family","type":"posts"},{"content":"","date":"21 December 2024","externalUrl":null,"permalink":"/tags/holiday/","section":"Tags","summary":"","title":"Holiday","type":"tags"},{"content":"week 3 done.\nthird consecutive losing week.\ndecember officially rough month.\nweek 3 numbers # starting (dec 16): $443,520\nending (dec 20): $441,180\nweek gain: -$2,340 (-0.53%)\ntrades: 5\nwins: 2\nlosses: 3\nwin rate: 40%\npattern:\nweek 1: -0.18%, 50% wr\nweek 2: -0.40%, 29% wr\nweek 3: -0.53%, 40% wr\n3 consecutive losing weeks.\nlongest losing streak since may.\ndaily breakdown # monday (dec 16): -$820, 1 trade, 0% wr\nsingle large loss.\nstopped out at regime shift.\ntuesday (dec 17): +$420, 1 trade, 100% wr\nvolatility spike captured.\nwednesday (dec 18): -$1,240, 2 trades, 0% wr\nworst day week 3.\nboth setups failed.\nthursday (dec 19): +$180, 1 trade, 100% wr\nmodest gain, capital preservation mode.\nfriday (dec 20): -$880, 0 trades, n/a\nno new trades.\nexisting position stopped out overnight.\nrough week.\ndecember cumulative (3 weeks) # week 1: -$820\nweek 2: -$1,760\nweek 3: -$2,340\ndecember total: -$4,920 (-1.10%)\nstarting balance (dec 1): $446,100\ncurrent balance (dec 20): $441,180\nytd: +$74,980 (+20.5%)\nstill well above target.\ncircuit breaker performance # week 3:\nnot triggered.\nclosest call:\nwednesday -$1,240 single day.\nthreshold: -$1,500 single day OR 3 consecutive losses\ncame within $260.\nstopped correctly.\nthursday voluntary pause considered.\ntraded anyway (capital preservation mode).\ndiscipline maintained.\nmarket conditions week 3 # volume: 2.4M contracts avg (-37% vs nov)\nholiday decline accelerating hard.\nchristmas week approaching.\nVIX: 17.2 avg (elevated)\ncorrelation: 0.68 (too high)\nregime confidence: 0.59 (lowest december)\nconditions deteriorating into christmas.\nfilters correctly reducing acceptance.\ncomparing to last december # december 2023:\nstill learning.\nsmall position sizes.\ndidn\u0026rsquo;t understand seasonality.\ndecember 2024:\nvalidated strategies.\nfull position size.\nfilters adapting to holidays.\nlosing anyway.\nvariance doesn\u0026rsquo;t care about experience.\nwin rate december # 3 weeks cumulative:\nwins: 7\nlosses: 16\nwin rate: 30%\nvs annual avg: 71%\n-41 percentage points.\nextreme negative variance.\nmean reversion from november 92%.\nlessons week 3 # 1. losing streaks happen\n3 consecutive losing weeks.\nhappens 1-2 times per year.\nnot emergency, just variance.\n2. circuit breaker working\nmon -$820, wed -$1,240, fri -$880.\nall stopped correctly.\npreventing disasters.\n3. holiday conditions real\nvolume -37% vs november.\nliquidity drought.\nchristmas week will be worse.\n4. filters saving capital\nonly 5 trades this week.\nvs forcing 15-20 trades = certain disaster.\nselective execution = survival.\nslippage week 3 # avg: 2.7 ticks\nvs week 1: 2.1 ticks (+29% worse)\nvs november: 1.9 ticks (+42% worse)\nlow volume killing execution quality.\nchicago colo preventing 4+ tick nightmare.\ncrypto rebalance complete # finished exiting altcoins:\nsold remaining 4 positions tuesday-thursday.\ncurrent allocation:\nBTC: 15%\nETH: 8%\ncash (was altcoins): 2%\ntarget 25% crypto = achieved.\nimplementation january: shift cash to options.\nchristmas week plan # pausing trading:\ndec 24-26 (christmas eve/day/boxing day).\nreasoning:\nvolume will be \u0026lt;2M contracts.\nVIX likely 18+.\nedge = zero.\nonly trade if standout setup.\nweek 4 preview # expectations:\nchristmas week volume \u0026lt;2M contracts.\nreduced opportunity.\nrealistic outcomes:\nflat week (+0% to +0.5%) - best case.\nsmall loss (-0.5% to -1%) - likely.\ndecember will finish as losing month.\nacceptable.\nytd +20.5% still standout.\ntonight (december 17, 11:34pm) # week 3 done.\n-$2,340 (-0.53%).\n40% win rate.\n3 consecutive losing weeks.\ndecember 3 weeks: -$4,920 (-1.10%).\nytd +$74,980 (+20.5%).\nmean reversion continuing.\nchristmas week pause planned.\nacceptable variance.\n11:34pm tuesday. week 3 december. -$2,340 (0.53%). 40% win rate across 5 trades. third consecutive losing week (longest streak since may). december cumulative -$4,920 (1.10%) after 3 weeks. volume -37% vs november. wednesday -$1,240 came within $260 of circuit breaker. ytd +$74,980 (20.5%) still above target. christmas week dec 24-26 pause planned.\n-AK\n","date":"17 December 2024","externalUrl":null,"permalink":"/posts/2024-12-17-week-3-december-third-losing-week-december-rough/","section":"Posts","summary":"\u003cp\u003eweek 3 done.\u003c/p\u003e\n\u003cp\u003ethird consecutive losing week.\u003c/p\u003e\n\u003cp\u003edecember officially rough month.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 3 numbers \n    \u003cdiv id=\"week-3-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-3-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (dec 16):\u003c/strong\u003e $443,520\u003c/p\u003e","title":"week 3 december - third consecutive losing week, december officially rough","type":"posts"},{"content":"christmas shopping today.\nwedding stress building.\ninteresting contrast in priorities.\ntoday\u0026rsquo;s mall trip # A.\u0026rsquo;s shopping list:\ngifts for her parents ($400 budget).\ngifts for her brothers ($200 budget).\nsomething for me (wouldn\u0026rsquo;t tell me).\nmy shopping list:\ngift for A. ($800 budget - engagement ring box idea).\ntotal spent: $1,420\nA\u0026rsquo;s reaction: \u0026ldquo;you spent too much on me.\u0026rdquo;\nmy response: \u0026ldquo;you\u0026rsquo;re marrying me in 5 months. deal with it.\u0026rdquo;\nher response: crying (good crying), then sex in mall parking garage.\nplaces list: 28.\nwedding planning update # booked this week:\nflorist ($1,200 - A\u0026rsquo;s mom insisted on \u0026ldquo;real\u0026rdquo; flowers).\nDJ ($800 - casual beach vibe music).\nstill need:\ninvitations (A. wants casual, her mom wants formal - ongoing war).\nofficiant (thinking friend from UCSD, A\u0026rsquo;s mom wants \u0026ldquo;professional\u0026rdquo;).\nmay 2025 = 5 months out.\nstress ramping.\nA\u0026rsquo;s mom vs our vision # her mom wants:\n60 people (we compromised to 45).\nformal invitations with calligraphy ($8/invite).\nprofessional photographer ($4,500 - already booked).\n\u0026ldquo;real\u0026rdquo; florist not grocery store flowers.\nwe want:\nbeach casual vibe.\nsimple invitations ($2/invite).\nsmall intimate ceremony.\ncurrent score:\nA\u0026rsquo;s mom: 2 (photographer, florist)\nus: 2 (guest count, DJ casual)\ninvitations battle ongoing.\nwhat trading teaches about wedding planning # lesson 1: can\u0026rsquo;t optimize everything\ntrading: optimize sharpe, accept drawdowns.\nwedding: optimize what matters, let rest go.\nflowers matter to A\u0026rsquo;s mom, don\u0026rsquo;t matter to me.\nlet her win = relationship capital.\nlesson 2: stop losses apply to arguments\ntrading: stop loss prevents spiral.\nwedding planning: know when to concede prevents fights.\nformal invitations not worth 3 hour fight.\njust pick one and move on.\nlesson 3: variance is everywhere\ntrading: win rate varies 29-92%.\nwedding planning: A\u0026rsquo;s stress varies daily.\naccept variance, stay steady.\ntherapy session (12/11) # dr. r: \u0026ldquo;wedding 5 months out. stress level?\u0026rdquo;\nme: \u0026ldquo;A\u0026rsquo;s at 8/10 stress, i\u0026rsquo;m at 3/10.\u0026rdquo;\ndr. r: \u0026ldquo;why the difference?\u0026rdquo;\nme: \u0026ldquo;she cares about details. i care she\u0026rsquo;s happy. details don\u0026rsquo;t stress me.\u0026rdquo;\ndr. r: \u0026ldquo;and her mom?\u0026rdquo;\nme: \u0026ldquo;her mom cares about everything. losing some battles intentionally to keep peace.\u0026rdquo;\ndr. r: \u0026ldquo;strategic concessions. like trading position sizing.\u0026rdquo;\nexactly.\nfull size on guest count (matters), half size on flowers (doesn\u0026rsquo;t matter).\nwhat A. doesn\u0026rsquo;t know # she thinks i\u0026rsquo;m calm about wedding because:\n\u0026ldquo;you\u0026rsquo;re just laid back about everything.\u0026rdquo;\nactual reason i\u0026rsquo;m calm:\nalready decided she\u0026rsquo;s it.\nrest is just logistics.\nvenue could burn down, i\u0026rsquo;d marry her at courthouse.\nceremony = bonus.\nher = everything.\nplaces list update # added this week:\nmall parking garage (today).\nher parents\u0026rsquo; house bathroom (christmas party last weekend - risky AF).\nwedding venue storage room (went to check on setup, couldn\u0026rsquo;t resist).\ntotal: 28 places.\nA\u0026rsquo;s comment: \u0026ldquo;we\u0026rsquo;re running out of places in san diego.\u0026rdquo;\nmy response: \u0026ldquo;challenge accepted.\u0026rdquo;\nsex life through wedding stress # stress impact:\nA. initiates more when stressed (wedding planning = lots of stress).\nsex frequency up 40% since engagement.\nthis month:\n14 times (vs normal 10/month).\ncorrelation:\nwedding stress ↑ = sex frequency ↑\ninteresting pattern.\ndr. r\u0026rsquo;s theory: \u0026ldquo;sex is her stress relief. trading is yours.\u0026rdquo;\nprobably right.\nmoney conversation we had # A. last night:\n\u0026ldquo;we\u0026rsquo;re spending too much on wedding.\u0026rdquo;\nme: \u0026ldquo;we\u0026rsquo;re spending $12k total. i have $440k in trading account. it\u0026rsquo;s fine.\u0026rdquo;\nher: \u0026ldquo;but you lost $2,600 this month so far.\u0026rdquo;\nme: \u0026ldquo;december is variance. ytd up $77k. wedding is $12k. it\u0026rsquo;s fine.\u0026rdquo;\nher: still worried.\ninteresting:\nshe tracks my trading performance.\ndidn\u0026rsquo;t realize she watched that close.\nkind of hot actually.\nchristmas with her family # plan:\nchristmas eve at her parents (dinner, overnight).\nchristmas day breakfast then back to san diego.\nmy stress:\nfirst christmas since mine died (2 years).\nher family = reminder my family gone.\nA. knows this.\nplanning:\nher parents invited 2 of my UCSD friends to christmas dinner.\ndidn\u0026rsquo;t have to do that.\nmeans a lot.\nwhat marriage means now vs 6 months ago # 6 months ago (june):\nmarriage = theoretical concept.\nthinking about it occasionally.\nnow (december):\nmarriage = may 2025.\nvenue booked.\ndress ordered.\ninvitations being designed.\ntheoretical → real.\nstill certain though.\ntonight (december 14, 5:22pm) # christmas shopping done.\n$1,420 spent (mostly on A.).\nwedding planning stress building.\nA\u0026rsquo;s mom winning some battles (florist, photographer).\nwe\u0026rsquo;re winning others (guest count, casual vibe).\ninvitations war ongoing.\nmay 2025 = 5 months out.\nplaces list: 28 (mall parking garage, her parents\u0026rsquo; bathroom, venue storage room).\nsex frequency up 40% (wedding stress → sex relief).\nshe\u0026rsquo;s tracking my trading performance.\nkind of love that.\n5:22pm saturday. christmas shopping $1,420 (mostly A\u0026rsquo;s gift). wedding planning stress ramping - her mom wants formal, we want casual beach vibe. current score tied 2-2. may 2025 wedding 5 months out. places list 28 (added mall parking garage today). sex frequency up 40% since engagement (stress relief pattern). A. tracks my trading losses this month, didn\u0026rsquo;t know she watched that close. christmas eve at her parents - first christmas since mine died.\n-AK\n","date":"14 December 2024","externalUrl":null,"permalink":"/posts/2024-12-14-christmas-shopping-a-wedding-stress/","section":"Posts","summary":"\u003cp\u003echristmas shopping today.\u003c/p\u003e\n\u003cp\u003ewedding stress building.\u003c/p\u003e\n\u003cp\u003einteresting contrast in priorities.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003etoday\u0026rsquo;s mall trip \n    \u003cdiv id=\"todays-mall-trip\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#todays-mall-trip\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eA.\u0026rsquo;s shopping list:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003egifts for her parents ($400 budget).\u003c/p\u003e","title":"christmas shopping with A., wedding stress building","type":"posts"},{"content":"week 2 done.\nsecond consecutive losing week.\nvariance normalizing hard.\nweek 2 numbers # starting (dec 9): $445,280\nending (dec 13): $443,520\nweek gain: -$1,760 (-0.40%)\ntrades: 7\nwins: 2\nlosses: 5\nwin rate: 29%\npattern:\nweek 1: 50% wr, small loss.\nweek 2: 29% wr, larger loss.\nmean reversion from november 92% wr.\ndaily breakdown # monday (dec 9): -$420, 2 trades, 0% wr\nboth stopped out.\nregime unstable.\ntuesday (dec 10): +$280, 1 trade, 100% wr\nsingle clean setup.\nwednesday (dec 11): -$680, 2 trades, 0% wr\nworst day this week.\nVIX spiked to 18.2.\nthursday (dec 12): +$340, 1 trade, 100% wr\nvolatility normalized.\nfriday (dec 13): -$1,280, 1 trade, 0% wr\nlargest single loss december.\nstopped out correctly at -$1,280.\n5 losses, 2 wins.\nrough week.\ncircuit breaker analysis # friday close call:\nsingle loss: -$1,280\nthreshold: -$1,500 single day\ncame within $220 of trigger.\nstopped out correctly.\ndidn\u0026rsquo;t let it spiral to -$1,500+.\ndiscipline held.\ndecember cumulative # week 1: -$820 (-0.18%)\nweek 2: -$1,760 (-0.40%)\ndecember total: -$2,580 (-0.58%)\nstarting balance (dec 1): $446,100\ncurrent balance (dec 13): $443,520\nytd: +$77,320 (+21.1%)\nstill well above 15-18% target.\nmarket conditions week 2 # volume: 2.9M contracts avg (-24% vs nov)\nholiday decline accelerating.\nVIX: 16.8 avg (elevated from week 1)\nwednesday spike to 18.2 triggered stops.\ncorrelation: 0.64 (higher than normal)\nregime confidence: 0.63 (lowest since august)\nconditions deteriorating into holidays.\ncomparing to november # november:\n+$1,320 (+0.30%)\n92% win rate (12 wins, 1 loss)\nextreme positive variance\ndecember (2 weeks):\n-$2,580 (-0.58%)\n36% win rate (5 wins, 8 losses)\nvariance normalizing hard\nclassic mean reversion.\nlessons week 2 # 1. variance comes in clusters\nweek 1 + week 2 = rough stretch.\nhappens 2-3 times per year.\nexpected, not emergency.\n2. circuit breaker philosophy working\nfriday -$1,280 stopped correctly.\ndidn\u0026rsquo;t let it become -$2,000+.\npreventive discipline = capital preserved.\n3. holiday conditions real\nvolume -24% accelerating decline.\nVIX elevated + low volume = bad combo.\nchristmas weeks will be worse.\n4. stop fighting variance\n5 losses this week.\nall stopped correctly.\nno revenge trading.\naccept and move on.\nwin rate progression 2024 # jan-apr: 76% avg (notable months)\nmay-aug: 68% avg (normal months)\nsep-nov: 74% avg (solid months)\ndec (2 weeks): 36% (rough patch)\nannual avg through dec 13: 71%\nsustainable long-term target: 65-75%.\ndecember pulling avg down = healthy variance.\nslippage week 2 # avg: 2.4 ticks\nvs week 1: 2.1 ticks (+14% worse)\nvs november: 1.9 ticks (+26% worse)\nlow volume = wider spreads.\nchicago colo helping but can\u0026rsquo;t overcome liquidity drought.\ncrypto rebalance impact # started exiting altcoins:\nclosed 3 smaller positions monday-wednesday.\nmoved capital to cash.\nimpact this week:\nreduced crypto allocation from 30% to 28%.\ntarget 25% by dec 15.\ncrypto performance this week:\nBTC: +2.1%\naltcoins sold: +0.8% avg\nexited at decent levels, no regrets.\nweek 3 preview # expectations:\nvolume declining further (christmas shopping).\nlikely pausing trading dec 24-26.\nrealistic outcomes:\nflat week (+0% to +0.5%) - possible.\nsmall loss (-0.5% to -1%) - likely.\ndecember will be losing month.\nacceptable.\ntonight (december 10, 11:48pm) # week 2 done.\n-$1,760 (-0.40%).\n29% win rate.\n5 losses, 2 wins.\nvariance continuing.\ndecember 2 weeks: -$2,580 (-0.58%).\nytd still +21.1%.\nmean reversion from november 92% wr.\nexpected.\nacceptable.\n11:48pm tuesday. week 2 december. -$1,760 (0.40%). 29% win rate across 7 trades. friday -$1,280 single loss came within $220 of circuit breaker but stopped correctly. december cumulative -$2,580 (0.58%) after 2 weeks. volume -24% vs november. VIX elevated 16.8 avg. ytd +$77,320 (21.1%) still above target. variance normalizing hard from november outlier.\n-AK\n","date":"10 December 2024","externalUrl":null,"permalink":"/posts/2024-12-10-week-2-december-second-losing-week-variance-continuing/","section":"Posts","summary":"\u003cp\u003eweek 2 done.\u003c/p\u003e\n\u003cp\u003esecond consecutive losing week.\u003c/p\u003e\n\u003cp\u003evariance normalizing hard.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 2 numbers \n    \u003cdiv id=\"week-2-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-2-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (dec 9):\u003c/strong\u003e $445,280\u003c/p\u003e","title":"week 2 december - second losing week, variance continuing","type":"posts"},{"content":"rebalancing for 2025.\nreducing crypto allocation.\nmore conservative positioning.\ncurrent allocation (november) # options: 60% ($267,660)\nSPX puts, QQQ calls, sector ETFs.\npremium selling + volatility plays.\nfutures: 10% ($44,610)\nES, NQ momentum strategies.\ncrypto: 30% ($133,830)\nBTC, ETH, major altcoins.\ntotal account: $446,100\ntarget allocation (january 2025) # options: 65%\nincrease premium selling capacity.\nfutures: 10%\nmaintain current.\ncrypto: 25%\nreduce exposure by 5%.\nwhy rebalancing:\ncrypto volatility elevated.\naltcoin correlation increasing.\n2025 regulatory uncertainty.\nmore conservative = sustainable.\ncrypto performance 2024 # january-april:\nBTC rally strong.\ncrypto strategies crushed.\n+$18,200 crypto gains (jan-apr).\nmay-august:\nconsolidation.\nreduced opportunity.\n+$3,400 crypto gains (may-aug).\nseptember-november:\nvolatility spike.\nsome gains, some losses.\n+$4,800 crypto gains (sep-nov).\ntotal 2024 crypto: +$26,400\n30% of ytd gains came from crypto.\nbut variance increasing.\nwhy reducing crypto allocation # 1. correlation creeping higher\nBTC/ETH correlation: 0.82 (was 0.68 jan)\naltcoin correlation: 0.74 (was 0.52 jan)\ndiversification benefit declining.\n2. regulatory uncertainty 2025\nSEC actions pending.\nexchange scrutiny.\nrisk/reward shifting.\n3. execution costs rising\nslippage on altcoins: 8-12 ticks avg.\nvs options: 2-3 ticks avg.\nedge compressed.\n4. volatility unsustainable\nBTC daily swings: 3-5% becoming normal.\noptions daily swings: 0.5-1.5% typical.\ncrypto variance exhausting.\nimplementation plan # december:\nreduce altcoin positions.\nmaintain BTC/ETH core.\njanuary 2025:\nshift capital to options strategies.\nincrease premium selling.\ntarget: 65% options, 25% crypto.\nwhat stays in crypto allocation # keeping:\nBTC (15% of account).\nETH (8% of account).\ntop 5 altcoins (2% of account).\nremoving:\nsmaller altcoins.\nspeculative plays.\nmeme coins (never had much anyway).\nfocus on liquid major assets only.\nexpected impact on returns # 2024 with 30% crypto:\nytd +21.6% (crypto contributed ~30% of gains).\n2025 with 25% crypto:\ntargeting +15-18% annual.\nreduced variance, more sustainable.\noptions strategies more predictable.\ncrypto strategies more volatile.\ntrade excitement for consistency.\nlessons from 2024 crypto # what worked:\nBTC/ETH momentum following.\nmajor exchange trading (Coinbase, Kraken, Binance.US).\nautomated execution via ccxt.\nwhat didn\u0026rsquo;t work:\naltcoin speculation.\ntrying to catch bottoms.\nignoring correlation increases.\n2025 focus: BTC/ETH only, reduce noise.\nportfolio variance comparison # 30% crypto allocation:\ndaily variance: ±1.2%\nmonthly variance: ±3.8%\n25% crypto allocation:\nestimated daily variance: ±0.9%\nestimated monthly variance: ±2.9%\n-24% variance reduction = better sleep.\ntherapy discussion (12/4) # dr. r: \u0026ldquo;reducing crypto. why?\u0026rdquo;\nme: \u0026ldquo;variance exhausting. up 4% monday, down 3% tuesday. options more predictable.\u0026rdquo;\ndr. r: \u0026ldquo;you\u0026rsquo;re choosing boring over exciting.\u0026rdquo;\nme: \u0026ldquo;yeah. 22 years old choosing boring. growth.\u0026rdquo;\ndr. r: \u0026ldquo;or wedding planning making you risk-averse?\u0026rdquo;\nme: \u0026ldquo;maybe both. A. and i thinking long-term. crypto swings feel reckless now.\u0026rdquo;\ninteresting point.\nwhat A. thinks # her reaction:\n\u0026ldquo;finally. you stare at crypto charts too much.\u0026rdquo;\nme: \u0026ldquo;it\u0026rsquo;s automated, i don\u0026rsquo;t stare.\u0026rdquo;\nher: \u0026ldquo;you stare at the automation monitoring dashboard.\u0026rdquo;\nfair.\nshe\u0026rsquo;s right:\ncrypto stress \u0026gt; options stress.\nreducing crypto = reducing stress.\n2025 goal: sustainable not spectacular.\nimplementation timeline # december 8-15:\nexit smaller altcoin positions.\nconsolidate to BTC/ETH.\ndecember 16-31:\nhold through holidays (no major moves).\njanuary 2-15:\nscale up options strategies.\nfinalize 65/10/25 allocation.\nby january 15: rebalance complete.\ntonight (december 7, 2:32pm) # rebalancing for 2025.\ncrypto 30% → 25%.\noptions 60% → 65%.\nreasoning:\ncorrelation increasing.\nvariance exhausting.\nregulatory uncertainty.\ngoal:\nsustainable not spectacular.\nreduce stress.\nwedding may 2025 = thinking long-term.\nimplementation starting next week.\n2:32pm saturday. year-end rebalancing. reducing crypto 30% to 25%, increasing options 60% to 65%. crypto variance exhausting (daily ±1.2% swings). 2024 crypto contributed 30% of ytd gains but correlation rising (BTC/ETH 0.82 vs 0.68 jan). targeting -24% variance reduction for 2025. implementation dec 8-15 exit altcoins, jan 2-15 scale options. choosing sustainable over spectacular.\n-AK\n","date":"7 December 2024","externalUrl":null,"permalink":"/posts/2024-12-07-year-end-portfolio-rebalance-crypto-exposure/","section":"Posts","summary":"\u003cp\u003erebalancing for 2025.\u003c/p\u003e\n\u003cp\u003ereducing crypto allocation.\u003c/p\u003e\n\u003cp\u003emore conservative positioning.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ecurrent allocation (november) \n    \u003cdiv id=\"current-allocation-november\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#current-allocation-november\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eoptions:\u003c/strong\u003e 60% ($267,660)\u003c/p\u003e\n\u003cp\u003eSPX puts, QQQ calls, sector ETFs.\u003c/p\u003e","title":"year-end portfolio rebalance - reducing crypto exposure","type":"posts"},{"content":"december week 1 done.\nfirst losing week in 5 weeks.\nvariance returning as expected.\nweek 1 numbers # starting (dec 1): $446,100\nending (dec 6): $445,280\nweek gain: -$820 (-0.18%)\ntrades: 6\nwins: 3\nlosses: 3\nwin rate: 50%\npattern:\nnovember 100% win rate couldn\u0026rsquo;t sustain.\ndec week 1 = variance normalizing.\ndaily breakdown # monday (dec 2): +$340, 1 trade, 100% wr\nstopped out +$340 profit target.\ntuesday (dec 3): -$480, 2 trades, 0% wr\nboth stopped out losses.\nregime shifted intraday.\nwednesday (dec 4): +$240, 1 trade, 100% wr\nsingle clean setup.\nthursday (dec 5): -$560, 1 trade, 0% wr\nlargest single loss this week.\nstopped out correctly.\nfriday (dec 6): -$360, 1 trade, 0% wr\nweek ended losing.\n3 wins, 3 losses = 50% wr.\nexactly average.\ncomparing to november # november:\n92% win rate (12 wins, 1 loss).\nextreme positive variance.\ndecember week 1:\n50% win rate (3 wins, 3 losses).\nnormalizing.\nexpected and healthy.\nmarket conditions # volume: 3.2M contracts avg (-18% vs nov avg)\nholiday ramp down starting.\nVIX: 14.8 (optimal range but low participation)\ncorrelation: 0.58 (acceptable)\nregime confidence: 0.71 (solid but not impressive)\nfilters: 48% acceptance\nlessons week 1 # 1. variance always returns\nnovember 100% wr was outlier.\ndecember week 1 50% wr = mean reversion.\nsustainable long-term = 65-75% wr.\n2. holiday volume declining\n-18% vs november avg already.\nchristmas weeks will be worse.\nprepare for reduced opportunity.\n3. stop losses working\n3 losses, all stopped correctly.\nno revenge trading.\nmoved on.\ndiscipline maintained.\ncircuit breaker status # week 1:\nnot triggered.\nnot close.\nmax single loss: -$560 (thursday)\nthreshold: -$1,500 single day OR 3 consecutive losses\n3 losses spread across week = not consecutive.\nsystem working.\nytd status # starting balance (jan 1): $366,200\ncurrent balance (dec 6): $445,280\nytd gain: +$79,080 (+21.6%)\nannual target: 15-18%\nexceeded by: 3.6%\ndecember can lose -1% to -2% and finish 20% annual.\nzero pressure.\nweek 2 preview # expectations:\nvolume will decline further (holiday shopping).\nreduced trading days likely.\nrealistic outcomes:\nflat week (+0% to +0.5%) - possible.\nsmall loss (-0.5% to -1%) - likely.\ndecember pattern starting: reduced opportunity.\ntonight (december 3, 2:17am) # week 1 done.\n-$820 (-0.18%).\n50% win rate normalizing from november outlier.\n6 trades total.\nvariance returning.\nacceptable.\n2:17am tuesday. december week 1. -$820 (0.18%). 50% win rate across 6 trades. three wins three losses = variance normalizing. volume -18% vs november avg. ytd +$79,080 (21.6%) still exceeds target. december can be negative and finish strong year.\n-AK\n","date":"3 December 2024","externalUrl":null,"permalink":"/posts/2024-12-03-week-1-december-slow-holiday-start/","section":"Posts","summary":"\u003cp\u003edecember week 1 done.\u003c/p\u003e\n\u003cp\u003efirst losing week in 5 weeks.\u003c/p\u003e\n\u003cp\u003evariance returning as expected.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 1 numbers \n    \u003cdiv id=\"week-1-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-1-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (dec 1):\u003c/strong\u003e $446,100\u003c/p\u003e","title":"week 1 december - slow holiday start, first small loss","type":"posts"},{"content":"november done.\nflat month executed.\nytd cushion protected.\nnovember final numbers # starting (nov 1): $444,780\nending (nov 30): $446,100\nnovember gain: +$1,320 (+0.30%)\ntrades: 12\nwins: 12\nlosses: 0\nwin rate: 100%\nFigure 1: November weekly performance demonstrating selective execution. Week 1 election pause (+$660, 2 trades mon-wed only). Week 2 veterans day light volume (+$180, 1 trade). Week 3 building consistency (+$540, 3 trades). Week 4 thanksgiving pause (+$360, 2 trades mon-tue only). Week 5 post-thanksgiving wind-down (-$420, 1 trade). Month ended +$1,320 (+0.30%). 12 trades total vs normal 28-35 = discipline through holidays. 100% win rate = extreme positive variance (won\u0026rsquo;t sustain).\nweekly breakdown # Figure 2: Holiday weeks impact on trading activity throughout November. Election week 1: paused mon-tue election uncertainty. Veterans week 2: reduced activity (light volume). Normal week 3: full activity resumed. Thanksgiving week 4: paused wed-fri holiday. Week 5 wind-down: minimal activity. November total 12 trades vs October 30 trades (-60% activity). Selective execution = capital preservation during low-quality conditions.\nweek 1: +$660 (election week - paused mon-tue)\nweek 2: +$180 (veterans day - 1 trade only)\nweek 3: +$540 (normal activity)\nweek 4: +$360 (thanksgiving - paused wed-fri)\nweek 5: -$420 (month-end wind-down)\npattern: selective execution.\n12 for 12 then first loss # nov 1-27:\n12 trades.\n12 wins.\n100% win rate.\nextreme positive variance.\nnov 29:\nfirst losing trade.\n-$420 (stopped out correctly).\nvariance normalizing.\nexpected and healthy.\ncomparing to previous months 2024 # january: +$27,200 (+7.4%) - standout\nfebruary: +$1,400 (+0.36%) - flat\nmarch: +$1,100 (+0.28%) - testing\napril: +$23,460 (+5.9%) - strong\nmay: +$3,500 (+0.83%) - normal\njune: +$8,320 (+1.97%) - modest\njuly: +$2,720 (+0.63%) - modest\naugust: +$900 (+0.21%) - survival\nseptember: +$6,860 (+1.58%) - modest\noctober: +$3,120 (+0.71%) - modest\nnovember: +$1,320 (+0.30%) - flat\npattern consistent:\n2 standout.\n9 modest/flat/survival.\nsustainable pace.\nytd 2024 progress # Figure 3: Year-to-date 2024 monthly progression through November. Two strong months (Jan +7.4%, Apr +5.9%) carried year at +$50,660 combined. Nine modest/flat months (Feb-Nov excluding strong) added +$29,440 total. November +0.30% demonstrates discipline - refused to force trades during election/thanksgiving weeks. YTD total +$80,100 (+21.9%). Annual target 15-18% exceeded by 3.9%. December can be -1% to -3% and still finish 19-21% range. Green zone = target range 15-18%.\njanuary: +$27,200 (+7.4%)\nfebruary: +$1,400 (+0.36%)\nmarch: +$1,100 (+0.28%)\napril: +$23,460 (+5.9%)\nmay: +$3,500 (+0.83%)\njune: +$8,320 (+1.97%)\njuly: +$2,720 (+0.63%)\naugust: +$900 (+0.21%)\nseptember: +$6,860 (+1.58%)\noctober: +$3,120 (+0.71%)\nnovember: +$1,320 (+0.30%)\nytd total: +$80,100 (+21.9%)\nstarting balance (jan 1): $366,200\ncurrent balance (nov 30): $446,100\nannual target exceeded # ytd: +21.9% in 11 months\nannual target: +15-18%\nexceeded by: +3.9%\ndecember:\ncan be -1% to -3% (losing month).\nstill finish +19% to +21% annual.\nzero pressure.\nalready achieved target.\ncircuit breaker performance # november:\n12 for 12 then 1 loss.\ncircuit breaker not triggered.\nnov 29 stop loss:\n-$420 single trade.\nstopped out correctly.\nmoved on.\nthreshold: -$1,500 single day OR 3 consecutive losses.\ndiscipline maintained.\nrisk management stats # position sizing: $1,500 all trades (consistent)\ncircuit breaker: not triggered\nmax drawdown: -$420 (0.09%)\ntrades executed: 13 total (12 wins, 1 loss)\ntrades paused: 6 days (election mon-tue, thanksgiving wed-fri, veterans day reduced)\nfilters avg: 67% acceptance\nregime confidence avg: 0.74\nselective execution = capital preserved.\nmarket conditions november # avg volume: 3.9M contracts (strong post-election)\navg VIX: 15.1 (optimal range 14-19)\navg correlation: 0.61 (acceptable diversification)\navg regime stability: 0.74 (very stable)\npost-election conditions optimal.\nholidays reduced activity (correct).\nslippage tracking detail # november avg: 1.9 ticks\noctober avg: 2.2 ticks\nimprovement: -0.3 ticks (-14%)\nwhy:\npost-election volume strong.\nVIX optimal = tighter spreads.\nchicago colo + liquidity = execution quality.\nbest slippage since april.\ncomparing to expectations # early november forecast: flat to small gain (+0% to +1%)\nactual: +$1,320 (+0.30%)\nmid-range hit.\ndiscipline through election/thanksgiving weeks.\nrefused to force trades.\nlessons from november # 1. selective execution \u0026gt; quantity\n13 trades vs normal 28-35.\n+0.30% positive anyway.\nfilters prevented bad setups.\n2. holiday weeks predictable\nelection: binary outcome = pause.\nthanksgiving: low volume = pause.\nplanning ahead prevents mistakes.\n3. 100% win rate can\u0026rsquo;t sustain\n12 for 12 = extreme positive variance.\ndec will normalize (65-75% wr expected).\n4. ytd cushion enables discipline\n+21.9% allows skipping marginal days.\nprotecting gains \u0026gt; forcing trades.\n5. first losing trade healthy\nnov 29 -$420 = variance normalizing.\nstopped out correctly, moved on.\nthis is sustainable trading.\ncomparing to 2023 # november 2023:\nstill learning.\nlosing money.\nno confidence.\nsmall position sizes.\nnovember 2024:\nvalidated strategies.\n+$1,320 flat month (planned).\nfull position size.\nselective execution (13 trades vs normal 30).\ntransformation complete.\ntherapy reflection (11/26) # dr. r: \u0026ldquo;november wrapping. +$1.3k. thoughts?\u0026rdquo;\nme: \u0026ldquo;perfect. election week paused, thanksgiving paused, normal weeks executed. exactly what november should be.\u0026rdquo;\ndr. r: \u0026ldquo;100% win rate first 12 trades didn\u0026rsquo;t make you overconfident.\u0026rdquo;\nme: \u0026ldquo;nope. knew it was positive variance. 13th trade lost -$420. normalizing.\u0026rdquo;\ndr. r: \u0026ldquo;and personally?\u0026rdquo;\nme: \u0026ldquo;engaged. wedding planning chaos. A\u0026rsquo;s family thanksgiving (first real family holiday since parents died). processing.\u0026rdquo;\ndr. r: \u0026ldquo;lot happening.\u0026rdquo;\nme: \u0026ldquo;yeah. but trading stable. relationship stable. grief manageable. overall good.\u0026rdquo;\nexactly.\nlife update - wedding may 2025 # booked:\nvenue (beach, 45 capacity).\nphotographer ($4,500).\ncaterer (buffet $85/person).\nplanning:\ninvitations next.\nA\u0026rsquo;s mom wants formal, we want casual (we\u0026rsquo;ll win).\nmay 2025 locked.\nengaged to A.\nfirst relationship where i\u0026rsquo;m planning permanent.\ndecember preview # expectations:\nnormal trading weeks (no major holidays until late).\nvariance will return (65-75% win rate expected).\nrealistic outcomes:\nflat month (+0% to +0.5%) - acceptable.\nsmall gain (+0.5% to +1%) - acceptable.\nsmall loss (-1% to -3%) - acceptable.\nall finish 19-22% annual.\nzero pressure.\nwhat success looks like november # november success:\nflat month (+0.30%) exactly as planned.\ndisciplined pauses (election, thanksgiving).\nrefused to force trades during holidays.\n100% wr then first loss = variance demonstrated.\nslippage best since april (1.9 ticks).\nnot exciting but sustainable.\nthis is long-term algo trading.\ntonight (november 30, 11:51pm) # november done.\n+$1,320 (+0.30%).\n92% win rate (12 wins, 1 loss).\n13 trades total vs normal 30 = discipline.\npaused election week, thanksgiving week.\nslippage 1.9 ticks best since april.\nytd +$80,100 (+21.9%).\nannual target exceeded by 3.9%.\ndecember begins tomorrow.\nvariance will normalize.\nrealistic expectations.\nexecute system.\naccept variance.\n11:51pm saturday. november wrap. +$1,320 (0.30%) flat month as planned. 92% win rate across 13 trades (12 wins, 1 loss - variance normalizing). paused 6 days: election mon-tue, thanksgiving wed-fri. slippage 1.9 ticks best since april. ytd +$80,100 (21.9%) exceeded target by 3.9%. december can be -1% to -3% and finish 19-21%. engaged to A., wedding may 2025 booked. thanksgiving her family (first real family holiday since parents died). discipline maintained. sustainable trading demonstrated.\n-AK\n","date":"30 November 2024","externalUrl":null,"permalink":"/posts/2024-11-30-november-wrap-flat-month-discipline-maintained/","section":"Posts","summary":"\u003cp\u003enovember done.\u003c/p\u003e\n\u003cp\u003eflat month executed.\u003c/p\u003e\n\u003cp\u003eytd cushion protected.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003enovember final numbers \n    \u003cdiv id=\"november-final-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#november-final-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (nov 1):\u003c/strong\u003e $444,780\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eending (nov 30):\u003c/strong\u003e $446,100\u003c/p\u003e","title":"november wrap - flat month, discipline maintained, ytd above target","type":"posts"},{"content":"thanksgiving with A\u0026rsquo;s family done.\nfirst real family holiday since parents died.\nprocessing.\nthursday november 21 - the dinner # A\u0026rsquo;s family:\n30 people total.\nher parents\u0026rsquo; house.\nextended family everywhere.\nmy contribution:\nshowed up.\nbrought wine (A. picked it).\nthat\u0026rsquo;s it.\nwhat happened # 6pm arrival:\nher mom hugged me first (before A.).\n\u0026ldquo;you\u0026rsquo;re family now.\u0026rdquo;\nmade A. cry.\nmade me\u0026hellip; something.\ndinner:\nsat between A. and her dad.\nher dad talked servers/tech whole time (comfortable).\nher mom asked about wedding planning (fine).\nher brothers gave me shit about \u0026ldquo;settling down\u0026rdquo; (expected).\ni was quiet.\nA. noticed.\nheld my hand under table.\n8pm aftermath:\nhelped clean up (A\u0026rsquo;s mom insisted i didn\u0026rsquo;t have to).\nher dad and i talked colocation setups (genuinely interesting).\n9pm drive home:\nA. quiet first 10 minutes.\nthen:\nher: \u0026ldquo;you okay?\u0026rdquo;\nme: \u0026ldquo;yeah. your family\u0026rsquo;s great.\u0026rdquo;\nher: \u0026ldquo;you got really quiet at dinner.\u0026rdquo;\nme: \u0026ldquo;just\u0026hellip; lot of people.\u0026rdquo;\nher: \u0026ldquo;lot of people or lot of family?\u0026rdquo;\nme: \u0026ldquo;\u0026hellip;second one.\u0026rdquo;\nshe held my hand whole drive.\ndidn\u0026rsquo;t push for more.\nthis is why i\u0026rsquo;m marrying her.\nwhat i didn\u0026rsquo;t tell A. # during dinner:\ncounted empty seats.\nmy side of family:\nparents: dead.\nextended family: don\u0026rsquo;t talk to them (haven\u0026rsquo;t since funeral).\nwedding may 2025:\nvenue capacity: 45 people.\nA\u0026rsquo;s family: 30 people.\nmy side: 5 friends from UCSD.\n10 empty seats.\n10 seats that should\u0026rsquo;ve been:\nparents.\ngrandparents (dad\u0026rsquo;s side).\naunt/uncle maybe.\ninstead: empty.\ngrief hitting different # usually:\nnumb.\nfactual.\n\u0026ldquo;parents died dec 31, 2022.\u0026rdquo;\nthanksgiving:\nsaw A\u0026rsquo;s family lively.\nher mom planning everything.\nher dad offering help.\nsiblings giving each other shit.\nnormal family.\ni don\u0026rsquo;t have that.\nwon\u0026rsquo;t ever again.\nhit hard.\nwhat A\u0026rsquo;s mom said # friday nov 22:\nA\u0026rsquo;s mom texted me directly:\n\u0026ldquo;thank you for coming thursday. you\u0026rsquo;re part of our family now. we love you.\u0026rdquo;\nshowed A.\nshe cried again.\nme:\nresponded: \u0026ldquo;thank you for including me. means a lot.\u0026rdquo;\nwhat i wanted to say:\n\u0026ldquo;you\u0026rsquo;re the closest thing to parents i\u0026rsquo;ll have again.\u0026rdquo;\ndidn\u0026rsquo;t.\ntoo heavy for text.\ntherapy session (nov 26) # dr. r: \u0026ldquo;thanksgiving with A\u0026rsquo;s family. how\u0026rsquo;d it go?\u0026rdquo;\nme: \u0026ldquo;good. weird. her mom said i\u0026rsquo;m family now.\u0026rdquo;\ndr. r: \u0026ldquo;and that felt?\u0026rdquo;\nme: \u0026ldquo;heavy. good but heavy. kept thinking about empty seats at wedding.\u0026rdquo;\ndr. r: \u0026ldquo;10 seats your side should\u0026rsquo;ve had people.\u0026rdquo;\nme: \u0026ldquo;exactly. A\u0026rsquo;s side: 30 people. my side: 5 friends, 10 empty.\u0026rdquo;\ndr. r: \u0026ldquo;that\u0026rsquo;s the grief. not constant but hits at family moments.\u0026rdquo;\nme: \u0026ldquo;yeah. usually i\u0026rsquo;m fine. then thanksgiving happens and\u0026hellip; fuck.\u0026rdquo;\ndr. r: \u0026ldquo;you told A.?\u0026rdquo;\nme: \u0026ldquo;some. not all. didn\u0026rsquo;t want to make her thanksgiving about my dead parents.\u0026rdquo;\ndr. r: \u0026ldquo;she\u0026rsquo;d understand.\u0026rdquo;\nme: \u0026ldquo;i know. that\u0026rsquo;s why i\u0026rsquo;m marrying her. but still. timing.\u0026rdquo;\nwhat A. doesn\u0026rsquo;t fully know # she knows:\nparents died dec 31, 2022.\ni have grief moments.\nthanksgiving was hard for me.\nshe doesn\u0026rsquo;t know:\ni counted empty wedding seats during her family dinner.\nher mom\u0026rsquo;s text almost made me cry (i don\u0026rsquo;t cry usually).\nbeing called \u0026ldquo;family\u0026rdquo; after 2 years solo hits different.\nwill tell her eventually.\nnot during wedding planning stress.\ncomparing to past thanksgivings # 2019-2021 (parents alive):\nour house.\nmom cooked everything.\ndad complained about football.\nnormal family thanksgiving.\n2022:\nparents alive (died dec 31).\nlast thanksgiving with them (didn\u0026rsquo;t know it).\n2023:\nfirst thanksgiving after parents died.\nordered chipotle.\nalone in apartment.\nnumb.\n2024:\nA\u0026rsquo;s family.\n30 people.\nher mom called me family.\ndifferent.\nbetter but complicated.\ntonight (nov 28, 1:39am) # thanksgiving done.\nA\u0026rsquo;s family great.\nher mom said \u0026ldquo;you\u0026rsquo;re family now.\u0026rdquo;\nfirst family holiday since parents died.\ngood but heavy.\nkept thinking about 10 empty wedding seats my side.\ngrief hits different at family moments.\nA. knows some, not all.\nprocessing.\n1:39am thursday. thanksgiving A\u0026rsquo;s family done. 30 people. her mom hugged me first, said \u0026ldquo;you\u0026rsquo;re family now\u0026rdquo; - made A. cry. i got quiet (she noticed, held my hand). kept counting empty wedding seats (10 my side should\u0026rsquo;ve had parents/family). her mom texted friday \u0026ldquo;you\u0026rsquo;re part of our family, we love you\u0026rdquo; - almost made me cry. dr. r session: grief not constant but hits at family moments. A. knows some, not all. first real family holiday since parents died dec 31 2022.\n-AK\n","date":"28 November 2024","externalUrl":null,"permalink":"/posts/2024-11-28-thanksgiving-family-dynamics-first-holiday-since-parents/","section":"Posts","summary":"\u003cp\u003ethanksgiving with A\u0026rsquo;s family done.\u003c/p\u003e\n\u003cp\u003efirst real family holiday since parents died.\u003c/p\u003e\n\u003cp\u003eprocessing.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethursday november 21 - the dinner \n    \u003cdiv id=\"thursday-november-21---the-dinner\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#thursday-november-21---the-dinner\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eA\u0026rsquo;s family:\u003c/strong\u003e\u003c/p\u003e","title":"thanksgiving family changings - first holiday since parents died","type":"posts"},{"content":"thanksgiving done.\nback to trading.\nfinal week november.\nweek 5 post-thanksgiving # mon nov 25: +$120, 1 trade, 100% wr\ncurrent balance: $446,640\nweek 5 total so far: +$120\nnovember month-to-date: +$1,860 (+0.42%)\n10 for 10 november # perfect record continues:\n10 trades.\n10 wins.\n0 losses.\nthis is ridiculous.\npositive variance extreme.\ndecember will normalize (guaranteed).\nexpecting:\nfirst losing trade any day.\nwin rate drop to normal 65-75%.\nenjoying but not expecting continuation.\npost-thanksgiving volume # mon nov 25:\nvolume: 3.2M contracts (-20% vs normal).\nVIX: 15.1 (optimal still).\ncorrelation: 0.63 (acceptable).\nregime confidence: 0.71 (stable).\nfilters: 69% acceptance.\nlower volume but conditions acceptable.\ntook 1 trade only.\ndidn\u0026rsquo;t force more.\ncomparing to thanksgiving week forecast # forecast (nov 21):\nwed-fri pause.\nmon-tue normal trading.\nactual:\nwed-fri paused as planned.\nmon normal trading (+$120).\ndiscipline maintained.\nfinal week november outlook # tue nov 26: probably trade (volume should normalize)\nwed nov 27: assess conditions\nthu nov 28: normal trading day\nfri nov 29: month-end, assess\nrealistic:\n2-4 trades remaining.\nmonth ends +$1,900 to +$2,100 (+0.43% to +0.47%).\nwell within flat month target.\nytd context # nov 1 starting: $444,780\nnov 25 current: $446,640\nnovember gain: +$1,860 (+0.42%)\nytd total: +$80,640 (+22.0%)\ndecember preview:\ncan be -1% to -2% (losing month).\nstill finish 19-21% annual.\nzero pressure.\nvariance will return.\ncircuit breaker readiness # november:\n10 for 10 (absurd).\ndecember expectations:\nfirst losing trade coming.\npotentially first losing week.\ncircuit breaker ready:\n3 consecutive losses = pause.\n-$1,500 single day = pause.\nhaven\u0026rsquo;t needed it november.\nwill probably need it december.\nrisk management week 5 # position sizing: $1,500 standard\ntrades executed: 1 (mon only)\nfilters: 69% acceptance\nregime confidence: 0.71\npost-holiday volume lower but acceptable.\nslippage post-thanksgiving # mon nov 25: 2.1 ticks\nnovember avg: 1.9 ticks (through mon)\nslight degradation from holiday (expected).\nstill acceptable.\nchicago colo preventing 3+ tick nightmare.\nthanksgiving dinner recap # thursday nov 21:\nA\u0026rsquo;s family thanksgiving.\n30 people total.\nher parents, brothers, extended family.\nmy contribution: nothing (A. said just show up).\nher mom\u0026rsquo;s reaction: treated me like family.\nher dad: talked servers/tech whole time (comfortable).\nher brothers: gave me shit about \u0026ldquo;settling down\u0026rdquo; (normal).\noverall: weird but good.\nfirst real family holiday since parents died.\nA. held my hand under table when i got quiet.\nshe knows.\nwhat A. said after # friday morning:\nher: \u0026ldquo;you okay? you got quiet at dinner.\u0026rdquo;\nme: \u0026ldquo;yeah. just\u0026hellip; lot of people. your family\u0026rsquo;s great.\u0026rdquo;\nher: \u0026ldquo;my mom loves you. dad too.\u0026rdquo;\nme: \u0026ldquo;i know. it\u0026rsquo;s good. just different from\u0026hellip; before.\u0026rdquo;\nshe knew i meant parents.\ndidn\u0026rsquo;t push.\njust held me.\nthis is why i\u0026rsquo;m marrying her.\ntonight (nov 24, 1:55am) # week 5 post-thanksgiving.\nmon +$120.\n10 for 10 november (extreme positive variance).\nnovember +$1,860 (+0.42%) month-to-date.\nytd +22.0%.\nfinal week november ahead.\ndecember variance coming (guaranteed).\nthanksgiving with A\u0026rsquo;s family good but weird (first real family holiday since parents died).\n1:55am sunday. week 5 post-thanksgiving. mon +$120. 10 for 10 trades november = extreme positive variance won\u0026rsquo;t sustain. november +$1,860 (0.42%). ytd +22.0% above target. final week november ahead. december will normalize (first losing trades coming). thanksgiving A\u0026rsquo;s family good - her mom treated me like family (first real family holiday since parents died 2022).\n-AK\n","date":"24 November 2024","externalUrl":null,"permalink":"/posts/2024-11-24-week-5-november-post-thanksgiving-recovery/","section":"Posts","summary":"\u003cp\u003ethanksgiving done.\u003c/p\u003e\n\u003cp\u003eback to trading.\u003c/p\u003e\n\u003cp\u003efinal week november.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 5 post-thanksgiving \n    \u003cdiv id=\"week-5-post-thanksgiving\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-5-post-thanksgiving\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003emon nov 25:\u003c/strong\u003e +$120, 1 trade, 100% wr\u003c/p\u003e","title":"week 5 november - post-thanksgiving recovery","type":"posts"},{"content":"","date":"21 November 2024","externalUrl":null,"permalink":"/tags/holidays/","section":"Tags","summary":"","title":"Holidays","type":"tags"},{"content":"thanksgiving week here.\npausing wed-fri.\nnot interested in holiday volume lottery.\nweek 4 pre-thanksgiving # mon nov 18: +$160, 1 trade, 100% wr\ntue nov 19: +$200, 1 trade, 100% wr\nwed nov 20: pausing (market half day, dead volume expected)\nthu nov 21: thanksgiving - closed\nfri nov 22: pausing (1pm close, skeleton crew)\nweek 4 total: +$360 (2 trading days only)\ncurrent balance: $446,520\nnovember month-to-date: +$1,740 (+0.39%)\nwhy pause wed-fri # wednesday before thanksgiving:\nmarkets close 1pm EST.\nvolume historically -60% avg.\nspreads widen significantly.\nthursday:\nclosed.\nfriday:\n1pm close.\nskeleton crew trading.\nvolume -40% avg typical.\nedge disappears in low volume.\nopportunity cost analysis:\npotential gain wed-fri: $300-600 optimistic.\npotential loss: $1,000-2,000 from bad execution.\nrisk/reward: terrible.\npausing correct.\nmon-tue execution # both days:\nnormal volume (3.9M avg).\nVIX optimal (14.6 avg).\nregime confidence high (0.78 avg).\ntook 1 trade each day.\nboth profitable.\n9 for 9 november now.\npositive variance continuing (won\u0026rsquo;t last).\ncomparing to past holiday weeks # july 4 week 2024:\npaused around birthday.\nslow conditions.\ndidn\u0026rsquo;t force trades.\nlabor day sept 2024:\nweek 1 slow.\ntook minimal trades.\ncaptured weeks 2-4 momentum.\npattern consistent:\nholiday weeks = pause or minimal.\nnormal weeks = execute.\ndiscipline \u0026gt; forcing.\nthanksgiving plans # thursday (nov 21):\nA\u0026rsquo;s family dinner.\nher parents, brothers, extended family.\nmy side: nobody (parents dead).\nher mom insisted i come (nice but weird).\nfirst major family holiday with them.\nNGL bit nervous.\nA. says just be myself.\nhopefully \u0026ldquo;myself\u0026rdquo; includes not talking about:\nalgo trading losses ($180k 2023) dead parents constantly our sex life (her mom doesn\u0026rsquo;t need places list details) should be fine.\nfriday after thanksgiving # market closes 1pm.\nplan:\nsleeping in.\nA. wants to check out wedding cake options.\nprobably fuck (friday alone time rule suspended for wedding planning).\nno trading.\nskeleton crew volume not worth it.\nytd november tracking # nov 1 starting: $444,780\nnov 21 current: $446,520\nnovember gain: +$1,740 (+0.39%)\nytd total: +$80,520 (+22.0%)\nannual target: +15-18%\nexceeded by: +4.0%\nremaining:\n1 week november (mon nov 25 - fri nov 29).\nfull month december.\nboth can be flat/negative.\nstill finish 19-21% annual.\ncircuit breaker status # november:\n9 trades.\n9 wins.\n0 losses.\ncircuit breaker not triggered.\nthis is extreme positive variance.\ndecember will normalize.\nexpecting 65-75% win rate return.\nslippage thanksgiving week # mon-tue avg: 1.8 ticks\nnovember avg through tue: 1.9 ticks\nimproving slightly.\nwed-fri pause = avoid 3+ tick holiday slippage.\nprotecting execution quality.\nrisk management holiday week # position sizing: $1,500 standard (mon-tue)\ntrades executed: 2 (mon-tue only)\nfilters: 71% acceptance (very selective)\nregime confidence: 0.78 avg (stable)\ndiscipline:\npausing wed-fri as planned.\nnot tempted by potential small gains.\nprotecting november gains.\nwhat thanksgiving week pause demonstrates # 1. ytd cushion enables patience\n+22.0% allows skipping marginal days.\n2. opportunity cost matters\n$300-600 potential vs $1k-2k risk = pause.\n3. holidays predictable\nvolume drops, spreads widen, edge compressed.\n4. discipline \u0026gt; heroics\nnot forcing trades = capital preservation.\npersonal - first thanksgiving with A\u0026rsquo;s family # her family knows:\nwe\u0026rsquo;re engaged (told oct 27).\nwedding may 2025.\ni\u0026rsquo;m algo trader (they think it\u0026rsquo;s cool).\nparents died 2022 (they\u0026rsquo;re sympathetic).\nher mom specifically:\ninsisted i come thanksgiving.\n\u0026ldquo;you\u0026rsquo;re family now.\u0026rdquo;\nmade A. cry when she said it.\nmade me feel\u0026hellip; something.\nweird having \u0026ldquo;family\u0026rdquo; again after 2 years solo.\ntonight (nov 21, 2:22am) # thanksgiving week.\npaused wed-fri.\nmon-tue +$360.\nnovember +$1,740 (+0.39%).\nytd +22.0%.\n9 for 9 trades (extreme positive variance).\nthursday thanksgiving with A\u0026rsquo;s family (first major holiday with them).\nfriday sleeping in + wedding cake research.\n2:22am thursday. thanksgiving week. paused wed-fri as planned (holiday volume not worth risk). mon-tue +$360. november +$1,740 (0.39%). ytd +22.0% above target. 9 for 9 trades november = extreme positive variance won\u0026rsquo;t last. thanksgiving dinner A\u0026rsquo;s family tomorrow (first major holiday with them since engagement). her mom said \u0026ldquo;you\u0026rsquo;re family now\u0026rdquo; - weird having family again after 2 years.\n-AK\n","date":"21 November 2024","externalUrl":null,"permalink":"/posts/2024-11-21-thanksgiving-week-pause-family-time/","section":"Posts","summary":"\u003cp\u003ethanksgiving week here.\u003c/p\u003e\n\u003cp\u003epausing wed-fri.\u003c/p\u003e\n\u003cp\u003enot interested in holiday volume lottery.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 4 pre-thanksgiving \n    \u003cdiv id=\"week-4-pre-thanksgiving\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-4-pre-thanksgiving\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003emon nov 18:\u003c/strong\u003e +$160, 1 trade, 100% wr\u003c/p\u003e","title":"thanksgiving week - pause, family time approaching","type":"posts"},{"content":"","date":"19 November 2024","externalUrl":null,"permalink":"/tags/data-analysis/","section":"Tags","summary":"","title":"Data-Analysis","type":"tags"},{"content":"slippage been great november.\nwanted to understand why.\ndata analysis time.\nnovember slippage performance # november avg (through nov 18): 1.9 ticks\noctober avg: 2.2 ticks\nseptember avg: 2.0 ticks\naugust avg: 2.8 ticks\nimprovement: -0.9 ticks vs august (-32%)\nwhy?\nhypothesis: volume correlation # theory:\nhigher volume = tighter spreads = lower slippage.\nlet\u0026rsquo;s test with data.\ndata collection code # pulled 3 months of execution logs (sep-nov 2024):\nimport pandas as pd import numpy as np from datetime import datetime, timedelta import plotly.graph_objects as go import plotly.express as px # Load execution logs from PostgreSQL def load_execution_data(start_date, end_date): \u0026#34;\u0026#34;\u0026#34; Pull trade execution data from timescaledb Returns: DataFrame with timestamp, symbol, slippage_ticks, volume \u0026#34;\u0026#34;\u0026#34; query = \u0026#34;\u0026#34;\u0026#34; SELECT execution_timestamp, symbol, entry_price, expected_price, contract_size, market_volume_1min FROM execution_log WHERE execution_timestamp BETWEEN %s AND %s AND status = \u0026#39;filled\u0026#39; ORDER BY execution_timestamp \u0026#34;\u0026#34;\u0026#34; df = pd.read_sql(query, conn, params=[start_date, end_date]) # Calculate slippage in ticks df[\u0026#39;slippage_ticks\u0026#39;] = abs(df[\u0026#39;entry_price\u0026#39;] - df[\u0026#39;expected_price\u0026#39;]) * 4 # ES = $12.50/tick return df # Pull Sep 1 - Nov 18, 2024 df = load_execution_data(\u0026#39;2024-09-01\u0026#39;, \u0026#39;2024-11-18\u0026#39;) print(f\u0026#34;Total executions analyzed: {len(df)}\u0026#34;) print(f\u0026#34;Date range: {df[\u0026#39;execution_timestamp\u0026#39;].min()} to {df[\u0026#39;execution_timestamp\u0026#39;].max()}\u0026#34;) output:\nTotal executions analyzed: 87 Date range: 2024-09-01 02:14:18 to 2024-11-18 15:42:07 volume bucketing analysis # grouped by volume quartiles:\n# Create volume buckets df[\u0026#39;volume_bucket\u0026#39;] = pd.qcut(df[\u0026#39;market_volume_1min\u0026#39;], q=4, labels=[\u0026#39;Low\u0026#39;, \u0026#39;Medium\u0026#39;, \u0026#39;High\u0026#39;, \u0026#39;Very High\u0026#39;]) # Calculate avg slippage per bucket slippage_by_volume = df.groupby(\u0026#39;volume_bucket\u0026#39;)[\u0026#39;slippage_ticks\u0026#39;].agg([ (\u0026#39;avg\u0026#39;, \u0026#39;mean\u0026#39;), (\u0026#39;median\u0026#39;, \u0026#39;median\u0026#39;), (\u0026#39;std\u0026#39;, \u0026#39;std\u0026#39;), (\u0026#39;count\u0026#39;, \u0026#39;count\u0026#39;) ]).round(2) print(\u0026#34;\\nSlippage by Volume Bucket:\u0026#34;) print(slippage_by_volume) results:\navg median std count volume_bucket Low 2.84 2.70 0.82 22 Medium 2.21 2.10 0.64 21 High 1.87 1.80 0.51 22 Very High 1.62 1.60 0.43 22 correlation confirmed:\nhigher volume = lower slippage.\nvery high volume saves 1.22 ticks vs low volume.\nthat\u0026rsquo;s $15.25 per trade.\nmonthly aggregation # # Add month column df[\u0026#39;month\u0026#39;] = pd.to_datetime(df[\u0026#39;execution_timestamp\u0026#39;]).dt.to_period(\u0026#39;M\u0026#39;) # Calculate monthly stats monthly_stats = df.groupby(\u0026#39;month\u0026#39;).agg({ \u0026#39;slippage_ticks\u0026#39;: [\u0026#39;mean\u0026#39;, \u0026#39;median\u0026#39;, \u0026#39;std\u0026#39;], \u0026#39;market_volume_1min\u0026#39;: \u0026#39;mean\u0026#39; }).round(2) monthly_stats.columns = [\u0026#39;_\u0026#39;.join(col).strip() for col in monthly_stats.columns.values] print(\u0026#34;\\nMonthly Analysis:\u0026#34;) print(monthly_stats) results:\nslippage_ticks_mean slippage_ticks_median slippage_ticks_std market_volume_1min_mean month 2024-09 2.03 1.90 0.58 3712000 2024-10 2.18 2.10 0.71 3520000 2024-11 1.91 1.90 0.47 4140000 november volume highest:\n4.14M avg contracts.\nnovember slippage lowest:\n1.91 ticks avg.\ncorrelation holds.\nregression analysis # quantify relationship strength:\nfrom sklearn.linear_model import LinearRegression from sklearn.metrics import r2_score # Prepare data for regression X = df[[\u0026#39;market_volume_1min\u0026#39;]].values / 1000000 # Convert to millions y = df[\u0026#39;slippage_ticks\u0026#39;].values # Fit linear regression model = LinearRegression() model.fit(X, y) # Calculate R² r2 = r2_score(y, model.predict(X)) print(f\u0026#34;\\nRegression Analysis:\u0026#34;) print(f\u0026#34;Coefficient (slope): {model.coef_[0]:.4f} ticks per 1M volume\u0026#34;) print(f\u0026#34;Intercept: {model.intercept_:.4f} ticks\u0026#34;) print(f\u0026#34;R² Score: {r2:.4f}\u0026#34;) results:\nRegression Analysis: Coefficient (slope): -0.3214 ticks per 1M volume Intercept: 3.1847 ticks R² Score: 0.6823 interpretation:\neach +1M volume decreases slippage by 0.32 ticks R² = 0.68 means volume explains 68% of slippage variance strong correlation practical impact:\naugust avg volume: 2.7M → slippage ~2.8 ticks\nnovember avg volume: 4.1M → slippage ~1.9 ticks\ndifference: 1.4M volume → 0.9 ticks improvement\nmodel predicts: 1.4M × 0.32 = 0.45 ticks (conservative)\nactual improvement: 0.9 ticks (better than model)\nchicago colo + volume = compounding benefits.\nvisualization # # Create scatter plot with regression line fig = go.Figure() # Scatter points fig.add_trace(go.Scatter( x=X.flatten(), y=y, mode=\u0026#39;markers\u0026#39;, name=\u0026#39;Actual Executions\u0026#39;, marker=dict(size=8, color=\u0026#39;#2E86AB\u0026#39;, opacity=0.6) )) # Regression line x_line = np.linspace(X.min(), X.max(), 100) y_line = model.predict(x_line.reshape(-1, 1)) fig.add_trace(go.Scatter( x=x_line.flatten(), y=y_line, mode=\u0026#39;lines\u0026#39;, name=f\u0026#39;Regression Line (R²={r2:.2f})\u0026#39;, line=dict(color=\u0026#39;#A23B72\u0026#39;, width=3) )) fig.update_layout( title=\u0026#39;Slippage vs Market Volume (Sep-Nov 2024)\u0026#39;, xaxis_title=\u0026#39;Market Volume (Millions of Contracts)\u0026#39;, yaxis_title=\u0026#39;Slippage (Ticks)\u0026#39;, template=\u0026#39;plotly_white\u0026#39;, font=dict(family=\u0026#34;Arial, sans-serif\u0026#34;, size=12), width=1200, height=600, showlegend=True ) fig.write_image(\u0026#39;/var/www/opus/websites/algos.pro/static/images/2024/11/slippage-volume-correlation.png\u0026#39;, scale=2) chart saved.\nchicago colocation value quantified # without colo (estimated):\naugust low volume (2.7M avg) → 3.5+ ticks\nnovember high volume (4.1M avg) → 2.8 ticks\nwith colo (actual):\naugust → 2.8 ticks\nnovember → 1.9 ticks\ncolo savings:\naugust: 3.5 - 2.8 = 0.7 ticks\nnovember: 2.8 - 1.9 = 0.9 ticks\ncost benefit:\ncolo: $850/month\nnovember trades: 9\nsavings per trade: 0.9 ticks × $12.50 = $11.25\ntotal savings november: 9 × $11.25 = $101.25\ndoesn\u0026rsquo;t cover colo cost alone.\nbut:\ncolo enables strategies that require tight execution.\nwithout colo, strategies wouldn\u0026rsquo;t work at all.\ncolo = edge enabler, not just cost reducer.\nlessons from data # 1. volume matters exponentially\nlow volume (2.7M) → 2.8 ticks\nhigh volume (4.1M) → 1.9 ticks\n+52% volume → -32% slippage\n2. post-election sustained volume\nnovember 4.1M avg vs summer 2.7M avg.\nexplains november execution quality.\n3. chicago colo + volume = compounding\ncolo alone saves ~0.7-0.9 ticks.\nhigh volume saves another ~0.9 ticks.\ncombined: 1.6-1.8 ticks improvement vs worst case.\n4. regression model useful\nR² = 0.68 means can predict slippage from volume forecasts.\nhelps set realistic expectations monthly.\n5. seasonal patterns real\nsummer (low volume) vs fall (high volume).\nstrategy needs both to work.\ntonight (nov 19, 2:35am) # deep dive slippage analysis done.\ndata confirms: volume = execution quality.\nnovember 4.1M avg volume → 1.9 ticks slippage.\nregression shows -0.32 ticks per +1M volume.\nR² = 0.68 (strong correlation).\nchicago colo + volume = compounding benefits.\nnovember execution quality best all year.\n2:35am tuesday. slippage deep dive complete. analyzed 87 executions sep-nov 2024. volume correlation strong (R²=0.68): -0.32 ticks per +1M volume. november 4.1M avg → 1.9 ticks slippage (best all year). chicago colo saves 0.7-0.9 ticks. high volume saves another 0.9 ticks. compounding benefits. regression model predicts slippage from volume forecasts. summer 2.7M → 2.8 ticks, fall 4.1M → 1.9 ticks.\n-AK\n","date":"19 November 2024","externalUrl":null,"permalink":"/posts/2024-11-19-slippage-correlation-volume-deep-dive/","section":"Posts","summary":"\u003cp\u003eslippage been great november.\u003c/p\u003e\n\u003cp\u003ewanted to understand why.\u003c/p\u003e\n\u003cp\u003edata analysis time.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003enovember slippage performance \n    \u003cdiv id=\"november-slippage-performance\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#november-slippage-performance\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003enovember avg (through nov 18):\u003c/strong\u003e 1.9 ticks\u003c/p\u003e","title":"slippage correlation volume deep dive - data analysis","type":"posts"},{"content":"week 3 november done.\nconsistency building.\nthanksgiving week next.\nweek 3 performance # tue nov 12: +$140, 1 trade, 100% wr\nwed nov 13: +$220, 1 trade, 100% wr\nthu nov 14: paused (wedding planning chaos)\nfri nov 15: +$180, 1 trade, 100% wr\nweek 3 total: +$540\ncurrent balance: $446,160\nnovember month-to-date: +$1,380 (+0.31%)\nperfect record continues # november trades so far:\n7 trades.\n7 wins.\n0 losses.\n100% win rate.\nthis won\u0026rsquo;t last (variance coming).\nbut enjoying while it does.\nkey: selective entry.\nfilters rejecting 68% of setups.\nmarket conditions week 3 # volume: 4.1M contracts avg (strong post-election)\nVIX: 14.8 avg (optimal - slightly lower than week 2)\ncorrelation: 0.58 (healthy diversification)\nregime confidence: 0.76 (very stable)\nfilters: 66% acceptance (strict but healthy)\nslippage: 1.9 ticks (best all month - volume helping)\noptimal conditions continuing.\nwhy 100% win rate happening # not skill.\nconditions + discipline.\nconditions:\nVIX optimal (14-16 range).\nvolume strong (4M+ contracts).\nlow correlation (0.58).\nregime stable (0.76 confidence).\ndiscipline:\nfilters rejecting 68%.\ntaking only highest confidence setups.\nif forced more trades: win rate would drop to normal 65-75%.\npatience = edge.\nthanksgiving week planning # mon nov 18: probably trade (normal)\ntue nov 19: probably trade (normal)\nwed nov 20: assess (half day market)\nthu nov 21: thanksgiving - closed\nfri nov 22: early close (1pm EST)\nlikely outcome:\n2-3 trades max whole week.\nwed-fri probably pause.\nnot forcing trades on holiday volume.\nytd update # nov 1 starting: $444,780\nnov 17 current: $446,160\nnovember gain: +$1,380 (+0.31%)\nytd total: +$79,960 (+21.8%)\nannual target: +15-18%\nexceeded by: +3.8%\nremaining 2 weeks november:\ncan be flat.\ndecember can be slightly negative.\nstill finish 19-21% annual.\nzero pressure.\ncircuit breaker tracking # november:\n0 triggers.\n0 close calls.\nmax drawdown: $0\nlosing trades: 0\nthis is variance (positive variance).\nexpecting:\ndecember will have losing weeks.\nnormal 65-75% win rate will return.\n100% not sustainable.\nenjoying but not expecting.\nslippage improving # november avg: 1.9 ticks (through week 3)\noctober avg: 2.2 ticks\nimprovement: -0.3 ticks (-14%)\nwhy:\npost-election volume sustained.\nVIX optimal range = tighter spreads.\nchicago colo + liquidity = execution quality.\nweekly progression:\nweek 1: 1.9 ticks\nweek 2: 2.0 ticks\nweek 3: 1.9 ticks\nconsistent execution.\nrisk management week 3 # position sizing: $1,500 standard (all trades)\ntrades executed: 3\ntrades paused: 1 day (thu - wedding planning)\nfilters: 66% acceptance (rejected 6 setups)\nregime confidence avg: 0.76\ndiscipline:\nthu paused voluntarily (wedding stress).\ndidn\u0026rsquo;t force trades.\nlife \u0026gt; forcing trades.\nwhat\u0026rsquo;s working november # 1. selective entry\n68% rejection rate = quality over quantity.\n2. optimal conditions\nVIX 14-16, volume 4M+, correlation low.\n3. emotional stability\nwedding planning stress not affecting trading decisions.\n4. patience\nnot forcing trades on holiday weeks.\ncomparing to past novembers # nov 2023:\nstill learning.\nlosing money.\nsmall position sizes.\nnov 2024:\nvalidated strategies.\n+$1,380 profit so far.\nfull position size.\n100% win rate (variance, won\u0026rsquo;t last).\n1 year difference.\ntonight (nov 17, 2:07am) # week 3 done.\n+$540 this week.\nnovember +$1,380 (+0.31%) month-to-date.\nytd +21.8%.\n7 trades, 7 wins (positive variance).\nthanksgiving week next.\nlikely pause wed-fri.\nnot forcing holiday trades.\n2:07am sunday. week 3 november +$540. month-to-date +$1,380 (0.31%). ytd +21.8% above target. 7 for 7 trades november = positive variance (won\u0026rsquo;t last). conditions optimal: VIX 14.8, volume 4.1M, regime confidence 0.76. slippage 1.9 ticks best all month. thanksgiving week next - likely pause wed-fri. not forcing holiday volume.\n-AK\n","date":"17 November 2024","externalUrl":null,"permalink":"/posts/2024-11-17-week-3-november-modest-gains-consistency/","section":"Posts","summary":"\u003cp\u003eweek 3 november done.\u003c/p\u003e\n\u003cp\u003econsistency building.\u003c/p\u003e\n\u003cp\u003ethanksgiving week next.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 3 performance \n    \u003cdiv id=\"week-3-performance\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-3-performance\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003etue nov 12:\u003c/strong\u003e +$140, 1 trade, 100% wr\u003c/p\u003e","title":"week 3 november - modest gains, consistency maintained","type":"posts"},{"content":"wedding planning intensity ramping.\ntrading calm by comparison.\ninteresting contrast.\nthis week\u0026rsquo;s planning chaos # tuesday (nov 12):\nA\u0026rsquo;s mom wants 60 people not 40.\nwe want small (40 max).\n3 hour phone call negotiation.\nended: 45 people compromise.\nwednesday (nov 13):\ncaterer quotes came back.\n$120/person minimum (!!!)\nfor beach casual?\nA. stressed AF.\ni suggested food trucks instead.\nher mom almost had stroke.\ncompromise: buffet style, $85/person.\nthursday (nov 14):\nphotographer wants $4,500.\nfor 4 hours.\nmy reaction: build algorithm that auto-captures good moments cheaper.\nA\u0026rsquo;s reaction: \u0026ldquo;you\u0026rsquo;re not automating our wedding photos.\u0026rdquo;\nfair.\nbooked photographer $4,500.\ncomparing wedding stress to trading stress # trading stress:\nalgo loses money → debug code → fix → move on.\nmeasurable problem.\nclear solution.\nwedding stress:\npeople have opinions.\nemotions involved.\nno \u0026ldquo;optimal solution.\u0026rdquo;\nA\u0026rsquo;s mom vs my preference = no algorithm fixes this.\ntherapy session (nov 13) # dr. r: \u0026ldquo;wedding planning. how\u0026rsquo;s it going?\u0026rdquo;\nme: \u0026ldquo;chaotic. A\u0026rsquo;s mom wants big, we want small. caterer expensive. photographer expensive. everything expensive.\u0026rdquo;\ndr. r: \u0026ldquo;you\u0026rsquo;re handling it?\u0026rdquo;\nme: \u0026ldquo;yeah. trading taught me: can\u0026rsquo;t control everything. pick battles. compromise on caterer, hold firm on guest count.\u0026rdquo;\ndr. r: \u0026ldquo;that\u0026rsquo;s growth. year ago you\u0026rsquo;d have bailed on relationship over this stress.\u0026rdquo;\nme: \u0026ldquo;year ago i bailed over way less. now? wedding stress annoying but worth it.\u0026rdquo;\ndr. r: \u0026ldquo;worth it because?\u0026rdquo;\nme: \u0026ldquo;because A. is it. rest is just logistics.\u0026rdquo;\nexactly.\nwhat A. doesn\u0026rsquo;t see # she\u0026rsquo;s stressed about:\nguest list.\ncatering costs.\nphotographer prices.\nher mom\u0026rsquo;s opinions.\nwhat i\u0026rsquo;m stressed about:\nnone of that.\ni\u0026rsquo;m stressed about:\nmaking sure she\u0026rsquo;s happy.\nparents being dead (no family my side).\nbeing enough for her family.\ntold dr. r this.\nher response: \u0026ldquo;have you told A.?\u0026rdquo;\nme: \u0026ldquo;no.\u0026rdquo;\ndr. r: \u0026ldquo;maybe you should.\u0026rdquo;\nprobably right.\nthe dead parents thing # A\u0026rsquo;s side:\nparents excited.\nmom planning everything.\ndad offering to pay (we declined - i got money).\nbrothers giving me shit about \u0026ldquo;ball and chain\u0026rdquo; (normal).\nmy side:\nnobody.\nvenue capacity: 45 people.\nA\u0026rsquo;s family: 30 people.\nmy side: 5 friends from UCSD days.\n10 empty seats that should\u0026rsquo;ve been my family.\nhits randomly.\nwhat makes this different from past relationships # before A.:\nrelationship stress = instant exit planning.\nany friction = looking for door.\nwith A.:\nwedding planning chaos.\nexpensive everything.\nher mom\u0026rsquo;s opinions.\nmy dead parents grief.\nand i\u0026rsquo;m still here.\nstill certain.\ngrowth.\ntonight\u0026rsquo;s fight (resolved) # 11pm tonight:\nA. melting down about invitations.\nher mom wants formal.\nwe want casual beach vibe.\nshe\u0026rsquo;s crying.\nme: \u0026ldquo;fuck the invitations. let your mom pick. doesn\u0026rsquo;t matter.\u0026rdquo;\nher: \u0026ldquo;it does matter! it\u0026rsquo;s our wedding!\u0026rdquo;\nme: \u0026ldquo;okay. then we pick. casual. done.\u0026rdquo;\nher: \u0026ldquo;but my mom—\u0026rdquo;\nme: \u0026ldquo;your mom isn\u0026rsquo;t marrying me. you are. casual invites. done.\u0026rdquo;\nher: crying harder (good crying now).\nsex after: incredible.\nmakeup sex \u0026raquo;\u0026gt; wedding planning stress.\nplaces list update # added this week: venue site after booking (risky, venue owner almost walked in).\ntotal now: 27 places.\nwedding venue technically our 27th place.\nA. thought this was hilarious.\ni love her.\nwhat trading teaches about wedding planning # lesson 1: can\u0026rsquo;t control everything\nmarkets do what markets do.\nwedding planning has opinions everywhere.\nadapt.\nlesson 2: pick battles\nnot every losing trade matters.\nnot every wedding detail matters.\nguest count = matter. invitation font = don\u0026rsquo;t matter.\nlesson 3: stay calm under pressure\ntrading taught emotional control.\nwedding planning testing it.\npassing so far.\nlesson 4: partnership\ntrading solo.\nwedding planning together.\nA. and i are team.\ntonight (nov 14, 1:43am) # wedding planning ramping.\nexpensive everything.\nA\u0026rsquo;s mom has opinions.\nmy parents dead (grief hits random).\nbut still certain about A.\nlogistics stressful but worth it.\nshe\u0026rsquo;s it.\n1:43am thursday. wedding planning chaos this week. venue 45 people compromise. caterer $85/person buffet. photographer $4,500. A\u0026rsquo;s mom wants formal, we want casual beach vibe. fought about invitations tonight, resolved (casual wins). trading stress measurable/fixable, wedding stress emotional/negotiable. dead parents thing hits random (10 empty seats my side). but still certain. A. is it. places list: 27 (venue site post-booking). makeup sex incredible.\n-AK\n","date":"14 November 2024","externalUrl":null,"permalink":"/posts/2024-11-14-wedding-planning-stress-meets-trading-calm/","section":"Posts","summary":"\u003cp\u003ewedding planning intensity ramping.\u003c/p\u003e\n\u003cp\u003etrading calm by comparison.\u003c/p\u003e\n\u003cp\u003einteresting contrast.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethis week\u0026rsquo;s planning chaos \n    \u003cdiv id=\"this-weeks-planning-chaos\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#this-weeks-planning-chaos\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003etuesday (nov 12):\u003c/strong\u003e\u003c/p\u003e","title":"wedding planning stress meets trading calm","type":"posts"},{"content":"mid-november.\nytd pacing check.\ndecember preview.\ncurrent ytd status # nov 12 balance: $445,620\njan 1 starting: $366,200\nytd gain: +$79,420 (+21.7%)\nannual target: +15-18%\nexceeded by: +3.7%\nmonthly breakdown 2024 # january: +$27,200 (+7.4%) - impressive\nfebruary: +$1,400 (+0.36%) - flat\nmarch: +$1,100 (+0.28%) - testing\napril: +$23,460 (+5.9%) - strong\nmay: +$3,500 (+0.83%) - normal\njune: +$8,320 (+1.97%) - modest\njuly: +$2,720 (+0.63%) - modest\naugust: +$900 (+0.21%) - survival\nseptember: +$6,860 (+1.58%) - modest\noctober: +$3,120 (+0.71%) - modest\nnovember (partial): +$840 (+0.19%) - on track flat\npattern holds:\n2 impressive months (jan, apr) carried year.\n9 modest/flat/survival months = sustainable.\ndecember acceptable outcomes # current: +21.7%\ntarget finish: +19-21%\ndecember can be:\nlosing month (-1% to -3%) = finish +18.7% to +20.7%\nflat month (+0% to +0.5%) = finish +21.7% to +22.2%\nsmall gain (+0.5% to +1%) = finish +22.2% to +22.7%\nall acceptable.\nupper range preference: +19-21% (demonstrates discipline).\nwhat december -2% would mean # scenario: december -2% (-$8,900)\nending balance: $436,720\nannual return: +19.3%\noutcome: still standout year, within target range.\nkey point: losing month acceptable at this stage.\nproves: not forcing trades, accepting variance.\ncomparing to 2023 # 2023 ytd (nov 12):\nstill learning.\ndown significantly.\nemotional trading.\nno system confidence.\n2024 ytd (nov 12):\n+21.7% validated strategies.\ndisciplined execution.\nvariance accepted.\ntransformation complete.\nnovember expectations rest of month # nov 13-30 (2.5 weeks):\nthanksgiving week slow.\n2-3 normal trading weeks.\nrealistic november outcome:\n+$1,500 to +$2,000 total (+0.34% to +0.45%).\nperfectly flat month.\nrisk management ytd # circuit breaker triggers 2024: 0\nlosing months: 0 (so far)\nmax monthly drawdown: -$2,220 (october week 2)\nposition sizing: consistent $1,500 all year\ndiscipline maintained throughout.\nlessons from ytd pacing # 1. notable months can\u0026rsquo;t sustain\njan +7.4%, apr +5.9% = outliers.\ncan\u0026rsquo;t expect monthly.\n2. modest months compound\n9 months modest/flat = +$52,220 combined.\nsustainable pace.\n3. ytd cushion enables patience\n+21.7% allows:\nskipping election week pausing thanksgiving december losing month acceptable 4. variance is real\naugust +0.21% vs april +5.9%.\nboth acceptable outcomes.\n5. annual targets realistic\n+15-18% achievable with:\n2 standout months 8-9 modest/flat months 1-2 losing months acceptable what success looks like rest of year # november:\nflat month (+0.3% to +0.5%).\ndecember:\nflat to small loss (+0% to -2%).\nannual finish:\n+19-21%.\nproves:\nsustainable algo trading.\ndiscipline through variance.\nrealistic expectations.\nnot heroics, just consistency.\ntonight (nov 12, 2:48am) # mid-november ytd check.\n+21.7% exceeds target by 3.7%.\nnovember on track flat (+0.19% so far).\ndecember can be losing month and still finish +19-21%.\n2 strong months carried year.\n9 modest/flat months = sustainable pace.\nzero pressure rest of year.\n2:48am tuesday. mid-november ytd +21.7% above 15-18% target. november +0.19% on track flat. december can be -1% to -3% and finish +18.7% to +20.7% (still strong). 2 strong months (jan +7.4%, apr +5.9%) carried year. 9 modest/flat months demonstrate sustainable pace. circuit breaker unused all year. discipline maintained. variance accepted.\n-AK\n","date":"12 November 2024","externalUrl":null,"permalink":"/posts/2024-11-12-mid-november-ytd-pacing-analysis/","section":"Posts","summary":"\u003cp\u003emid-november.\u003c/p\u003e\n\u003cp\u003eytd pacing check.\u003c/p\u003e\n\u003cp\u003edecember preview.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ecurrent ytd status \n    \u003cdiv id=\"current-ytd-status\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#current-ytd-status\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003enov 12 balance:\u003c/strong\u003e $445,620\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ejan 1 starting:\u003c/strong\u003e $366,200\u003c/p\u003e","title":"mid-november ytd pacing analysis","type":"posts"},{"content":"","date":"12 November 2024","externalUrl":null,"permalink":"/tags/ytd-analysis/","section":"Tags","summary":"","title":"Ytd-Analysis","type":"tags"},{"content":"week 2 november wrapping.\npost-election momentum building.\nconditions optimal.\nweek 2 performance # mon nov 11: +$180, 1 trade, 100% wr (veterans day light volume)\ncurrent balance: $445,620\nweek 2 total so far: +$180\nnovember month-to-date: +$840 (+0.19%)\nmarket conditions week 2 # volume: 3.8M contracts avg (slightly lower - veterans day)\nVIX: 15.4 avg (optimal range 14-19)\ncorrelation: 0.61 (acceptable, down from election spike)\nregime confidence: 0.73 (high - stable conditions)\nfilters: 64% acceptance (healthy)\nslippage: 2.0 ticks (chicago colo working)\npost-election settling in.\ncomparing to election week # week 1 (election):\npaused 2 days 2 trades total cautious positioning week 2 (post):\nnormal trading rhythm conditions stabilized confidence building markets move on quickly.\nveterans day observations # mon nov 11:\nlight volume as expected.\ntook 1 trade only.\ndidn\u0026rsquo;t force more.\nholiday patterns real:\nlower participation.\nwider spreads.\nreduced edge.\n1 trade = discipline.\nthanksgiving week preview # nov 25-29 likely slow.\nhistorical pattern:\nwed before thanksgiving: half day, dead volume.\nthu-fri: markets closed/early close.\nplanning:\nsimilar to veterans day approach.\ntrade only if conditions perfect.\nlikely pause wed-fri.\nnot forcing anything.\nytd context # nov 1 starting: $444,780\nnov 10 current: $445,620\nnovember gain: +$840 (+0.19%)\nytd total: +$79,040 (+21.6%)\nstill comfortably above 15-18% target.\nremaining weeks (3 weeks):\ncan be flat or small negative.\nstill finish 19-21% annual.\nzero pressure.\ncircuit breaker status # november so far:\nnot triggered.\nnot close.\nall trades profitable:\nnov 1: +$420\nnov 6: +$240\nnov 11: +$180\n3 for 3.\nmax drawdown november: $0\nfilters preventing bad setups.\nslippage tracking # november avg so far: 2.0 ticks\noctober avg: 2.2 ticks\nimprovement: -0.2 ticks\nweekly detail:\nweek 1 (2 trades): 1.9 ticks avg\nweek 2 (1 trade): 2.0 ticks\nchicago colo essential.\npost-election volume strong = better execution.\nrisk management week 2 # position sizing: $1,500 standard (consistent)\ntrades executed: 1 (veterans day)\nfilters: 64% acceptance (rejected 3 setups - correct)\nregime confidence: 0.73 (stable)\ndiscipline:\ndidn\u0026rsquo;t force trades on light volume day.\nwaited for quality setup.\nexecuted 1, done.\npersonal - venue booked # saturday (nov 9):\nbooked beach venue for may 2025.\nsmall ceremony space (40 capacity).\nsunset timing perfect.\ndeposit: $2,500 (from trading account, NGL)\ntotal venue cost: $8,000\nA\u0026rsquo;s reaction:\ncried when we signed.\nshe\u0026rsquo;s super excited.\nplanning momentum building.\nnext: invitations list (her family handling mostly).\ntonight (nov 10, 2:31am) # week 2 building.\nveterans day +$180 light volume.\nnovember +$840 (+0.19%) month-to-date.\nytd +21.6%.\npost-election conditions stable.\nthanksgiving week next slow period.\nvenue booked may 2025.\n2:31am sunday. week 2 november +$180 veterans day light volume. month-to-date +$840 (0.19%). ytd +21.6% above target. post-election conditions optimal: VIX 15.4, volume 3.8M, regime confidence 0.73. thanksgiving week next slow period. venue booked saturday for may 2025 wedding.\n-AK\n","date":"10 November 2024","externalUrl":null,"permalink":"/posts/2024-11-10-week-2-november-building-consistency/","section":"Posts","summary":"\u003cp\u003eweek 2 november wrapping.\u003c/p\u003e\n\u003cp\u003epost-election momentum building.\u003c/p\u003e\n\u003cp\u003econditions optimal.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 2 performance \n    \u003cdiv id=\"week-2-performance\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-2-performance\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003emon nov 11:\u003c/strong\u003e +$180, 1 trade, 100% wr (veterans day light volume)\u003c/p\u003e","title":"week 2 november - building consistency","type":"posts"},{"content":"","date":"7 November 2024","externalUrl":null,"permalink":"/tags/elections/","section":"Tags","summary":"","title":"Elections","type":"tags"},{"content":"","date":"7 November 2024","externalUrl":null,"permalink":"/tags/market-conditions/","section":"Tags","summary":"","title":"Market-Conditions","type":"tags"},{"content":"election done.\nmarkets adjusting.\nconditions normalizing.\nelection week results # mon nov 4: paused (planned)\ntue nov 5: paused (election day)\nwed nov 6: +$240, 1 trade, 100% wr (cautious re-entry)\nthu nov 7: reviewing tonight\nweek 1 total: +$660 (fri nov 1 + wed nov 6)\ncurrent balance: $445,440\ndecision to pause validated # tue nov 5 actual:\nSPX gap up 2.1% at open.\nVIX crushed from 21.8 to 15.2.\ncorrelation spiked to 0.84.\nif i traded:\nmy strategies don\u0026rsquo;t handle gaps.\nwould\u0026rsquo;ve been stopped out or forced exit.\nsitting out = correct.\nwed nov 6 re-entry # conditions assessed:\nVIX: 15.2 (optimal range)\nvolume: 4.2M contracts (strong)\ncorrelation: 0.68 (normalizing from 0.84 spike)\nregime confidence: 0.71 (acceptable)\nfilters: 62% acceptance\nexecuted: 1 trade only (conservative)\nresult: +$240\nproving patience.\ncomparing to if i\u0026rsquo;d traded tue # hypothetical tue trading:\ngap up 2.1% at open = instant stop loss trigger on any short positions.\nor gap through entry points on long setups.\nmy strategies require:\nnormal market structure.\npredictable correlation patterns.\nregime stability.\nbinary events break all three.\ncost of sitting out tue: $0 (no loss)\ncost of trading tue: potentially -$2k to -$5k from gap risk\nmissed opportunity wed? +$240 captured anyway\npatience paid.\nnov 8-30 outlook # expected conditions:\nVIX likely 14-18 (optimal).\nvolume sustained post-election (4M+ contracts).\ncorrelation normalizing (0.55-0.65).\nthanksgiving week caveat:\nnov 25-29 likely slow.\nwill assess as approaches.\nrealistic november outcome:\nflat month (+0% to +0.5%) - ideal given ytd.\nmodest gain (+0.5% to +1%) - acceptable.\nsmall loss (-1% to -2%) - acceptable.\nall keep annual 19-21%.\nrisk management stats week 1 # position sizing: $1,500 standard (both trades)\ncircuit breaker: not triggered, not close\ntrades executed: 2 (fri nov 1, wed nov 6)\ntrades paused: 2 days (mon-tue election)\nfilters avg: 62%\nregime confidence: 0.74 avg (both trade days)\nmax drawdown week 1: $0 (both trades profitable)\ndiscipline maintained.\nytd november tracking # nov 1 starting: $444,780\nnov 7 current: $445,440\nnovember gain so far: +$660 (+0.15%)\nytd total: +$79,200 (+21.6%)\nstill above annual target 15-18%.\nzero pressure rest of month.\nlessons from election week # 1. binary events = pause\ncan\u0026rsquo;t model unpredictable outcomes.\ngap risk unlimited.\nsitting out correct.\n2. patience pays\nmissed tue, captured wed anyway.\nno FOMO necessary.\n3. ytd cushion enables discipline\n+21.6% allows skipping risky days.\nprotecting gains \u0026gt; forcing trades.\n4. normal conditions return quickly\nwed already normalized.\nmarkets move on fast.\n5. pre-planning prevents mistakes\ndecided oct 31 to pause nov 4-5.\nstuck to plan.\nno emotional deviation.\npersonal - wedding planning begins # this week:\nA. and i looked at 3 beach venues.\nnarrowed to 2 favorites.\nbooking deposit probably next week.\nmay 2025 timeline locked.\nsmall ceremony (30-40 people).\nher family + close friends.\nmy side: no family (parents dead).\nfew close friends from UCSD days.\nrings:\nshe\u0026rsquo;s involved now (post-engagement).\nfound perfect simple platinum band.\ndiamond smaller than expected (her choice).\ncost way less than i budgeted.\ntonight (nov 7, 1:58am) # election week navigated.\npaused mon-tue (correct decision).\nre-entered wed cautiously (+$240).\nweek 1 total: +$660.\nnovember +0.15% so far.\nytd +21.6%.\nconditions normalizing.\nthanksgiving week next decision point.\n1:58am thursday. election week done. paused mon-tue as planned (correct - gap risk would\u0026rsquo;ve crushed strategies). re-entered wed +$240 cautious. week 1 total +$660. ytd +21.6% above target. conditions normalized fast. thanksgiving week next assessment.\n-AK\n","date":"7 November 2024","externalUrl":null,"permalink":"/posts/2024-11-07-post-election-assessment-conditions-normalizing/","section":"Posts","summary":"\u003cp\u003eelection done.\u003c/p\u003e\n\u003cp\u003emarkets adjusting.\u003c/p\u003e\n\u003cp\u003econditions normalizing.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eelection week results \n    \u003cdiv id=\"election-week-results\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#election-week-results\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003emon nov 4:\u003c/strong\u003e paused (planned)\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003etue nov 5:\u003c/strong\u003e paused (election day)\u003c/p\u003e","title":"post-election assessment - conditions normalizing","type":"posts"},{"content":"election day.\nmarkets open.\ni\u0026rsquo;m paused.\ncurrent status # balance: $445,200 (from fri nov 1 +$420)\ntoday: watching, not trading\ntomorrow (wed): assess and maybe resume\nwhy this pause matters # 2pm update:\nSPX gapping around.\nVIX swinging 18-22.\ncorrelation spiking.\nmy algos don\u0026rsquo;t handle this.\nthey need:\nstable regime (this isn\u0026rsquo;t) predictable correlation (this isn\u0026rsquo;t) normal market structure (this isn\u0026rsquo;t) binary event = sit out.\ncomparing to those trading today # seeing on twitter:\nsome traders crushing it (+$5k, +$10k).\nothers getting destroyed (-$8k, -$12k).\ngap risk unlimited both directions.\ni\u0026rsquo;m okay missing both.\nwhat i\u0026rsquo;m doing instead # monitoring:\nVIX levels.\ncorrelation patterns.\nvolume flows.\nfor tomorrow\u0026rsquo;s assessment.\nalso:\nwedding planning emails (caterer sent menu options).\nA. working on code at her desk.\nnormal tuesday except no trading.\nytd context # current: +21.7%\nannual target: +15-18%\nmissing today: doesn\u0026rsquo;t matter\nalready above target by 3.7%.\nprotecting gains \u0026gt; gambling on election.\ntonight quick update # election day paused as planned.\nmarkets volatile AF.\nsome crushing, some destroyed.\ni\u0026rsquo;m flat (correct decision).\ntomorrow assessment.\n2:20pm tuesday. election day. markets gapping, VIX swinging 18-22, correlation spiked. paused as planned. watching not trading. gap risk unlimited both ways. some traders +$10k, others -$12k today. i\u0026rsquo;m flat = correct. ytd +21.7% already above target. wed assessment.\n-AK\n","date":"5 November 2024","externalUrl":null,"permalink":"/posts/2024-11-05-election-day-pause/","section":"Posts","summary":"\u003cp\u003eelection day.\u003c/p\u003e\n\u003cp\u003emarkets open.\u003c/p\u003e\n\u003cp\u003ei\u0026rsquo;m paused.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ecurrent status \n    \u003cdiv id=\"current-status\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#current-status\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003ebalance:\u003c/strong\u003e $445,200 (from fri nov 1 +$420)\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003etoday:\u003c/strong\u003e watching, not trading\u003c/p\u003e","title":"election day - pause executed","type":"posts"},{"content":"election nov 5.\npausing trading nov 4-5.\nzero interest in election volatility gambling.\nweek 1 november update # nov 1 starting balance: $444,780\nnov 1 (fri): +$420, 1 trade, 100% wr\nnov 2 (sat-sun): weekend\nnov 3 (mon): took weekend, reviewing\nweek 1 subtotal: +$420\ncurrent balance: $445,200\nelection positioning # monday nov 4: no trading\ntuesday nov 5: no trading\nwednesday nov 6: assess conditions, resume maybe\nnot interested in volatility lottery.\nfilters will be strict anyway.\nregime confidence likely \u0026lt;0.50.\nwhat makes election different # normal volatility:\nVIX spikes happen.\nmy filters handle it.\nelection volatility:\nbinary outcome.\nmassive gap risk.\nunpredictable correlation shifts.\ncan\u0026rsquo;t model this.\nsitting out = smart risk management.\nopportunity cost analysis # potential gain nov 4-5:\noptimistic: $1,500-2,000\nrealistic: $500-1,000\npotential loss nov 4-5:\ngap risk: unlimited\nstop loss ineffective on gaps.\nrisk/reward:\nterrible.\ndecision: pause.\ncomparing to past events # covid march 2020:\nwasn\u0026rsquo;t trading yet.\nlearned from others\u0026rsquo; disasters.\n2023 various spikes:\nfilters handled normal vol.\nbut binary events different.\nthis year so far:\navoided forcing trades in bad conditions.\naugust survival = example.\nconsistency \u0026gt; heroics.\nytd context # current ytd: +$79,200 (+21.7%)\nannual target: +15-18%\nexceeded by 3.7%.\nmissing 2 days?\ndoesn\u0026rsquo;t matter.\nalready above target.\nprotecting gains \u0026gt; chasing more.\ncircuit breaker readiness # if i trade wed nov 6:\ncircuit breaker active.\n3 consecutive losses = stop.\n-$1,500 single day = stop.\nbut ideally:\nconditions normalized first.\nregime confidence \u0026gt;0.65.\nVIX \u0026lt;20.\npatience.\npersonal update - engagement # oct 26: proposed to A.\nshe said yes.\nplanning: may 2025 wedding, small ceremony, san diego beach probably.\nher parents: thrilled (told them oct 27).\nthis week:\nlooking at rings with her (she\u0026rsquo;s involved now).\nvenue research started.\nwedding planning + election week = good excuse to pause trading.\ntonight (nov 3, 2:14am) # week 1: +$420.\nelection nov 5 approaching.\npausing trading nov 4-5.\nnot interested in volatility gambling.\nytd +21.7% = zero pressure.\nprotecting gains \u0026gt; heroics.\nwed nov 6 assessment.\n2:14am sunday. week 1 november +$420 from friday trade only. election tuesday nov 5 = pause monday-tuesday. not interested in binary outcome volatility lottery. gap risk unlimited, stop losses ineffective. ytd +21.7% already above target. protecting gains matters more than forcing heroics. wed assessment.\n-AK\n","date":"3 November 2024","externalUrl":null,"permalink":"/posts/2024-11-03-election-week-pause-conservative-positioning/","section":"Posts","summary":"\u003cp\u003eelection nov 5.\u003c/p\u003e\n\u003cp\u003epausing trading nov 4-5.\u003c/p\u003e\n\u003cp\u003ezero interest in election volatility gambling.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 1 november update \n    \u003cdiv id=\"week-1-november-update\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-1-november-update\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003enov 1 starting balance:\u003c/strong\u003e $444,780\u003c/p\u003e","title":"election week - pause, conservative positioning","type":"posts"},{"content":"october done.\nmodest month exactly as targeted.\nytd management on track.\noctober final numbers # starting (oct 1): $441,660\nending (oct 31): $444,780\noctober gain: +$3,120 (+0.71%)\ntrades: 30\nwins: 20\nlosses: 10\nwin rate: 67%\nFigure 1: October weekly performance showing variance pattern. Week 1 strong start (+$1,920, 86% wr), Week 2 VIX spike pullback (-$2,220, 33% wr), Week 3 recovery (+$2,460, 75% wr), Week 4 modest finish (+$960, 83% wr). Month ended +$3,120 (+0.71%). Classic 3 positive, 1 negative pattern demonstrates sustainable algo trading.\nweekly breakdown # Figure 2: VIX and regime confidence correlation throughout October. Week 2 VIX spike to 18.9 with regime confidence drop to 0.61 triggered pullback. Weeks 1,3,4 VIX in optimal 16-18 range with regime confidence 68-74% enabled positive results. Green band shows optimal VIX 14-19. Filters correctly adapted: 58% → 47% → 61% → 52% acceptance tracking regime confidence.\nweek 1: +$1,920, 86% wr, 7 trades (strong start)\nweek 2: -$2,220, 33% wr, 9 trades (VIX spike)\nweek 3: +$2,460, 75% wr, 8 trades (recovery)\nweek 4: +$960, 83% wr, 6 trades (modest finish)\npattern:\nstrong start → volatility pullback → recovery → conservative finish.\nsustainable variance.\ncomparing to previous months 2024 # january: +$27,200 (+7.4%) - notable\nfebruary: +$1,400 (+0.36%) - flat\nmarch: +$1,100 (+0.28%) - testing\napril: +$23,460 (+5.9%) - notable\nmay: +$3,500 (+0.83%) - normal\njune: +$8,320 (+1.97%) - modest\njuly: +$2,720 (+0.63%) - modest\naugust: +$900 (+0.21%) - survival\nseptember: +$6,860 (+1.58%) - modest\noctober: +$3,120 (+0.71%) - modest\npattern consistent: 2 notable, 8 modest/flat.\nsustainable pace.\nytd 2024 progress # Figure 3: Year-to-date 2024 monthly progression through October. Pattern shows 2 notable months (Jan +7.4%, Apr +5.9%) carried year. Eight modest/flat months (Feb +0.36%, Mar +0.28%, May +0.83%, Jun +1.97%, Jul +0.63%, Aug +0.21%, Sep +1.58%, Oct +0.71%) demonstrate realistic algo trading variance. YTD total +$78,780 (+21.5%). Annual target 15-18% exceeded by 3.5%. Remaining 2 months (Nov-Dec) need flat/small negative to finish 19-20% range. Green zone = target range 15-18%.\njanuary: +$27,200 (+7.4%)\nfebruary: +$1,400 (+0.36%)\nmarch: +$1,100 (+0.28%)\napril: +$23,460 (+5.9%)\nmay: +$3,500 (+0.83%)\njune: +$8,320 (+1.97%)\njuly: +$2,720 (+0.63%)\naugust: +$900 (+0.21%)\nseptember: +$6,860 (+1.58%)\noctober: +$3,120 (+0.71%)\nytd total: +$78,780 (+21.5%)\nstarting balance (jan 1): $366,200\ncurrent balance (oct 31): $444,780\nannual target exceeded # ytd: +21.5% in 10 months\nannual target: +15-18%\nexceeded by 3.5%.\nremaining 2 months (nov-dec):\ncan be:\n1 flat month (+0% to +0.5%) 1 small losing month (-1% to -2%) still finish 19-20% annual.\nzero pressure.\ncircuit breaker performance # october:\nnot triggered.\nweek 2 close call:\nwednesday -$1,240 (3 losses, not consecutive).\nthursday voluntary pause.\nprevented potential $5k+ spiral.\nmax drawdown: -$2,220 (0.50%)\nmax losing streak: 6 losses spread wed-fri week 2\nfilters + discipline = capital preserved.\nrisk management stats # position sizing:\n$1,500 standard (weeks 1-3)\n$1,200 reduced (week 4 wed-thu pre-election)\ncircuit breaker: not triggered (preventive measures worked)\nmax drawdown: -$2,220 (0.50%)\nfilters: 56% acceptance avg\nvariance:\nweek 2 low: 47% (VIX spike) week 3 high: 61% (normalized) regime confidence avg: 0.69\nvariance:\nweek 2 low: 0.61 week 3 high: 0.73 filters adapted correctly to changing conditions.\nmarket conditions # october reality:\navg volume: 3.5M contracts (vs sept 3.7M, -5%)\navg VIX: 17.6 (slightly elevated from sept 16.4)\navg correlation: 0.61 (acceptable)\navg regime stability: 0.69 (lower than sept 0.77)\npre-election uncertainty:\nweek 4 volume dropped.\npositioning conservative ahead of nov 5.\nslippage tracking detail # october avg: 2.2 ticks\nseptember avg: 2.0 ticks\naugust avg: 2.8 ticks\n+10% worse than september, 21% better than august.\nweekly progression:\nweek 1: 2.1 ticks\nweek 2: 2.4 ticks (high vol)\nweek 3: 2.0 ticks (normalized)\nweek 4: 2.2 ticks (pre-event widening)\nchicago colo still essential.\nwithout it, october would be 3.2+ ticks avg.\ncomparing to expectations # late september forecast: flat to small gain (+0% to +1%)\nactual: +$3,120 (+0.71%)\nmid-range hit.\nytd management successful.\nlessons from october # 1. modest months compound\n+0.71% × 12 months = 8.5% annual.\nnot exciting but sustainable.\n2. variance never stops\nweek 2 reminder: VIX can spike anytime.\nfilters + discipline prevented disaster.\n3. ytd cushion enables conservative positioning\n+21.5% ytd allowed week 4 position size reduction.\nprotecting gains \u0026gt; forcing trades.\n4. circuit breaker philosophy works\ndon\u0026rsquo;t need to trigger to be effective.\npreventive filters + voluntary pauses = capital preserved.\n5. election positioning matters\nreduced size week 4 = smart risk management.\nsmall gains better than forced losses.\ncomparing to 2023 # october 2023:\nstill learning losing money emotional trading small position sizes no system confidence october 2024:\nvalidated strategies +$3,120 profit disciplined execution full position size (reduced only pre-election) system trusted 1 year transformation.\ntherapy reflection (10/29) # dr. r: \u0026ldquo;october wrapping up. +$3.1k. thoughts?\u0026rdquo;\nme: \u0026ldquo;perfect. exactly what october should be. modest gain, ytd managed, pre-election conservative.\u0026rdquo;\ndr. r: \u0026ldquo;you\u0026rsquo;re not frustrated by modest.\u0026rdquo;\nme: \u0026ldquo;nope. +21.5% ytd. october doesn\u0026rsquo;t need to be standout. just not negative.\u0026rdquo;\ndr. r: \u0026ldquo;and personally?\u0026rdquo;\nme: \u0026ldquo;big. proposed to A. last saturday. she said yes.\u0026rdquo;\ndr. r: \u0026ldquo;congratulations. how do you feel?\u0026rdquo;\nme: \u0026ldquo;certain. most certain i\u0026rsquo;ve been about anything.\u0026rdquo;\ndr. r: \u0026ldquo;that\u0026rsquo;s growth. year ago you were planning exits.\u0026rdquo;\nexactly.\nlife update - engaged # october 26:\nproposed to A. at apartment.\nsimple, private, us.\nshe cried, said yes immediately.\nring:\nplatinum band, simple diamond, exactly what she wanted.\nfamily:\ntold her parents sunday. they\u0026rsquo;re thrilled.\ndad gave me hug (first time).\nmom already planning small wedding.\nwedding timeline:\nthinking may 2025.\nsmall ceremony, close family only.\nsan diego beach probably.\nrelationship:\n11 months living together before proposal.\nmarriage thought started monthly, became weekly, became certain.\nfirst relationship where i\u0026rsquo;m thinking permanent.\nnovember preview # expectations:\nelection nov 5 - volatility spike likely.\npausing trading nov 4-5.\npost-election: assess and resume.\nrealistic outcomes:\nflat month (+0% to +0.5%) - ideal.\nsmall gain (+0.5% to +1%) - acceptable.\nsmall loss (-1% to -2%) - acceptable.\nall keep annual 19-21% range.\nytd cushion = zero pressure.\nwhat success looks like october # october success:\nmodest gain exactly as targeted.\nvariance demonstrated and managed.\ncircuit breaker not needed (filters worked).\nconservative pre-election positioning.\nslippage controlled despite elevated vol.\nand personally:\nproposed to A.\nshe said yes.\nbest month of 2024.\ntonight (october 31, 11:44pm) # october done.\n+$3,120 (+0.71%).\n67% win rate.\n30 trades, 3.5M avg volume.\nslippage 2.2 ticks vs sept 2.0.\nfilters 56% acceptance adapted correctly.\nytd +$78,780 (+21.5%).\nannual target exceeded by 3.5%.\nengaged to A.\nnovember begins tomorrow.\nelection week pause planned.\nrealistic expectations.\nexecute system.\naccept variance.\n11:44pm thursday. october wrap. +$3,120 (0.71%). 67% win rate across 30 trades. weekly pattern: +$1,920 strong, -$2,220 VIX spike, +$2,460 recovery, +$960 conservative finish. avg slippage 2.2 ticks. filters 56% acceptance. ytd +$78,780 (21.5%) exceeded target by 3.5%. nov-dec can be flat/small loss and finish 19-20%. proposed to A. october 26, she said yes. modest trading month, impressive life month.\n-AK\n","date":"31 October 2024","externalUrl":null,"permalink":"/posts/2024-10-31-october-wrap-modest-month-ytd-management-discipline/","section":"Posts","summary":"\u003cp\u003eoctober done.\u003c/p\u003e\n\u003cp\u003emodest month exactly as targeted.\u003c/p\u003e\n\u003cp\u003eytd management on track.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eoctober final numbers \n    \u003cdiv id=\"october-final-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#october-final-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (oct 1):\u003c/strong\u003e $441,660\u003c/p\u003e","title":"october wrap - modest month, ytd management, discipline maintained","type":"posts"},{"content":"week 4 october done.\nmodest finish ahead of election week.\nweek 4 numbers # starting (oct 21): $443,820\nending (oct 24): $444,780\nweek 4 gain: +$960 (+0.22%)\ntrades: 6\nwins: 5\nlosses: 1\nwin rate: 83%\nconservative positioning.\nelection volatility coming.\nmarket conditions week 4 # avg VIX: 17.4 (slightly elevated)\ncorrelation: 0.62 (moderate)\nvolume: 3.3M (down 6% vs week 3)\nregime stability: 0.68 (acceptable but cautious)\npre-election uncertainty building.\npositioning for november # reduced trade size wednesday-thursday:\nnormal: $1,500\nwednesday-thursday: $1,200\nreason: election nov 5\nVIX likely 18-22 range next week.\nconservative approach validated.\nsmall gains better than forcing into volatility.\nfilter performance # acceptance rate: 52% (vs week 3 61%)\ncorrectly tightened pre-event.\n48% rejection = capital preservation ahead of uncertainty.\nregime confidence: 0.68\nsystem detecting building uncertainty.\nslippage tracking # week 4 avg: 2.2 ticks\nslightly worse than week 3 (2.0).\npre-event vol expanding spreads.\ncomparing month weeks # week 1: +$1,920 (86% wr) - strong start\nweek 2: -$2,220 (33% wr) - VIX spike pullback\nweek 3: +$2,460 (75% wr) - recovery\nweek 4: +$960 (83% wr) - modest finish\nmonth total: +$3,120 (+0.71%)\nexactly what targeted.\nytd check # ytd (through oct 24): +$78,780 (+21.5%)\nannual target: +15-18%\n3.5% above target.\nnovember-december need:\n1 flat month (+0% to +0.5%)\n1 small losing month (-1% to -2%)\nfinish 19-20% annual = perfect.\nelection week plan # nov 4 (monday before): pause trading\nnov 5 (election day): no trades\nnov 6-7: assess conditions, resume if stable\nconservative approach:\nprotect october gains.\nwait for post-election clarity.\ntonight (oct 24, 11:51pm) # week 4 done.\n+$960 (+0.22%).\n83% win rate modest.\noctober wrapping +$3,120.\nconservative pre-election positioning.\nytd +21.5%.\nelection week pause planned.\n11:51pm thursday. week 4 october complete. +$960 (0.22%). 5 wins, 1 loss. reduced position sizing wed-thu ($1,200 vs $1,500) ahead of election. filters 52% acceptance. month ends +$3,120 (0.71%). ytd +$78,780 (21.5%). election week pause nov 4-5 planned. modest conservative finish.\n-AK\n","date":"24 October 2024","externalUrl":null,"permalink":"/posts/2024-10-24-week-4-october-modest-finish-pre-election-positioning/","section":"Posts","summary":"\u003cp\u003eweek 4 october done.\u003c/p\u003e\n\u003cp\u003emodest finish ahead of election week.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 4 numbers \n    \u003cdiv id=\"week-4-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-4-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (oct 21):\u003c/strong\u003e $443,820\u003c/p\u003e","title":"week 4 october - modest finish, pre-election positioning","type":"posts"},{"content":"week 3 october done.\nrecovery from week 2 losses.\nweek 3 numbers # starting (oct 14): $441,360\nending (oct 17): $443,820\nweek 3 gain: +$2,460 (+0.56%)\ntrades: 8\nwins: 6\nlosses: 2\nwin rate: 75%\nsolid recovery.\nconditions normalized.\nmarket conditions week 3 # avg VIX: 16.8 (back to optimal from 18.9)\ncorrelation: 0.58 (down from 0.68)\nvolume: 3.5M (stable)\nregime stability: 0.73 (recovered from 0.61)\nconditions returned to normal range.\nregime shift reversed.\nwhat worked # monday-wednesday: +$1,680 (4 wins, 0 losses)\nVIX normalized quickly.\nfilters opened back to 61% acceptance.\nthursday-friday: +$780 (2 wins, 2 losses)\nmodest finish but positive.\nfilter performance # acceptance rate: 61% (vs week 2 47%)\ncorrectly reopened after regime stabilized.\nregime confidence: 0.73\nback to confident range.\nsystem detecting improvement.\nslippage tracking # week 3 avg: 2.0 ticks\nback to september levels.\nlower vol = tighter spreads.\ncomparing week patterns # week 1: +$1,920 (86% wr)\nweek 2: -$2,220 (33% wr)\nweek 3: +$2,460 (75% wr)\nclassic 2 positive, 1 negative pattern.\nexactly what sustainable trading looks like.\nmonth progress check # week 1: +$1,920\nweek 2: -$2,220\nweek 3: +$2,460\nmonth through 3 weeks: +$2,160 (+0.49%)\ntracking toward flat to small positive month.\nperfect for ytd management.\nytd update # ytd (through oct 17): +$77,820 (+21.3%)\nstill above target.\noctober small gain acceptable.\nneed november-december flat or negative.\nstrategy note # circuit breaker not needed week 3.\nmax loss thursday: -$380.\nwell below -$1,500 threshold.\nfilters preventing bad setups.\ntonight (oct 17, 2:27am) # week 3 solid.\n+$2,460 (+0.56%).\n75% win rate.\nconditions normalized.\nfilters adapted correctly.\nmonth positive through 3 weeks.\nytd on track.\n2:27am thursday. week 3 october complete. +$2,460 (0.56%). 6 wins, 2 losses. VIX recovered to 16.8 from week 2 spike. filters reopened to 61% acceptance. slippage back to 2.0 ticks. month +$2,160 through 3 weeks. ytd +$77,820 (21.3%). recovery demonstrated.\n-AK\n","date":"17 October 2024","externalUrl":null,"permalink":"/posts/2024-10-17-week-3-october-recovery-from-week-2-pullback/","section":"Posts","summary":"\u003cp\u003eweek 3 october done.\u003c/p\u003e\n\u003cp\u003erecovery from week 2 losses.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 3 numbers \n    \u003cdiv id=\"week-3-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-3-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (oct 14):\u003c/strong\u003e $441,360\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eending (oct 17):\u003c/strong\u003e $443,820\u003c/p\u003e","title":"week 3 october - recovery from week 2 pullback","type":"posts"},{"content":"","date":"15 October 2024","externalUrl":null,"permalink":"/tags/analysis/","section":"Tags","summary":"","title":"Analysis","type":"tags"},{"content":"mid-october.\ntime for ytd reality check.\ncurrent status (oct 15) # ytd: +$77,580 (+21.2%)\nannual target: +15-18%\nexceeded by 3.2%.\nmonths remaining: 2.5\ndecision point: how to finish year.\nscenarios for remaining 2.5 months # scenario 1: continue current pace\noct-dec each +0.5% avg\nresult: finish +23.5% annual\nproblem: unrealistic, unsustainable\nscenario 2: flat remainder\noct-dec each +0% to +0.5%\nresult: finish +21-22% annual\nacceptable: slightly above target but reasonable\nscenario 3: mixed (preferred)\noct: +0.5% to +1%\nnov: flat (+0% to +0.5%)\ndec: small loss (-1% to -2%)\nresult: finish +19-20% annual\nideal: demonstrates realistic variance\nwhy scenario 3 preferred # 1. demonstrates sustainability\nshows 2024 wasn\u0026rsquo;t luck.\nrealistic algo trading includes losses.\n2. manages expectations\ncan\u0026rsquo;t sustain 21%+ annually.\n3. positions for 2025\nending 2024 at +19% sets realistic baseline.\n4. shows discipline\nchoosing conservative over aggressive.\noctober target refined # current (oct 15): +$77,580\noctober target end: +$78,000 to +$79,500\nrequires: +$420 to +$1,920 remaining 2 weeks\nachievable: week 3 already +$2,460\nplan:\nweek 3 done: +$2,460\nweek 4 target: flat to small gain\nmonth ends +0.5% to +1%.\nnovember-december plan # november:\nelection volatility nov 5.\nconservative positioning.\ntarget: +$0 to +$1,500 (+0% to +0.3%)\ndecember:\nholiday liquidity decline.\naccept small loss.\ntarget: -$2,000 to -$4,000 (-0.4% to -0.9%)\ncombined result # oct: +$3,000 (+0.7%)\nnov: +$500 (+0.1%)\ndec: -$3,000 (-0.7%)\nyear-end: +$79,000 (+19.3%)\nperfect finish.\ncomparing to 2023 # 2023 year-end: -$34,000 (-8.5%)\nlost money learning.\n2024 projected: +$79,000 (+19.3%)\nvalidated strategies.\n$113k swing year-over-year.\nwhat this means for 2025 # starting 2025: ~$445,000\nvs 2024 start: $366,200\n+21.5% larger account.\nrealistic 2025 target: +12-15%\n(harder to maintain % as account grows)\nprojected 2025 end: $498k to $511k\nfirst year potentially crossing $500k.\ntonight (oct 15, 2:43am) # mid-october check complete.\nytd +21.2%.\noctober target: +0.5% to +1%\nnovember target: flat\ndecember target: small loss\nyear-end projection: +19-20%\nrealistic, sustainable, disciplined.\n2:43am tuesday. mid-october analysis complete. ytd +$77,580 (21.2%). october tracking +0.7% target. nov-dec plan: flat + small loss = finish 19-20% annual. demonstrates realistic algo trading variance. 2024 → 2025 account growth $366k → $445k (+21.5%). first year potentially crossing $500k in 2025.\n-AK\n","date":"15 October 2024","externalUrl":null,"permalink":"/posts/2024-10-15-mid-october-check-ytd-pacing-analysis/","section":"Posts","summary":"\u003cp\u003emid-october.\u003c/p\u003e\n\u003cp\u003etime for ytd reality check.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ecurrent status (oct 15) \n    \u003cdiv id=\"current-status-oct-15\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#current-status-oct-15\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eytd:\u003c/strong\u003e +$77,580 (+21.2%)\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eannual target:\u003c/strong\u003e +15-18%\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eexceeded by 3.2%.\u003c/strong\u003e\u003c/p\u003e","title":"mid-october check - ytd pacing analysis","type":"posts"},{"content":"","date":"15 October 2024","externalUrl":null,"permalink":"/tags/planning/","section":"Tags","summary":"","title":"Planning","type":"tags"},{"content":"11 months living with A.\nnovember 1 is anniversary.\nmarriage thought no longer hypothetical.\nwhat changed this month # therapy (10/9):\ndr. r: \u0026ldquo;11 months approaching. thoughts?\u0026rdquo;\nme: \u0026ldquo;good. really good. been thinking about proposal seriously.\u0026rdquo;\ndr. r: \u0026ldquo;seriously meaning?\u0026rdquo;\nme: \u0026ldquo;like\u0026hellip; when, not if. probably before year mark.\u0026rdquo;\ndr. r: \u0026ldquo;that\u0026rsquo;s significant shift from weekly thought to actual planning.\u0026rdquo;\nme: \u0026ldquo;yeah. feels right. A. is it.\u0026rdquo;\ndr. r: \u0026ldquo;you seem certain.\u0026rdquo;\nme: \u0026ldquo;most certain i\u0026rsquo;ve been about anything besides trading edge.\u0026rdquo;\nsignals from A. # last weekend:\ntalking about future apartment (bigger space).\nmentioned kids timeline casually (28-30 ideal age for her).\nreferred to \u0026ldquo;our future\u0026rdquo; not \u0026ldquo;my future.\u0026rdquo;\nshe\u0026rsquo;s thinking same timeline.\nwhat\u0026rsquo;s still locked # daily routine:\nperfect.\nzero friction mornings.\nseparate workspaces essential.\ndinner together 7pm locked.\nsex life:\nincredible.\nplaces list: 26 now.\nlast addition: friend\u0026rsquo;s wedding bathroom (risky AF).\ncommunication about fantasies/limits completely open.\nshe initiates 95% of time, picks places.\nrelationship foundation:\nshe saw me broken (sept 2023).\nstayed through trading disaster.\ndoesn\u0026rsquo;t tie us to performance.\nweek 2 october -$2,220? didn\u0026rsquo;t affect us.\nsecure attachment (dr. r\u0026rsquo;s words).\nwhat\u0026rsquo;s different from before # before A.:\nexit strategy always active.\nthinking weeks, max months.\nmultiple girls rotating.\nnow:\nthinking years.\nplanning proposal.\nfirst relationship where leaving never crosses mind.\nfamily situation # her family:\nparents love me (explicitly told her).\ndad and i talk servers/tech.\nmom thinks i\u0026rsquo;m good for A.\nbrothers still give me shit (normal).\nmy side:\nparents dead.\nA. held me through anniversary grief (dec 31).\nshe gets it.\nthe proposal plan (rough) # when: before november 1 (11 month mark)\nhow: simple, private, us\nnot public spectacle.\nprobably apartment.\nring: researching now\nshe mentioned once: simple, no giant rock, platinum band.\naftermath: tell her family first, therapy session after\nwhy now feels right # 1. time tested\n11 months living together.\nseen each other stressed, sad, happy, horny, broken.\n2. aligned futures\nboth want: apartment upgrade, maybe kids 28-30, keep working.\nshe codes, i trade, we\u0026rsquo;re independent but together.\n3. relationship doesn\u0026rsquo;t depend on external\ntrading up or down? doesn\u0026rsquo;t matter to us.\nher projects succeed or fail? doesn\u0026rsquo;t matter.\nwe\u0026rsquo;re solid regardless.\n4. no exit thought\nyear ago: planning exits with every girl.\nnow: planning permanent.\n5. dr. r validation\nshe rarely gives explicit approval.\nbut her face when i said \u0026ldquo;proposal seriously\u0026rdquo; = approval.\nwhat A. doesn\u0026rsquo;t know yet # she knows:\ni\u0026rsquo;m thinking long-term.\nmarriage crossed my mind.\nshe doesn\u0026rsquo;t know:\ni\u0026rsquo;m planning actual proposal.\ntimeline is weeks not months.\nring research in progress.\nkeeping it surprise.\ntonight (oct 12, 1:52am) # 11 months in 20 days.\nproposal planning active.\ntimeline: before november 1.\nA. is it.\nmost certain i\u0026rsquo;ve been about anything.\n1:52am saturday. 11 months with A. approaching. marriage thought shifted from weekly consideration to actual proposal planning. timeline before november 1. therapy validated decision. she saw me broken sept 2023 and stayed. relationship stable regardless of trading performance. first time thinking permanent not exit. ring research active.\n-AK\n","date":"12 October 2024","externalUrl":null,"permalink":"/posts/2024-10-12-eleven-months-thinking-proposal-seriously/","section":"Posts","summary":"\u003cp\u003e11 months living with A.\u003c/p\u003e\n\u003cp\u003enovember 1 is anniversary.\u003c/p\u003e\n\u003cp\u003emarriage thought no longer hypothetical.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ewhat changed this month \n    \u003cdiv id=\"what-changed-this-month\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#what-changed-this-month\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003etherapy (10/9):\u003c/strong\u003e\u003c/p\u003e","title":"eleven months - thinking proposal seriously","type":"posts"},{"content":"","date":"12 October 2024","externalUrl":null,"permalink":"/tags/living-together/","section":"Tags","summary":"","title":"Living-Together","type":"tags"},{"content":"","date":"10 October 2024","externalUrl":null,"permalink":"/tags/variance/","section":"Tags","summary":"","title":"Variance","type":"tags"},{"content":"week 2 october done.\nfirst losing week since august.\nvariance reminder.\nweek 2 numbers # starting (oct 7): $443,580\nending (oct 10): $441,360\nweek 2 loss: -$2,220 (-0.50%)\ntrades: 9\nwins: 3\nlosses: 6\nwin rate: 33%\nnot unexpected.\nconditions shifted midweek.\nwhat happened # monday-tuesday: +$840 (2 wins, 0 losses)\nsetup looked normal.\nwednesday-friday: -$3,060 (1 win, 6 losses)\nVIX spiked 17.2 → 19.8.\ncorrelation jumped 0.55 → 0.74.\nregime confidence dropped 0.74 → 0.61.\nclassic regime shift.\nfilters caught it but couldn\u0026rsquo;t prevent all losses.\ncircuit breaker performance # wednesday: -$1,240 (3 losses but not consecutive)\nthreshold: 3 consecutive OR -$1,500 single day\ncame close but didn\u0026rsquo;t trigger.\nthursday paused trading voluntarily.\nfriday attempted 2 setups, both losses.\ncircuit breaker working as designed.\nprevented potential $5k+ disaster.\nmarket conditions week 2 # avg VIX: 18.9 (elevated from 17.2)\ncorrelation: 0.68 (jumped from 0.55)\nvolume: 3.4M (down 6% vs week 1)\nregime stability: 0.61 (vs 0.74 week 1)\nconditions degraded rapidly wednesday.\nslippage impact # week 2 avg: 2.4 ticks (vs week 1 2.1 ticks)\nhigher vol = wider spreads.\nslippage added ~$180 to losses.\ngross loss pre-slippage: ~$2,040.\nnet loss post-slippage: -$2,220.\nexecution costs matter in volatile conditions.\nfilter performance # acceptance rate: 47% (vs week 1 58%)\nfilters tightened correctly.\n53% rejection saved capital.\nregime confidence: 0.61 (low)\ncorrectly identified poor conditions.\ncomparing to expectations # early october target: flat to +1% month\nweek 1: +$1,920\nweek 2: -$2,220\nmonth through 2 weeks: -$300 (-0.07%)\nexactly what \u0026ldquo;flat month\u0026rdquo; looks like.\nvariance working as expected.\nlessons from week 2 # 1. regime shifts happen\nmonday/tuesday normal.\nwednesday everything changed.\ncan\u0026rsquo;t predict, must adapt.\n2. circuit breaker prevents disasters\n-$2,220 contained vs potential -$5k+.\n3. filters respond correctly\n47% acceptance week 2 vs 58% week 1.\nsystem detecting poor conditions.\n4. voluntary pauses work\nthursday pause prevented forcing trades.\n5. losing weeks normal\n~30% of weeks should lose.\nweek 2 october = expected variance.\ncomparing to similar conditions # july week 2: -$1,740 (VIX spike)\noct week 2: -$2,220 (VIX spike)\nsimilar cause, similar outcome.\nsystem responding consistently.\nytd check # ytd (through oct 10): +$75,360 (+20.6%)\ndown from +21.2% week 1.\nmoving in right direction.\noctober flat or slightly negative = perfect.\nbrings annual toward 19-20% range.\ntonight (oct 10, 11:38pm) # week 2 done.\n-$2,220 (-0.50%).\n33% win rate.\nVIX spike 17.2 → 19.8 midweek.\nregime shift detected, adapted.\ncircuit breaker prevented disaster.\nmonth flat through 2 weeks.\nvariance demonstrated.\nexecute system.\n11:38pm thursday. week 2 october complete. -$2,220 (-0.50%). 3 wins, 6 losses. monday-tuesday strong (+$840), wednesday VIX spiked to 19.8 triggering losses (-$3,060 wed-fri). filters tightened to 47% acceptance. circuit breaker prevented larger loss. month flat -$300 through 2 weeks. ytd +$75,360 (20.6%). variance working as expected.\n-AK\n","date":"10 October 2024","externalUrl":null,"permalink":"/posts/2024-10-10-week-2-october-first-pullback-variance-demonstrated/","section":"Posts","summary":"\u003cp\u003eweek 2 october done.\u003c/p\u003e\n\u003cp\u003efirst losing week since august.\u003c/p\u003e\n\u003cp\u003evariance reminder.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 2 numbers \n    \u003cdiv id=\"week-2-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-2-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (oct 7):\u003c/strong\u003e $443,580\u003c/p\u003e","title":"week 2 october - first pullback, variance demonstrated","type":"posts"},{"content":"position sizing makes or breaks algo trading.\nbeen refining adaptive approach last 6 months.\nfinally working consistently.\nthe problem with static sizing # most algo traders:\nfixed $X per trade.\nworks in stable conditions.\nfails during regime shifts.\nexample:\n$1,500 position during VIX 15 = 0.34% risk.\nsame $1,500 during VIX 22 = 0.68% risk.\ndouble the actual risk, same nominal size.\nsolution: regime-based adaptive sizing # core concept:\nposition size scales with regime confidence.\nhigh confidence = full size.\nlow confidence = reduced size.\nimplementation:\nregime confidence 0-1 scale.\nposition size = base_size × confidence_factor.\nfilters integrated:\nregime confidence already calculated.\nreuse for position sizing.\nthe code # import numpy as np import pandas as pd from typing import Dict, Tuple from dataclasses import dataclass from datetime import datetime, timedelta @dataclass class RegimeMetrics: \u0026#34;\u0026#34;\u0026#34;Market regime indicators\u0026#34;\u0026#34;\u0026#34; vix: float correlation: float volume_ratio: float # current / 30-day avg trend_strength: float timestamp: datetime @dataclass class PositionSizingConfig: \u0026#34;\u0026#34;\u0026#34;Configuration for adaptive position sizing\u0026#34;\u0026#34;\u0026#34; base_size: float = 1500.0 # Base position size in dollars min_size: float = 600.0 # Minimum position size max_size: float = 2000.0 # Maximum position size # VIX thresholds vix_optimal_low: float = 14.0 vix_optimal_high: float = 19.0 vix_danger: float = 25.0 # Correlation thresholds corr_optimal: float = 0.65 corr_danger: float = 0.80 # Volume thresholds vol_ratio_low: float = 0.75 vol_ratio_optimal: float = 0.95 # Confidence weights vix_weight: float = 0.35 corr_weight: float = 0.25 volume_weight: float = 0.20 trend_weight: float = 0.20 class AdaptivePositionSizer: \u0026#34;\u0026#34;\u0026#34; Adaptive position sizing based on regime metrics Core philosophy: - Scale position size with market regime confidence - Reduce risk during uncertain/volatile periods - Increase size during optimal conditions - Never exceed hard limits \u0026#34;\u0026#34;\u0026#34; def __init__(self, config: PositionSizingConfig = None): self.config = config or PositionSizingConfig() self.history = [] def calculate_regime_confidence(self, metrics: RegimeMetrics) -\u0026gt; float: \u0026#34;\u0026#34;\u0026#34; Calculate overall regime confidence score (0-1) Components: - VIX score: optimal range 14-19, penalty outside - Correlation score: lower is better (\u0026lt; 0.65 optimal) - Volume score: normal to high volume preferred - Trend strength: strong trends preferred Returns: - float: confidence score 0.0 (no confidence) to 1.0 (full confidence) \u0026#34;\u0026#34;\u0026#34; # VIX component scoring vix_score = self._score_vix(metrics.vix) # Correlation component scoring corr_score = self._score_correlation(metrics.correlation) # Volume component scoring vol_score = self._score_volume(metrics.volume_ratio) # Trend strength (already 0-1 from regime detection) trend_score = min(max(metrics.trend_strength, 0.0), 1.0) # Weighted combination confidence = ( vix_score * self.config.vix_weight + corr_score * self.config.corr_weight + vol_score * self.config.volume_weight + trend_score * self.config.trend_weight ) return np.clip(confidence, 0.0, 1.0) def _score_vix(self, vix: float) -\u0026gt; float: \u0026#34;\u0026#34;\u0026#34;Score VIX level (0-1, higher is better)\u0026#34;\u0026#34;\u0026#34; cfg = self.config if cfg.vix_optimal_low \u0026lt;= vix \u0026lt;= cfg.vix_optimal_high: # Optimal range: full score return 1.0 elif vix \u0026lt; cfg.vix_optimal_low: # Too low (complacency risk) deviation = cfg.vix_optimal_low - vix return max(0.5, 1.0 - (deviation / 5.0)) elif vix \u0026gt; cfg.vix_danger: # Danger zone return 0.2 else: # Elevated but not danger deviation = vix - cfg.vix_optimal_high return max(0.3, 1.0 - (deviation / 8.0)) def _score_correlation(self, corr: float) -\u0026gt; float: \u0026#34;\u0026#34;\u0026#34;Score correlation (0-1, lower corr = higher score)\u0026#34;\u0026#34;\u0026#34; cfg = self.config if corr \u0026lt;= cfg.corr_optimal: # Optimal: low correlation return 1.0 elif corr \u0026gt;= cfg.corr_danger: # Danger: everything moving together return 0.2 else: # Between optimal and danger range_span = cfg.corr_danger - cfg.corr_optimal position = (corr - cfg.corr_optimal) / range_span return 1.0 - (position * 0.8) # Linear decay from 1.0 to 0.2 def _score_volume(self, vol_ratio: float) -\u0026gt; float: \u0026#34;\u0026#34;\u0026#34;Score volume ratio (0-1)\u0026#34;\u0026#34;\u0026#34; cfg = self.config if vol_ratio \u0026gt;= cfg.vol_ratio_optimal: # Normal to high volume: full score return 1.0 elif vol_ratio \u0026lt;= cfg.vol_ratio_low: # Very low volume: risky return 0.3 else: # Between low and optimal: scale linearly range_span = cfg.vol_ratio_optimal - cfg.vol_ratio_low position = (vol_ratio - cfg.vol_ratio_low) / range_span return 0.3 + (position * 0.7) # Scale from 0.3 to 1.0 def calculate_position_size( self, metrics: RegimeMetrics, account_value: float ) -\u0026gt; Tuple[float, Dict]: \u0026#34;\u0026#34;\u0026#34; Calculate adaptive position size Args: metrics: Current market regime metrics account_value: Current account value Returns: Tuple of (position_size, details_dict) \u0026#34;\u0026#34;\u0026#34; # Calculate regime confidence confidence = self.calculate_regime_confidence(metrics) # Calculate confidence-adjusted size adjusted_size = self.config.base_size * confidence # Apply hard limits final_size = np.clip( adjusted_size, self.config.min_size, self.config.max_size ) # Calculate percentage of account pct_of_account = (final_size / account_value) * 100 # Store in history details = { \u0026#39;timestamp\u0026#39;: metrics.timestamp, \u0026#39;regime_confidence\u0026#39;: confidence, \u0026#39;base_size\u0026#39;: self.config.base_size, \u0026#39;adjusted_size\u0026#39;: adjusted_size, \u0026#39;final_size\u0026#39;: final_size, \u0026#39;pct_of_account\u0026#39;: pct_of_account, \u0026#39;vix\u0026#39;: metrics.vix, \u0026#39;correlation\u0026#39;: metrics.correlation, \u0026#39;volume_ratio\u0026#39;: metrics.volume_ratio, \u0026#39;trend_strength\u0026#39;: metrics.trend_strength, \u0026#39;account_value\u0026#39;: account_value } self.history.append(details) return final_size, details def get_sizing_summary(self, lookback_days: int = 30) -\u0026gt; pd.DataFrame: \u0026#34;\u0026#34;\u0026#34;Get summary of recent position sizing decisions\u0026#34;\u0026#34;\u0026#34; if not self.history: return pd.DataFrame() df = pd.DataFrame(self.history) # Filter to lookback period cutoff = datetime.now() - timedelta(days=lookback_days) df = df[df[\u0026#39;timestamp\u0026#39;] \u0026gt;= cutoff] return df def print_current_sizing(self, metrics: RegimeMetrics, account_value: float): \u0026#34;\u0026#34;\u0026#34;Debug helper: print current sizing decision\u0026#34;\u0026#34;\u0026#34; size, details = self.calculate_position_size(metrics, account_value) print(f\u0026#34;\\n=== Position Sizing Analysis ===\u0026#34;) print(f\u0026#34;Timestamp: {metrics.timestamp}\u0026#34;) print(f\u0026#34;\\nMarket Regime:\u0026#34;) print(f\u0026#34; VIX: {metrics.vix:.2f}\u0026#34;) print(f\u0026#34; Correlation: {metrics.correlation:.2f}\u0026#34;) print(f\u0026#34; Volume Ratio: {metrics.volume_ratio:.2f}\u0026#34;) print(f\u0026#34; Trend Strength: {metrics.trend_strength:.2f}\u0026#34;) print(f\u0026#34;\\nSizing Decision:\u0026#34;) print(f\u0026#34; Regime Confidence: {details[\u0026#39;regime_confidence\u0026#39;]:.2f}\u0026#34;) print(f\u0026#34; Base Size: ${details[\u0026#39;base_size\u0026#39;]:.0f}\u0026#34;) print(f\u0026#34; Adjusted Size: ${details[\u0026#39;adjusted_size\u0026#39;]:.0f}\u0026#34;) print(f\u0026#34; Final Size: ${details[\u0026#39;final_size\u0026#39;]:.0f}\u0026#34;) print(f\u0026#34; % of Account: {details[\u0026#39;pct_of_account\u0026#39;]:.3f}%\u0026#34;) print(f\u0026#34;================================\\n\u0026#34;) # Example usage if __name__ == \u0026#34;__main__\u0026#34;: # Initialize position sizer with default config sizer = AdaptivePositionSizer() # Example 1: Optimal conditions print(\u0026#34;Example 1: Optimal Market Conditions\u0026#34;) optimal_metrics = RegimeMetrics( vix=16.5, correlation=0.58, volume_ratio=1.05, trend_strength=0.78, timestamp=datetime.now() ) sizer.print_current_sizing(optimal_metrics, account_value=444780) # Example 2: Elevated VIX print(\u0026#34;\\nExample 2: Elevated VIX (Week 2 October)\u0026#34;) elevated_metrics = RegimeMetrics( vix=19.8, correlation=0.74, volume_ratio=0.94, trend_strength=0.61, timestamp=datetime.now() ) sizer.print_current_sizing(elevated_metrics, account_value=444780) # Example 3: Low volume conditions print(\u0026#34;\\nExample 3: Low Volume (August-style)\u0026#34;) low_vol_metrics = RegimeMetrics( vix=16.0, correlation=0.54, volume_ratio=0.71, trend_strength=0.69, timestamp=datetime.now() ) sizer.print_current_sizing(low_vol_metrics, account_value=444780) real results october # week 1 (optimal conditions):\nVIX 17.2, corr 0.55, vol 1.03\nconfidence: 0.74\nposition size: $1,500 (full)\nresult: +$1,920\nweek 2 (elevated VIX):\nVIX 18.9, corr 0.68, vol 0.97\nconfidence: 0.61\nposition size: $1,200 (reduced)\nresult: -$2,220 (would\u0026rsquo;ve been -$2,775 at full size)\nsaved $555 by reducing size.\nweek 3 (recovery):\nVIX 16.8, corr 0.58, vol 1.01\nconfidence: 0.73\nposition size: $1,500 (full)\nresult: +$2,460\nweek 4 (pre-election):\nVIX 17.4, corr 0.62, vol 0.94\nconfidence: 0.68\nposition size: $1,200 (manually reduced)\nresult: +$960 (conservative)\nkey insights # 1. confidence correlates with results\nhigh confidence weeks: +$1,920, +$2,460\nlow confidence week: -$2,220 (but contained)\n2. reduced sizing limits damage\nweek 2 full size loss: -$2,775\nweek 2 actual loss: -$2,220\ndifference: $555 saved\n3. system catches regime shifts\nVIX spike 17.2 → 18.9 detected.\nconfidence dropped 0.74 → 0.61.\nsize reduced automatically.\n4. reversion works\nweek 2 poor conditions.\nweek 3 normalized.\nconfidence + size restored.\n5. combines with other filters\nposition sizing + trade filters = complete risk mgmt.\nthe reason behind this # traditional approach:\nfixed size regardless of conditions.\nadaptive approach:\nsize scales with confidence.\nresult:\nsame edge, better risk-adjusted returns.\noctober results with adaptive sizing # total p\u0026amp;l: +$3,120\nwithout adaptive sizing (estimated): +$2,300\nimprovement: +$820 (35% better)\nexplanation:\nweek 2 loss contained.\nweeks 1,3 full size captured gains.\nintegration with existing system # regime detection already running.\nposition sizer uses same metrics.\nno additional data needed.\nno additional computation.\njust smarter position sizing.\nwhat\u0026rsquo;s next # november election:\nexpecting VIX 18-22.\nconfidence will drop.\nsize will reduce automatically.\nprotect october gains.\ntonight (oct 7, 3:15am) # adaptive position sizing working.\noctober week 1-2 demonstrated value.\nreduces risk during uncertainty.\nmaintains size during optimal conditions.\nsimple but effective.\n3:15am monday. adaptive position sizing implemented. regime confidence 0-1 drives size $600-$2,000 range. october week 2 VIX spike reduced size $1,500 → $1,200, saved $555. week 3 recovery restored full size. combines with trade filters for complete risk management. estimated +35% performance improvement october vs static sizing.\n-AK\n","date":"7 October 2024","externalUrl":null,"permalink":"/posts/2024-10-07-adaptive-position-sizing-regime-based-approach/","section":"Posts","summary":"\u003cp\u003eposition sizing makes or breaks algo trading.\u003c/p\u003e\n\u003cp\u003ebeen refining adaptive approach last 6 months.\u003c/p\u003e\n\u003cp\u003efinally working consistently.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe problem with static sizing \n    \u003cdiv id=\"the-problem-with-static-sizing\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-problem-with-static-sizing\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003emost algo traders:\u003c/strong\u003e\u003c/p\u003e","title":"adaptive position sizing - regime-based approach","type":"posts"},{"content":"week 1 october done.\ncarrying september momentum.\nweek 1 numbers # starting (oct 1): $441,660\nending (oct 3): $443,580\nweek 1 gain: +$1,920 (+0.43%)\ntrades: 7\nwins: 6\nlosses: 1\nwin rate: 86%\nmodest start.\nvolume holding post-labor day levels.\nmarket conditions week 1 # avg volume: 3.6M contracts (vs sept 3.7M)\navg VIX: 17.2 (slightly elevated)\ncorrelation: 0.55 (low)\nregime stability: 0.74\nconditions still favorable.\nslightly less optimal than late september.\nslippage tracking # week 1 avg: 2.1 ticks\nsept avg: 2.0 ticks\nexecution quality maintained.\nchicago colo performing.\nfilter performance # acceptance rate: 58%\n42% rejected = capital preservation.\nregime confidence: 0.74\nsimilar to late september.\nfilters responding correctly to conditions.\ncomparing to september # sept week 1 (labor day): +$820 (75% wr, 4 trades)\noct week 1: +$1,920 (86% wr, 7 trades)\nbetter conditions october week 1.\nno holiday skeleton crew.\nytd progress check # ytd (through oct 3): +$77,580 (+21.2%)\nannual target: +15-18%\nstill 3.2% above target.\noct-dec need to average flat or slightly negative.\nacceptable outcomes october:\n-1% to +1% keeps annual 19-21%.\nflat to small loss preferred.\nstrategy note # position sizing holding $1,500.\ncircuit breaker not needed (max loss -$240 thursday).\nfilters preventing bad setups.\ntonight (oct 3, 2:14am) # week 1 solid.\n+$1,920 (0.43%).\n86% win rate across 7 trades.\nvolume maintained.\nslippage controlled.\nytd +21.2%.\nzero pressure.\nexecute system.\n2:14am thursday. week 1 october complete. +$1,920 (0.43%). 6 wins, 1 loss. volume held sept levels 3.6M avg. slippage 2.1 ticks. filters 58% acceptance. ytd +$77,580 (21.2%). modest start carrying sept momentum.\n-AK\n","date":"3 October 2024","externalUrl":null,"permalink":"/posts/2024-10-03-week-1-october-post-september-momentum/","section":"Posts","summary":"\u003cp\u003eweek 1 october done.\u003c/p\u003e\n\u003cp\u003ecarrying september momentum.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 1 numbers \n    \u003cdiv id=\"week-1-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-1-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (oct 1):\u003c/strong\u003e $441,660\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eending (oct 3):\u003c/strong\u003e $443,580\u003c/p\u003e","title":"week 1 october - post-september momentum","type":"posts"},{"content":"september done.\nmodest month as expected.\nvolume returned post-labor day.\nseptember final numbers # starting (sep 1): $434,800\nending (sep 30): $441,660\nseptember gain: +$6,860 (+1.58%)\ntrades: 28\nwins: 21\nlosses: 7\nwin rate: 75%\nFigure 1: September weekly performance demonstrating post-labor day recovery. Week 1 labor day skeleton crew (+$820, 75% wr, 4 trades), Week 2 momentum confirmed (+$2,840, 78% wr, 9 trades), Week 3 consistency maintained (+$1,420, 71% wr, 7 trades), Week 4 strong finish (+$1,780, 75% wr, 8 trades). Month ended +$6,860 (+1.58%). Volume returned averaging 3.7M contracts vs August 2.7M (+37%).\nweekly breakdown # Figure 2: Volume and slippage correlation throughout September. Labor Day week 1 low volume (2.6M avg) with elevated slippage (2.7 ticks). Weeks 2-4 volume recovered and sustained (3.7-3.9M avg) with improved execution (1.9-2.1 ticks). September avg 3.7M contracts vs August 2.7M (+37% improvement). Slippage avg 2.0 ticks vs August 2.8 ticks (-29% improvement). Summer conditions officially over.\nweek 1: +$820, 75% wr, 4 trades (labor day)\nweek 2: +$2,840, 78% wr, 9 trades (peak)\nweek 3: +$1,420, 71% wr, 7 trades (consistency)\nweek 4: +$1,780, 75% wr, 8 trades (strong finish)\npattern:\nlabor day slow → build → consistency → strong finish.\nclassic september recovery.\ncomparing to previous months 2024 # january: +$27,200 (+7.4%) - notable\nfebruary: +$1,400 (+0.36%) - flat\nmarch: +$1,100 (+0.28%) - testing\napril: +$23,460 (+5.9%) - strong\nmay: +$3,500 (+0.83%) - normal\njune: +$8,320 (+1.97%) - modest\njuly: +$2,720 (+0.63%) - modest\naugust: +$900 (+0.21%) - survival\nseptember: +$6,860 (+1.58%) - modest\npattern consistent: 2 strong, 7 modest/flat.\nsustainable pace.\nytd 2024 progress # Figure 3: Year-to-date 2024 monthly progression through September. Pattern shows 2 notable months (Jan +7.4%, Apr +5.9%) carried year. Seven modest/flat months (Feb +0.36%, Mar +0.28%, May +0.83%, Jun +1.97%, Jul +0.63%, Aug +0.21%, Sep +1.58%) demonstrate realistic algo trading variance. YTD total +$75,660 (+20.7%). Annual target 15-18% exceeded by 2.7%. Remaining 3 months (Oct-Dec) need flat/negative to finish 18-21% range. Green zone = target range 15-18%.\njanuary: +$27,200 (+7.4%)\nfebruary: +$1,400 (+0.36%)\nmarch: +$1,100 (+0.28%)\napril: +$23,460 (+5.9%)\nmay: +$3,500 (+0.83%)\njune: +$8,320 (+1.97%)\njuly: +$2,720 (+0.63%)\naugust: +$900 (+0.21%)\nseptember: +$6,860 (+1.58%)\nytd total: +$75,660 (+20.7%)\nstarting balance (jan 1): $366,200\ncurrent balance (sep 30): $441,660\nannual target exceeded # ytd: +20.7% in 9 months\nannual target: +15-18%\nexceeded by 2.7%.\nremaining 3 months (oct-dec):\ncan be:\n2 flat months (+0% to +0.5%) 1 losing month (-2% to -3%) still finish 18-21% annual.\nzero pressure.\ncircuit breaker performance # september:\nnot triggered once.\nnot close.\nmax drawdown: -$680 (0.15%)\nmax losing streak: 1 loss\nfilters prevented reaching threshold.\nrisk management stats # position sizing: $1,500 all trades (consistent)\ncircuit breaker: not triggered (preventive filters worked)\nmax drawdown: -$680 (0.15%)\nfilters: 61% acceptance avg\nvariance:\nweek 1 labor day: 31% weeks 2-4: 58-64% regime confidence avg: 0.77\nvariance:\nweek 1: 0.71 week 4 peak: 0.82 filters adapted correctly to volume return.\nmarket conditions # september reality:\navg volume: 3.7M contracts\nvs august: 2.7M contracts (+37%)\navg VIX: 16.4 (optimal)\navg correlation: 0.52 (low)\navg regime stability: 0.77\nsummer officially over.\nvolume sustained post-labor day.\nconditions returned to spring levels.\nslippage tracking detail # september avg: 2.0 ticks\naugust avg: 2.8 ticks\nimprovement: -0.8 ticks (-29%)\nweekly progression:\nweek 1 (low vol): 2.7 ticks\nweek 2 (building): 2.0 ticks\nweek 3 (stable): 2.1 ticks\nweek 4 (optimal): 1.9 ticks\nvolume directly correlates to execution quality.\nchicago colo + normal volume = optimal.\ncomparing to expectations # late august forecast: modest month (+1% to +2%), volume return post-labor day.\nactual: +$6,860 (+1.58%)\nwithin projected range.\nvolume return confirmed.\nexpectations met.\nlessons from september # 1. labor day pattern real\nweek 1 always slow.\nweeks 2-4 build momentum.\npredictable seasonality.\n2. volume is everything\naugust -29% volume = struggle.\nseptember +37% volume = thrive.\nedge requires liquidity.\n3. patient positioning pays\ndidn\u0026rsquo;t force trades week 1.\ncaptured weeks 2-4 momentum.\ndiscipline rewarded.\n4. adaptive filters essential\n31% acceptance week 1 preserved capital.\n64% acceptance weeks 2-4 captured opportunities.\nsystem responding correctly.\n5. modest months compound\n+1.58% × 12 months = 19% annual.\nsustainable pace.\ncomparing to 2023 # september 2023:\ndisaster month ($28k loss) no circuit breaker emotional trading small position sizes breaking point september 2024:\nmodest gain (+$6,860) circuit breaker active (not needed) disciplined execution full position size confidence 1 year transformation.\ntherapy reflection (9/27) # dr. r: \u0026ldquo;september wrapping up. +$6.9k. thoughts?\u0026rdquo;\nme: \u0026ldquo;exactly what september should be. labor day slow, weeks 2-4 built momentum. volume returned. edge restored.\u0026rdquo;\ndr. r: \u0026ldquo;you\u0026rsquo;re not comparing to april notable.\u0026rdquo;\nme: \u0026ldquo;nope. april was outlier perfect conditions. september was normal. both acceptable.\u0026rdquo;\ndr. r: \u0026ldquo;and personally?\u0026rdquo;\nme: \u0026ldquo;10 months with A. marriage thought weekly now. no proposal yet but persistent.\u0026rdquo;\ndr. r: \u0026ldquo;significant growth from planning exits to thinking marriage.\u0026rdquo;\nexactly.\nliving with A. through september # 10 months milestone.\ntrading variance:\nseptember +1.6% didn\u0026rsquo;t affect relationship.\nif september was -1%, wouldn\u0026rsquo;t matter.\nrelationship stability enables trading stability.\nplaces list: 24\nlast addition: hotel rooftop pool (almost caught).\nsex life still incredible.\nroutine locked.\nthinking long-term naturally.\noctober preview # expectations:\nvolume should maintain 3.5M+ avg.\nVIX likely 16-20 range.\nrealistic outcomes:\nmodest month (+1% to +2%) - possible.\nflat month (+0% to +1%) - likely.\nlosing month (-1% to -2%) - acceptable.\nytd cushion = zero pressure.\nall outcomes keep annual 18-21%.\nwhat success looks like september # september success:\nvolume returned post-labor day.\ndiscipline during week 1 slow start.\ncaptured weeks 2-4 momentum.\nslippage improved to 2.0 ticks.\nfilters adapted correctly (31% → 64%).\nnot strong but sustainable.\ntonight (september 30, 11:48pm) # september done.\n+$6,860 (+1.58%).\n75% win rate.\n28 trades, 3.7M avg volume.\nslippage 2.0 ticks vs august 2.8.\nfilters 61% acceptance vs august 39%.\nytd +$75,660 (+20.7%).\nannual target exceeded.\noctober begins tomorrow.\nrealistic expectations.\nexecute system.\naccept variance.\n11:48pm monday. september wrap. +$6,860 (1.58%). 75% win rate across 28 trades. weekly pattern: +$820 labor day, +$2,840 peak, +$1,420 consistency, +$1,780 strong finish. volume recovered 3.7M avg (+37% vs august). slippage improved 2.8 → 2.0 ticks. ytd +$75,660 (20.7%) exceeded target. october begins with realistic expectations.\n-AK\n","date":"30 September 2024","externalUrl":null,"permalink":"/posts/2024-09-30-september-wrap-modest-month-volume-restored-discipline-maintained/","section":"Posts","summary":"\u003cp\u003eseptember done.\u003c/p\u003e\n\u003cp\u003emodest month as expected.\u003c/p\u003e\n\u003cp\u003evolume returned post-labor day.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eseptember final numbers \n    \u003cdiv id=\"september-final-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#september-final-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (sep 1):\u003c/strong\u003e $434,800\u003c/p\u003e","title":"september wrap - modest month, volume restored, discipline maintained","type":"posts"},{"content":"september wrapping up.\noctober preview.\nrealistic expectations.\nseptember results # final numbers (projected):\nstarting (sep 1): $434,800\nending (sep 30): ~$441,660\ngain: ~$6,860 (+1.58%)\nsolid modest month.\nvolume returned post-labor day.\nslippage improved.\nexecution quality restored.\noctober market expectations # historical pattern:\noctober avg VIX: 17-22 (slightly elevated)\noctober avg volume: 3.8M contracts (stable)\noctober variance: higher than summer, lower than spring\nseasonality:\npost-summer return continues.\npre-election positioning (2024 election year).\npotential volatility spikes.\nrealistic assessment:\nconditions similar to september likely.\noccasional volatility from news/earnings.\noctober performance scenarios # scenario 1: repeat september (40% probability)\nvolume maintains 3.5M+ avg.\nVIX stays 14-19 range.\noutcome: +1% to +2% month.\nscenario 2: flat month (35% probability)\nvolume steady but edge compressed.\nVIX 18-22 range.\noutcome: +0% to +1% month.\nscenario 3: pullback (25% probability)\nVIX spike \u0026gt;22 or volume crash.\nfilters tighten aggressively.\noutcome: -1% to -2% month.\nall acceptable.\nytd +20.7% allows variance.\nposition sizing plan # default: $1,500 full size\nconditions:\nif VIX \u0026lt;20 and volume \u0026gt;3.5M: maintain.\nif VIX \u0026gt;25 or volume \u0026lt;2.5M: reduce to $900-1,200.\ncircuit breaker: unchanged\n3 consecutive losses OR -$1,500 single day.\nfilter expectations # september avg: 61% acceptance\noctober target: 55-65% range\nif market stable: filters open (60-65%).\nif volatility spikes: filters tighten (45-55%).\nadaptive response critical.\ncomparing to 2023 # october 2023:\nstill learning phase.\nlosing money.\ntesting strategies.\nemotional trading.\noctober 2024:\nvalidated strategies.\nmodest expectations.\ndisciplined execution.\n1 year transformation.\nytd cushion analysis # current ytd: +$75,660 (+20.7%)\ntarget: 15-18%\ncushion: +2.7%\noctober scenarios:\n+2% month → ytd 22.7% (excessive)\n+0% month → ytd 20.7% (above target)\n-2% month → ytd 18.7% (above target)\nall outcomes keep me above 18% annual.\nzero pressure.\nrisk management priorities # 1. preserve capital\nbetter flat than forced trades.\n2. follow circuit breaker\nprevent september 2023 style disaster.\n3. maintain discipline\nno revenge trading after losses.\n4. trust filters\nsystem adapts to conditions.\n5. accept variance\noctober doesn\u0026rsquo;t need to match april.\nwhat could surprise # upside surprises:\nvolume spike \u0026gt;4.5M sustained.\nVIX stays 14-16 optimal range.\ncorrelation drops \u0026lt;0.5.\noutcome: standout month possible.\ndownside surprises:\nelection volatility spike.\ngeopolitical event.\nflash crash.\noutcome: circuit breaker prevents disaster.\nprepared for both.\nmonthly targets # conservative: +$0 to +$2k (+0% to +0.5%)\nrealistic: +$2k to +$6k (+0.5% to +1.4%)\noptimistic: +$6k to +$9k (+1.4% to +2%)\ntracking: weekly updates as usual.\nrelationship stability note # 10 months with A.\ntrading variance doesn\u0026rsquo;t affect relationship.\nseptember +1.6% or -1% wouldn\u0026rsquo;t matter to her.\npsychological foundation solid.\nenables disciplined trading.\ntonight (sep 28, 2:28am) # october preview.\nseptember finishing ~+1.6%.\nrealistic october outcomes:\nmodest (+1% to +2%) - possible.\nflat (+0% to +1%) - likely.\npullback (-1% to -2%) - acceptable.\nytd cushion = zero pressure.\nexecute system.\naccept variance.\n2:28am saturday. october preview. september ending ~$441,660 (+$6,860, 1.6%). october scenarios: modest/flat/pullback all acceptable. ytd +20.7% cushion allows variance. filters target 55-65%. position size $1,500 unless conditions shift. circuit breaker active. realistic expectations.\n-AK\n","date":"28 September 2024","externalUrl":null,"permalink":"/posts/2024-09-28-looking-ahead-october-expectations/","section":"Posts","summary":"\u003cp\u003eseptember wrapping up.\u003c/p\u003e\n\u003cp\u003eoctober preview.\u003c/p\u003e\n\u003cp\u003erealistic expectations.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eseptember results \n    \u003cdiv id=\"september-results\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#september-results\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003efinal numbers (projected):\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003estarting (sep 1): $434,800\u003c/p\u003e\n\u003cp\u003eending (sep 30): ~$441,660\u003c/p\u003e","title":"looking ahead - october expectations, realistic outcomes","type":"posts"},{"content":"","date":"28 September 2024","externalUrl":null,"permalink":"/tags/outlook/","section":"Tags","summary":"","title":"Outlook","type":"tags"},{"content":"mid-week 4 update.\nprofitable run building.\n4 straight wins.\nwednesday wrap # trades this week: 6\nwins: 5\nlosses: 1\ncurrent streak: 4 wins\nweek pnl: +$1,420\nwhat\u0026rsquo;s working # regime detection:\nconfidence: 0.82 (high)\nlow vol regime dominating.\nfilter acceptance:\n64% this week.\nquality setups appearing.\nexecution:\nslippage avg: 1.8 ticks.\nbest week september.\nstrategy performance # regime-adaptive mean reversion:\nall 5 wins in low vol regime.\n1 loss during brief VIX spike tuesday.\nparameters adapting perfectly.\nvolume conditions # this week avg: 3.8M contracts\nstable and healthy.\nno signs of deterioration.\nposition sizing # all trades: $1,500 full size\nzero hesitation.\nconditions optimal.\ncomparing to earlier september # week 1: 4 trades, 75% wr (labor day)\nweek 2: 9 trades, 78% wr (peak)\nweek 3: 7 trades, 71% wr (consistency)\nweek 4 (projected): 8 trades, 75% wr (strong finish)\nseptember pattern confirmed.\nrisk check # circuit breaker: not triggered\nmax drawdown this week: -$340\nwell within limits.\ndiscipline maintained.\nthursday-friday outlook # 2 trading days left.\nrealistic outcomes:\n2 more wins → finish week +$2,200+\n1 win, 1 loss → finish week +$1,800\n2 losses → finish week +$800\nall keep september strong.\nseptember mtd # current: ~+$6,460\nweek 4 projected: +$1,400 to +$2,000\nmonth finish: +$6,860 to +$8,460\ntarget hit regardless.\ntonight (sep 26, 3:07am) # mid-week 4.\n4-win streak active.\n+$1,420 week so far.\nvolume 3.8M, slippage 1.8 ticks.\nregime confidence 0.82.\nfinishing september strong.\n3:07am thursday. mid-week 4 update. 4-win streak active, +$1,420 week pnl. volume stable 3.8M avg, slippage 1.8 ticks best of month. regime confidence 0.82. 2 days remain, week projecting +$1,800+. september finishing strong.\n-AK\n","date":"26 September 2024","externalUrl":null,"permalink":"/posts/2024-09-26-mid-week-4-profitable-run-building/","section":"Posts","summary":"\u003cp\u003emid-week 4 update.\u003c/p\u003e\n\u003cp\u003eprofitable run building.\u003c/p\u003e\n\u003cp\u003e4 straight wins.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ewednesday wrap \n    \u003cdiv id=\"wednesday-wrap\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#wednesday-wrap\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003etrades this week:\u003c/strong\u003e 6\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ewins:\u003c/strong\u003e 5\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003elosses:\u003c/strong\u003e 1\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ecurrent streak:\u003c/strong\u003e 4 wins\u003c/p\u003e","title":"mid-week 4 - profitable run building, 4 straight wins","type":"posts"},{"content":"","date":"26 September 2024","externalUrl":null,"permalink":"/tags/update/","section":"Tags","summary":"","title":"Update","type":"tags"},{"content":"week 4 done.\nfinishing strong.\nconsistent execution maintained.\nweek 4 numbers # starting (sep 23): $441,260\nending (sep 27): $443,040\nweek gain: +$1,780 (+0.40%)\ntrades: 8\nwins: 6\nlosses: 2\nwin rate: 75%\nvolume performance # week avg: 3.7M contracts\nvs week 3: 3.6M contracts (+3%)\nvs august avg: 2.7M contracts (+37%)\nvolume stable.\nseptember pattern confirmed.\nslippage tracking # week 4 avg: 1.9 ticks\nweek 3 avg: 2.1 ticks\nimprovement: -0.2 ticks\nbest execution september.\nlimit orders + chicago colo + stable volume = optimal.\nposition sizing # all trades: $1,500 full size\nmaintained throughout september.\nno hesitation.\nconditions supportive.\nfilters performance # acceptance rate: 61%\nregime confidence: 0.78\nup from week 3 (58%, 0.76).\nconditions improving slightly.\nmore quality setups.\nstrategy breakdown # regime-adaptive mean reversion:\nlow vol regime: 4 wins, 1 loss (80% wr)\nmedium vol regime: 2 wins, 1 loss (67% wr)\ngrowing in stable conditions.\ncomparing across september weeks # week 1: +$820, 75% wr, 4 trades (labor day)\nweek 2: +$2,840, 78% wr, 9 trades (peak)\nweek 3: +$1,420, 71% wr, 7 trades (consistency)\nweek 4: +$1,780, 75% wr, 8 trades (strong finish)\npattern:\nlabor day slow → peak → pullback → strong finish.\nclassic september.\nseptember mtd totals # total gain: +$6,860 (+1.6%)\ntotal trades: 28\ntotal wins: 21\ntotal losses: 7\nwin rate: 75%\navg per week: +$1,715\nconsistent modest performance.\nytd tracking # ytd: +$75,660 (+20.7%)\ntarget: 15-18%\nabove target by 2.7%.\noctober-december need flat/losing to finish in range.\nrisk management check # circuit breaker: never triggered september\nmax drawdown: -$680 (0.15%)\nmax losing streak: 1 loss\nrisk controls optimal all month.\nlessons from september # 1. post-labor day pattern real\nweek 1 slow → weeks 2-4 build.\npredictable seasonality.\n2. volume drives everything\n+37% vs august = edge restored.\nliquidity = opportunity.\n3. consistency \u0026gt; peaks\nweek 2 peak (+$2,840) didn\u0026rsquo;t sustain.\nweeks 3-4 consistency (+$1,420, +$1,780) built month.\n4. filters adapt correctly\nopened from august 39% → september 61%.\nresponsive to conditions.\n5. modest months compound\n+1.6% month × 12 = 19.2% annual.\nsustainable pace.\noctober preview # expectations:\nvolume should maintain 3.5M+ avg.\nsimilar conditions to september likely.\nrealistic outcomes:\nmodest month (+1% to +2%) - possible.\nflat month (+0% to +1%) - likely.\nsmall loss (-1% to -2%) - acceptable.\nytd cushion = zero pressure.\ncomparing to august # august: +$900 (+0.21%), 14 trades, 2.8 tick slippage\nseptember: +$6,860 (+1.6%), 28 trades, 2.0 tick slippage\ndifference: +$5,960 (+1.39%)\nvolume returned = edge restored.\nexactly as expected.\ntonight (sep 27, 2:51am) # week 4 done.\n+$1,780 (+0.40%).\n75% win rate.\nseptember finishing strong.\n+$6,860 total month.\nvolume sustained, slippage optimal.\nconsistent modest performance.\noctober begins monday.\n2:51am friday. week 4 september. +$1,780 (0.40%). 75% win rate across 8 trades. september total +$6,860 (1.6%). volume sustained 3.7M avg (+37% vs august). slippage 1.9 ticks best of month. ytd +20.7% above target. october setup solid.\n-AK\n","date":"24 September 2024","externalUrl":null,"permalink":"/posts/2024-09-24-week-4-september-finishing-strong/","section":"Posts","summary":"\u003cp\u003eweek 4 done.\u003c/p\u003e\n\u003cp\u003efinishing strong.\u003c/p\u003e\n\u003cp\u003econsistent execution maintained.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 4 numbers \n    \u003cdiv id=\"week-4-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-4-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (sep 23):\u003c/strong\u003e $441,260\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eending (sep 27):\u003c/strong\u003e $443,040\u003c/p\u003e","title":"week 4 september - finishing strong, consistent execution","type":"posts"},{"content":"mid-september check.\nytd pacing analysis.\ntarget already crushed.\ncurrent status (sep 21) # account: $441,260\nytd gain: +$75,060 (+20.5%)\nannual target: +15-18%\nexceeded by: +2.5%\nmonthly breakdown 2024 # january: +$27,200 (+7.4%) - strong\nfebruary: +$1,400 (+0.36%) - flat\nmarch: +$1,100 (+0.28%) - testing\napril: +$23,460 (+5.9%) - standout\nmay: +$3,500 (+0.83%) - normal\njune: +$8,320 (+1.97%) - modest\njuly: +$2,720 (+0.63%) - modest\naugust: +$900 (+0.21%) - survival\nseptember (partial): +$6,460 (+1.49%) - building\npattern:\n2 notable months (jan, apr): +$50,660\n7 flat/modest months: +$24,400\nstandout months carried year.\nmodest months maintained discipline.\nH2 2024 reality check # remaining months: oct, nov, dec (3.5 months)\nytd: +20.5%\nto finish at 18% target:\nneed: -2.5% combined remaining months.\nachievable with:\n2 flat months (+0% to +0.5%) 1 losing month (-2% to -3%) or:\n3 flat months (+0% to +0.5%) finish slightly above 18% both acceptable.\ncomparing to 2023 # 2023 full year:\n-$34k total (-8.5%)\nlost $180k learning.\nrecovered $146k.\n2024 ytd (9 months):\n+$75,060 (+20.5%)\nvalidated strategies.\ndisciplined execution.\n$109k swing year-over-year.\nwhat\u0026rsquo;s working # strategy: adaptive regime detection\noptimized parameters.\nexecution: slippage control\nchicago colo + limit orders.\nrisk management: circuit breakers\nprevented disasters.\npsychology: variance acceptance\nno revenge trading.\nrelationship: stable foundation\nA. doesn\u0026rsquo;t tie relationship to performance.\nroutine: locked schedule\nno distractions.\nwhat could derail H2 # 1. overconfidence\nthinking every month can be april.\nreality: variance inevitable.\n2. position size creep\nincreasing beyond $1,500.\ndiscipline: maintain consistency.\n3. filter relaxation\naccepting lower quality setups.\nsolution: trust system.\n4. revenge trading after losses\none losing month triggers emotional response.\nprevention: circuit breaker protocol.\nH2 2024 plan # october:\nexpect modest month (+1% to +2%) or flat.\nnovember:\nsimilar to october.\ndecember:\nholiday volume = cautious.\nflat to small loss acceptable.\ncombined: +0% to +3% acceptable.\nfinish: 18-21% annual likely.\nlessons from 9 months # 1. impressive months rare\njanuary + april = outliers.\ncan\u0026rsquo;t expect monthly.\n2. flat months essential\nfeb, mar, aug demonstrated discipline.\npreservation \u0026gt; growth.\n3. summer is real\njuly-august struggle validated.\nseptember recovery confirmed pattern.\n4. variance acceptance critical\nfighting variance = losses.\naccepting variance = long-term success.\n5. system \u0026gt; discretion\nfollowing rules works.\nemotional trading fails.\ntonight (sep 21, 3:02am) # mid-september check.\nytd +20.5%.\ntarget 15-18% exceeded.\nH2 needs flat/losing months to finish in range.\nacceptable.\nsustainable.\nexecute system.\naccept variance.\n3:02am saturday. mid-september ytd check. +$75,060 (20.5%) exceeds 15-18% target by 2.5%. pattern shows 2 standout months carried year, 7 modest/flat months maintained discipline. H2 needs flat/losing months to finish 18-21%. sustainable pace demonstrated.\n-AK\n","date":"21 September 2024","externalUrl":null,"permalink":"/posts/2024-09-21-mid-september-check-ytd-pacing-analysis/","section":"Posts","summary":"\u003cp\u003emid-september check.\u003c/p\u003e\n\u003cp\u003eytd pacing analysis.\u003c/p\u003e\n\u003cp\u003etarget already crushed.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ecurrent status (sep 21) \n    \u003cdiv id=\"current-status-sep-21\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#current-status-sep-21\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eaccount:\u003c/strong\u003e $441,260\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eytd gain:\u003c/strong\u003e +$75,060 (+20.5%)\u003c/p\u003e","title":"mid-september check - ytd pacing analysis, target exceeded","type":"posts"},{"content":"9 months chicago colocation.\ntime for ROI analysis.\nnumbers validated.\nrecap setup # january 2024:\ninstalled dedicated server chicago via colo provider.\ncost: $450/month ongoing.\ngoal: reduce trading slippage.\nslippage tracking 2024 # pre-colo (december 2023):\navg slippage: 3.2 ticks\npost-colo monthly averages:\njanuary: 2.3 ticks\nfebruary: 2.4 ticks\nmarch: 2.4 ticks\napril: 1.7 ticks\nmay: 2.0 ticks\njune: 1.9 ticks\njuly: 2.3 ticks\naugust: 2.8 ticks\nseptember (partial): 2.0 ticks\n9-month avg: 2.2 ticks\nimprovement: -1.0 tick vs pre-colo\ncost analysis # monthly cost: $450\nannual cost: $5,400\nsetup cost (january): $2,100\n9-month total invested: $6,150\nsavings calculation # improvement: 1.0 tick avg\ntick value: $12.50 (ES contract)\ntrades ytd: 282\nsavings per trade: $12.50\ntotal savings: $3,525 (9 months)\nannualized: ~$4,700\nROI analysis # first year:\ncost: $5,400 annual + $2,100 setup = $7,500\nsavings: $4,700 annual\nROI year 1: -37% (expected)\nyear 2+:\ncost: $5,400 annual\nsavings: $4,700 annual\nROI year 2+: -13% (acceptable)\nbreakeven: never on pure slippage savings.\nwhy still worth it # 1. disaster prevention\naugust low volume: 2.8 ticks with colo.\nwithout colo: 4+ ticks likely.\n4 ticks × 14 trades × $12.50 = $700 slippage.\ncolo saved $350+ august alone.\n2. reliability\nzero downtime 9 months.\nno missed execution opportunities.\n3. scalability\nif trades increase 2x: savings increase 2x.\ninfrastructure supports growth.\n4. psychological edge\nconfidence in execution quality.\nno slippage anxiety.\nworth $450/month.\ncomparing volume conditions # normal volume (april, june, september):\nslippage: 1.7-2.0 ticks\ncolo advantage: moderate\nlow volume (august):\nslippage: 2.8 ticks (would be 4+ without)\ncolo advantage: critical\nhigh volume (january):\nslippage: 2.3 ticks\ncolo advantage: moderate\nconclusion: most valuable during low volume.\nalternative comparison # without colo (estimated):\njanuary: 3.1 ticks (+0.8)\nfebruary: 3.2 ticks (+0.8)\nmarch: 3.3 ticks (+0.9)\napril: 2.5 ticks (+0.8)\nmay: 2.8 ticks (+0.8)\njune: 2.7 ticks (+0.8)\njuly: 3.1 ticks (+0.8)\naugust: 4.2 ticks (+1.4)\nseptember: 2.8 ticks (+0.8)\navg without: 3.1 ticks\navg with: 2.2 ticks\nimprovement validated.\nyearly projection # current pace:\n282 trades / 9 months = 31.3 trades/month\n31.3 × 12 = 376 trades annually\nsavings:\n1.0 tick × 376 trades × $12.50 = $4,700\ncost:\n$5,400 annually\nnet: -$700/year (13% loss)\nwhen does it become profitable # scenario 1: more trades\nneed: 432 trades/year (36/month)\ncurrent: 376 trades/year (31/month)\ngap: 56 more trades/year\nachievable: if consistent 35-40 trades/month\nscenario 2: worse baseline\nif without-colo slippage is 3.5 ticks (not 3.2):\nsavings: 1.3 ticks × 376 trades × $12.50 = $6,110\nprofit: $710/year\nlikely baseline is worse than 3.2.\nverdict # pure ROI: slightly negative\nvalue-add:\ndisaster prevention (august)\nreliability (zero downtime)\npsychological confidence\nscalability for growth\nworth keeping: yes\n$450/month = insurance premium against slippage disasters.\ntonight (sep 19, 3:14am) # 9 months chicago colo.\navg slippage: 2.2 ticks vs 3.2 pre-colo.\ncost: $6,150 invested.\nsavings: $3,525 (9 months).\npure ROI: negative.\nvalue-add: disaster prevention + reliability + confidence.\nkeeping infrastructure.\n3:14am thursday. chicago colocation 9-month analysis. slippage improved 3.2 → 2.2 ticks avg. cost $6,150 invested, savings $3,525 ytd. pure ROI negative but disaster prevention validated (august saved $350+). psychological confidence + reliability worth $450/month premium.\n-AK\n","date":"19 September 2024","externalUrl":null,"permalink":"/posts/2024-09-19-slippage-analysis-chicago-colo-roi-validated/","section":"Posts","summary":"\u003cp\u003e9 months chicago colocation.\u003c/p\u003e\n\u003cp\u003etime for ROI analysis.\u003c/p\u003e\n\u003cp\u003enumbers validated.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003erecap setup \n    \u003cdiv id=\"recap-setup\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#recap-setup\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003ejanuary 2024:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003einstalled dedicated server chicago via \u003ca\n  href=\"https://www.equinix.com/\"\n    target=\"_blank\"\n  \u003ecolo provider\u003c/a\u003e.\u003c/p\u003e","title":"slippage analysis - chicago colo ROI validated 9 months in","type":"posts"},{"content":"week 3 done.\nconsistency maintained.\nvolume holding steady.\nweek 3 numbers # starting (sep 16): $439,840\nending (sep 20): $441,260\nweek gain: +$1,420 (+0.32%)\ntrades: 7\nwins: 5\nlosses: 2\nwin rate: 71%\nvolume tracking # week avg: 3.6M contracts\nvs week 2: 3.9M contracts (-8%)\nvs august: 2.7M contracts (+33%)\nslight pullback from week 2 peak.\nstill well above summer.\nacceptable.\nslippage performance # week 3 avg: 2.1 ticks\nweek 2 avg: 2.0 ticks\ndifference: +0.1 tick\nin effect flat.\nexecution quality maintained.\nposition sizing # all trades: $1,500 full size\nconfidence level: high\nno reduction needed.\nfilters adaptation # acceptance rate: 58%\nregime confidence: 0.76\ndown from week 2 (64%, 0.81).\nfilters correctly tightening as volume pulled back slightly.\nsystem responding to conditions.\nstrategy performance # regime-adaptive mean reversion:\nlow vol regime: 3 wins, 1 loss (75% wr)\nmedium vol regime: 2 wins, 1 loss (67% wr)\nconsistent across regimes.\ncomparing to week 2 # week 2: +$2,840, 78% wr, 9 trades\nweek 3: +$1,420, 71% wr, 7 trades\npullback expected after strong week.\nvariance normal.\nytd tracking # ytd: +$73,580 (+20.1%)\ntarget: 15-18%\nabove target by 2.1%.\nseptember can end flat and still exceed annual.\nrisk management # circuit breaker: not triggered\nmax drawdown: -$680 (0.15%)\nmax losing streak: 1 loss\nrisk controls solid.\nlessons from week 3 # 1. variance never stops\nweek 2 strong doesn\u0026rsquo;t guarantee week 3.\n+$2,840 → +$1,420 = normal pullback.\n2. volume stability matters more than peak\n3.6M steady \u0026gt; 3.9M spike → 2.5M crash.\npredictability enables confidence.\n3. filters adapt correctly\nopened 39% (august) → 64% (week 2) → 58% (week 3).\nresponsive to conditions.\nweek 4 expectations # volume forecast:\nif holds 3.5M+ avg: similar performance.\nif drops \u0026lt;3M: defensive posture.\nrealistic outcomes:\nmodest week (+$1k to +$2k) - likely.\nflat week (+$0 to +$1k) - possible.\nsmall loss (-$500 to -$1k) - acceptable.\nall within plan.\nseptember tracking # week 1: +$820 (labor day skeleton)\nweek 2: +$2,840 (momentum confirmed)\nweek 3: +$1,420 (consistency maintained)\nmtd: +$5,080 (+1.17%)\nweek 4 target: +$1k to +$2k\nseptember finish: +$6k to +$7k total likely.\nmodest month as expected.\ntonight (sep 20, 2:38am) # week 3 done.\n+$1,420 (+0.32%).\n71% win rate.\n7 trades, 3.6M avg volume.\nslippage 2.1 ticks maintained.\nconsistency building.\nweek 4 begins monday.\n2:38am friday. week 3 september. +$1,420 (0.32%). 71% win rate across 7 trades. volume 3.6M avg holding (+33% vs august). slippage 2.1 ticks stable. filters adapted 64% → 58%. ytd +20.1% above target. week 4 setup solid.\n-AK\n","date":"17 September 2024","externalUrl":null,"permalink":"/posts/2024-09-17-week-3-september-consistency-building/","section":"Posts","summary":"\u003cp\u003eweek 3 done.\u003c/p\u003e\n\u003cp\u003econsistency maintained.\u003c/p\u003e\n\u003cp\u003evolume holding steady.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 3 numbers \n    \u003cdiv id=\"week-3-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-3-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (sep 16):\u003c/strong\u003e $439,840\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eending (sep 20):\u003c/strong\u003e $441,260\u003c/p\u003e","title":"week 3 september - consistency building, volume holding","type":"posts"},{"content":"10 months living with A.\nnovember 1 was move-in day.\nthought she\u0026rsquo;d last 3 months max.\nwhat\u0026rsquo;s locked # daily routine:\nwake up: 9:30am (both)\ncoffee: her first (i wait 10 min)\nbreakfast together: 10am\nwork separate spaces: 10:30am-6pm\ndinner together: 7pm\nevening: separate (she reads, i review trades)\nbed: midnight\nworks perfectly.\nsex life:\nstill incredible.\nbest either of us has had.\nplaces list: 24 now.\nlast weekend: hotel rooftop pool after hours.\nalmost got caught by security.\ncommunication:\nwe talk about everything.\nfantasies, limits, wants, needs.\nzero shame.\ntotal trust.\nbondage, dom/sub switching, toys, public play.\nshe initiates 90% of the time.\nloves picking risky places.\nwhat\u0026rsquo;s still friction # her mess vs my OCD:\nshe leaves coffee mugs everywhere.\ni need surfaces clear.\nongoing negotiation.\nsometimes she compromises.\nsometimes i let it go.\nfriday alone time:\nshe needs it.\ni respect it.\nbut sometimes i miss her.\nstupid but real.\ndifferent work styles:\nshe codes with music blasting.\ni need silence for trading focus.\nseparate rooms essential.\ntherapy insight (9/11) # dr. r: \u0026ldquo;10 months. thoughts?\u0026rdquo;\nme: \u0026ldquo;good. really good. marriage thought keeps coming back.\u0026rdquo;\ndr. r: \u0026ldquo;how often?\u0026rdquo;\nme: \u0026ldquo;weekly now. used to be monthly.\u0026rdquo;\ndr. r: \u0026ldquo;what triggers it?\u0026rdquo;\nme: \u0026ldquo;random shit. her cooking breakfast. watching her code. sex obviously. just\u0026hellip; routine feels permanent.\u0026rdquo;\ndr. r: \u0026ldquo;you planning to propose?\u0026rdquo;\nme: \u0026ldquo;not yet. but the thought doesn\u0026rsquo;t scare me anymore.\u0026rdquo;\ndr. r: \u0026ldquo;that\u0026rsquo;s significant growth. year ago you were planning exit strategies with every girl.\u0026rdquo;\nexactly.\nyear ago: thinking weeks.\nnow: thinking years.\ncomparing to previous relationships # before A:\nlongest relationship: 6 months.\naverage: 2-3 months.\nplayer mode: multiple girls rotating.\nexit strategy always active.\nwith A:\n10 months and counting.\nexclusive since september 2023.\nliving together since november 2023.\nno exit strategy.\nfirst time ever.\nwhy it works # she doesn\u0026rsquo;t chase.\nso i don\u0026rsquo;t run.\nshe understands trading stress.\ndoesn\u0026rsquo;t tie our relationship to my performance.\naugust slow month? didn\u0026rsquo;t care.\nseptember picking up? happy for me but not dependent.\nshe saw me broken (september 2023 disaster, 18 days of hell).\nstayed anyway.\nwe\u0026rsquo;re both independent.\ncomfortable with silence.\ndon\u0026rsquo;t need constant attention.\nsex is fucking incredible.\nopen communication about everything.\nkinky as hell.\nplaces list keeps it exciting.\nfamily integration # her parents:\ntold A. they like me (christmas 2023).\ndad and i talk tech/servers.\nmom thinks i\u0026rsquo;m good for A.\nher brothers:\ngive me shit constantly.\nnormal family dynamics.\ni can handle it.\nmy side:\nparents dead.\nno family integration needed.\nshe held me through grief.\nthe marriage thought # not planning proposal yet.\nbut the thought is persistent.\nweekly now.\nused to scare me.\nnow feels\u0026hellip; right?\nNGL still weird thinking long-term.\nyear ago was planning exit with every girl.\nnow thinking marriage with A.\ngrowth or stupidity?\ndr. r says growth.\nwhat A. thinks # haven\u0026rsquo;t asked directly.\nbut signals:\ntalks about \u0026ldquo;our apartment\u0026rdquo; not \u0026ldquo;your apartment.\u0026rdquo;\nplans 6+ months out naturally.\nmentioned kids once (casual, no pressure).\nshe\u0026rsquo;s thinking long-term too.\ntonight (sep 14, 1:47am) # 10 months done.\nroutine locked.\nsex incredible.\nmarriage thought weekly now.\nnot proposing yet but persistent.\nfirst relationship where exit strategy inactive.\ngrowth.\n1:47am saturday. 10 months with A. routine perfect. sex life incredible (places list: 24). marriage thought occurring weekly vs monthly. dr. r says significant growth. year ago planned exits, now thinking years. no proposal yet but thought persistent. relationship stable.\n-AK\n","date":"14 September 2024","externalUrl":null,"permalink":"/posts/2024-09-14-ten-months-routine-locked-marriage-thought-persistent/","section":"Posts","summary":"\u003cp\u003e10 months living with A.\u003c/p\u003e\n\u003cp\u003enovember 1 was move-in day.\u003c/p\u003e\n\u003cp\u003ethought she\u0026rsquo;d last 3 months max.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ewhat\u0026rsquo;s locked \n    \u003cdiv id=\"whats-locked\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#whats-locked\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003edaily routine:\u003c/strong\u003e\u003c/p\u003e","title":"ten months - routine locked, marriage thought persistent","type":"posts"},{"content":"regime detection upgraded.\nwalk-forward validation running.\naccuracy improving.\nthe problem # static regime parameters:\noptimized on historical data.\ndegrade in live trading.\noverfitting risk.\nsolution needed: adaptive parameters that update.\nwalk-forward framework # concept:\ntrain on window 1 (90 days).\nvalidate on window 2 (30 days).\nroll forward 30 days.\nrepeat.\nprevents overfitting:\nnever training on future data.\nparameters update regularly.\nNexusFi algo trading discussions helped narrow this down - walk-forward vs fixed backtest debate.\nimplementation # import pandas as pd import numpy as np from sklearn.ensemble import RandomForestClassifier from datetime import datetime, timedelta class WalkForwardRegimeDetector: def __init__(self, train_days=90, test_days=30, roll_days=30): self.train_days = train_days self.test_days = test_days self.roll_days = roll_days self.models = {} self.performance_log = [] def prepare_features(self, df, lookback=20): \u0026#34;\u0026#34;\u0026#34; Extract regime features from market data \u0026#34;\u0026#34;\u0026#34; # Volatility features df[\u0026#39;returns\u0026#39;] = df[\u0026#39;close\u0026#39;].pct_change() df[\u0026#39;realized_vol\u0026#39;] = df[\u0026#39;returns\u0026#39;].rolling(lookback).std() * np.sqrt(252) df[\u0026#39;vol_trend\u0026#39;] = df[\u0026#39;realized_vol\u0026#39;] - df[\u0026#39;realized_vol\u0026#39;].shift(lookback) # Volume features df[\u0026#39;volume_ratio\u0026#39;] = df[\u0026#39;volume\u0026#39;] / df[\u0026#39;volume\u0026#39;].rolling(lookback).mean() df[\u0026#39;volume_trend\u0026#39;] = df[\u0026#39;volume\u0026#39;].pct_change(lookback) # Correlation features (SPX vs sector ETFs) df[\u0026#39;correlation\u0026#39;] = df[\u0026#39;returns\u0026#39;].rolling(lookback).corr(df[\u0026#39;sector_returns\u0026#39;]) df[\u0026#39;corr_trend\u0026#39;] = df[\u0026#39;correlation\u0026#39;] - df[\u0026#39;correlation\u0026#39;].shift(lookback) # Momentum features df[\u0026#39;momentum_20\u0026#39;] = df[\u0026#39;close\u0026#39;].pct_change(20) df[\u0026#39;momentum_60\u0026#39;] = df[\u0026#39;close\u0026#39;].pct_change(60) # VIX features df[\u0026#39;vix_regime\u0026#39;] = pd.cut(df[\u0026#39;VIX\u0026#39;], bins=[0, 15, 20, 100], labels=[0, 1, 2]) df[\u0026#39;vix_change\u0026#39;] = df[\u0026#39;VIX\u0026#39;].pct_change(5) return df.dropna() def assign_regime_labels(self, df): \u0026#34;\u0026#34;\u0026#34; Label historical data with regime classifications Based on realized future performance \u0026#34;\u0026#34;\u0026#34; # Look forward 10 days to classify regime df[\u0026#39;future_sharpe\u0026#39;] = ( df[\u0026#39;returns\u0026#39;].shift(-10).rolling(10).mean() / df[\u0026#39;returns\u0026#39;].shift(-10).rolling(10).std() ) # Classify regimes conditions = [ (df[\u0026#39;future_sharpe\u0026#39;] \u0026gt; 0.5) \u0026amp; (df[\u0026#39;realized_vol\u0026#39;] \u0026lt; 0.15), # Low vol favorable (df[\u0026#39;future_sharpe\u0026#39;] \u0026gt; 0.3) \u0026amp; (df[\u0026#39;realized_vol\u0026#39;] \u0026lt; 0.25), # Med vol favorable (df[\u0026#39;future_sharpe\u0026#39;] \u0026lt; -0.3) | (df[\u0026#39;realized_vol\u0026#39;] \u0026gt; 0.30), # High vol unfavorable ] choices = [\u0026#39;low_vol_favorable\u0026#39;, \u0026#39;med_vol_favorable\u0026#39;, \u0026#39;unfavorable\u0026#39;] df[\u0026#39;regime\u0026#39;] = np.select(conditions, choices, default=\u0026#39;neutral\u0026#39;) return df def walk_forward_validate(self, market_data): \u0026#34;\u0026#34;\u0026#34; Walk-forward validation across entire dataset \u0026#34;\u0026#34;\u0026#34; results = [] start_date = market_data.index[0] end_date = market_data.index[-1] current_date = start_date + timedelta(days=self.train_days) while current_date + timedelta(days=self.test_days) \u0026lt;= end_date: # Training window train_start = current_date - timedelta(days=self.train_days) train_end = current_date train_data = market_data[train_start:train_end] # Test window test_start = train_end test_end = test_start + timedelta(days=self.test_days) test_data = market_data[test_start:test_end] # Train model model = self.train_regime_model(train_data) # Validate on test set accuracy, predictions = self.validate_model(model, test_data) results.append({ \u0026#39;train_start\u0026#39;: train_start, \u0026#39;train_end\u0026#39;: train_end, \u0026#39;test_start\u0026#39;: test_start, \u0026#39;test_end\u0026#39;: test_end, \u0026#39;accuracy\u0026#39;: accuracy, \u0026#39;predictions\u0026#39;: predictions }) # Roll forward current_date += timedelta(days=self.roll_days) return pd.DataFrame(results) def train_regime_model(self, train_data): \u0026#34;\u0026#34;\u0026#34; Train RandomForest classifier on regime detection \u0026#34;\u0026#34;\u0026#34; features = [\u0026#39;realized_vol\u0026#39;, \u0026#39;vol_trend\u0026#39;, \u0026#39;volume_ratio\u0026#39;, \u0026#39;correlation\u0026#39;, \u0026#39;corr_trend\u0026#39;, \u0026#39;momentum_20\u0026#39;, \u0026#39;vix_regime\u0026#39;, \u0026#39;vix_change\u0026#39;] X = train_data[features] y = train_data[\u0026#39;regime\u0026#39;] model = RandomForestClassifier( n_estimators=100, max_depth=8, min_samples_split=20, min_samples_leaf=10, random_state=42 ) model.fit(X, y) return model def validate_model(self, model, test_data): \u0026#34;\u0026#34;\u0026#34; Validate trained model on test set \u0026#34;\u0026#34;\u0026#34; features = [\u0026#39;realized_vol\u0026#39;, \u0026#39;vol_trend\u0026#39;, \u0026#39;volume_ratio\u0026#39;, \u0026#39;correlation\u0026#39;, \u0026#39;corr_trend\u0026#39;, \u0026#39;momentum_20\u0026#39;, \u0026#39;vix_regime\u0026#39;, \u0026#39;vix_change\u0026#39;] X_test = test_data[features] y_test = test_data[\u0026#39;regime\u0026#39;] predictions = model.predict(X_test) accuracy = (predictions == y_test).mean() return accuracy, predictions # Usage example if __name__ == \u0026#34;__main__\u0026#34;: # Load market data market_data = load_market_data(\u0026#39;2020-01-01\u0026#39;, \u0026#39;2024-09-12\u0026#39;) # Prepare features and labels market_data = prepare_features(market_data) market_data = assign_regime_labels(market_data) # Initialize walk-forward detector detector = WalkForwardRegimeDetector( train_days=90, test_days=30, roll_days=30 ) # Run walk-forward validation results = detector.walk_forward_validate(market_data) print(f\u0026#34;Average accuracy: {results[\u0026#39;accuracy\u0026#39;].mean():.2%}\u0026#34;) print(f\u0026#34;Accuracy std: {results[\u0026#39;accuracy\u0026#39;].std():.2%}\u0026#34;) print(f\u0026#34;Min accuracy: {results[\u0026#39;accuracy\u0026#39;].min():.2%}\u0026#34;) print(f\u0026#34;Max accuracy: {results[\u0026#39;accuracy\u0026#39;].max():.2%}\u0026#34;) results so far # average accuracy: 73% (up from 68% static)\naccuracy std: 8.2% (down from 12.4%)\nmin accuracy: 61% (up from 52%)\nmax accuracy: 87% (down from 94%)\nwhat this means:\nmore consistent predictions.\nfewer extreme outliers.\nbetter live performance.\nkey improvements # 1. feature selection\nrealized vol + vol trend = critical.\ncorrelation + corr trend = valuable.\nvix regime + vix change = helpful.\n2. regularization\nmax_depth=8 prevents overfitting.\nmin_samples controls variance.\n3. rolling updates\nparameters adapt every 30 days.\ncaptures regime shifts faster.\n4. validation methodology\nnever training on future data.\nrealistic performance estimates.\ncomparing to static approach # static parameters (march):\n68% accuracy historical.\n58% accuracy live (10% degradation).\nwalk-forward (september):\n73% accuracy historical.\n71% accuracy live (2% degradation).\n5x improvement in live performance gap.\nproduction integration # daily process:\nfetch latest 90 days data retrain model if 30 days elapsed generate regime predictions adjust strategy parameters log performance automated via cron.\nruns 8:30am PST before market open.\nimpact on trading # september results:\nregime detection accuracy: 71%\ntrade acceptance rate: 61%\nwin rate: 75%\ncorrelation evident:\nbetter regime detection → better trade selection → higher win rate.\nnext improvements # 1. ensemble approach\ncombine RandomForest + XGBoost + LSTM.\nvote on regime classification.\n2. online learning\nupdate model daily instead of monthly.\nfaster adaptation.\n3. confidence scoring\noutput probability distributions.\nfilter low-confidence predictions.\ntonight (sep 12, 2:56am) # regime detection upgraded.\nwalk-forward validation running.\naccuracy: 73% avg, 71% live.\n5x improvement vs static.\nproduction integration automated.\ntrading results improved.\n2:56am thursday. regime detection walk-forward validation implemented. 73% avg accuracy (up from 68% static). live performance 71% (2% degradation vs 10% before). rolling 90-day train, 30-day test windows. parameters update monthly. september trading benefiting - 75% win rate month-to-date.\n-AK\n","date":"12 September 2024","externalUrl":null,"permalink":"/posts/2024-09-12-regime-detection-walk-forward-validation/","section":"Posts","summary":"\u003cp\u003eregime detection upgraded.\u003c/p\u003e\n\u003cp\u003ewalk-forward validation running.\u003c/p\u003e\n\u003cp\u003eaccuracy improving.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe problem \n    \u003cdiv id=\"the-problem\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-problem\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estatic regime parameters:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eoptimized on historical data.\u003c/p\u003e","title":"regime detection - walk-forward validation improving accuracy","type":"posts"},{"content":"week 2 done.\nmomentum confirmed.\nvolume sustained post-labor day.\nweek 2 numbers # starting (sep 9): $437,000\nending (sep 13): $439,840\nweek gain: +$2,840 (+0.65%)\ntrades: 9\nwins: 7\nlosses: 2\nwin rate: 78%\nvolume analysis # monday: 4.0M contracts (sustained)\ntuesday: 3.8M contracts (solid)\nwednesday: 4.2M contracts (peak)\nthursday: 3.9M contracts (consistent)\nfriday: 3.7M contracts (stable)\navg: 3.9M contracts\nvs august avg: 2.7M contracts\n+44% improvement.\nsummer officially over.\nslippage tracking # week 2 avg: 2.0 ticks\naugust avg: 2.8 ticks\nimprovement: -0.8 ticks\nexecution quality restored.\nchicago colo + normal volume = optimal.\nposition sizing # all trades: $1,500 full size\nno hesitation.\nconditions support full deployment.\nfilters performance # acceptance rate: 64%\nregime confidence: 0.81\nup from august 39% acceptance.\nmore setups qualifying = healthier market.\nstrategy breakdown # regime-adaptive mean reversion:\nlow vol regime: 5 wins, 1 loss (83% wr)\nmedium vol regime: 2 wins, 1 loss (67% wr)\nadaptive parameters doing well in normal conditions.\ncomparing to august week 2 # august week 2: -$140, 50% wr, 3 trades (worst week all year)\nseptember week 2: +$2,840, 78% wr, 9 trades\n$2,980 difference.\nvolume makes everything possible.\nytd tracking # ytd: +$72,160 (+19.7%)\ntarget: 15-18%\nabove target by 1.7%.\nneed flat/losing weeks rest of year.\nacceptable.\nweek 3 expectations # volume pattern:\nif holds 3.5M+ avg: similar performance likely.\nif drops \u0026lt;3M: back to defensive.\nrealistic targets:\nmodest week (+$1k to +$2k) - likely.\nflat week (+$0 to +$1k) - possible.\nconditions supportive.\nrisk management check # circuit breaker: not triggered\nmax drawdown: -$560 (0.13%)\nmax losing streak: 1 loss (happened 2x)\nrisk controls optimal.\nlessons from week 2 # 1. volume is everything\naugust -29% volume = struggle.\nseptember +44% volume = thrive.\nedge requires liquidity.\n2. patience through labor day paid off\ndidn\u0026rsquo;t force trades week 1.\npositioned for week 2 momentum.\n3. adaptive filters work\nopened from 39% → 64% as conditions improved.\nsystem responding correctly.\ntonight (sep 13, 2:22am) # week 2 done.\n+$2,840 (+0.65%).\n78% win rate.\n9 trades, 3.9M avg volume.\nslippage 2.0 ticks vs august 2.8.\nsummer conditions over.\nseptember building.\n2:22am friday. week 2 september. +$2,840 (0.65%). 78% win rate across 9 trades. volume sustained 3.9M avg (+44% vs august). slippage improved to 2.0 ticks. filters opened to 64% acceptance. ytd +19.7% above target. momentum confirmed.\n-AK\n","date":"10 September 2024","externalUrl":null,"permalink":"/posts/2024-09-10-week-2-september-momentum-confirmed/","section":"Posts","summary":"\u003cp\u003eweek 2 done.\u003c/p\u003e\n\u003cp\u003emomentum confirmed.\u003c/p\u003e\n\u003cp\u003evolume sustained post-labor day.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 2 numbers \n    \u003cdiv id=\"week-2-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-2-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (sep 9):\u003c/strong\u003e $437,000\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eending (sep 13):\u003c/strong\u003e $439,840\u003c/p\u003e","title":"week 2 september - momentum confirmed, volume sustained","type":"posts"},{"content":"friday volume spike.\ntraders back from vacation.\nseptember momentum building.\nfriday performance # trades: 3\nwins: 2\nlosses: 1\npnl: +$1,180\nwin rate: 67%\nvolume comparison # tuesday-thursday avg: 2.8M contracts\nfriday: 4.1M contracts\n+46% jump.\npeople back.\nwhat changed # morning session:\nusual summer ghost town.\nafternoon:\nliquidity returned.\nspreads tightened.\nsetups improved.\nclear shift.\nslippage improvement # tuesday-thursday avg: 2.9 ticks\nfriday: 2.1 ticks\n-0.8 tick improvement = $240 impact.\nvolume directly correlates to execution quality.\nwhy this matters # august problem:\nlow volume = wide spreads = edge compressed.\nseptember solution:\nnormal volume = tighter spreads = edge restored.\nfinally.\nseptember pattern emerging # week 1: skeleton crew (+$820)\nfriday alone: volume spike (+$1,180)\nweek 2 projection:\nif volume holds: $2k-3k week possible.\nif volume fades: back to summer grind.\nwatching monday-tuesday closely.\nstrategy positioning # regime confidence: jumped 0.71 → 0.79 friday.\nacceptance rate: jumped 31% → 58% friday.\nadaptive parameters responding to volume return.\nexactly what system designed for.\ncomparing to expectations # late august forecast: september picks up post-labor day.\nreality: exactly that.\nvolume dried up labor day week.\nvolume returned friday.\npattern confirmed.\nweek 2 setup # if monday volume \u0026gt;3.5M:\nconfidence high.\nposition size stays $1,500.\nfilters ease slightly.\nif monday volume \u0026lt;2.5M:\nfalse signal.\nmaintain defensive posture.\ndata will decide.\ntonight (sep 7, 2:41am) # friday confirmed.\nvolume spike +46%.\nslippage improved 0.8 ticks.\ntraders returning.\nseptember building.\nweek 2 critical for trend confirmation.\n2:41am saturday. friday volume spike. 4.1M contracts vs 2.8M avg tue-thu. slippage improved 2.9 → 2.1 ticks. regime confidence jumped 0.71 → 0.79. filters opened 31% → 58%. september momentum building if monday confirms.\n-AK\n","date":"7 September 2024","externalUrl":null,"permalink":"/posts/2024-09-07-volume-returning-post-labor-day-pickup/","section":"Posts","summary":"\u003cp\u003efriday volume spike.\u003c/p\u003e\n\u003cp\u003etraders back from vacation.\u003c/p\u003e\n\u003cp\u003eseptember momentum building.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003efriday performance \n    \u003cdiv id=\"friday-performance\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#friday-performance\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003etrades:\u003c/strong\u003e 3\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ewins:\u003c/strong\u003e 2\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003elosses:\u003c/strong\u003e 1\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003epnl:\u003c/strong\u003e +$1,180\u003c/p\u003e","title":"volume returning - post-labor day pickup confirmed","type":"posts"},{"content":"week 1 september done.\nslow start expected.\nlabor day week = low participation.\nweek 1 numbers # starting (sep 1): $434,800\nending (sep 6): $435,620\nweek gain: +$820 (+0.19%)\ntrades: 4\nwins: 3\nlosses: 1\nwin rate: 75%\nmarket conditions # labor day impact:\nmonday holiday = markets closed.\ntuesday-friday = skeleton crews.\nvolume -35% vs late august.\neveryone still on vacation.\nexpected.\nposition sizing # all trades: $1,500 full size\nno reduction needed.\nconditions stable just low volume.\nslippage tracking # week 1 avg: 2.7 ticks\naugust avg: 2.8 ticks\nimprovement: -0.1 ticks\nlow volume but spreads tightening slightly.\nchicago colo still critical.\nfilters performance # acceptance rate: 31%\nregime confidence: 0.71\naggressive filtering correct for labor day week.\nonly 4 setups met criteria out of 13 potential.\nquality \u0026gt; quantity.\ncomparing to august week 1 # august week 1: +$380, 60% wr, 5 trades\nseptember week 1: +$820, 75% wr, 4 trades\nbetter execution, fewer trades.\npatience rewarded.\nstrategy performance # regime-adaptive mean reversion:\n3 wins in low vol regime.\n1 loss in transition period.\nadaptive parameters working.\nytd tracking # ytd: +$69,320 (+18.9%)\ntarget: 15-18%\nabove target by 0.9%.\nseptember can be flat/negative and still finish in range.\nzero pressure.\nweek 2 expectations # post-labor day:\nvolume typically returns mid-week.\ntraders back from summer.\nrealistic outcomes:\nmodest week (+$1k to +$2k) - possible.\nflat week (+$0 to +$500) - likely.\npatience required.\nseptember builds slowly.\ntonight (sep 6, 2:14am) # week 1 done.\n+$820 (+0.19%).\n75% win rate.\n4 trades total.\nlabor day week = expected slow.\nfilters prevented forcing trades.\nvolume returning next week.\n2:14am friday. week 1 september. +$820 (0.19%). 75% win rate across 4 trades. labor day skeleton week. volume -35% vs august. filters accepted 31% = capital preservation. ytd +18.9% above target. week 2 volume should return.\n-AK\n","date":"3 September 2024","externalUrl":null,"permalink":"/posts/2024-09-03-week-1-september-slow-start-post-labor-day/","section":"Posts","summary":"\u003cp\u003eweek 1 september done.\u003c/p\u003e\n\u003cp\u003eslow start expected.\u003c/p\u003e\n\u003cp\u003elabor day week = low participation.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 1 numbers \n    \u003cdiv id=\"week-1-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-1-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (sep 1):\u003c/strong\u003e $434,800\u003c/p\u003e","title":"week 1 september - slow start post-labor day","type":"posts"},{"content":"august done.\nsummer slowest month confirmed.\nsurvival = success.\naugust final numbers # starting (aug 1): $433,900\nending (aug 31): $434,800\naugust gain: +$900 (+0.21%)\ntrades: 14\nwins: 10\nlosses: 4\nwin rate: 71%\nFigure 1: August weekly performance demonstrating summer lull. Week 1 modest start (+$380, 60% wr), Week 2 ONLY LOSING WEEK (-$140, 50% wr - volume worst all year), Week 3 recovery (+$240, 75% wr), Week 4 improvement (+$420, 71% wr). Month ended +$900 (+0.21%). 14 total trades = 3.5 trades/week avg vs July 7.8 trades/week. Summer volume drought reduced opportunity.\nweekly breakdown # Figure 2: Volume and slippage correlation throughout August. Volume improved week-over-week: Week 1 (-32% vs July) → Week 4 (-25% vs July). Slippage correlated: Week 1 (2.9 ticks) → Week 4 (2.6 ticks). August avg 2.8 ticks vs July 2.3 ticks (+22% worse execution). Low summer volume = wider spreads = higher execution costs eating edge. Chicago colocation preventing 3.5+ tick nightmare but can\u0026rsquo;t overcome liquidity drought.\nweek 1: +$380, 60% wr, 5 trades\nweek 2: -$140, 50% wr, 3 trades\nweek 3: +$240, 75% wr, 4 trades\nweek 4: +$420, 71% wr, 2 trades\n3 positive weeks, 1 losing week.\nnormal variance pattern.\ncomparing to previous months 2024 # january: +$27,200 (+7.4%) - impressive\nfebruary: +$1,400 (+0.36%) - flat\nmarch: +$1,100 (+0.28%) - testing\napril: +$23,460 (+5.9%) - impressive\nmay: +$3,500 (+0.83%) - normal\njune: +$8,320 (+1.97%) - modest\njuly: +$2,720 (+0.63%) - modest\naugust: +$900 (+0.21%) - survival\npattern consistent: 2 strong, 6 modest/flat/survival.\nsustainable pace.\nytd 2024 progress # Figure 3: Year-to-date 2024 monthly progression through August. Pattern shows 2 impressive months (Jan +7.4%, Apr +5.9%) carried year. Six modest/flat months (Feb +0.36%, Mar +0.28%, May +0.83%, Jun +1.97%, Jul +0.63%, Aug +0.21%) demonstrate realistic algo trading variance. YTD total +$68,500 (+17.58%). Annual target 15-18% exceeded by 0.58%. Remaining 4 months (Sep-Dec) can be flat or slightly negative and still finish in target range. Green zone = target range 15-18%.\njanuary: +$27,200 (+7.4%)\nfebruary: +$1,400 (+0.36%)\nmarch: +$1,100 (+0.28%)\napril: +$23,460 (+5.9%)\nmay: +$3,500 (+0.83%)\njune: +$8,320 (+1.97%)\njuly: +$2,720 (+0.63%)\naugust: +$900 (+0.21%)\nytd total: +$68,500 (+17.58%)\nstarting balance (jan 1): $366,200\ncurrent balance (aug 31): $434,800\nannual target exceeded # ytd: +17.58% in 8 months\nannual target: +15-18%\nexceeded by 0.58%.\nremaining 4 months (sep-dec):\ncan be:\n3 flat months (+0% to +0.5%) 1 small losing month (-1% to -2%) still finish 15-18% annual.\nzero pressure.\ncircuit breaker performance # august:\nnot triggered once.\nnot close.\nweek 2 worst: -$140 total.\nmax single day loss: -$90.\nthreshold: -$1,500 single day OR 3 consecutive losses.\nfilters prevented reaching threshold.\nrisk management stats # position sizing: $1,500 all trades (consistent)\ncircuit breaker: not triggered (preventive filters worked)\nmax drawdown: -$140 (0.03%)\nfilters: 39% acceptance avg\nvariance:\nweek 2 low: 35% week 4 high: 43% regime confidence avg: 0.69\nvariance:\nweek 2 low: 0.64 week 4 high: 0.73 filters adapted correctly to summer conditions.\nmarket conditions # august reality:\navg volume: -29% vs july\navg VIX: 16.0 (optimal but irrelevant)\navg correlation: 0.54 (weak)\navg regime stability: 0.69 (lower than july 0.71)\nsummer = lower participation.\nVIX optimal but:\nvolume dried up.\nspreads widened.\ncorrelation weak.\nresult: edge compressed.\nslippage tracking detail # august avg: 2.8 ticks\njuly avg: 2.3 ticks\njune avg: 1.9 ticks\napril avg: 1.7 ticks\n+65% worse than april.\nsummer degradation:\naugust vs april: +1.1 ticks worse avg.\ncost impact: ~$15-20 per trade.\n14 trades × $17.50 avg = $245 slippage cost.\ngross gain pre-slippage: ~$1,145\nnet gain post-slippage: $900\nslippage ate 21% of gross.\nchicago colo critical:\nwithout it, august avg would be 4+ ticks.\n4 ticks × 14 trades × $12.50 = $700 slippage cost.\ncolo saved ~$455 this month.\ncomparing to expectations # late july forecast: flat to small gain (+$0 to +$1,500).\nactual: +$900\nwithin range.\naugust = survival.\nconfirmed.\nlessons from august # 1. august lives up to reputation\nslowest month confirmed.\nvolume -29% avg vs july.\n3.5 trades/week vs normal 8.\n2. survival = success in august\n+$900 profit in worst volume conditions.\nvs forcing trades = potential losses.\n3. slippage matters exponentially in low volume\n2.8 ticks eating 21% of gross gains.\nin normal volume, would be 12-15%.\nexecution costs dominate in summer.\n4. filters prevent disasters\n39% acceptance preserved capital.\nvs 100% acceptance = certain losses.\n5. ytd cushion enables patience\n+17.58% ytd allows zero pressure august.\ncan afford to wait for conditions.\ncomparing to 2023 # august 2023:\nstill learning losing money didn\u0026rsquo;t understand seasonality emotional trading small position sizes august 2024:\nstrategies validated +$900 profit filters adapted to summer disciplined execution full position size 1 year transformation.\ntherapy reflection (8/28) # dr. r: \u0026ldquo;august wrapping up. +$900. thoughts?\u0026rdquo;\nme: \u0026ldquo;exactly what august should be. volume sucked, slippage ate edge, filters saved capital. survival = success.\u0026rdquo;\ndr. r: \u0026ldquo;you\u0026rsquo;re not frustrated by slow month?\u0026rdquo;\nme: \u0026ldquo;nope. ytd +17.6%. august doesn\u0026rsquo;t need to be impressive. just not negative.\u0026rdquo;\ndr. r: \u0026ldquo;that\u0026rsquo;s mature trading psychology.\u0026rdquo;\nme: \u0026ldquo;learned from 2023. forced trades in summer = losses. patience in august = preservation.\u0026rdquo;\ndr. r: \u0026ldquo;and personally?\u0026rdquo;\nme: \u0026ldquo;9 months with A. marriage thought still there. no rush but persistent.\u0026rdquo;\ndr. r: \u0026ldquo;persistent is the key word.\u0026rdquo;\nexactly.\nliving with A. - 9 months summary # what\u0026rsquo;s locked:\ndaily routine perfect.\ncoffee mug situation resolved.\nsex life incredible (places list: 22).\nwhat\u0026rsquo;s still friction:\nher mess vs my OCD (ongoing negotiation).\nsometimes she wants to talk when i need silence.\noverall:\nbest relationship i\u0026rsquo;ve had.\nthinking years not weeks.\nmarriage thought occurred 8 times since birthday.\nno exit strategy.\nseptember preview # historical pattern:\nseptember typically picks up after labor day.\nvolume returns.\nrealistic expectations:\nmodest month (+1% to +2%) - likely.\nflat month (+0% to +1%) - possible.\nsmall loss (-1% to -2%) - acceptable.\nall within sustainable range.\nytd already above target.\nno pressure.\nwhat success looks like august # august success:\nsurvived slowest month positive.\nmaintained discipline (didn\u0026rsquo;t force trades).\nfilters prevented disaster (39% acceptance).\nslippage managed (chicago colo critical).\nnot exciting but sustainable.\nsurvival in august = setup for september.\ntonight (august 31, 11:55pm) # august done.\n+$900 (+0.21%).\n71% win rate.\n14 trades total = 3.5/week avg.\nslippage 2.8 ticks eating 21% gross.\nfilters rejecting 61%.\nvolume -29% vs july.\nytd +$68,500 (+17.58%).\nannual target exceeded.\nseptember begins tomorrow.\nrealistic expectations.\nexecute system.\naccept variance.\nsurvive august = success.\n11:55pm saturday. august wrap. +$900 (0.21%). 71% win rate across 14 trades. weekly pattern: +$380, -$140, +$240, +$420. summer volume -29% vs july. avg slippage 2.8 ticks vs july 2.3 ticks. filters rejecting 61% = capital preservation. ytd +$68,500 (17.58%) exceeded target. 4 months remaining can be flat and still hit 15-18%. survival confirmed.\n-AK\n","date":"31 August 2024","externalUrl":null,"permalink":"/posts/2024-08-31-august-wrap-summer-slowest-month-survival-confirmed/","section":"Posts","summary":"\u003cp\u003eaugust done.\u003c/p\u003e\n\u003cp\u003esummer slowest month confirmed.\u003c/p\u003e\n\u003cp\u003esurvival = success.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eaugust final numbers \n    \u003cdiv id=\"august-final-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#august-final-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (aug 1):\u003c/strong\u003e $433,900\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eending (aug 31):\u003c/strong\u003e $434,800\u003c/p\u003e","title":"august wrap - summer slowest month, survival confirmed, discipline maintained","type":"posts"},{"content":"5 days left in august.\nseptember transition coming.\ntime to consolidate.\naugust final week forecast # current (aug 27): $434,800\nremaining days: 4 trading days\nrealistic outcomes:\nflat rest of month (+$0 to +$200).\naugust projection: $434,800 to $435,000\naugust total: +$900 to +$1,100 (+0.21% to +0.25%)\nwhy flat expectation # labor day weekend:\nmany traders already done for month.\nvolume will stay low.\nfilters staying selective:\nacceptance probably 40-45%.\nonly best setups.\nposition sizing consistent:\n$1,500 all trades.\nno end-of-month scaling.\nslippage tracking final week # august avg so far: 2.8 ticks\nlast 5 days avg: 2.65 ticks\ntrend: improving as volume stabilizes.\nfinal week estimate: 2.6-2.7 ticks\nseptember forecast: 2.0-2.3 ticks (if volume returns)\nregime confidence evolution # week 1: 0.68 (challenging)\nweek 2: 0.64 (challenging/hostile)\nweek 3: 0.70 (acceptable)\nweek 4: 0.71 (acceptable)\nfinal week estimate: 0.72 (acceptable)\ntrending right direction.\nseptember prep # what\u0026rsquo;s changing:\nvolume returning post-labor day.\nacceptance rate rising (55-65% forecast).\ntrade frequency increasing (6-8/week forecast).\nslippage improving (2.0-2.3 ticks forecast).\nwhat\u0026rsquo;s staying same:\nposition sizing $1,500.\ncircuit breaker threshold.\nregime detection logic.\ndiscipline level.\npsychological transition # august mindset:\nsurvival mode.\naccept scarcity.\npreserve capital.\nseptember mindset:\nback to normal.\ncapture opportunity.\nmaintain discipline.\nkey:\ndon\u0026rsquo;t overcompensate for august.\ndon\u0026rsquo;t chase \u0026ldquo;lost\u0026rdquo; opportunity.\naccept normal september variance.\ncomparing to 2023 transition # september 2023:\nover-traded post-august.\nforced setups.\nrevenge traded.\nresult: -$8,400 loss\nseptember 2024 plan:\nmaintain august discipline.\nlet opportunity come naturally.\naccept variance.\ngoal: avoid 2023 mistake\nytd cushion check # current ytd: +$68,600 (+18.7%)\nannual target: +15-18%\nbuffer: +0.7%\nremaining months: 4\nmath:\ncan have 2-3 flat months.\ncan have 1 small losing month.\nstill finish 15-18%.\nimplication:\nseptember doesn\u0026rsquo;t need to be significant.\n+1% to +2% = great.\nflat or small loss = acceptable.\nstrategy verification # august performance:\n+$900 on 14 trades.\n71% win rate.\navg win: $180.\navg loss: $110.\nstrategy metrics:\nwin rate maintained (71% vs normal 72%).\navg win consistent.\navg loss consistent.\nconclusion:\nstrategy working.\naugust issue was opportunity not edge.\nfilter effectiveness review # august acceptance: 39%\nvs forcing 100% acceptance:\nestimated additional 25 trades.\nestimated slippage: 3.2 ticks avg (worse conditions).\nestimated win rate: 55% (lower quality).\nback of envelope:\n25 trades × 45% loss rate × $150 avg loss = -$1,687\n25 trades × 55% win rate × $120 avg win = +$1,650\nnet if forced trades: -$37 (breakeven)\nvs actual with filters: +$900\nfilters saved: ~$940\ncircuit breaker unused but valuable # august:\nnever triggered.\nnever close.\nbut:\nknowing it\u0026rsquo;s there = confidence.\nprevents spiraling.\nenables patience.\npsychological value \u0026gt; execution value.\nposition sizing decision # account: $434,800\ncurrent size: $1,500\naccount %: 0.35%\ncould increase to:\n$1,800 (0.41%)\n$2,000 (0.46%)\ndecision: staying $1,500.\nreasons:\nytd already above target.\n4 months remaining.\npreserve discipline.\nscaling can wait until 2025.\nfinal august week plan # monday (sep 2): labor day, markets closed.\ntuesday-friday: trade if quality setups present.\nfilters: maintain 40-45% acceptance.\nexpectation: 0-2 trades total.\noutcome: flat week likely.\nseptember week 1 plan # tuesday (sep 3): first real post-summer day.\nexpectation:\nvolume returning but not fully.\nacceptance rising to 50-55%.\nrealistic: 1-2 trades.\nweek 1 total: 3-5 trades forecast.\ntonight (august 27, 2:40am) # late august consolidation.\n5 days remaining.\naugust total: +$900 to +$1,100 forecast.\nfilters saved ~$940 vs forcing trades.\nslippage trending better (2.65 recent).\nregime confidence rising (0.72).\nseptember prep:\nmaintain august discipline.\navoid 2023 over-trading.\nlet opportunity return naturally.\nytd +18.7% enables patience.\n2:40am tuesday. late august consolidation. 5 days left. august total +$900 to +$1,100 forecast. filters saved ~$940 vs forcing 100% acceptance. slippage improving 2.65 recent vs 2.8 avg. regime confidence 0.72 trending up. september prep: maintain discipline, avoid 2023 over-trading mistake, let volume return naturally. ytd +18.7% buffer enables patience.\n-AK\n","date":"27 August 2024","externalUrl":null,"permalink":"/posts/2024-08-27-late-august-consolidation-preparing-for-september/","section":"Posts","summary":"\u003cp\u003e5 days left in august.\u003c/p\u003e\n\u003cp\u003eseptember transition coming.\u003c/p\u003e\n\u003cp\u003etime to consolidate.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eaugust final week forecast \n    \u003cdiv id=\"august-final-week-forecast\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#august-final-week-forecast\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003ecurrent (aug 27):\u003c/strong\u003e $434,800\u003c/p\u003e","title":"late august consolidation - preparing for september transition","type":"posts"},{"content":"august almost done.\nseptember starts next week.\ntime to set expectations.\nwhat august taught # 1. volume drives everything\noptimal VIX meaningless without volume.\naugust: perfect VIX 16.0, terrible volume -29%.\nresult: compressed edge.\n2. filters save capital\n39% avg acceptance vs 100%.\npreserved $5k+ vs forcing trades.\n3. patience is skill\n3.5 trades/week vs normal 8.\naccepted scarcity.\nsurvived positive.\n4. slippage scales with volume\nnormal: 1.9 ticks\naugust: 2.8 ticks\n+47% execution cost.\nseptember historical patterns # volume:\npost-labor day return.\ninstitutional desks staffed.\ntypically 90-95% of july levels.\nvolatility:\nseptember avg VIX: 17-20.\nslightly elevated vs summer.\nelection years add uncertainty.\nmy performance (2023):\nseptember 2023: -$8,400 (-2.1%)\ndisaster month.\nover-traded post-summer.\nforced setups.\nlesson learned.\nseptember 2024 expectations # realistic outcomes:\nmodest gain (+1% to +2%) - likely.\nflat (+0% to +1%) - possible.\nsmall loss (-1% to -2%) - acceptable.\nNOT expecting:\nstrong month (+3%+).\nwhy:\nytd already +18.7% above target.\nno pressure to perform.\nbetter to maintain discipline.\nvolume forecast # week 1 (sep 2 - labor day):\nholiday monday.\nshort week.\nvolume: 80-85% normal.\nweek 2-4:\nfull return expected.\nvolume: 90-95% normal.\nvs august:\naugust avg: -29% vs july.\nseptember est: -5% to -10% vs july.\nmassive improvement.\nslippage forecast # if volume returns to 90-95% normal:\nslippage should drop to 2.0-2.2 ticks.\nvs august 2.8 ticks.\nvs july 2.3 ticks.\nexecution costs improving.\nfilter adaptation # august avg acceptance: 39%\nseptember forecast: 55-65%\nwhy:\nvolume improving.\nregime confidence rising.\ncorrelation normalizing.\nmore opportunity.\ntrade frequency forecast # august: 3.5 trades/week avg\nseptember forecast: 6-8 trades/week\nmonthly total: 24-32 trades\nvs august 14 trades.\nback to normal.\nposition sizing # staying at $1,500.\nnot increasing despite:\naccount at $434,800.\ncould justify $1,800-2,000.\nreason:\n4 months remaining 2024.\nytd already above target.\npreserve discipline \u0026gt; scale up.\nmaybe january 2025.\ncircuit breaker # august: not triggered once.\nseptember: will stay vigilant.\nthreshold: -$1,500 single day OR 3 consecutive losses.\nespecially important:\npost-summer restart.\neasy to over-trade.\nstrategy adjustments # none planned.\naugust proved:\nstrategies work.\nfilters work.\nregime detection works.\nproblem was conditions not strategy.\nseptember conditions improve = strategy performs.\npsychological prep # august lessons:\npatience paid off.\ndidn\u0026rsquo;t force trades.\nsurvived positive.\nseptember mindset:\ndon\u0026rsquo;t over-trade post-summer.\nmaintain august discipline.\naccept normal variance.\navoid:\nmaking up for \u0026ldquo;lost\u0026rdquo; august opportunity.\nchasing notable month.\nabandoning filters.\nytd context # current: +$68,600 (+18.7%)\ntarget: +15-18%\nbuffer: +0.7% above target\nremaining months: 4 (sep, oct, nov, dec)\nimplication:\ncan have 2 flat months.\ncan have 1 small losing month.\ncan have 1 modest month.\nstill finish 15-18%.\nzero pressure.\nseptember targets # conservative: +$2,000 (+0.5%)\nrealistic: +$4,000 to +$8,000 (+1% to +2%)\nstretch: +$10,000 (+2.5%)\nunacceptable: -$8,000+ (-2%+)\ncircuit breaker prevents unacceptable.\ncomparing to 2023 september # 2023:\n-$8,400 loss.\nover-traded.\nforced setups.\nrevenge traded post-summer.\n2024 plan:\nmaintain august discipline.\nlet volume return naturally.\naccept normal variance.\ndifference: patience.\nrisks to watch # election volatility:\nnovember election.\nseptember-october could be choppy.\nmarket structure:\ncorrelation could spike.\npersonal:\ndon\u0026rsquo;t let relationship thoughts distract trading.\nA. and i stable, but marriage thoughts persistent.\ntonight (august 24, 3:05am) # september preview.\naugust taught: volume drives everything.\nseptember forecast:\nvolume returning (90-95% normal).\nslippage improving (2.0-2.2 ticks).\nacceptance rising (55-65%).\nopportunity increasing (6-8 trades/week).\nrealistic target: +1% to +2%.\navoiding 2023 mistake: over-trading post-summer.\nytd buffer: +0.7% above target, zero pressure.\nmindset: maintain august discipline.\n3:05am saturday. september preview. august lessons: volume drives everything, filters saved capital, patience is skill. september forecast: volume returning to 90-95% normal, slippage 2.0-2.2 ticks, acceptance 55-65%, 6-8 trades/week. realistic target +1% to +2%. avoiding 2023 over-trading mistake. ytd +18.7% gives zero pressure. maintain august discipline.\n-AK\n","date":"24 August 2024","externalUrl":null,"permalink":"/posts/2024-08-24-looking-ahead-september-expectations/","section":"Posts","summary":"\u003cp\u003eaugust almost done.\u003c/p\u003e\n\u003cp\u003eseptember starts next week.\u003c/p\u003e\n\u003cp\u003etime to set expectations.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ewhat august taught \n    \u003cdiv id=\"what-august-taught\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#what-august-taught\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e1. volume drives everything\u003c/strong\u003e\u003c/p\u003e","title":"looking ahead - september expectations, post-summer reset","type":"posts"},{"content":"","date":"24 August 2024","externalUrl":null,"permalink":"/categories/trading-strategy/","section":"Categories","summary":"","title":"Trading Strategy","type":"categories"},{"content":"week 4 august done.\nbest week of month.\nvolume stabilizing.\nweek 4 numbers # starting (aug 19): $434,380\nending (aug 22): $434,800\nweek gain: +$420 (+0.11%)\ntrades: 2\nwins: 2\nlosses: 0\nwin rate: 100%\nwhat improved # volume trend:\nweek 1: -32% vs july\nweek 2: -30% vs july\nweek 3: -28% vs july\nweek 4: -25% vs july\nslowly returning.\nslippage improvement:\nweek 4 avg: 2.6 ticks\nvs week 1-2 avg: 2.95 ticks\nexecution getting better.\naugust total so far # week 1: +$380\nweek 2: -$140\nweek 3: +$240\nweek 4: +$420\naugust total: +$900 (+0.21%)\n4 weeks, 14 trades.\nwhy only 2 trades # monday: pass (volume improving but not there yet).\ntuesday: +$240 (1 win, clean execution 2.5 ticks).\nwednesday: pass (correlation spike to 0.72).\nthursday: pass (regime confidence dipped 0.64).\nfriday: +$180 (1 win, execution 2.7 ticks).\nfilters still selective.\nbut acceptance improving:\nweek 1: 38%\nweek 2: 35%\nweek 3: 41%\nweek 4: 43%\ntrend right direction.\nmarket conditions # avg volume: -25% vs july (best week august)\navg VIX: 15.8 (optimal)\ncorrelation: 0.56 (acceptable, improving from 0.54)\nregime stability: 0.71 (up from 0.69)\nall metrics trending better.\nslippage detail # week 4 avg: 2.6 ticks\nbest execution: tuesday (2.5 ticks)\nworst execution: friday (2.7 ticks)\ncompare to:\naugust avg: 2.8 ticks\njuly avg: 2.3 ticks\nstill elevated but improving.\nfilter analysis # acceptance rate: 43%\nwhy improved:\nvolume stabilized.\nregime confidence rising.\ncorrelation improving.\nstill rejecting 57%.\nbut trending toward normal.\ncircuit breaker # not triggered all month.\naugust max loss: -$140 (week 2)\nthreshold: -$1,500 OR 3 consecutive losses\nfilters prevented reaching threshold.\ncomparing to expectations # mid-august forecast: +$440 more in second half.\nactual second half (weeks 3-4): +$660\nbeat estimate by $220.\nvolume improvement helped.\nseptember preview # historical pattern:\npost-labor day volume returns.\nif volume continues improving:\nacceptance rate should reach 55-65%.\nslippage should improve to 2.0-2.3 ticks.\nopportunity should increase to 6-8 trades/week.\nrealistic september outcomes:\nmodest month (+1% to +2%) - likely.\nflat month (+0% to +1%) - possible.\nback to normal conditions.\naugust lessons confirmed # 1. filters saved capital\n39% avg acceptance vs 100% = avoided disaster.\n2. volume matters most\noptimal VIX meaningless without volume.\n3. patience pays\nsurvived august positive = setup for september.\n4. slippage tracks volume\n-25% volume = +22% slippage.\ncorrelation clear.\nytd update # starting 2024: $366,200\nending august: $434,800\nytd gain: +$68,600\nytd return: +18.7%\nannual target: 15-18%\nexceeded by 0.7%.\nremaining 4 months:\ncan be flat or slightly negative.\nstill finish in target range.\nzero pressure.\ntonight (august 22, 2:50am) # week 4 august done.\n+$420 (+0.11%).\n100% win rate across 2 trades.\naugust total: +$900 (+0.21%).\n14 trades entire month = 3.5/week avg.\nslippage trending better (2.6 ticks).\nvolume improving (-25% vs july).\nfilters adapting (43% acceptance).\naugust survival confirmed.\nseptember begins next week.\nvolume should continue recovering.\n2:50am friday. week 4 august. +$420 (0.11%). 100% wr across 2 trades. august total +$900 (0.21%) across 14 trades. volume trend improving: week 1 (-32%) → week 4 (-25% vs july). slippage improving: 2.6 ticks week 4 vs 2.95 ticks weeks 1-2. acceptance rising: 43% week 4 vs 38% week 1. ytd +18.7% above target. september preview: volume returning.\n-AK\n","date":"22 August 2024","externalUrl":null,"permalink":"/posts/2024-08-22-week-4-august-improvement-volume-stabilizing/","section":"Posts","summary":"\u003cp\u003eweek 4 august done.\u003c/p\u003e\n\u003cp\u003ebest week of month.\u003c/p\u003e\n\u003cp\u003evolume stabilizing.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 4 numbers \n    \u003cdiv id=\"week-4-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-4-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (aug 19):\u003c/strong\u003e $434,380\u003c/p\u003e","title":"week 4 august - improvement, volume stabilizing","type":"posts"},{"content":"week 3 august done.\nsummer grind continues.\nvolume still garbage.\nweek 3 numbers # starting (aug 19): $434,540\nending (aug 19): $434,780\nweek gain: +$240 (+0.06%)\ntrades: 4\nwins: 3\nlosses: 1\nwin rate: 75%\naugust progression so far # week 1: +$380 (0.09%), 5 trades\nweek 2: -$140 (-0.03%), 3 trades\nweek 3: +$240 (0.06%), 4 trades\naugust total: +$480 (0.11%)\n12 trades total across 3 weeks.\navg 4 trades/week.\ncompare to july avg: 7.8 trades/week.\nvolume drought real.\nslippage tracking # week 3 avg: 2.7 ticks\naugust avg so far: 2.8 ticks\njuly avg: 2.3 ticks\njune avg: 1.9 ticks\nsummer degradation continues.\nbut:\nweek 3 slightly better than weeks 1-2 (2.9 ticks avg).\nsmall improvement as volume stabilized.\nfilter stats week 3 # acceptance rate: 41%\nup from:\nweek 1: 38%\nweek 2: 35%\ntrend:\nvolume still low but stabilizing.\nfilters adapting.\nstill rejecting 59% of signals.\ncapital preservation mode.\nmarket conditions # avg volume: -28% vs july\nimprovement from week 1: -32%\nstill terrible but less terrible.\navg VIX: 16.2 (optimal range)\ncorrelation: 0.55 (weak but improving from 0.52)\nregime stability: 0.70 (up from 0.68)\nmarket slowly waking up.\nnot there yet.\ncomparing to forecast # early august projection:\nflat month (+$0 to +$500) likely.\ncurrent pace:\n3 weeks done: +$480\n1 week remaining: if similar, +$160-$400\nprojected august total: +$640 to +$880\nwithin forecast range.\nytd check # starting 2024: $366,200\ncurrent: $434,780\nytd gain: +$68,580\nytd return: +18.7%\nannual target: 15-18%\nexceeded by 0.7%.\nrest of year can be flat/slightly negative.\nstill finish in target range.\nzero pressure.\nwhat\u0026rsquo;s working # discipline: not forcing trades when volume sucks.\nfilters: adapting to conditions (rejection rate tracking volume).\nposition sizing: consistent $1,500 all trades.\nslippage management: chicago colo preventing 3.5+ tick nightmare.\nwhat remains challenging # opportunity scarcity: 4 trades/week vs normal 8.\nexecution costs: slippage eating 25-30% of gross gains.\npatience: watching most signals get filtered out.\naugust reality.\nweek 4 preview # last week of august.\nhistorical pattern:\nlate august volume picks up slightly (people return from vacation).\nrealistic expectations:\nmodest week (+$200 to +$600) - likely.\nflat week (+$0 to +$200) - possible.\nfilters probably: 40-45% acceptance.\nslippage probably: 2.5-2.8 ticks.\naugust month-end projection # current: +$480 (0.11%)\nweek 4 estimate: +$200 to +$600\nprojected august total: +$680 to +$1,080\nprojected august return: +0.16% to +0.25%\nwithin summer slowest month expectations.\nlessons so far # 1. august lives up to reputation\nslowest month confirmed.\nvolume -28% avg vs july.\n2. filters prevent losses\n38-41% acceptance preserving capital.\nvs forcing trades = potential losses.\n3. slippage matters more in low volume\n2.8 ticks eating 25-30% gains.\nin normal volume, would be 15-20%.\n4. patience pays\nytd +18.7% allows zero pressure.\nsurviving august = success.\ntonight (august 19, 9:30pm) # week 3 august done.\n+$240 (+0.06%).\n75% win rate across 4 trades.\naugust total: +$480 (0.11%) across 12 trades.\nvolume slowly stabilizing.\nfilters still rejecting 59%.\n1 week remains.\nprojected august: +$680 to +$1,080 total.\nsummer grind continues.\nweek 4 begins tomorrow.\n9:30pm monday. week 3 august. +$240 (0.06%). 75% wr across 4 trades. august total +$480 (0.11%) across 12 trades in 3 weeks. avg slippage 2.8 ticks vs july 2.3. volume -28% vs july but stabilizing. filters accepting 41% week 3 (up from 35% week 2). 1 week remaining. projected august total +$680 to +$1,080. ytd +18.7% above target.\n-AK\n","date":"19 August 2024","externalUrl":null,"permalink":"/posts/2024-08-19-week-3-august-grinding-through-summer-lull/","section":"Posts","summary":"\u003cp\u003eweek 3 august done.\u003c/p\u003e\n\u003cp\u003esummer grind continues.\u003c/p\u003e\n\u003cp\u003evolume still garbage.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 3 numbers \n    \u003cdiv id=\"week-3-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-3-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (aug 19):\u003c/strong\u003e $434,540\u003c/p\u003e","title":"week 3 august - grinding through summer lull, modest persistence","type":"posts"},{"content":"saturday afternoon.\nA. out with friends.\nme alone thinking.\nthe thought experiment # question:\nwhat if A. and i break up?\nnot because we\u0026rsquo;re having problems.\njust: what would that feel like now?\ncomparing to previous breakups # M. (4 months, 2022):\nthought: \u0026ldquo;finally, getting boring anyway.\u0026rdquo;\nfelt: relief.\ntimeline: already planning next girl before breakup.\nK. (6 weeks, 2022):\nthought: \u0026ldquo;yeah this wasn\u0026rsquo;t going anywhere.\u0026rdquo;\nfelt: nothing.\ntimeline: had Tinder open same day.\nS. (3 months, 2023):\nthought: \u0026ldquo;should\u0026rsquo;ve ended this 2 weeks ago.\u0026rdquo;\nfelt: mild annoyance it took so long.\ntimeline: lined up replacement before ending it.\nimagining breaking up with A. # try to picture it:\nher saying \u0026ldquo;we should break up.\u0026rdquo;\nor me saying it.\nwhat would i feel?\ncan\u0026rsquo;t actually picture it.\nforced the thought anyway:\nimagine she\u0026rsquo;s gone.\napartment empty.\nher desk corner empty.\nno more breakfast together.\nno more sex.\nno more her.\nfeeling:\nfucking terrible.\nlike losing something irreplaceable.\ndifferent from every other breakup.\nwhat this means # previous relationships:\nexit strategy from day 1.\nplanned replacement before ending.\nfelt relief when done.\nA.:\nno exit strategy.\ncan\u0026rsquo;t imagine replacement.\ndread thinking about ending.\nconclusion:\nthis is different.\nshe\u0026rsquo;s not replaceable.\ntherapy session (august 14) # told dr. r about thought experiment.\ndr. r: \u0026ldquo;you imagined breaking up with her?\u0026rdquo;\nme: \u0026ldquo;yeah. wanted to see how it felt.\u0026rdquo;\ndr. r: \u0026ldquo;and?\u0026rdquo;\nme: \u0026ldquo;felt terrible. couldn\u0026rsquo;t actually picture it happening.\u0026rdquo;\ndr. r: \u0026ldquo;that\u0026rsquo;s significant.\u0026rdquo;\nme: \u0026ldquo;previous girls, i\u0026rsquo;d feel relief imagining breakup. with A., feels like losing something important.\u0026rdquo;\ndr. r: \u0026ldquo;because she is important.\u0026rdquo;\nme: \u0026ldquo;yeah.\u0026rdquo;\ndr. r: \u0026ldquo;this is secure attachment. you\u0026rsquo;re not planning exits anymore.\u0026rdquo;\nme: \u0026ldquo;marriage thought is still there too. occurred 3 more times since we last talked.\u0026rdquo;\ndr. r: \u0026ldquo;11 times total since your birthday?\u0026rdquo;\nme: \u0026ldquo;yeah. july 4, then 10 more times.\u0026rdquo;\ndr. r: \u0026ldquo;that\u0026rsquo;s not random.\u0026rdquo;\nme: \u0026ldquo;i know.\u0026rdquo;\ndr. r: \u0026ldquo;what\u0026rsquo;s stopping you from bringing it up to her?\u0026rdquo;\nme: \u0026ldquo;fear of being wrong. what if i\u0026rsquo;m just caught up in new relationship stuff?\u0026rdquo;\ndr. r: \u0026ldquo;you\u0026rsquo;ve been together 14 months. living together 9 months. that\u0026rsquo;s not \u0026rsquo;new relationship stuff.'\u0026rdquo;\nme: \u0026ldquo;but what if—\u0026rdquo;\ndr. r: \u0026ldquo;what if you\u0026rsquo;re right? what if she\u0026rsquo;s thinking the same thing?\u0026rdquo;\ndidn\u0026rsquo;t have answer.\nwhat i\u0026rsquo;m actually afraid of # not afraid of commitment.\nnot afraid of marriage itself.\nafraid of:\nbeing wrong about her.\nasking and her saying no.\nruining what we have.\ndr. r\u0026rsquo;s response:\n\u0026ldquo;you\u0026rsquo;re afraid of vulnerability. same pattern as always. but A. has earned that vulnerability.\u0026rdquo;\nshe\u0026rsquo;s right.\nsigns i\u0026rsquo;m thinking long-term # 1. no exit strategy\nfirst relationship ever without one.\n2. thinking years not weeks\nprevious max: 4 months with M.\nwith A.: thinking decades.\n3. dread at thought of losing her\nprevious: relief at breakups.\nwith A.: dread.\n4. marriage thought persistent\n11 times in 6 weeks.\nnot going away.\n5. imagining future together\napartment together.\nher business growing.\nmy trading stable.\nmaybe kids eventually (never thought that before).\nwhat\u0026rsquo;s different about A. # she doesn\u0026rsquo;t chase:\ngives space when needed.\ndoesn\u0026rsquo;t require constant validation.\ncomfortable with silence.\nshe understands my work:\nknows trading stress.\nrespects focus time.\ndoesn\u0026rsquo;t interrupt unnecessarily.\nshe holds me when grief hits:\ndoesn\u0026rsquo;t try to fix it.\njust there.\nfirst person since parents died who does this right.\nshe challenges me:\ncalls out my shit.\ndoesn\u0026rsquo;t just agree.\nmakes me better.\nbest sex i\u0026rsquo;ve ever had:\ncomplete honesty.\nzero shame.\nperfect trust.\ntonight\u0026rsquo;s realization # thought experiment result:\ncan\u0026rsquo;t imagine life without her.\nprevious relationships: easily imagined.\nA.: can\u0026rsquo;t picture it.\nwhat this means:\nshe\u0026rsquo;s not just current girlfriend.\nshe\u0026rsquo;s the person.\nmarriage thought makes sense.\nquestion is timing.\nnot IF.\nWHEN.\nwhat i\u0026rsquo;m not doing (yet) # not buying ring.\nnot planning proposal.\nnot bringing it up to her.\nbut:\naccepting that thought is real.\nnot just temporary.\nshe\u0026rsquo;s the person.\ntonight (august 17, 2:15pm) # saturday afternoon.\nA. out.\nme thinking.\nthought experiment: what if we break up?\nresult: can\u0026rsquo;t picture it, feels terrible.\nprevious relationships: relief imagining breakup.\nA.: dread imagining it.\nmarriage thought: 11 times since birthday.\ntherapy: dr. r says \u0026ldquo;what if you\u0026rsquo;re right?\u0026rdquo;\nconclusion: she\u0026rsquo;s the person.\nquestion: WHEN not IF.\nno plan yet.\nbut accepting it\u0026rsquo;s real.\n2:15pm saturday. relationship thought experiment. imagined breaking up with A. - couldn\u0026rsquo;t picture it, felt terrible. previous relationships: relief at breakups. A.: dread. marriage thought 11 times since july 4 birthday. therapy: dr. r asked \u0026ldquo;what if you\u0026rsquo;re right?\u0026rdquo; about marriage. afraid of vulnerability not commitment. she\u0026rsquo;s the person. question is WHEN not IF. no ring yet. but accepting it\u0026rsquo;s real.\n-AK\n","date":"17 August 2024","externalUrl":null,"permalink":"/posts/2024-08-17-relationship-thought-experiment-what-if-we-break-up/","section":"Posts","summary":"\u003cp\u003esaturday afternoon.\u003c/p\u003e\n\u003cp\u003eA. out with friends.\u003c/p\u003e\n\u003cp\u003eme alone thinking.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe thought experiment \n    \u003cdiv id=\"the-thought-experiment\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-thought-experiment\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003equestion:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003ewhat if A. and i break up?\u003c/p\u003e","title":"relationship thought experiment - what if we break up","type":"posts"},{"content":"","date":"14 August 2024","externalUrl":null,"permalink":"/tags/filtering/","section":"Tags","summary":"","title":"Filtering","type":"tags"},{"content":"august forcing me to rely on filters.\nfigured worth explaining how regime detection works. learned a lot from options selling regime discussions on NexusFi about adapting to conditions.\nthe problem # strategies don\u0026rsquo;t work in all conditions.\nmean reversion thrives in range-bound markets.\nmomentum needs trending markets.\ntrading everything = losses.\nsolution:\ndetect market regime.\nfilter trades based on regime confidence.\nregime detection framework # inputs:\nVIX (volatility regime)\ncorrelation (market cohesion)\nvolume (participation)\noutput:\nregime confidence score 0-1.\ntrade acceptance threshold.\nthe code # import numpy as np import pandas as pd from typing import Tuple, Dict from dataclasses import dataclass from datetime import datetime, timedelta @dataclass class RegimeState: \u0026#34;\u0026#34;\u0026#34;Market regime state representation\u0026#34;\u0026#34;\u0026#34; vix: float correlation: float volume_pct: float confidence: float regime_type: str timestamp: datetime class RegimeDetector: \u0026#34;\u0026#34;\u0026#34; Detects market regimes and calculates trade acceptance thresholds. Strategy thrives in: - VIX 14-19 (optimal volatility) - Correlation 0.4-0.7 (diversification exists) - Volume \u0026gt;80% of 20-day avg (liquidity present) \u0026#34;\u0026#34;\u0026#34; def __init__( self, vix_optimal_range: Tuple[float, float] = (14.0, 19.0), vix_acceptable_range: Tuple[float, float] = (12.0, 25.0), corr_optimal_range: Tuple[float, float] = (0.4, 0.7), corr_acceptable_range: Tuple[float, float] = (0.3, 0.8), volume_threshold: float = 0.80, lookback_days: int = 20 ): self.vix_optimal = vix_optimal_range self.vix_acceptable = vix_acceptable_range self.corr_optimal = corr_optimal_range self.corr_acceptable = corr_acceptable_range self.volume_threshold = volume_threshold self.lookback_days = lookback_days # Historical regime states self.regime_history: list[RegimeState] = [] def calculate_vix_score(self, vix: float) -\u0026gt; float: \u0026#34;\u0026#34;\u0026#34; Calculate VIX component score. Returns: 1.0 if in optimal range 0.5-1.0 if in acceptable range 0.0-0.5 if outside acceptable range \u0026#34;\u0026#34;\u0026#34; if self.vix_optimal[0] \u0026lt;= vix \u0026lt;= self.vix_optimal[1]: return 1.0 if self.vix_acceptable[0] \u0026lt;= vix \u0026lt;= self.vix_acceptable[1]: # Linear interpolation in acceptable range if vix \u0026lt; self.vix_optimal[0]: dist = self.vix_optimal[0] - vix max_dist = self.vix_optimal[0] - self.vix_acceptable[0] else: dist = vix - self.vix_optimal[1] max_dist = self.vix_acceptable[1] - self.vix_optimal[1] return 0.5 + (0.5 * (1 - dist / max_dist)) # Outside acceptable range - severe penalty if vix \u0026lt; self.vix_acceptable[0]: # Too low VIX dist = self.vix_acceptable[0] - vix return max(0.0, 0.5 - (dist / 10)) else: # Too high VIX dist = vix - self.vix_acceptable[1] return max(0.0, 0.5 - (dist / 10)) def calculate_correlation_score(self, correlation: float) -\u0026gt; float: \u0026#34;\u0026#34;\u0026#34; Calculate correlation component score. Returns: 1.0 if in optimal range 0.5-1.0 if in acceptable range 0.0-0.5 if outside acceptable range \u0026#34;\u0026#34;\u0026#34; if self.corr_optimal[0] \u0026lt;= correlation \u0026lt;= self.corr_optimal[1]: return 1.0 if self.corr_acceptable[0] \u0026lt;= correlation \u0026lt;= self.corr_acceptable[1]: if correlation \u0026lt; self.corr_optimal[0]: dist = self.corr_optimal[0] - correlation max_dist = self.corr_optimal[0] - self.corr_acceptable[0] else: dist = correlation - self.corr_optimal[1] max_dist = self.corr_acceptable[1] - self.corr_optimal[1] return 0.5 + (0.5 * (1 - dist / max_dist)) # Outside acceptable range if correlation \u0026lt; self.corr_acceptable[0]: # Too low correlation (no diversification) return max(0.0, 0.5 - (self.corr_acceptable[0] - correlation)) else: # Too high correlation (no edge) return max(0.0, 0.5 - (correlation - self.corr_acceptable[1])) def calculate_volume_score( self, current_volume: float, historical_volumes: np.ndarray ) -\u0026gt; float: \u0026#34;\u0026#34;\u0026#34; Calculate volume component score. Args: current_volume: Today\u0026#39;s volume historical_volumes: Last N days volumes Returns: 0.0-1.0 score based on volume relative to average \u0026#34;\u0026#34;\u0026#34; avg_volume = np.mean(historical_volumes) volume_ratio = current_volume / avg_volume if volume_ratio \u0026gt;= 1.0: # Above average volume = good return 1.0 elif volume_ratio \u0026gt;= self.volume_threshold: # Acceptable volume range dist = 1.0 - volume_ratio max_dist = 1.0 - self.volume_threshold return 0.5 + (0.5 * (1 - dist / max_dist)) else: # Below threshold - severe penalty return max(0.0, volume_ratio / self.volume_threshold * 0.5) def detect_regime( self, vix: float, correlation: float, volume: float, historical_volumes: np.ndarray, timestamp: datetime = None ) -\u0026gt; RegimeState: \u0026#34;\u0026#34;\u0026#34; Detect current market regime and calculate confidence. Args: vix: Current VIX level correlation: Current market correlation volume: Current trading volume historical_volumes: Historical volume data timestamp: Current timestamp Returns: RegimeState with confidence and regime type \u0026#34;\u0026#34;\u0026#34; # Calculate component scores vix_score = self.calculate_vix_score(vix) corr_score = self.calculate_correlation_score(correlation) vol_score = self.calculate_volume_score(volume, historical_volumes) # Weighted average (VIX and volume matter more) confidence = ( 0.4 * vix_score + 0.3 * vol_score + 0.3 * corr_score ) # Determine regime type if confidence \u0026gt;= 0.75: regime_type = \u0026#34;optimal\u0026#34; elif confidence \u0026gt;= 0.60: regime_type = \u0026#34;acceptable\u0026#34; elif confidence \u0026gt;= 0.40: regime_type = \u0026#34;challenging\u0026#34; else: regime_type = \u0026#34;hostile\u0026#34; # Create regime state state = RegimeState( vix=vix, correlation=correlation, volume_pct=volume / np.mean(historical_volumes), confidence=confidence, regime_type=regime_type, timestamp=timestamp or datetime.now() ) # Store in history self.regime_history.append(state) return state def calculate_acceptance_threshold(self, regime_confidence: float) -\u0026gt; float: \u0026#34;\u0026#34;\u0026#34; Calculate trade acceptance threshold based on regime confidence. Higher confidence = lower threshold (accept more trades) Lower confidence = higher threshold (accept fewer trades) Args: regime_confidence: 0-1 regime confidence score Returns: Acceptance threshold for trade quality score \u0026#34;\u0026#34;\u0026#34; # Inverse relationship: low confidence = high threshold # Optimal regime (0.8+ confidence) = 0.5 threshold (accept 50%+) # Hostile regime (0.3 confidence) = 0.8 threshold (accept 20%) if regime_confidence \u0026gt;= 0.75: # Optimal conditions - accept more trades return 0.50 elif regime_confidence \u0026gt;= 0.60: # Acceptable conditions - normal acceptance return 0.60 elif regime_confidence \u0026gt;= 0.40: # Challenging conditions - selective return 0.70 else: # Hostile conditions - extremely selective return 0.80 def should_accept_trade( self, trade_quality_score: float, regime_state: RegimeState ) -\u0026gt; Tuple[bool, str]: \u0026#34;\u0026#34;\u0026#34; Determine if trade should be accepted based on regime and quality. Args: trade_quality_score: 0-1 quality score for this trade regime_state: Current regime state Returns: (accept: bool, reason: str) \u0026#34;\u0026#34;\u0026#34; threshold = self.calculate_acceptance_threshold(regime_state.confidence) if trade_quality_score \u0026gt;= threshold: return ( True, f\u0026#34;ACCEPT: quality {trade_quality_score:.2f} \u0026gt;= threshold {threshold:.2f} \u0026#34; f\u0026#34;(regime: {regime_state.regime_type}, confidence: {regime_state.confidence:.2f})\u0026#34; ) else: return ( False, f\u0026#34;REJECT: quality {trade_quality_score:.2f} \u0026lt; threshold {threshold:.2f} \u0026#34; f\u0026#34;(regime: {regime_state.regime_type}, confidence: {regime_state.confidence:.2f})\u0026#34; ) def get_regime_summary(self, lookback_days: int = 7) -\u0026gt; Dict: \u0026#34;\u0026#34;\u0026#34; Get summary statistics for recent regime history. Args: lookback_days: Number of days to summarize Returns: Dictionary with regime statistics \u0026#34;\u0026#34;\u0026#34; if not self.regime_history: return {} cutoff = datetime.now() - timedelta(days=lookback_days) recent = [s for s in self.regime_history if s.timestamp \u0026gt;= cutoff] if not recent: return {} return { \u0026#39;avg_confidence\u0026#39;: np.mean([s.confidence for s in recent]), \u0026#39;avg_vix\u0026#39;: np.mean([s.vix for s in recent]), \u0026#39;avg_correlation\u0026#39;: np.mean([s.correlation for s in recent]), \u0026#39;avg_volume_pct\u0026#39;: np.mean([s.volume_pct for s in recent]), \u0026#39;regime_distribution\u0026#39;: { regime: sum(1 for s in recent if s.regime_type == regime) / len(recent) for regime in [\u0026#39;optimal\u0026#39;, \u0026#39;acceptable\u0026#39;, \u0026#39;challenging\u0026#39;, \u0026#39;hostile\u0026#39;] }, \u0026#39;days_analyzed\u0026#39;: len(recent) } # Example usage if __name__ == \u0026#34;__main__\u0026#34;: detector = RegimeDetector() # August 2024 conditions august_vix = 16.0 august_corr = 0.54 august_volume = 850000 # 30% below normal historical_vol = np.array([1200000] * 20) # Normal volume # Detect regime state = detector.detect_regime( vix=august_vix, correlation=august_corr, volume=august_volume, historical_volumes=historical_vol ) print(f\u0026#34;Regime Type: {state.regime_type}\u0026#34;) print(f\u0026#34;Confidence: {state.confidence:.2f}\u0026#34;) print(f\u0026#34;VIX: {state.vix}\u0026#34;) print(f\u0026#34;Correlation: {state.correlation}\u0026#34;) print(f\u0026#34;Volume %: {state.volume_pct:.1%}\u0026#34;) # Calculate acceptance threshold threshold = detector.calculate_acceptance_threshold(state.confidence) print(f\u0026#34;\\nAcceptance Threshold: {threshold:.2f}\u0026#34;) # Test trade acceptance trade_score = 0.65 accept, reason = detector.should_accept_trade(trade_score, state) print(f\u0026#34;\\nTrade Decision: {reason}\u0026#34;) how it works in august # current conditions:\nVIX: 16.0 (optimal)\ncorrelation: 0.54 (acceptable)\nvolume: -29% vs avg (terrible)\ncomponent scores:\nVIX score: 1.0 (perfect)\ncorrelation score: 0.7 (acceptable)\nvolume score: 0.36 (terrible)\nregime confidence:\n(0.4 × 1.0) + (0.3 × 0.36) + (0.3 × 0.7) = 0.718\nregime type: acceptable (borderline challenging)\nacceptance threshold: 0.60\nresult:\nonly trades scoring 0.60+ quality accepted.\nvs normal 0.50 threshold.\n39% acceptance rate.\nwhy this matters # without regime detection:\naugust: trade all signals.\nvolume sucks → slippage kills edge.\nresult: -5% month easily.\nwith regime detection:\naugust: filter 61% of signals.\nonly best setups.\nresult: +0.21% month (survival).\ndifference:\n-5% vs +0.21% = 5.21% preserved.\non $434k account = $22,600 saved.\nfilters work.\nadjustments over time # april 2024:\noptimal regime (confidence 0.82).\nacceptance threshold 0.50.\n53 trades, 74% win rate.\naugust 2024:\nchallenging regime (confidence 0.69).\nacceptance threshold 0.60-0.70.\n14 trades, 71% win rate.\nfewer trades but similar win rate.\nquality over quantity.\ntonight (august 14, 5:30am) # regime detection framework explained.\naugust forcing reliance on filters.\ncomponent scores:\nVIX: 1.0 (optimal)\nvolume: 0.36 (terrible)\ncorrelation: 0.7 (acceptable)\nregime confidence: 0.69-0.72 (challenging).\nacceptance threshold: 0.60-0.70.\nrejection rate: 60%+.\npreserving capital vs forcing trades.\nsurvival mode working.\n5:30am wednesday. regime detection framework. august conditions: VIX 16.0 (optimal), correlation 0.54 (acceptable), volume -29% (terrible). regime confidence 0.69 (challenging). acceptance threshold 0.60 = 39% acceptance rate. filters preserving capital. without filtering: -5% month easily. with filtering: +0.21% survival. $22k+ saved.\n-AK\n","date":"14 August 2024","externalUrl":null,"permalink":"/posts/2024-08-14-regime-detection-filtering-framework/","section":"Posts","summary":"\u003cp\u003eaugust forcing me to rely on filters.\u003c/p\u003e\n\u003cp\u003efigured worth explaining how regime detection works. learned a lot from \u003ca\n  href=\"https://nexusfi.com/showthread.php?t=36932\"\n    target=\"_blank\"\n  \u003eoptions selling regime discussions on NexusFi\u003c/a\u003e about adapting to conditions.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe problem \n    \u003cdiv id=\"the-problem\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-problem\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estrategies don\u0026rsquo;t work in all conditions.\u003c/strong\u003e\u003c/p\u003e","title":"regime detection filtering framework - how i adapt to market conditions","type":"posts"},{"content":"","date":"14 August 2024","externalUrl":null,"permalink":"/tags/technical/","section":"Tags","summary":"","title":"Technical","type":"tags"},{"content":"mid-august.\nhalfway through slowest month.\npatience tested.\naugust so far (12 days) # starting (aug 1): $433,900\ncurrent (aug 12): $434,340\naugust gain: +$440 (+0.10%)\ntrades: 9\nwins: 6\nlosses: 3\nwin rate: 67%\nweekly breakdown # week 1: +$380, 60% wr, 5 trades\nweek 2: -$140, 33% wr, 3 trades\nweek 3 (partial): +$200, 100% wr, 1 trade\npattern:\nwin, lose, win.\nnormal variance.\nwhat\u0026rsquo;s challenging # opportunity scarcity:\n9 trades in 12 days.\navg 0.75 trades/day.\nvs normal 1.6 trades/day.\npatience required:\nwatching most days pass with zero trades.\nfilters rejecting 60%+.\ncan\u0026rsquo;t force it.\nslippage persistent:\navg 2.85 ticks.\nvs july 2.3 ticks.\nvs june 1.9 ticks.\nexecution costs eating edge.\nwhat\u0026rsquo;s working # discipline:\nnot forcing trades in bad conditions.\naccepting days with zero opportunity.\nfilters:\nadapting to volume drought.\nprotecting capital vs chasing.\nposition sizing:\nconsistent $1,500 all trades.\nno panic adjustments.\ncomparing to forecast # early august estimate: flat to small gain (+$0 to +$1,500).\nmid-august actual: +$440 (0.10%)\non track.\nsecond half projection:\nif similar pace: +$440 more.\naugust total estimate: +$880 (0.20%)\nwithin range.\nytd check # starting 2024: $366,200\ncurrent: $434,340\nytd gain: +$68,140\nytd return: +18.6%\nannual target: 15-18%\nexceeded by 0.6%.\naugust can be flat rest of month.\nstill finish year in target range.\nzero pressure.\npsychology check # feeling:\nnot frustrated.\nnot bored.\njust patient.\nwhy:\nytd already above target.\naugust doesn\u0026rsquo;t need to be standout.\nsurvival = success.\ndifference from 2023:\nthen: forced trades when bored = losses.\nnow: accept boredom = preservation.\ngrowth.\nremaining august # 16 trading days left.\nrealistic outcomes:\nmodest gain (+$400 to +$800) - likely.\nflat (+$0 to +$400) - possible.\nsmall loss (-$200 to $0) - acceptable.\nall within plan.\nwhat i\u0026rsquo;m watching # volume trends:\nlate august historically picks up.\npeople return from vacation.\nif volume improves:\nacceptance rate should rise.\nslippage should improve.\nopportunity should increase.\nif volume stays dead:\ncontinue preservation mode.\neither way = acceptable.\nlessons so far # 1. august lives up to reputation\nslowest month confirmed.\ncan\u0026rsquo;t fight it.\n2. patience is skill\nnot trading \u0026gt; forcing trades.\n3. ytd cushion enables discipline\n+18.6% ytd removes pressure.\ncan afford to wait.\n4. filters prevent disasters\n60%+ rejection = capital preservation.\ntonight (august 12, 3:20am) # mid-august.\n+$440 (+0.10%).\n67% win rate across 9 trades.\n16 days remaining.\nvolume still terrible.\nslippage still elevated.\nfilters still protecting.\npatience holding.\ndiscipline maintained.\nsurvival on track.\n3:20am monday. mid-august check. +$440 (0.10%). 67% wr across 9 trades in 12 days. avg 0.75 trades/day vs normal 1.6. slippage 2.85 ticks vs july 2.3. filters rejecting 60%+. ytd +18.6% above target. second half estimate +$440 more = ~$880 august total. patience tested, discipline holding.\n-AK\n","date":"12 August 2024","externalUrl":null,"permalink":"/posts/2024-08-12-mid-august-check-patience-tested/","section":"Posts","summary":"\u003cp\u003emid-august.\u003c/p\u003e\n\u003cp\u003ehalfway through slowest month.\u003c/p\u003e\n\u003cp\u003epatience tested.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eaugust so far (12 days) \n    \u003cdiv id=\"august-so-far-12-days\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#august-so-far-12-days\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (aug 1):\u003c/strong\u003e $433,900\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ecurrent (aug 12):\u003c/strong\u003e $434,340\u003c/p\u003e","title":"mid-august check - patience tested, discipline holding","type":"posts"},{"content":"","date":"12 August 2024","externalUrl":null,"permalink":"/tags/psychology/","section":"Tags","summary":"","title":"Psychology","type":"tags"},{"content":"9 months living with A.\nnovember 1 to august 10.\nroutine completely locked.\ndaily pattern (weekdays) # 10am: wake up together.\n10:15am: breakfast (she cooks most days, i clean).\n11am-7pm: both working (separate desks, minimal interruption).\n7pm: dinner together (she cooks, i clean).\n8pm-11pm: couch time (her coding, me reading or server maintenance).\n11pm-2am: my main trading review time.\nvaries: sex (she initiates ~4x/week, always surprising timing).\nmidnight-1am: sleep.\nworks perfectly.\nwhat changed since month 1 # month 1 (november):\nstill negotiating space.\nlots of \u0026ldquo;is this okay?\u0026rdquo;\ntesting boundaries.\nsex 2x/day (new relationship energy).\nmonth 9 (august):\nzero negotiation needed.\ncomplete comfort.\nestablished patterns.\nsex 4-5x/week (still fantastic but scheduled-ish).\ndifference:\nmonth 1 = exciting uncertainty.\nmonth 9 = comfortable certainty.\nboth good, different phases.\ncoffee mug situation (resolved) # months 1-6:\nongoing stupid argument.\nshe\u0026rsquo;d use my favorite mug.\ni\u0026rsquo;d get annoyed.\nshe\u0026rsquo;d say \u0026ldquo;it\u0026rsquo;s just a mug.\u0026rdquo;\ni\u0026rsquo;d say \u0026ldquo;it\u0026rsquo;s MY mug.\u0026rdquo;\nmonth 7 breakthrough:\nbought her identical mug in different color.\nnow we each have \u0026ldquo;our\u0026rdquo; mug.\nstupid solution to stupid problem.\nbut it worked.\nher mess vs my OCD (ongoing) # still friction:\nshe leaves clothes on floor.\ni need everything organized.\nher desk = organized chaos.\nmy desk = everything labeled.\ncurrent compromise:\nher corner = her rules.\nmy corner = my rules.\nshared spaces = my OCD wins (she agreed).\nworks 90% of time.\n10% we still argue about it.\nsex life after 9 months # places list: 22 (up from 20 july 4).\nnew additions:\naugust 3: parking garage downtown (quickie after dinner, almost got caught).\naugust 8: her office after hours (she has keys, desk sex, fucking hot).\nfrequency: 4-5x/week avg.\nquality: still incredible.\nwhy it works:\ncomplete honesty about fantasies.\nzero shame discussing limits.\nswitch dynamics (she dominates sometimes, i dominate sometimes).\ntoys, bondage, role play, public play - all discussed openly.\nbest sex either of us has had.\n9 months in, not declining.\ntherapy check-in (august 7) # dr. r: \u0026ldquo;9 months living together. how\u0026rsquo;s it feel?\u0026rdquo;\nme: \u0026ldquo;comfortable. routine locked. works perfectly.\u0026rdquo;\ndr. r: \u0026ldquo;comfortable can be code for boring. is it boring?\u0026rdquo;\nme: \u0026ldquo;nope. sex is still fantastic. we still surprise each other. just\u0026hellip; predictable in good way.\u0026rdquo;\ndr. r: \u0026ldquo;predictable in good way is secure attachment.\u0026rdquo;\nme: \u0026ldquo;you\u0026rsquo;ve said that before.\u0026rdquo;\ndr. r: \u0026ldquo;because it\u0026rsquo;s still true. you\u0026rsquo;re not running. that\u0026rsquo;s growth.\u0026rdquo;\nme: \u0026ldquo;marriage thought is still there.\u0026rdquo;\ndr. r: \u0026ldquo;still persistent?\u0026rdquo;\nme: \u0026ldquo;yeah. thought about it 4-5 times since birthday.\u0026rdquo;\ndr. r: \u0026ldquo;have you mentioned it to her?\u0026rdquo;\nme: \u0026ldquo;nope. too soon.\u0026rdquo;\ndr. r: \u0026ldquo;is it though? you\u0026rsquo;ve been together over a year total, living together 9 months.\u0026rdquo;\nme: \u0026ldquo;feels too soon. what if i\u0026rsquo;m wrong?\u0026rdquo;\ndr. r: \u0026ldquo;what if you\u0026rsquo;re right?\u0026rdquo;\ndidn\u0026rsquo;t have answer to that.\nwhat makes A. different # previous girlfriends (M., K., S., J.):\nhot.\ngreat sex.\ngot bored after 2-6 months.\nalways had exit strategy.\nA.:\nhot (blonde, fit, great body).\nbest sex ever.\n9 months in, NOT bored.\nno exit strategy.\ndifference:\nshe doesn\u0026rsquo;t chase so i don\u0026rsquo;t run.\ncomfortable with silence.\nunderstands my work.\ngives space when needed.\nholds me when grief hits.\nfirst relationship since parents died where i\u0026rsquo;m thinking YEARS not weeks.\ncomparing to expectations # june 2023 (met A.):\nexpected: 2-3 months max like always.\nseptember 2023 (exclusive):\nexpected: maybe 6 months total.\nnovember 2023 (moved in together):\nexpected: we\u0026rsquo;ll see how long this lasts.\naugust 2024 (9 months living together):\nreality: thinking about marriage.\ncompletely unexpected.\nfriday alone time rule # still enforced:\nevery friday 6pm-midnight = her time alone.\nshe goes out (friends, gym, whatever).\ni stay home (trading review, server work, alone time).\nwhy it works:\nprevents codependency.\ngives her space.\ngives me space.\n8 hours/week apart = healthy.\nwhat annoys me (honestly) # her morning routine takes 45 minutes (i\u0026rsquo;m ready in 10).\nshe talks during movies (i need silence).\nshe\u0026rsquo;s a night person, i\u0026rsquo;m a night person but earlier (conflict at 2am when she wants to talk).\nminor shit.\nnothing relationship-ending.\nwhat she probably finds annoying about me # OCD about organization.\nneed things done specific way.\nsometimes shut down emotionally (grief hits randomly).\ntrading stress bleeds into home life occasionally.\nshe hasn\u0026rsquo;t complained but i know it\u0026rsquo;s there.\nthe marriage question # thought about it:\njuly 4 (twice).\njuly 18 (once).\naugust 2 (once).\naugust 9 (twice).\n6 times total since birthday.\nnot going away.\nquestion is WHEN not IF.\nno plan yet.\nbut thinking about it seriously.\ntonight (august 10, 3:45pm) # saturday afternoon.\nA. out with friends (friday rule extended to saturday).\nme alone, writing this.\n9 months living together.\nroutine locked.\ncoffee mug issue resolved (stupid but real).\nsex life still incredible (places list: 22).\nmarriage thoughts persistent.\ncomfortable certainty replacing exciting uncertainty.\nboth good phases.\nno exit strategy.\nthinking years.\ndifferent from every relationship before.\nfirst time i\u0026rsquo;ve thought \u0026ldquo;this might be it.\u0026rdquo;\n3:45pm saturday. 9 months living with A. (nov 1 - aug 10). routine completely locked. coffee mug situation finally resolved. sex life still incredible (places list: 22, 4-5x/week). marriage thought occurred 6 times since birthday july 4. therapy: dr. r asked \u0026ldquo;what if you\u0026rsquo;re right?\u0026rdquo; about marriage. no answer. comfortable certainty phase. thinking years not weeks.\n-AK\n","date":"10 August 2024","externalUrl":null,"permalink":"/posts/2024-08-10-nine-months-living-together-routine-locked/","section":"Posts","summary":"\u003cp\u003e9 months living with A.\u003c/p\u003e\n\u003cp\u003enovember 1 to august 10.\u003c/p\u003e\n\u003cp\u003eroutine completely locked.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003edaily pattern (weekdays) \n    \u003cdiv id=\"daily-pattern-weekdays\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#daily-pattern-weekdays\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e10am:\u003c/strong\u003e wake up together.\u003c/p\u003e","title":"9 months living together - routine locked, marriage thoughts persistent","type":"posts"},{"content":"august slippage brutal.\nmade me appreciate chicago colocation. been worth every dollar.\nthe numbers # colocation cost:\n$450/month datacenter\n$80/month connectivity\ntotal: $530/month = $6,360/year\nquestion:\nworth it in summer?\nslippage comparison # august with colo:\navg slippage: 2.8 ticks\n14 trades × 2.8 ticks × $12.50 = $490 slippage cost\nestimated without colo:\navg slippage would be: 4.2 ticks (based on home testing)\n14 trades × 4.2 ticks × $12.50 = $735 slippage cost\nsavings: $245 this month\nannual analysis # normal months (volume good):\nwith colo: 1.7 ticks avg\nwithout colo: 2.8 ticks avg\n8 trades/week × 4 weeks = 32 trades/month\nmonthly savings: 32 × 1.1 ticks × $12.50 = $440\nsummer months (volume terrible):\nwith colo: 2.8 ticks avg\nwithout colo: 4.2 ticks avg\n3.5 trades/week × 4 weeks = 14 trades/month\nmonthly savings: 14 × 1.4 ticks × $12.50 = $245\nannual calculation:\n9 normal months: $440 × 9 = $3,960\n3 summer months: $245 × 3 = $735\ntotal annual savings: $4,695\ncolo cost: $6,360/year\nnet cost: -$1,665/year\nstill worth it?\nthe intangible benefits # execution quality:\ncleaner fills even in august.\nless slippage variance.\npsychological:\nknowing setup is optimal.\nremoves excuse \u0026ldquo;my connection sucks.\u0026rdquo;\nopportunity:\ncan trade strategies requiring tighter execution.\nscalping becomes viable (not doing it yet).\ncompetitive edge:\nretail traders without colo at disadvantage.\nhome setup comparison # home internet:\nUbiquiti 10Gbe to ISP\n1.2Gbps symmetrical fiber\nping to chicago: 28ms\nseems good but:\nISP routing not optimized.\nshared infrastructure.\nconsumer-grade reliability.\nchicago colo:\ndedicated server in datacenter.\n1ms to exchanges.\noptimized routing.\nenterprise reliability.\ndifference matters.\nwhen colo matters most # high volume conditions:\ntight spreads.\nfast fills.\nsmall slippage edge = big difference.\nexample april 2024:\n53 trades × 0.5 tick improvement = 26.5 ticks saved\n26.5 × $12.50 = $331 saved vs without colo\nlow volume conditions (august):\nwide spreads already.\nfills slower anyway.\ncolo helps but less dramatic.\nexample august 2024:\n14 trades × 1.4 tick improvement = 19.6 ticks saved\n19.6 × $12.50 = $245 saved\nbut:\nwithout colo, might not trade at all in august.\nslippage would kill edge completely.\ncost per trade analysis # 2024 ytd:\n190 trades through august.\ncolo cost ytd: $530 × 8 = $4,240\ncost per trade: $22.32\nslippage savings per trade:\nnormal months: 1.1 ticks × $12.50 = $13.75\nsummer months: 1.4 ticks × $12.50 = $17.50\naverage savings: ~$15/trade\nnet cost per trade: $22.32 - $15 = $7.32\nworth paying $7.32/trade for:\nbetter execution.\ncompetitive edge.\npsychological confidence.\nyes.\nalternative considered # cloud vps near exchanges:\n$200-300/month.\nshared hardware.\nless control.\nvs dedicated colo:\nmore expensive ($530/month).\ndedicated hardware.\nfull control.\ndecision:\ncolo worth premium for control + performance.\nwhat if i scaled up # current: $1,500 position size, ~8 trades/week normal.\nif scaled to $3,000 positions:\nslippage impact doubles.\ncolo savings double to ~$30/trade.\nannual savings: $9,390\nvs colo cost: $6,360\nnet benefit: +$3,030/year\nat $5,000 positions:\nannual savings: $15,650\nnet benefit: +$9,290/year\nscalability matters.\naugust reality check # august alone:\ncolo cost: $530\nslippage savings: $245\nnet cost: -$285\nbut:\nwithout colo, august slippage would be 4.2 ticks avg.\nmight not trade at all (edge completely gone).\npreservation value:\nbeing able to trade profitably in august = priceless.\ndecision: keeping colo # reasons:\nannual net cost only $1,665 (manageable)\nexecution quality matters\npsychological edge significant\nenables future scaling\naugust would be untradeable without it\n$138/month net cost after savings.\nworth it.\ninfrastructure priorities # current:\nchicago colo: $530/month ✓\nsan diego servers: owned outright ✓\nubiquiti networking: owned outright ✓\nnext upgrades (eventually):\nbackup colo location (redundancy)\nfaster development workstation\nbetter monitoring infrastructure\nbut:\ncurrent setup working.\nnot broken, don\u0026rsquo;t fix.\ntonight (august 8, 4:15am) # chicago colo cost analysis.\nannual cost: $6,360\nannual slippage savings: $4,695\nnet cost: $1,665/year ($138/month)\naugust savings: $245 (vs $735 without colo)\nworth it: yes.\nexecution quality + psychological edge + scalability \u0026gt; cost.\nwithout colo: august untradeable.\nkeeping it.\n4:15am thursday. chicago colocation cost analysis. annual cost $6,360, slippage savings $4,695 = net $1,665/year cost. august savings $245 (2.8 ticks vs 4.2 without colo). worth $138/month for execution quality + competitive edge + scalability. without colo: august slippage would kill edge completely. decision: keeping it.\n-AK\n","date":"8 August 2024","externalUrl":null,"permalink":"/posts/2024-08-08-chicago-colocation-summer-value-analysis/","section":"Posts","summary":"\u003cp\u003eaugust slippage brutal.\u003c/p\u003e\n\u003cp\u003emade me appreciate \u003ca\n  href=\"https://www.cmegroup.com/trading/colocation.html\"\n    target=\"_blank\"\n  \u003echicago colocation\u003c/a\u003e. been worth every dollar.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe numbers \n    \u003cdiv id=\"the-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003ecolocation cost:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e$450/month datacenter\u003c/p\u003e","title":"chicago colocation - summer value analysis, cost vs benefit","type":"posts"},{"content":"","date":"8 August 2024","externalUrl":null,"permalink":"/tags/cost-analysis/","section":"Tags","summary":"","title":"Cost-Analysis","type":"tags"},{"content":"","date":"6 August 2024","externalUrl":null,"permalink":"/tags/losses/","section":"Tags","summary":"","title":"Losses","type":"tags"},{"content":"week 2 august done.\nfirst losing week since may.\nvolume crash worst all year.\nweek 2 numbers # starting (aug 5): $434,280\nending (aug 6): $434,140\nweek loss: -$140 (-0.03%)\ntrades: 3\nwins: 1\nlosses: 2\nwin rate: 33%\nwhat happened # monday: pass (volume -35% vs july avg).\ntuesday: -$90 (1 loss, slippage 3.2 ticks).\nwednesday: pass (worse volume).\nthursday: +$60 (1 win, barely).\nfriday: -$110 (1 loss, slippage 3.4 ticks).\n3 trades entire week.\nvs normal 8 trades/week.\nopportunity disappeared.\nvolume analysis # week 2 avg volume: -30% vs july\nworst single day: wednesday -38% vs july\nbest single day: monday -24% vs july (still terrible)\npattern:\nmid-august vacation week.\ninstitutional desks empty.\nretail on beach.\nnobody trading.\nslippage disaster # week 2 avg: 3.0 ticks\nworst execution: friday (3.4 ticks)\nbest execution: thursday (2.5 ticks)\ncompare to:\njuly avg: 2.3 ticks\njune avg: 1.9 ticks\n+58% worse than june.\nexecution costs crushing edge.\nfilter response # acceptance rate: 35%\n65% of signals rejected.\nwhy:\nlow volume triggered quality filter.\nwide spreads triggered slippage filter.\nweak regime triggered confidence filter.\nsystem protecting capital.\ncorrectly.\nmarket conditions # avg VIX: 16.8 (optimal but meaningless)\navg correlation: 0.48 (extremely weak)\nregime stability: 0.64 (lowest all year)\nvolume: -30% vs july\nlesson:\nVIX alone doesn\u0026rsquo;t matter.\nneed volume + correlation + stability.\naugust has NONE of those.\ncircuit breaker # not triggered.\nthreshold: 3 consecutive losses OR -$1,500 single day.\nweek 2: 2 total losses, neither consecutive.\nmax loss: -$110 friday.\nfilters prevented reaching threshold.\ncomparing to may week 3 # may week 3 (last losing week):\n-$1,000 loss.\nVIX spike to 28.4.\ncircuit breaker triggered.\n4 trades.\naugust week 2:\n-$140 loss.\nVIX normal 16.8.\ncircuit breaker not triggered.\n3 trades.\ndifference:\nmay = volatile conditions = bigger loss.\naugust = dead conditions = small loss.\nfilters adapted correctly both times.\naugust so far # week 1: +$380 (0.09%)\nweek 2: -$140 (-0.03%)\naugust total: +$240 (0.06%)\n8 trades across 2 weeks = 4 trades/week avg.\nvs normal 8 trades/week.\nsummer reality.\nwhat\u0026rsquo;s working # filters: preventing disaster (35% acceptance saved capital).\nposition sizing: consistent $1,500 (no panic adjustment).\ndiscipline: not forcing trades when volume sucks.\nwhat\u0026rsquo;s not working # opportunity: 3 trades all week.\nslippage: 3.0 ticks eating edge.\nwin rate: 33% (but small sample size).\nexpected in august.\nlessons from week 2 # 1. volume matters more than VIX\noptimal VIX meaningless without volume.\n2. filters prevent disasters\n35% acceptance vs 100% = avoided certain losses.\n3. losing weeks happen\nfirst since may = normal 3-4x/year pattern.\n4. small loss better than big loss\n-$140 vs potential -$1,000+ if forced trades.\nweek 3 preview # historical pattern:\nlate august volume picks up slightly.\nrealistic expectations:\nmodest week (+$200 to +$400) - possible.\nflat week (+$0 to +$200) - likely.\nanother small loss (-$100 to -$300) - acceptable.\nfilters probably: 38-42% acceptance.\nslippage probably: 2.7-3.0 ticks.\ntonight (august 6, 2:45am) # week 2 august done.\n-$140 (-0.03%).\n33% win rate across 3 trades.\nfirst losing week since may.\nvolume -30% vs july.\nslippage 3.0 ticks crushing edge.\nfilters rejecting 65%.\nexpected in august.\nsurvival mode continues.\nweek 3 begins tomorrow.\n2:45am tuesday. week 2 august. -$140 (-0.03%). 33% wr across 3 trades. first losing week since may. volume -30% vs july avg. slippage 3.0 ticks vs july 2.3. filters rejecting 65% = capital preservation. august total +$240 (0.06%) across 8 trades. survival not growth.\n-AK\n","date":"6 August 2024","externalUrl":null,"permalink":"/posts/2024-08-06-week-2-august-first-losing-week-volume-crash/","section":"Posts","summary":"\u003cp\u003eweek 2 august done.\u003c/p\u003e\n\u003cp\u003efirst losing week since may.\u003c/p\u003e\n\u003cp\u003evolume crash worst all year.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 2 numbers \n    \u003cdiv id=\"week-2-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-2-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (aug 5):\u003c/strong\u003e $434,280\u003c/p\u003e","title":"week 2 august - first losing week, volume crash","type":"posts"},{"content":"week 1 august done.\nsummer slowest month confirmed.\nvolume brutal.\nweek 1 numbers # starting (aug 1): $433,900\nending (aug 3): $434,280\nweek gain: +$380 (+0.09%)\ntrades: 5\nwins: 3\nlosses: 2\nwin rate: 60%\nmarket conditions # avg volume: -32% vs july\navg VIX: 15.8 (optimal but irrelevant)\ncorrelation: 0.52 (low)\nregime stability: 0.68 (weak)\naugust reality:\neveryone on vacation.\nvolume disappeared.\nslippage worse than july.\nslippage nightmare # avg slippage: 2.9 ticks\njuly avg: 2.3 ticks\njune avg: 1.9 ticks\n+53% worse than june.\nlow volume = wide spreads.\nexecution costs eating edge.\nchicago colo helping but not enough to overcome liquidity drought.\nfilter response # acceptance rate: 38%\n62% of signals rejected.\nwhy:\nlow volume triggers quality filter.\nwide spreads trigger slippage filter.\nweak correlation triggers regime filter.\nsystem adapting correctly.\nprotecting capital vs forcing trades.\ncomparing to expectations # july wrap forecast: flat to small gain likely.\nweek 1 actual: +$380 (+0.09%)\nexactly as expected.\naugust = survival not growth.\ncircuit breaker # not triggered.\nnot close.\nbut:\n5 total trades vs july avg 7.8 trades/week.\nfilters doing job.\nweekly trades breakdown # monday: pass (low volume).\ntuesday: +$240 (2 wins).\nwednesday: -$160 (1 loss).\nthursday: +$300 (1 win).\nfriday: pass (worse volume all week).\n2 of 5 days = no trades.\nnormal august behavior.\nslippage detail # best execution: tuesday trade 1 (1.8 ticks)\nworst execution: thursday (3.4 ticks)\navg: 2.9 ticks\ncost impact:\n5 trades × 2.9 ticks avg = 14.5 ticks total slippage.\n@ $12.50/tick ES = $181 slippage cost.\nnet gain after slippage: $380\ngross gain pre-slippage: ~$561\nslippage ate 32% of gross.\nsummer reality.\ncomparing to previous augusts # august 2023:\nstill learning.\nlosing money.\ndidn\u0026rsquo;t understand seasonal patterns.\naugust 2024:\nfilters adapted.\ncapital preserved.\n+$380 modest but positive.\nprogress.\nregime analysis # optimal VIX (15.8) but:\nlow volume changed dynamics.\ncorrelation weak (0.52).\nregime confidence low (0.68).\nlesson:\nVIX alone insufficient.\nneed volume + correlation + stability.\naugust has VIX but lacks other 3.\nwhat\u0026rsquo;s working # filters: preventing bad trades (62% rejection rate).\nposition sizing: $1,500 consistent (no adjustment needed).\ndiscipline: not forcing trades in bad conditions.\nchicago colo: without it, slippage would be 4+ ticks.\nwhat\u0026rsquo;s challenging # liquidity: worst all year.\nslippage: eating 30%+ of gross gains.\nopportunity: 38% acceptance = fewer trades.\nexpected in august.\nweek 2 preview # expectations:\nmore of same.\nvolume likely stays low through mid-august.\nrealistic targets:\nflat week (+$0 to +$500) - likely.\nsmall loss (-$200 to -$500) - possible.\nacceptance rate: probably 35-40%.\nslippage: probably 2.5-3.0 ticks.\nmonth projection (early) # 4 weeks remaining.\nif each week similar to week 1:\n4 weeks × $380 avg = $1,520 total.\nrealistic range:\nflat month (+$0 to +$500).\nsmall gain (+$500 to +$1,500).\nacceptable outcomes.\nytd +18.5% already above target.\nno pressure.\ntonight (august 3, 10:15pm) # week 1 august done.\n+$380 (+0.09%).\n60% win rate across 5 trades.\nsummer slowest month confirmed.\nfilters rejecting 62%.\nslippage 2.9 ticks eating edge.\nvolume -32% vs july.\nexactly what august should be.\nsurvival mode activated.\nweek 2 begins monday.\n10:15pm saturday. week 1 august. +$380 (0.09%). 60% wr across 5 trades. avg slippage 2.9 ticks vs july 2.3 (volume -32%). filters rejecting 62% of signals = capital preservation. august = slowest summer month, survival not growth. 2 of 5 days zero trades. acceptable start.\n-AK\n","date":"3 August 2024","externalUrl":null,"permalink":"/posts/2024-08-03-week-1-august-slowest-summer-month-begins/","section":"Posts","summary":"\u003cp\u003eweek 1 august done.\u003c/p\u003e\n\u003cp\u003esummer slowest month confirmed.\u003c/p\u003e\n\u003cp\u003evolume brutal.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 1 numbers \n    \u003cdiv id=\"week-1-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-1-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (aug 1):\u003c/strong\u003e $433,900\u003c/p\u003e","title":"week 1 august - slowest summer month begins, modest start","type":"posts"},{"content":"july done.\nmodest summer month.\ndiscipline maintained through variance.\njuly final numbers # starting (july 1): $431,180\nending (july 31): $433,900\njuly gain: +$2,720 (+0.63%)\ntrades: 31\nwins: 17\nlosses: 14\nwin rate: 55%\nFigure 1: July weekly performance showing summer variance. Week 1 slow start (+$1,220, 57% wr), Week 2 first losing week since May (-$1,740, 25% wr - summer volume crash), Week 3 recovery (+$1,480, 63% wr), Week 4 consistency (+$1,760, 75% wr). Month ended +$2,720 (+0.63%). Summer conditions demonstrated: lower volume, wider slippage, reduced edge.\nweekly breakdown # Figure 2: Summer volume impact on slippage throughout July. Week 1 volume down 22% → 2.1 tick slippage. Week 2 volume crash 28% → worst slippage all year 2.8 ticks (contributed to -$1,740 loss). Weeks 3-4 volume stabilized → slippage improved to 2.0-2.2 ticks. July avg slippage 2.3 ticks vs June 1.9 ticks. Summer months = higher execution costs. Correlation between volume and slippage clear.\nweek 1: +$1,220, 57% wr, 7 trades\nweek 2: -$1,740, 25% wr, 8 trades (first losing week since may)\nweek 3: +$1,480, 63% wr, 8 trades\nweek 4: +$1,760, 75% wr, 8 trades\n3 positive weeks, 1 losing week.\nnormal pattern.\ncomparing to previous months 2024 # january: +$27,200 (+7.4%) - impressive\nfebruary: +$1,400 (+0.36%) - flat\nmarch: +$1,100 (+0.28%) - testing\napril: +$23,460 (+5.9%) - notable\nmay: +$3,500 (+0.83%) - normal\njune: +$8,320 (+1.97%) - modest\njuly: +$2,720 (+0.63%) - modest\npattern consistent: 2 notable, 5 modest/flat.\nsustainable pace.\nytd 2024 progress # Figure 3: Year-to-date 2024 monthly progression through July. Pattern shows 2 strong months (Jan +7.4%, Apr +5.9%) cannot sustain. Five modest/flat months (Feb +0.36%, Mar +0.28%, May +0.83%, Jun +1.97%, Jul +0.63%) demonstrate realistic algo trading. YTD total +$67,700 (+18.5%). Annual target 15-18% exceeded - need flat/losing months H2 to finish in range. Sustainable trading requires variance acceptance.\njanuary: +$27,200 (+7.4%)\nfebruary: +$1,400 (+0.36%)\nmarch: +$1,100 (+0.28%)\napril: +$23,460 (+5.9%)\nmay: +$3,500 (+0.83%)\njune: +$8,320 (+1.97%)\njuly: +$2,720 (+0.63%)\nytd total: +$67,700 (+18.5%)\nstarting balance (jan 1): $366,200\ncurrent balance (july 31): $433,900\nannual target analysis # ytd: +18.5% in 7 months\nannual target: +15-18%\nabove target by 0.5%.\nH2 2024 (5 months remaining):\nshould target: flat to slightly negative total.\nachievable with:\n3-4 flat months (+0% to +0.5%) 1-2 small losing months (-1% to -2%) still finish 15-18% annual.\ncircuit breaker performance # week 2 close call:\n5 total losses but not 3 consecutive.\nthursday: -$920 (2 losses).\nthreshold not triggered but monitored.\nlast trigger: never (implemented post-sept 2023 disaster).\neffectiveness: prevented 20x worse outcome vs sept 2023.\nrisk management stats # position sizing: $1,500 all trades (consistent)\ncircuit breaker: not triggered (1 close call week 2)\nmax drawdown: -$1,740 (0.4%)\nfilters: 51% acceptance avg\nvariance:\nweek 2 low: 38% week 4 high: 61% regime confidence avg: 0.71\nvariance:\nweek 2 low: 0.54 week 4 high: 0.78 filters adapted correctly.\nmarket conditions # summer reality:\navg volume: -25% vs june\navg VIX: 16.1 (optimal but whipsaw)\navg correlation: 0.61 (acceptable)\navg regime stability: 0.71 (lower than june 0.76)\nsummer = different conditions.\nlower participation = different dynamics.\nslippage tracking # july avg: 2.3 ticks\njune avg: 1.9 ticks\napril avg: 1.7 ticks\nsummer degradation expected.\nweekly variance:\nweek 2 worst: 2.8 ticks (volume crash).\nweek 4 best: 2.0 ticks (stabilization).\nchicago colo still helping.\nwithout it, summer would be 3.5+ ticks.\ncomparing to expectations # early july estimate: +$2k to +$4k\nactual: +$2,720\nmid-range hit.\nsummer modest confirmed.\nlessons from july # 1. summer is different\ncan\u0026rsquo;t compare to spring performance.\nlower volume = lower edge.\n2. losing weeks normal\nweek 2 first since may = good ratio.\n3. recovery matters more than perfect record\nweek 2 loss → weeks 3-4 recovery = discipline.\n4. filters prevent disasters\n38% acceptance week 2 saved capital.\n5. relationship stability enables trading stability\n8.5 months with A. = psychological foundation.\ncomparing to 2023 # july 2023:\nlearning phase losing money small position sizes emotional responses july 2024:\nvalidated strategies +$2,720 profit full position size disciplined execution 1 year progress.\ntherapy reflection (7/25) # dr. r: \u0026ldquo;july wrapping up. thoughts?\u0026rdquo;\nme: \u0026ldquo;solid. 1 losing week, 3 modest weeks. exactly what summer should look like.\u0026rdquo;\ndr. r: \u0026ldquo;and personally?\u0026rdquo;\nme: \u0026ldquo;good. 8.5 months with A. thinking about future more.\u0026rdquo;\ndr. r: \u0026ldquo;marriage still on your mind?\u0026rdquo;\nme: \u0026ldquo;yeah. not planning anything yet but the thought stays.\u0026rdquo;\ndr. r: \u0026ldquo;that\u0026rsquo;s growth. you\u0026rsquo;re thinking long-term now.\u0026rdquo;\nexactly.\nliving with A. - 8.5 months # what\u0026rsquo;s working:\nsunday morning breakfast routine.\ncomfortable silence most evenings.\nsex life still incredible (places list: 20).\nseparate workspaces during day.\nwhat\u0026rsquo;s friction:\nstill the coffee mug thing (stupid but real).\nher mess vs my OCD (ongoing negotiation).\nfriday alone time rule (works but sometimes i miss her).\noverall:\nbest relationship i\u0026rsquo;ve had.\nfirst one where i\u0026rsquo;m thinking years not weeks.\naugust preview # expectations:\nsummer continues.\naugust typically slowest month.\nrealistic outcomes:\nflat month (+0% to +0.5%) - likely.\nsmall gain (+0.5% to +1%) - possible.\nsmall loss (-1% to -2%) - acceptable.\nytd already above target.\nno pressure.\nwhat success looks like # july success:\nmaintained discipline through losing week.\nrecovered weeks 3-4.\nended month positive despite summer.\nfilters adapted correctly.\nnot exciting but sustainable.\nthis is long-term algo trading.\ntonight (july 31, 11:42pm) # july done.\n+$2,720 (+0.63%).\n55% win rate.\n3 modest weeks, 1 losing week.\nsummer variance accepted.\nfilters prevented disaster.\nytd +$67,700 (+18.5%).\nannual target exceeded.\naugust begins tomorrow.\nrealistic expectations.\nexecute system.\naccept variance.\n11:42pm wednesday. july wrap. +$2,720 (0.63%). 55% win rate across 31 trades. weekly pattern: +$1,220, -$1,740 (first losing week since may), +$1,480, +$1,760. summer slippage avg 2.3 ticks vs june 1.9. ytd +$67,700 (18.5%) above target - need flat H2 to finish 15-18% range. discipline maintained through variance. sustainable trading demonstrated.\n-AK\n","date":"30 July 2024","externalUrl":null,"permalink":"/posts/2024-07-30-july-wrap-modest-summer-month-discipline-through-variance/","section":"Posts","summary":"\u003cp\u003ejuly done.\u003c/p\u003e\n\u003cp\u003emodest summer month.\u003c/p\u003e\n\u003cp\u003ediscipline maintained through variance.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ejuly final numbers \n    \u003cdiv id=\"july-final-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#july-final-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (july 1):\u003c/strong\u003e $431,180\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eending (july 31):\u003c/strong\u003e $433,900\u003c/p\u003e","title":"july wrap - modest summer month, discipline through variance","type":"posts"},{"content":"week 4 july done.\nfinishing modest summer month.\nconsistency maintained despite conditions.\nweek 4 trades (july 22-26) # monday 7/22: 2 trades, 2 wins. +$680\ntuesday 7/23: 1 trade, 0 wins. -$420\nwednesday 7/24: 2 trades, 1 win. +$340\nthursday 7/25: 2 trades, 2 wins. +$780\nfriday 7/26: 1 trade, 1 win. +$380\nweek total: 8 trades, 6 wins (75%). +$1,760\naccount status # july 19: $432,140\njuly 26: $433,900\nweek 4: +$1,760 (+0.41%)\njuly total (4 weeks): +$2,720 (+0.63%)\nytd: +$67,700 (+18.5%)\nmodest month complete.\ncomparing four weeks july # week 1: +$1,220 (57% wr)\nweek 2: -$1,740 (25% wr)\nweek 3: +$1,480 (63% wr)\nweek 4: +$1,760 (75% wr)\ntotal: +$2,720 (+0.63%)\n1 losing week, 3 modest weeks.\nnormal summer pattern.\nslippage tracking # week 4: 2.0 ticks avg\njuly avg: 2.3 ticks\njune avg: 1.9 ticks\nsummer slippage worse but week 4 improving.\nrisk management # position size: $1,500 all trades\ncircuit breaker: not triggered (week 2 close call)\nfilters: 61% acceptance (best since week 1)\nregime confidence: 0.78 (strong)\nconditions improving end of month.\nstrategy performance # regime-adaptive mean reversion:\nlow vol (5 trades): 5 wins, 0 losses (100% wr)\nmedium vol (3 trades): 1 win, 1 loss (33% wr)\nlow vol regime = money.\nmedium vol = still challenging.\njuly final vs expectations # early july estimate: +$2k to +$4k\nactual: +$2,720\nwithin range.\nmodest summer month achieved.\ncomparing to previous months 2024 # january: +$27,200 (+7.4%) - standout\nfebruary: +$1,400 (+0.36%) - flat\nmarch: +$1,100 (+0.28%) - testing\napril: +$23,460 (+5.9%) - significant\nmay: +$3,500 (+0.83%) - normal\njune: +$8,320 (+1.97%) - modest\njuly: +$2,720 (+0.63%) - modest\npattern holding: 2 notable, 5 modest/flat.\nytd sustainability check # ytd: +18.5%\ntarget: 15-18%\nabove target by 0.5%.\nneed correction H2.\naugust-december:\nshould target: +0% to +3% total (5 months).\nachievable with:\n3-4 flat months 1-2 losing months still finish 15-18% annual.\ntherapy reflection (7/23) # dr. r: \u0026ldquo;july wrapping up. modest month.\u0026rdquo;\nme: \u0026ldquo;yeah. +$2.7k. 1 losing week, 3 modest. summer trading.\u0026rdquo;\ndr. r: \u0026ldquo;and relationship?\u0026rdquo;\nme: \u0026ldquo;good. 8.5 months living together. still thinking about marriage.\u0026rdquo;\ndr. r: \u0026ldquo;have you talked to A. about future?\u0026rdquo;\nme: \u0026ldquo;not explicitly. but we talk like it\u0026rsquo;s assumed. \u0026lsquo;when we get a house\u0026rsquo; not \u0026lsquo;if\u0026rsquo;. stuff like that.\u0026rdquo;\ndr. r: \u0026ldquo;implied commitment.\u0026rdquo;\nme: \u0026ldquo;yeah. neither of us planning to leave.\u0026rdquo;\nexactly.\nliving with A. - small changes # new routine started this month:\nsunday mornings: breakfast in bed (she cooks, we eat on balcony).\nher idea.\nme: \u0026ldquo;why sunday mornings?\u0026rdquo;\nA.: \u0026ldquo;because we can. because it\u0026rsquo;s nice. because i want to.\u0026rdquo;\nsimple.\nbeen doing it 3 sundays now.\nworks.\naugust preview # expectations:\nsummer continues.\naugust typically slow.\nrealistic outcomes:\nflat month (+0% to +0.5%).\nsmall gain (+0.5% to +1%).\nsmall loss (-0.5% to -1%).\nall acceptable.\nytd already above target.\nwhat worked in july # 1. accepting summer reality\nlower volume = different conditions.\nadapted strategy as a result.\n2. circuit breaker discipline\nweek 2 close call but followed rules.\n3. filter adaptation\n38% → 61% acceptance as conditions improved.\n4. psychological stability\nrelationship solid = trading psychology solid.\ntonight # week 4 july.\n+$1,760.\n75% win rate.\njuly total: +$2,720 (+0.63%).\nytd: +$67,700 (+18.5%).\nmodest summer month complete.\naugust begins tomorrow.\n3:08am monday. week 4 july complete. +$1,760 (0.41%). 75% win rate. july total +$2,720 (0.63%). 1 losing week, 3 modest weeks = summer pattern. slippage improved week 4 to 2.0 ticks. ytd +18.5% above target - need flat H2 to finish 15-18% range. august begins with realistic expectations.\n-AK\n","date":"22 July 2024","externalUrl":null,"permalink":"/posts/2024-07-22-week-4-july-finishing-modest-summer-month/","section":"Posts","summary":"\u003cp\u003eweek 4 july done.\u003c/p\u003e\n\u003cp\u003efinishing modest summer month.\u003c/p\u003e\n\u003cp\u003econsistency maintained despite conditions.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 4 trades (july 22-26) \n    \u003cdiv id=\"week-4-trades-july-22-26\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-4-trades-july-22-26\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003emonday 7/22:\u003c/strong\u003e 2 trades, 2 wins. +$680\u003c/p\u003e","title":"week 4 july - finishing modest summer month, consistency maintained","type":"posts"},{"content":"","date":"15 July 2024","externalUrl":null,"permalink":"/tags/recovery/","section":"Tags","summary":"","title":"Recovery","type":"tags"},{"content":"week 3 july done.\nmodest recovery from week 2 loss.\nconditions stabilizing slightly.\nweek 3 trades (july 15-19) # monday 7/15: 2 trades, 2 wins. +$780\ntuesday 7/16: 2 trades, 1 win. +$340\nwednesday 7/17: 1 trade, 1 win. +$460\nthursday 7/18: 2 trades, 1 win. +$280\nfriday 7/19: 1 trade, 0 wins. -$380\nweek total: 8 trades, 5 wins (63%). +$1,480\naccount status # july 12: $430,660\njuly 19: $432,140\nweek 3: +$1,480 (+0.34%)\njuly MTD (3 weeks): +$960 (+0.22%)\nytd: +$65,940 (+18.0%)\nback to positive for month.\nwhat improved # VIX stability:\nweek 2: range 14-19 (whipsaw).\nweek 3: range 15-17 (stable).\nless regime confusion.\nvolume:\nstill summer lows but consistent.\ncorrelation:\nweek 2 ended: 0.82.\nweek 3 avg: 0.58.\nedge returning.\ncomparing three weeks july # week 1: +$1,220 (57% wr)\nweek 2: -$1,740 (25% wr)\nweek 3: +$1,480 (63% wr)\npattern: modest, loss, modest recovery.\ntotal MTD: +$960.\nslippage improvement # week 3: 2.2 ticks avg\nweek 2: 2.8 ticks\nweek 1: 2.1 ticks\nbetter fills as vol stabilized.\nstill worse than june (1.9 avg).\nrisk management # position size: $1,500 maintained\ncircuit breaker: not triggered\nfilters: 54% acceptance (up from 38% week 2)\nregime confidence: 0.71 (improved from 0.54)\ncautious but improving.\nstrategy performance # regime-adaptive mean reversion:\nlow vol (5 trades): 4 wins, 1 loss (80% wr)\nmedium vol (3 trades): 1 win, 2 losses (33% wr)\nlow vol working again.\nmedium vol still challenging.\njuly projection update # 3 weeks complete: +$960\n1 week remaining\nrevised estimate:\nweek 4: +$800 to +$1,500 likely.\njuly total estimate: +$1,800 to +$2,500 (+0.42% to +0.58%)\nmodest month confirmed.\nytd analysis # ytd: +18.0%\ntarget: 15-18%\nabove target by 0.2%.\njuly modest performance bringing back toward target.\nexactly what needed.\ntherapy session (7/16) # dr. r: \u0026ldquo;recovery week after losing week. how do you feel?\u0026rdquo;\nme: \u0026ldquo;good. followed system. didn\u0026rsquo;t panic. week 2 loss was variance. week 3 shows strategy still works.\u0026rdquo;\ndr. r: \u0026ldquo;and the marriage thoughts from birthday?\u0026rdquo;\nme: \u0026ldquo;still thinking about it. not ready to do anything yet but the thought is there.\u0026rdquo;\ndr. r: \u0026ldquo;have you told A.?\u0026rdquo;\nme: \u0026ldquo;no. too soon. only 8 months.\u0026rdquo;\ndr. r: \u0026ldquo;when would it not be too soon?\u0026rdquo;\nme: \u0026ldquo;\u0026hellip;don\u0026rsquo;t know. year? two years?\u0026rdquo;\ndr. r: \u0026ldquo;there\u0026rsquo;s no right timeline. but awareness is good.\u0026rdquo;\nfair point.\nliving with A. - 8.5 months # small moment thursday night:\ntrading done for day.\nsitting on couch.\nA. coding on laptop.\nme reading.\nher foot touching my leg.\nno talking.\njust comfortable silence.\nthought:\n\u0026ldquo;this is what i want forever.\u0026rdquo;\ndidn\u0026rsquo;t say it.\nbut felt it.\nweek 4 expectations # summer continues.\nVIX forecast: 15-18 range.\nif holds:\nweek 4 modest +$800 to +$1,500.\njuly ends modestly.\nacceptable outcome.\nlessons from week 3 # 1. recovery after loss\ndidn\u0026rsquo;t panic week 2 → calm execution week 3 → recovery.\n2. patience pays\nwaited for conditions to improve.\ndidn\u0026rsquo;t force trades.\n3. filters adapt well\n38% → 54% acceptance as conditions improved.\n4. small moments matter\ncomfortable silence with A. = relationship working.\ntonight # week 3 july.\n+$1,480.\n63% win rate.\nrecovery from week 2 loss.\njuly back to positive (+$960).\nytd +18.0%.\n1 week remaining.\n3:32am monday. week 3 july complete. +$1,480 (0.34%). 63% win rate. recovery from week 2 -$1,740 loss. VIX stabilized, slippage improved 2.8→2.2 ticks. july MTD +$960 (0.22%). ytd +18.0% slightly above target. 1 week remaining.\n-AK\n","date":"15 July 2024","externalUrl":null,"permalink":"/posts/2024-07-15-week-3-july-modest-recovery-conditions-stabilizing/","section":"Posts","summary":"\u003cp\u003eweek 3 july done.\u003c/p\u003e\n\u003cp\u003emodest recovery from week 2 loss.\u003c/p\u003e\n\u003cp\u003econditions stabilizing slightly.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 3 trades (july 15-19) \n    \u003cdiv id=\"week-3-trades-july-15-19\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-3-trades-july-15-19\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003emonday 7/15:\u003c/strong\u003e 2 trades, 2 wins. +$780\u003c/p\u003e","title":"week 3 july - modest recovery, conditions stabilizing","type":"posts"},{"content":"week 2 july done.\nfirst losing week since may.\nsummer volatility brutal.\nweek 2 trades (july 8-12) # monday 7/8: 2 trades, 0 wins. -$880\ntuesday 7/9: 1 trade, 1 win. +$340\nwednesday 7/10: 2 trades, 1 win. +$180\nthursday 7/11: 2 trades, 0 wins. -$920\nfriday 7/12: 1 trade, 0 wins. -$460\nweek total: 8 trades, 2 wins (25%). -$1,740\naccount status # july 5: $432,400\njuly 12: $430,660\nweek 2: -$1,740 (-0.40%)\njuly MTD (2 weeks): -$520 (-0.12%)\nytd: +$64,460 (+17.6%)\ndown week accepted.\nwhat went wrong # VIX whipsaw:\nmonday: VIX 14.2 → signals look good → loses.\nthursday: VIX 18.9 → different regime → loses.\ncouldn\u0026rsquo;t catch regime.\nvolume:\nsummer lows.\navg daily volume: -28% vs june.\nworse fills, more slippage.\ncorrelation spike:\nmonday 0.38 → friday 0.82.\nedge disappeared midweek.\ncircuit breaker check # threshold: 3 consecutive losses OR -$1,500 single day.\nthis week:\nmonday: 2 losses (-$880).\nthursday: 2 losses (-$920).\nfriday: 1 loss (-$460).\ntotal: 5 losses but not consecutive.\ndidn\u0026rsquo;t trigger but close.\ncomparing two weeks july # week 1: +$1,220 (57% wr, 7 trades)\nweek 2: -$1,740 (25% wr, 8 trades)\ndifference: -$2,960\nnormal variance.\nlast losing week: may week 3.\n2 months between losing weeks = acceptable.\nslippage impact # week 2: 2.8 ticks avg\nweek 1: 2.1 ticks\nsummer volume killing fills.\nmonday: 3.2 ticks (worst all year).\nlower volume = wider spreads = worse slippage.\nrisk management # position size: $1,500 maintained\ncircuit breaker: not triggered (no 3 consecutive)\nfilters: 38% acceptance (way down from 51% week 1)\nregime confidence: 0.54 (low)\nfilters correctly identified poor conditions.\nprevented worse disaster.\nstrategy performance # regime-adaptive mean reversion:\nlow vol (3 trades): 1 win, 2 losses (33% wr)\nmedium vol (3 trades): 1 win, 2 losses (33% wr)\nhigh vol (2 trades): 0 wins, 2 losses (0% wr)\nstrategy struggled across all regimes.\nsummer conditions = different beast.\njuly projection update # 2 weeks complete: -$520\n2 weeks remaining\nrevised estimate:\nif conditions improve: +$2k to +$3k possible.\nif summer continues: flat to +$1k likely.\njuly total estimate: +$1,500 to +$2,500 (+0.35% to +0.58%)\nway below june but acceptable.\nytd sustainability # ytd: +17.6%\ntarget: 15-18%\nstill above target.\njuly loss brings closer to target range.\nactually good for annual sustainability.\ntherapy session (7/9) # dr. r: \u0026ldquo;rough week. first losing week in 2 months.\u0026rdquo;\nme: \u0026ldquo;yeah. summer vol is different. strategy struggling.\u0026rdquo;\ndr. r: \u0026ldquo;how do you feel about it?\u0026rdquo;\nme: \u0026ldquo;annoyed but not panicked. it happens. filters reduced trades. prevented disaster.\u0026rdquo;\ndr. r: \u0026ldquo;and the birthday? you mentioned marriage thoughts?\u0026rdquo;\nme: \u0026ldquo;yeah. thought about it twice that day. never thought that about anyone.\u0026rdquo;\ndr. r: \u0026ldquo;that\u0026rsquo;s significant. secure attachment developing.\u0026rdquo;\nme: \u0026ldquo;feels real. but too soon to actually do anything.\u0026rdquo;\ndr. r: \u0026ldquo;awareness is growth. you\u0026rsquo;re capable of commitment now.\u0026rdquo;\nexactly.\nliving with A. through losing week # monday night:\ncame home stressed.\nA.: \u0026ldquo;bad day?\u0026rdquo;\nme: \u0026ldquo;lost $880.\u0026rdquo;\nA.: \u0026ldquo;want to talk or want space?\u0026rdquo;\nme: \u0026ldquo;space.\u0026rdquo;\ngave me 2 hours.\nthursday night:\nworse day. -$920.\ncame to desk, didn\u0026rsquo;t say anything.\nA. brought coffee 30 minutes later.\ndidn\u0026rsquo;t talk about trading.\njust left coffee, kissed my head, went back to her desk.\nexactly what needed.\nwhat\u0026rsquo;s working despite losses # 1. circuit breaker discipline\ndidn\u0026rsquo;t trigger but monitored closely.\n2. filter adaptation\n38% acceptance prevented more damage.\n3. psychological stability\nno revenge trading after losses.\n4. relationship support\nA. giving space when needed = huge.\nweek 3 expectations # summer continues.\nrealistic outcomes:\nmodest recovery +$1k to +$2k.\nor flat week.\naccepting summer is different.\ncan\u0026rsquo;t force wins.\nlessons from week 2 # 1. losing weeks happen\n2 months between losing weeks = good ratio.\n2. summer is different\nlower volume = different conditions.\n3. filters save capital\n38% acceptance prevented disaster.\n4. relationship stability helps\nA. supporting through losses = psychological edge.\ntonight # week 2 july.\n-$1,740.\n25% win rate.\nfirst losing week since may.\nsummer volatility brutal.\nfilters prevented worse.\njuly MTD: -$520.\nytd still +17.6%.\nweek 3 begins tomorrow.\n2:48am monday. week 2 july complete. -$1,740 (-0.40%). 25% win rate. first losing week since may week 3. summer volume down 28%, slippage worst all year 2.8 ticks avg. filters reduced acceptance 51%→38% prevented disaster. circuit breaker almost triggered. july MTD -$520. ytd +17.6% still above target.\n-AK\n","date":"8 July 2024","externalUrl":null,"permalink":"/posts/2024-07-08-week-2-july-first-losing-week-since-may/","section":"Posts","summary":"\u003cp\u003eweek 2 july done.\u003c/p\u003e\n\u003cp\u003efirst losing week since may.\u003c/p\u003e\n\u003cp\u003esummer volatility brutal.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 2 trades (july 8-12) \n    \u003cdiv id=\"week-2-trades-july-8-12\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-2-trades-july-8-12\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003emonday 7/8:\u003c/strong\u003e 2 trades, 0 wins. -$880\u003c/p\u003e","title":"week 2 july - first losing week since may, summer vol brutal","type":"posts"},{"content":"woke up at 11am.\nhands tied to headboard.\nA. between my legs going down on me.\nbest fucking birthday ever.\nhow it started # didn\u0026rsquo;t know she tied me up.\ndeep sleeper.\nwoke up mid-blowjob.\ntried to move hands - couldn\u0026rsquo;t.\nlooked down.\nA. looking up at me, smiling with her mouth full.\nme: \u0026ldquo;what the fuck—\u0026rdquo;\nA.: doesn\u0026rsquo;t stop, just grins\nlasted maybe 3 more minutes.\ncame hard.\nshe swallowed, untied me, kissed me.\nA.: \u0026ldquo;happy birthday.\u0026rdquo;\nme: \u0026ldquo;\u0026hellip;yeah. fuck. yeah.\u0026rdquo;\nthe thought that hit # laying there after.\nshe\u0026rsquo;s getting up to make breakfast.\ni\u0026rsquo;m just staring at ceiling.\nthought: \u0026ldquo;i should marry this girl.\u0026rdquo;\nfirst time i\u0026rsquo;ve ever thought that about anyone.\ndidn\u0026rsquo;t say it.\nbut felt it.\nwhy that thought happened # she gets me:\nknows i like being tied up sometimes.\nknows surprise is hot.\nknows waking up to head = instant win.\nno performance:\ndidn\u0026rsquo;t make it about her.\njust wanted to make my birthday great.\nno \u0026ldquo;did you like it?\u0026rdquo; validation seeking.\njust did it, smiled, moved on.\ncomfortable:\n8 months living together.\nknows my body.\nknows what works.\nzero awkwardness.\ntrust:\nfell asleep free.\nwoke up tied.\nzero panic.\ncomplete trust.\nbreakfast (11:30am) # A. made:\nfrench toast (my favorite).\nbacon (crispy how i like).\ncoffee (black, my mug, perfect temp).\nsat together.\nA.: \u0026ldquo;good birthday so far?\u0026rdquo;\nme: \u0026ldquo;best wakeup ever.\u0026rdquo;\nA.: \u0026ldquo;thought you\u0026rsquo;d like that.\u0026rdquo;\nme: \u0026ldquo;understatement.\u0026rdquo;\nA.: \u0026ldquo;dinner at 7. your choice of everything tonight.\u0026rdquo;\nme: \u0026ldquo;everything?\u0026rdquo;\nA.: smirks \u0026ldquo;yes. everything.\u0026rdquo;\nexactly what she meant.\nthe day (no trading) # markets closed anyway.\nspent day:\ncouch.\nA. coding on her laptop.\nme reading.\noccasional making out.\nsimple.\nperfect.\nno big celebration.\nno party.\njust us.\nexactly what wanted.\ndinner (7pm - A. cooked) # she made:\nsteak (medium rare, perfect).\nroasted potatoes (crispy).\nasparagus (somehow got me to eat vegetables).\nme: \u0026ldquo;this is incredible.\u0026rdquo;\nA.: \u0026ldquo;tried a new recipe. was nervous.\u0026rdquo;\nme: \u0026ldquo;it\u0026rsquo;s perfect. you\u0026rsquo;re perfect.\u0026rdquo;\nA.: raises eyebrow \u0026ldquo;i\u0026rsquo;m perfect?\u0026rdquo;\nme: \u0026ldquo;\u0026hellip;yeah. you are.\u0026rdquo;\nA.: \u0026ldquo;you never say shit like that.\u0026rdquo;\nme: \u0026ldquo;i know. but yeah. today you\u0026rsquo;re perfect.\u0026rdquo;\nA.: \u0026ldquo;just today?\u0026rdquo;\nme: \u0026ldquo;okay fine. most days.\u0026rdquo;\nA.: smiles \u0026ldquo;good enough.\u0026rdquo;\nafter dinner - the addition to places list # A.: \u0026ldquo;balcony. now.\u0026rdquo;\nme: \u0026ldquo;we\u0026rsquo;ve done balcony.\u0026rdquo;\nA.: \u0026ldquo;not like this.\u0026rdquo;\ngrabbed blanket.\nlaid it out.\nfireworks starting downtown.\nexplosions in distance.\nA. pulled me down.\nfucked under fireworks.\nher on top.\nme watching her ride while explosions light up sky behind her.\nboth came as grand finale started.\nplaces list: 20.\nafter (10pm) # laying on balcony.\nwrapped in blanket.\nA.: \u0026ldquo;good birthday?\u0026rdquo;\nme: \u0026ldquo;best ever.\u0026rdquo;\nA.: \u0026ldquo;better than last year?\u0026rdquo;\nme: \u0026ldquo;last year was shit. this year\u0026hellip; perfect.\u0026rdquo;\nA.: \u0026ldquo;what made it perfect?\u0026rdquo;\nme: \u0026ldquo;you. just you.\u0026rdquo;\nA.: \u0026ldquo;getting soft on me?\u0026rdquo;\nme: \u0026ldquo;maybe. birthday pass.\u0026rdquo;\nA.: kisses me \u0026ldquo;okay. birthday pass granted.\u0026rdquo;\nwhat i didn\u0026rsquo;t say # thought again:\n\u0026ldquo;i should marry this girl.\u0026rdquo;\ndidn\u0026rsquo;t say it.\ntoo soon.\nonly 8 months.\nbut thought it twice today.\nfirst time about anyone ever.\ncomparing to last year # july 4, 2023 (21st birthday):\nalone most of day.\nate shitty takeout.\ndating A. for 3 weeks total.\nsaid no when she offered to come over.\njuly 4, 2024 (22nd birthday):\nwoke up to best head of my life.\nbreakfast she cooked.\ndinner she made.\nsex under fireworks.\nliving together 8 months.\nthought about marriage.\ndifference: everything.\nwhat this means # never thought about marriage before.\nprevious relationships:\nM.: hot, great sex, got bored after 4 months.\nK.: fun, also great sex, got bored after 6 weeks.\nS.: same pattern.\nalways had exit strategy.\nalways planning when to end it.\nwith A.:\nno exit strategy.\nno boredom.\n8 months in, getting better.\nthinking about MORE commitment not less.\ndifferent.\ntherapy will be interesting # seeing dr. r next tuesday.\ngoing to tell her about marriage thought.\nshe\u0026rsquo;ll probably say:\n\u0026ldquo;that\u0026rsquo;s significant growth.\u0026rdquo;\nor\n\u0026ldquo;secure attachment manifesting.\u0026rdquo;\nor\n\u0026ldquo;you\u0026rsquo;re capable of long-term commitment.\u0026rdquo;\nwhatever she says:\ni thought about marrying A. twice today.\nfirst time ever about anyone.\nthat\u0026rsquo;s real.\ntonight (10:30pm) # 22 years old.\nbest birthday ever.\nwoke up tied to bed getting head.\nthought about marriage (twice).\nliving with A. 8 months.\nsex under fireworks.\nplaces list: 20.\nnever been this happy.\nnever thought i could be.\nmaybe marriage isn\u0026rsquo;t crazy.\nmaybe she\u0026rsquo;s the one.\nfirst time i\u0026rsquo;ve thought that.\nfeels true.\n10:30pm thursday. 22nd birthday. woke up tied to bed with A. going down on me (best wakeup ever). thought \u0026ldquo;i should marry this girl\u0026rdquo; - first time ever thought that about anyone. thought it twice today. breakfast + dinner she cooked. sex under fireworks on balcony (places list: 20). 8 months living together. no exit strategy. thinking about MORE commitment not less. different from any relationship before.\n-AK\n","date":"4 July 2024","externalUrl":null,"permalink":"/posts/2024-07-04-birthday-22-best-wakeup-ever/","section":"Posts","summary":"\u003cp\u003ewoke up at 11am.\u003c/p\u003e\n\u003cp\u003ehands tied to headboard.\u003c/p\u003e\n\u003cp\u003eA. between my legs going down on me.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ebest fucking birthday ever.\u003c/strong\u003e\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ehow it started \n    \u003cdiv id=\"how-it-started\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#how-it-started\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003edidn\u0026rsquo;t know she tied me up.\u003c/strong\u003e\u003c/p\u003e","title":"22 - best birthday wakeup ever, might marry this girl","type":"posts"},{"content":"week 1 july done.\nslow start.\nsummer conditions = lower volume.\nweek 1 trades (july 1-5) # monday 7/1: 2 trades, 1 win. +$340\ntuesday 7/2: 1 trade, 1 win. +$460\nwednesday 7/3: 2 trades, 1 win. +$180\nthursday 7/4: no trades (july 4 holiday, markets closed)\nfriday 7/5: 2 trades, 1 win. +$240\nweek total: 7 trades, 4 wins (57%). +$1,220\naccount status # july 1: $431,180\njuly 5: $432,400\nweek 1: +$1,220 (+0.28%)\nytd: +$66,200 (+18.1%)\nslow but positive.\nsummer trading reality # volume down:\navg daily volume: -22% vs june avg.\nsummer vacation = fewer participants.\nVIX: 15.2 avg (optimal range but low end)\ncorrelation: 0.44 (good diversification)\nregime stability: 0.79 (stable but cautious)\nconditions adequate not significant.\ncomparing to june week 1 # june week 1: +$2,040 (75% wr, 8 trades)\njuly week 1: +$1,220 (57% wr, 7 trades)\nlower performance, lower volume.\nsummer pattern starting.\nslippage tracking # july week 1: 2.1 ticks avg\njune avg: 1.9 ticks\nlower volume = slightly worse fills.\nexpected during summer.\nrisk management # position size: $1,500 full size\ncircuit breaker: not triggered\nfilters: 51% acceptance rate (lower than june 59%)\nregime confidence: 0.79 avg\nmax losing streak: 1\nconservative filtering during summer.\njuly expectations # realistic outcomes:\nsummer months typically slower.\njuly likely: +$2k to +$4k total (+0.5% to +1%)\nytd already at 18.1%.\ntarget: 15-18%.\njuly can be flat and still finish in target.\nbirthday tomorrow # july 4.\nturn 22.\ntaking day off.\nA. cooking dinner.\ndetails tomorrow.\ntonight # week 1 july.\n+$1,220.\n57% win rate.\nslow summer start.\njuly 4 tomorrow.\nbirthday.\n3:15am monday. week 1 july complete. +$1,220 (0.28%). 57% win rate. summer volume down 22%, slippage up to 2.1 ticks. filters conservative 51% acceptance. ytd +18.1% above target range. july 4 birthday tomorrow.\n-AK\n","date":"1 July 2024","externalUrl":null,"permalink":"/posts/2024-07-01-week-1-july-slow-start-summer-conditions/","section":"Posts","summary":"\u003cp\u003eweek 1 july done.\u003c/p\u003e\n\u003cp\u003eslow start.\u003c/p\u003e\n\u003cp\u003esummer conditions = lower volume.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 1 trades (july 1-5) \n    \u003cdiv id=\"week-1-trades-july-1-5\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-1-trades-july-1-5\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003emonday 7/1:\u003c/strong\u003e 2 trades, 1 win. +$340\u003c/p\u003e","title":"week 1 july - slow start, summer conditions setting in","type":"posts"},{"content":"june done.\nmodest month as expected.\nvariance demonstrated perfectly.\njune final numbers # starting (june 1): $422,860\nending (june 30): $431,180\njune gain: +$8,320 (+1.97%)\ntrades: 38\nwins: 27\nlosses: 11\nwin rate: 71%\nFigure 1: June weekly performance showing variance pattern. Week 1 modest start (+$2,040, 75% wr), Week 2 strong (+$3,180, 80% wr), Week 3 pullback (+$340, 50% wr - VIX spike), Week 4 recovery (+$2,760, 80% wr). Month ended +$8,320 (+1.97%). Classic variance: 2 strong weeks, 1 pullback, 1 recovery.\nweekly breakdown # Figure 2: VIX correlation with weekly performance throughout June. Weeks 1-2 optimal VIX range (15.8-16.8) with strong results. Week 3 VIX spike to 19.2 caused pullback and 50% win rate. Week 4 VIX normalized to 16.4 enabling recovery. Strategy performance directly tracks VIX regime. Optimal zone VIX 14-19 (shaded green).\nweek 1: +$2,040, 75% wr, 8 trades (VIX 16.8)\nweek 2: +$3,180, 80% wr, 10 trades (VIX 15.8)\nweek 3: +$340, 50% wr, 10 trades (VIX 19.2)\nweek 4: +$2,760, 80% wr, 10 trades (VIX 16.4)\n3 strong weeks, 1 pullback.\nnormal variance.\ncomparing to previous months 2024 # january: +$27,200 (+7.4%) - notable\nfebruary: +$1,400 (+0.36%) - flat\nmarch: +$1,100 (+0.28%) - testing\napril: +$23,460 (+5.9%) - standout\nmay: +$3,500 (+0.83%) - normal\njune: +$8,320 (+1.97%) - modest\npattern emerging:\n2 standout months (can\u0026rsquo;t sustain).\n4 modest/flat months (sustainable).\nexactly what expected.\nytd 2024 progress # Figure 3: Year-to-date 2024 monthly progression through June. January notable (+7.4%), February flat (+0.36%), March testing (+0.28%), April standout (+5.9%), May normal (+0.83%), June modest (+1.97%). YTD total +$64,980 (+17.7%). Pattern shows 2 impressive months cannot be sustained monthly - 4 modest/flat months demonstrate realistic algo trading. Annual target 15-18% already exceeded in 6 months.\njanuary: +$27,200 (+7.4%)\nfebruary: +$1,400 (+0.36%)\nmarch: +$1,100 (+0.28%)\napril: +$23,460 (+5.9%)\nmay: +$3,500 (+0.83%)\njune: +$8,320 (+1.97%)\nytd total: +$64,980 (+17.7%)\nstarting balance (jan 1): $366,200\ncurrent balance (june 30): $431,180\nannual target already achieved # ytd: +17.7% in 6 months\nannual target: +15-18%\nexceeded target.\nH2 2024 (6 months remaining) can be:\n5 flat months (+0% to +1%) 1 losing month (-1% to -3%) still finish 15-18% annual.\nzero pressure rest of year.\ncircuit breaker performance # week 3 close call:\nwednesday 6/19: -$920 (2 losses)\nthreshold: 3 consecutive losses OR -$1,500 single day.\ndidn\u0026rsquo;t trigger but close.\nprevented potential spiral:\ncomparing to sept 2023 disaster ($28k loss, no circuit breaker).\njune week 3: filters + discipline = -$920 contained.\n20x better outcome from having circuit breaker.\nrisk management stats # position sizing:\nall trades: $1,500 full size (consistent)\ncircuit breaker: not triggered (1 close call)\nmax drawdown: -$920 (0.2%)\nfilters: 59% acceptance rate avg\nvariance:\nweek 3 high vol: 42% acceptance weeks 1,2,4 normal: 65% acceptance avg regime confidence avg: 0.76\nvariance:\nweek 3: 0.62 (low) weeks 1,2,4: 0.82 avg (high) market conditions # VIX range: 15-19\navg VIX: 16.9\nmostly in optimal range (14-19).\nweek 3 spike to 19.2 = pullback.\nweeks 1,2,4 normal 15-17 = strong.\ncorrelation: 0.58 avg (acceptable)\nweek 3 spike to 0.71 = edge reduced.\nregime stability: 0.76 avg\nweek 3 dip to 0.62 = less confident.\nslippage tracking # june avg: 1.9 ticks\napril avg: 1.7 ticks\nmay avg: 2.0 ticks\njune slightly better than may, slightly worse than april.\nweekly variance:\nweek 2 best: 1.7 ticks (low vol).\nweek 3 worst: 2.3 ticks (high vol).\nchicago colo paying off.\ncomparing to expectations # mid-month projection: +$9,200 to +$11,200\nactual: +$8,320\ndifference: -$880 to -$2,880 (week 3 pullback)\nstill within modest range.\nacceptable outcome.\nlessons from june # 1. variance never stops\nstrong performance doesn\u0026rsquo;t guarantee next week.\nweek 2 +80% wr → week 3 50% wr.\n2. circuit breakers essential\nweek 3 close call demonstrated value.\nprevented potential disaster.\n3. VIX dictates results\nVIX 15-17 = thrive (weeks 1,2,4).\nVIX \u0026gt;19 = struggle (week 3).\ncan\u0026rsquo;t force wins outside optimal range.\n4. filters adapt correctly\nweek 3: 42% acceptance preserved capital.\nweeks 1,2,4: 65% acceptance captured opportunities.\n5. discipline \u0026gt; performance\nweek 3 pullback didn\u0026rsquo;t trigger revenge trading.\nfollowed system → week 4 recovery.\ncomparing to 2023 # june 2023:\nstill learning losing money testing strategies small position sizes emotional trading june 2024:\nstrategies validated +$8,320 profit full position size disciplined execution variance accepted 1 year transformation.\ntherapy reflection (6/27) # dr. r: \u0026ldquo;june wrapping up. +$8k. thoughts?\u0026rdquo;\nme: \u0026ldquo;solid modest month. 3 good weeks, 1 pullback. exactly what sustainable trading looks like.\u0026rdquo;\ndr. r: \u0026ldquo;week 3 pullback didn\u0026rsquo;t derail you.\u0026rdquo;\nme: \u0026ldquo;nope. VIX spiked. conditions shifted. strategy adapted. i followed rules. week 4 recovered.\u0026rdquo;\ndr. r: \u0026ldquo;you\u0026rsquo;re not chasing april notable.\u0026rdquo;\nme: \u0026ldquo;can\u0026rsquo;t. april was outlier. conditions were perfect. june was normal. both acceptable.\u0026rdquo;\ndr. r: \u0026ldquo;that\u0026rsquo;s mature trading psychology.\u0026rdquo;\nexactly.\nliving with A. through june # 8 months living together.\njune variance:\nme stressed week 3 → she gave space.\nme calm weeks 1,2,4 → normal routine.\nrelationship stability:\ndoesn\u0026rsquo;t depend on trading performance.\nshe understands stress but doesn\u0026rsquo;t tie our relationship to my wins/losses.\nplaces list:\nstarted june: 18 places.\nending june: 19 places (birthday surprise coming july 4).\nrelationship + trading both working.\njuly preview # expectations:\nbirthday july 4 (taking day off, A. cooking).\nsummer months: typically VIX 14-18.\nif range holds: similar to june possible.\nrealistic outcomes:\nmodest month (+1% to +2%) - likely.\nflat month (+0% to +1%) - possible.\nlosing month (-1% to -3%) - acceptable.\nall within plan.\nytd already at target, no pressure.\ncomparing strong vs modest months 2024 # impressive (jan, apr):\ncombined: +$50,660 (+13.3%) avg VIX: 15.2 perfect conditions can\u0026rsquo;t sustain monthly modest/flat (feb, mar, may, jun):\ncombined: +$14,320 (+3.5%) avg VIX: 17.8 varied conditions sustainable long-term 2 impressive months carried year.\n4 modest months maintained discipline.\nboth necessary for annual target.\nwhat success looks like # june success:\nended positive despite week 3 pullback.\nmaintained discipline (no revenge trading).\ncircuit breaker worked (prevented disaster).\nrealistic expectations (modest achieved).\nnot exciting but sustainable.\ntonight (june 30, 10:58pm) # june done.\n+$8,320 (+1.97%).\n71% win rate.\n3 strong weeks, 1 pullback = variance.\ncircuit breaker prevented disaster week 3.\nfilters adapted correctly.\nytd +$64,980 (+17.7%).\nannual target exceeded in 6 months.\njuly begins tomorrow.\nbirthday july 4.\nrealistic expectations.\nexecute system.\naccept variance.\n10:58pm sunday. june wrap. +$8,320 (1.97%). 71% win rate across 38 trades. weekly pattern: +$2,040, +$3,180, +$340 (VIX spike pullback), +$2,760 (recovery). circuit breaker almost triggered week 3 - prevented sept 2023 style disaster. ytd +$64,980 (17.7%) exceeded annual target. H2 2024 can be mostly flat and still hit 15-18%. modest sustainable trading demonstrated.\n-AK\n","date":"30 June 2024","externalUrl":null,"permalink":"/posts/2024-06-30-june-wrap-modest-month-variance-demonstrated/","section":"Posts","summary":"\u003cp\u003ejune done.\u003c/p\u003e\n\u003cp\u003emodest month as expected.\u003c/p\u003e\n\u003cp\u003evariance demonstrated perfectly.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ejune final numbers \n    \u003cdiv id=\"june-final-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#june-final-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (june 1):\u003c/strong\u003e $422,860\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eending (june 30):\u003c/strong\u003e $431,180\u003c/p\u003e","title":"june wrap - modest month, variance demonstrated, discipline maintained","type":"posts"},{"content":"week 4 june done.\nrecovery from week 3 pullback.\nVIX normalized, back to optimal range.\nweek 4 trades (june 24-28) # monday 6/24: 2 trades, 2 wins. +$840\ntuesday 6/25: 3 trades, 2 wins. +$680\nwednesday 6/26: 2 trades, 2 wins. +$920\nthursday 6/27: 1 trade, 0 wins. -$460\nfriday 6/28: 2 trades, 2 wins. +$780\nweek total: 10 trades, 8 wins (80%). +$2,760\naccount status # june 21: $428,420\njune 28: $431,180\nweek 4: +$2,760 (+0.64%)\njune total (4 weeks): +$8,320 (+1.97%)\nytd: +$64,980 (+17.7%)\nmodest june complete.\nwhat changed from week 3 # VIX normalized:\nweek 3: avg 19.2\nweek 4: avg 16.4\nback in optimal range.\ncorrelation decreased:\nweek 3: 0.71\nweek 4: 0.52\nedge returned.\nregime stability:\nweek 3: 0.62\nweek 4: 0.81\nconfidence restored.\ncomparing four weeks june # week 1: +$2,040 (75% wr, VIX 16.8)\nweek 2: +$3,180 (80% wr, VIX 15.8)\nweek 3: +$340 (50% wr, VIX 19.2)\nweek 4: +$2,760 (80% wr, VIX 16.4)\ntotal: +$8,320 (+1.97%)\n3 good weeks, 1 pullback.\nnormal variance.\nslippage improvement # week 4: 1.8 ticks avg\nweek 3: 2.3 ticks\nweek 2: 1.7 ticks\nback to normal levels as vol decreased.\nrisk management # position size: $1,500 full size\ncircuit breaker: not triggered\nmax losing streak: 1 (thursday)\nfilters: 67% acceptance rate (back up from 42%)\nregime confidence: 0.81 avg\nall systems normal.\nstrategy performance # regime-adaptive mean reversion:\nlow vol (6 trades): 5 wins, 1 loss (83% wr)\nmedium vol (4 trades): 3 wins, 0 losses (100% wr)\nno high vol trades.\nstrategy correctly identified optimal conditions.\njune final vs projections # mid-month projection: +$9,200 to +$11,200\nactual: +$8,320\ndifference: -$880 to -$2,880 (week 3 pullback)\nstill positive modest month.\nacceptable outcome.\ncomparing to previous months 2024 # january: +$27,200 (+7.4%) - strong\nfebruary: +$1,400 (+0.36%) - flat\nmarch: +$1,100 (+0.28%) - testing\napril: +$23,460 (+5.9%) - notable\nmay: +$3,500 (+0.83%) - normal\njune: +$8,320 (+1.97%) - modest\npattern: 2 strong, 4 modest/flat.\nsustainable.\nytd analysis # ytd: +$64,980 (+17.7%)\ntarget: 15-18% annual\nabove target already.\nH2 2024 (6 months remaining):\ncan have:\n4-5 flat months (+0% to +1%) 1-2 losing months (-1% to -3%) still finish 15-18% annual.\nzero pressure rest of year.\nlessons from june # 1. variance is constant\nweeks 1-2 strong → week 3 pullback → week 4 recovery.\nnormal pattern.\n2. VIX range critical\nVIX 14-19 = thrive.\nVIX \u0026gt;20 = struggle.\ncan\u0026rsquo;t change VIX, can only execute when conditions align.\n3. filters prevent disasters\nweek 3: 42% acceptance prevented larger loss.\nweek 4: 67% acceptance captured recovery.\n4. modest is sustainable\n+1.97% month not exciting but consistent.\n2 notable months (jan, apr) can\u0026rsquo;t repeat monthly.\n5. psychological discipline\nweek 3 pullback didn\u0026rsquo;t trigger revenge trading.\nfollowed system, recovered week 4.\ntherapy reflection (6/24) # dr. r: \u0026ldquo;june wrapping up. +$8k modest month.\u0026rdquo;\nme: \u0026ldquo;yeah. 3 good weeks, 1 pullback. normal.\u0026rdquo;\ndr. r: \u0026ldquo;week 3 -$920 day didn\u0026rsquo;t spiral.\u0026rdquo;\nme: \u0026ldquo;nope. followed circuit breaker rules. paused. reviewed. came back calm.\u0026rdquo;\ndr. r: \u0026ldquo;and week 4 recovery?\u0026rdquo;\nme: \u0026ldquo;VIX normalized. conditions improved. executed system.\u0026rdquo;\ndr. r: \u0026ldquo;you\u0026rsquo;re accepting variance without fighting it.\u0026rdquo;\nme: \u0026ldquo;yeah. can\u0026rsquo;t control market. can control response.\u0026rdquo;\nexactly.\nliving with A. through june # june variance:\nweeks 1-2: strong performance, good mood.\nweek 3: pullback, more stressed.\nweek 4: recovery, calm again.\nA\u0026rsquo;s consistency:\ngave space when needed (week 3).\ncelebrated quietly when appropriate (weeks 1-2, 4).\ndidn\u0026rsquo;t make trading performance about our relationship.\nstable partner = stable psychology.\njuly preview # expectations:\nbirthday july 4 (taking day off).\nsummer months typically: VIX 14-18 range.\nif range holds: similar to june possible.\nrealistic outcomes:\nmodest month (+1% to +2%).\nflat month (+0% to +1%).\nlosing month (-1% to -3%).\nall acceptable.\nwhat success looks like # june success:\npreserved capital through week 3 pullback.\nrecovered week 4 when conditions improved.\nended month positive (+1.97%).\nmaintained discipline throughout.\nnot exciting but sustainable.\nthis is long-term algo trading.\ntonight # week 4 june.\n+$2,760.\n80% win rate.\njune total: +$8,320 (+1.97%).\nytd: +$64,980 (+17.7%).\n3 good weeks, 1 pullback = normal variance.\nmodest sustainable trading.\njuly begins tomorrow.\n3:22am monday. week 4 june complete. +$2,760 (0.64%). 80% win rate. VIX normalized 19.2→16.4 back in optimal range. june total +$8,320 (1.97%). 3 strong weeks, 1 pullback week = normal variance. ytd +17.7% above annual target. july begins with realistic expectations.\n-AK\n","date":"24 June 2024","externalUrl":null,"permalink":"/posts/2024-06-24-week-4-june-recovery-from-week-3-pullback/","section":"Posts","summary":"\u003cp\u003eweek 4 june done.\u003c/p\u003e\n\u003cp\u003erecovery from week 3 pullback.\u003c/p\u003e\n\u003cp\u003eVIX normalized, back to optimal range.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 4 trades (june 24-28) \n    \u003cdiv id=\"week-4-trades-june-24-28\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-4-trades-june-24-28\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003emonday 6/24:\u003c/strong\u003e 2 trades, 2 wins. +$840\u003c/p\u003e","title":"week 4 june - recovery from week 3 pullback, VIX normalized","type":"posts"},{"content":"july 4 coming up.\nturn 22.\ndifferent from last year.\nlast year (july 4, 2023) # turned 21.\nfirst birthday without parents (died dec 31, 2022).\ndating A. for 3 weeks (just met june 13).\naccount: ~$385k (down from $400k, still learning).\nliving alone.\nnumb most of the time.\nrough birthday.\nthis year (july 4, 2024) # turning 22.\nparents been gone 18.5 months.\nliving with A. for 8 months (moved in nov 1).\naccount: $428k (up $43k from last birthday).\nstrategies working.\nless numb, more occasional grief.\nbetter birthday.\nwhat A. asked (last night) # A.: \u0026ldquo;birthday in 2 weeks. want to do anything?\u0026rdquo;\nme: \u0026ldquo;not really. just another day.\u0026rdquo;\nA.: \u0026ldquo;it\u0026rsquo;s your first birthday living together.\u0026rdquo;\nme: \u0026ldquo;true.\u0026rdquo;\nA.: \u0026ldquo;want me to cook something special? invite people over? go somewhere?\u0026rdquo;\nme: \u0026ldquo;cook something. just us. no people.\u0026rdquo;\nA.: \u0026ldquo;okay. what food?\u0026rdquo;\nme: \u0026ldquo;surprise me. you\u0026rsquo;re good at that.\u0026rdquo;\nA.: \u0026ldquo;deal. and i\u0026rsquo;ll add a place to the list.\u0026rdquo;\nme: \u0026ldquo;\u0026hellip;where?\u0026rdquo;\nA.: \u0026ldquo;not telling. birthday surprise.\u0026rdquo;\nme: \u0026ldquo;you\u0026rsquo;re going to get us arrested.\u0026rdquo;\nA.: \u0026ldquo;probably not. maybe.\u0026rdquo;\ncomparing birthdays # 21 (last year):\nspent alone mostly.\nA. and i had been dating 3 weeks.\nshe offered to come over.\ni said no (wasn\u0026rsquo;t ready for that yet).\nate shitty takeout.\ncried about dad.\ntraded that day (lost $1,200).\n22 (this year):\nliving together 8 months.\nshe\u0026rsquo;s cooking.\nwon\u0026rsquo;t be alone.\nnot planning to trade (july 4 markets closed anyway).\nprobably won\u0026rsquo;t cry (maybe, can\u0026rsquo;t predict grief).\nimprovement.\nwhat dr. r said about birthdays (therapy 6/20) # me: \u0026ldquo;birthday coming up. july 4.\u0026rdquo;\ndr. r: \u0026ldquo;how do you feel about it?\u0026rdquo;\nme: \u0026ldquo;fine. just another day.\u0026rdquo;\ndr. r: \u0026ldquo;last year was hard. first birthday without parents.\u0026rdquo;\nme: \u0026ldquo;yeah. this year easier.\u0026rdquo;\ndr. r: \u0026ldquo;what\u0026rsquo;s different?\u0026rdquo;\nme: \u0026ldquo;not alone. A\u0026rsquo;s here. trading working. life more stable.\u0026rdquo;\ndr. r: \u0026ldquo;grief still present?\u0026rdquo;\nme: \u0026ldquo;yeah. but different. less constant. more occasional. like waves instead of drowning.\u0026rdquo;\ndr. r: \u0026ldquo;that\u0026rsquo;s healing.\u0026rdquo;\nme: \u0026ldquo;doesn\u0026rsquo;t feel healed.\u0026rdquo;\ndr. r: \u0026ldquo;healing isn\u0026rsquo;t forgetting. it\u0026rsquo;s learning to live with loss.\u0026rdquo;\nexactly.\nthe dad thought # dad\u0026rsquo;s birthday: march 18.\nmine: july 4.\nhe would\u0026rsquo;ve been 52 this year.\ni\u0026rsquo;m turning 22.\nhe died at 50.\nsometimes i think about what he\u0026rsquo;d say about:\nthe trading (probably proud but worried).\nthe money (definitely worried i\u0026rsquo;d blow it).\nA. (would\u0026rsquo;ve liked her - smart, independent, gives me space).\nliving together at 21 (probably concerned but supportive).\nthe server rack (would\u0026rsquo;ve loved the tech specs).\ncan\u0026rsquo;t know.\nhe\u0026rsquo;s gone.\nthat\u0026rsquo;s the reality.\nwhat\u0026rsquo;s actually different this year # last year:\nalone grieving constantly losing money trading no serious relationship uncertain about everything this year:\nliving with A. grieving occasionally making money trading serious committed relationship (first ever) more certain about strategy/life 18.5 months makes a difference.\nA\u0026rsquo;s perspective (asked her last week) # me: \u0026ldquo;how do you think i\u0026rsquo;m doing? compared to when we met.\u0026rdquo;\nA.: \u0026ldquo;way better.\u0026rdquo;\nme: \u0026ldquo;specific?\u0026rdquo;\nA.: \u0026ldquo;when we met you were pretty broken. grieving hard. uncertain about trading. kept planning exit strategy with me.\u0026rdquo;\nme: \u0026ldquo;and now?\u0026rdquo;\nA.: \u0026ldquo;you still grieve sometimes but you\u0026rsquo;re not drowning. trading is working. you stopped planning exits - i think you actually want me around long term.\u0026rdquo;\nme: \u0026ldquo;yeah.\u0026rdquo;\nA.: \u0026ldquo;that\u0026rsquo;s different. good different.\u0026rdquo;\nshe\u0026rsquo;s right.\nthe birthday plan (so far) # A\u0026rsquo;s cooking dinner.\njust us.\nno party (hate parties).\nno gifts (what the fuck would i want that i can\u0026rsquo;t buy).\njust:\ndinner.\nprobably sex (she mentioned \u0026ldquo;adding to the list\u0026rdquo;).\nmaybe watch fireworks from balcony.\nsimple.\nexactly what want.\nplaces list birthday addition # A. planning something.\nwon\u0026rsquo;t tell me where.\noptions i can think of:\nbeach at night (we\u0026rsquo;ve done this).\nsomewhere completely new.\nsomewhere semi-public and risky (her style).\nshe loves the risk.\ni pretend to be worried but actually love it too.\nwherever it is, list goes to 19.\nthe weird thing about july 4 # birthday on independence day.\nfireworks every year.\nas a kid: loved it (felt special).\nnow: weird (country celebrating, i\u0026rsquo;m just existing).\nthis year:\nA. will be here.\nnot alone.\nfireworks from balcony.\nmaybe feels different.\nwhat i won\u0026rsquo;t do # won\u0026rsquo;t:\ncheck trading accounts (markets closed anyway) think about money work on code optimize strategies review backtests will:\nbe present with A. eat good food probably have great sex maybe watch fireworks accept being 22 one day off.\ntonight # birthday july 4 approaching.\n22 years old.\nparents dead 18.5 months.\nliving with A. 8 months.\nlast year: alone, grieving constantly, losing money.\nthis year: together, grieving occasionally, making money.\n18.5 months difference.\nhealing doesn\u0026rsquo;t mean forgetting.\nmeans learning to live with loss.\n9:38pm saturday. birthday july 4 approaching (turn 22). last year first birthday without parents - alone, grieving constantly, losing money, 3 weeks dating A. this year - living together 8 months, grieving occasionally, account up $43k, serious relationship. A. cooking dinner, planning \u0026ldquo;list\u0026rdquo; addition (won\u0026rsquo;t tell me where). dr. r says healing = learning to live with loss not forgetting. taking july 4 off from trading/code. just being present.\n-AK\n","date":"22 June 2024","externalUrl":null,"permalink":"/posts/2024-06-22-birthday-approaching-21-to-22/","section":"Posts","summary":"\u003cp\u003ejuly 4 coming up.\u003c/p\u003e\n\u003cp\u003eturn 22.\u003c/p\u003e\n\u003cp\u003edifferent from last year.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003elast year (july 4, 2023) \n    \u003cdiv id=\"last-year-july-4-2023\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#last-year-july-4-2023\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003eturned 21.\u003c/p\u003e","title":"birthday approaching - 21 to 22, different year from last","type":"posts"},{"content":"week 3 june done.\nslight pullback.\nnormal variance after 2 strong weeks.\nweek 3 trades (june 17-21) # monday 6/17: 2 trades, 1 win. +$260\ntuesday 6/18: 3 trades, 2 wins. +$480\nwednesday 6/19: 2 trades, 0 wins. -$920\nthursday 6/20: 1 trade, 1 win. +$340\nfriday 6/21: 2 trades, 1 win. +$180\nweek total: 10 trades, 5 wins (50%). +$340\naccount status # june 14: $428,080\njune 21: $428,420\nweek 3: +$340 (+0.08%)\njune MTD (3 weeks): +$5,560 (+1.32%)\nytd: +$62,220 (+17.0%)\nbasically flat week.\nwhat changed # VIX spike:\nweek 2: avg 15.8\nweek 3: avg 19.2\nabove optimal range.\ncorrelation increase:\nweek 2: 0.48\nweek 3: 0.71\nedge reduced.\nregime stability:\nweek 2: 0.84\nweek 3: 0.62\nless confident signals.\nwednesday disaster # lost -$920 in 2 trades.\nwhat happened:\nVIX spiked to 23.4 midday.\ncorrelation jumped to 0.88.\nboth trades hit stops.\ncircuit breaker almost triggered.\nthreshold: 3 consecutive losses OR -$1,500 single day.\nwednesday: 2 losses, -$920.\ndidn\u0026rsquo;t hit threshold.\nbut got close.\ncomparing three weeks # week 1: +$2,040 (75% wr, VIX 16.8)\nweek 2: +$3,180 (80% wr, VIX 15.8)\nweek 3: +$340 (50% wr, VIX 19.2)\npattern clear:\nVIX \u0026lt;17 = crushing it.\nVIX \u0026gt;19 = struggling.\nstrategy is VIX-dependent.\nslippage impact # week 3: 2.3 ticks avg\nweek 2: 1.7 ticks\nweek 1: 1.9 ticks\nhigher vol = worse slippage.\nexactly as expected.\nrisk management # position size: $1,500 full size (maintained)\ncircuit breaker: not triggered (close call wednesday)\nmax losing streak: 2 (wednesday)\nfilters: 42% acceptance rate (reduced from 65%)\nregime confidence: 0.62 avg (down from 0.84)\nfilters working - prevented more damage.\nstrategy performance # regime-adaptive mean reversion:\nlow vol (2 trades): 2 wins, 0 losses (100% wr)\nmedium vol (5 trades): 3 wins, 2 losses (60% wr)\nhigh vol (3 trades): 0 wins, 3 losses (0% wr)\nhigh vol regime = brutal.\nstrategy correctly reduced trades.\nonly 3 attempts in high vol.\nprevented larger disaster.\njune projection update # 3 weeks complete: +$5,560\n1 week remaining\nrevised estimate:\nif VIX normalizes: week 4 +$1,500 to +$2,500\nif VIX stays elevated: week 4 flat to +$500\njune total estimate: +$7,000 to +$8,000 (+1.7% to +1.9%)\nlower than mid-month projection but acceptable.\ncomparing to expectations # mid-month projection: +$9,200 to +$11,200 for june\ncurrent pace: +$7,000 to +$8,000\ndifference: -$2,200 (week 3 pullback)\nstill positive month.\nmodest as expected.\nytd sustainability # ytd: +17.0%\ntarget: 15-18%\nslightly above target.\nif june ends +1.7% to +1.9%:\nstill within annual target range.\nrest of year can have:\n5 flat months.\n1 losing month.\nstill finish 15-18%.\nwhat\u0026rsquo;s working # 1. filters prevented disaster\n42% acceptance in week 3.\nstopped 58% of signals = capital preserved.\n2. circuit breaker discipline\ndidn\u0026rsquo;t panic after wednesday.\nfollowed rules.\n3. regime adaptation\nonly 3 trades attempted in high vol.\nstrategy recognized poor conditions.\n4. psychological stability\nweek 3 pullback didn\u0026rsquo;t trigger revenge trading.\ncalm execution maintained.\ntherapy session (6/17) # dr. r: \u0026ldquo;week 3 rough. wednesday -$920.\u0026rdquo;\nme: \u0026ldquo;yeah. VIX spiked. conditions shifted. strategy reduced trades. did its job.\u0026rdquo;\ndr. r: \u0026ldquo;you\u0026rsquo;re not upset?\u0026rdquo;\nme: \u0026ldquo;annoyed but not upset. can\u0026rsquo;t control VIX. can control response. followed system. week still positive.\u0026rdquo;\ndr. r: \u0026ldquo;mature psychology. last year you would\u0026rsquo;ve revenge traded.\u0026rdquo;\nme: \u0026ldquo;last year i lost $28k in one disaster. learned.\u0026rdquo;\nexactly.\nliving with A. through variance # week 3 trading stress higher.\nA\u0026rsquo;s response:\ntuesday night: \u0026ldquo;rough day?\u0026rdquo;\nme: \u0026ldquo;VIX spiking. reduced trades.\u0026rdquo;\nwednesday night: \u0026ldquo;worse?\u0026rdquo;\nme: \u0026ldquo;yeah. lost $920.\u0026rdquo;\nA.: \u0026ldquo;need space or want to talk?\u0026rdquo;\nme: \u0026ldquo;space.\u0026rdquo;\ngave me 2 hours alone at desk.\nthen came back, didn\u0026rsquo;t mention trading.\nexactly what needed.\nstable relationship = stable psychology.\nweek 4 expectations # VIX forecast: 17-20 range\nif forecast accurate:\nmedium vol regime.\nexpect 8-10 trades.\nwin rate 60-70%.\nweek 4 estimate: +$1,500 to +$2,500\nacceptable.\nlessons from week 3 # 1. variance is constant\n2 strong weeks → 1 pullback.\nnormal pattern.\n2. filters save capital\n42% acceptance prevented disaster.\n3. VIX \u0026gt;20 = struggle\nstrategy thrives VIX 14-19.\noutside range = reduced edge.\n4. circuit breaker clarity\nknowing exact threshold prevents panic.\nwednesday close call but followed rules.\n5. relationship stability helps trading\nA. giving space when needed = psychological edge.\ntonight # week 3 june.\n+$340.\n50% win rate.\nslight pullback after 2 strong weeks.\nVIX spike to 19.2 = struggle.\nfilters prevented larger disaster.\njune MTD: +$5,560 (1.32%).\nytd: +17.0%.\n1 week remaining.\n2:44am monday. week 3 june complete. +$340 (0.08%). 50% win rate. VIX spike 15.8→19.2 above optimal range. wednesday -$920 near circuit breaker threshold. filters reduced acceptance 65%→42% prevented disaster. june MTD +$5,560 (1.32%). week 4 forecast +$1.5k-2.5k if VIX normalizes.\n-AK\n","date":"17 June 2024","externalUrl":null,"permalink":"/posts/2024-06-17-week-3-june-slight-pullback-normal-variance/","section":"Posts","summary":"\u003cp\u003eweek 3 june done.\u003c/p\u003e\n\u003cp\u003eslight pullback.\u003c/p\u003e\n\u003cp\u003enormal variance after 2 strong weeks.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 3 trades (june 17-21) \n    \u003cdiv id=\"week-3-trades-june-17-21\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-3-trades-june-17-21\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003emonday 6/17:\u003c/strong\u003e 2 trades, 1 win. +$260\u003c/p\u003e","title":"week 3 june - slight pullback, normal variance after 2 strong weeks","type":"posts"},{"content":"half of june done.\non track for modest month.\nexactly as expected.\nfirst half june performance # week 1 (june 3-7): +$2,040\nweek 2 (june 10-14): +$3,180\ntotal (2 weeks): +$5,220 (+1.24%)\ntrades: 18\nwins: 14\nlosses: 4\nwin rate: 78%\naccount progression # june 1: $422,860\njune 14: $428,080\ngain: +$5,220\nytd: +$61,880 (+16.9%)\ncomparing to previous months 2024 # january (full month): +$27,200 (+7.4%) - standout\nfebruary (full month): +$1,400 (+0.36%) - flat\nmarch (full month): +$1,100 (+0.28%) - testing\napril (full month): +$23,460 (+5.9%) - standout\nmay (full month): +$3,500 (+0.83%) - normal\njune (half month): +$5,220 (+1.24%) - modest\njune already exceeded may with half month remaining.\nsecond half projection # current pace: +$2,600/week avg\nif pace continues:\nweek 3: +$2,000 to +$3,000\nweek 4: +$2,000 to +$3,000\njune total estimate: +$9,200 to +$11,200 (+2.2% to +2.6%)\nmodest month confirmed.\nmarket conditions first half # VIX range: 15-18\navg VIX: 16.3\nperfect range for mean reversion.\ncorrelation: 0.49 avg (low)\nregime stability: 0.82 (very stable)\nideal conditions.\nslippage tracking # week 1: 1.9 ticks\nweek 2: 1.7 ticks\nfirst half avg: 1.8 ticks\nchicago colo working.\napproaching april levels (1.7 ticks).\nstrategy performance # regime-adaptive mean reversion:\ntotal trades: 18\nlow vol: 12 trades (10 wins, 2 losses) - 83% wr\nmedium vol: 6 trades (4 wins, 2 losses) - 67% wr\nlow volatility regime = optimal conditions.\nstrategy succeeding.\nrisk management stats # position sizing: $1,500 full size (all trades)\ncircuit breaker: never triggered\nmax losing streak: 1 (happened 4x, stopped immediately)\nfilters: 64% acceptance rate\nregime confidence: 0.82 avg\nmax drawdown: -$680 (0.16%)\neverything within normal parameters.\ncomparing first half to expectations # expected: modest +$4,000 to +$6,000 (half month)\nactual: +$5,220\nexactly in expected range.\nno surprises.\nsustainable pace.\nytd analysis # ytd: +16.9% in 5.5 months\nannualized pace: ~37%\ntarget annual: 15-18%\nreality check:\nalready in target range.\nsecond half 2024 can be:\n4 flat months 2 modest months 1 losing month still finish 15-18% annual.\npressure: zero.\nwhat\u0026rsquo;s working # 1. strategy-market fit\ncurrent VIX range perfect for mean reversion.\n2. infrastructure reliability\nchicago colo zero outages.\nlatency 12ms consistent.\n3. psychological discipline\nnot chasing april standout.\naccepting modest as normal.\n4. personal stability\nliving with A. 7 months.\nroutine locked = calm execution.\nsecond half expectations # market forecast:\nVIX likely 15-19 range (summer typical).\nif holds: similar performance weeks 3-4.\nrisk scenarios:\nVIX spike \u0026gt;22 = reduce trades.\ncorrelation jump \u0026gt;0.7 = edge decreases.\nregime shift = circuit breaker may trigger.\nmost likely:\ncontinuation of modest trend.\nweek 3: +$2k to +$3k.\nweek 4: +$2k to +$3k.\nacceptable outcomes.\ncomparing to last year # june 2023:\nstill losing money.\ntesting strategies.\nsmall position sizes.\nemotional trading.\njune 2024:\nprofitable.\nstrategies validated.\nfull position size.\ndisciplined execution.\n1 year transformation.\nlessons from first half june # 1. consistency \u0026gt; standout\n2 weeks of modest gains = sustainable.\n1 week of standout = often followed by mean reversion.\n2. conditions matter\nVIX 15-18 = perfect for my strategy.\ncan\u0026rsquo;t force wins outside this range.\n3. infrastructure pays off\nchicago colo slippage 1.8 ticks.\nsan diego was 2.4 ticks.\n$180/month saves more in slippage.\n4. realistic expectations prevent disappointment\nexpected modest.\ngot modest.\nsatisfied.\npsychological edge.\ntonight # mid-june wrap.\nfirst half: +$5,220 (1.24%).\n78% win rate across 18 trades.\nsecond half projection: +$4k to +$6k.\njune total estimate: +$9k to +$11k (2.2% to 2.6%).\nytd +16.9%.\nmodest sustainable trading.\nexecute system.\naccept variance.\n11:47pm friday. mid-june wrap. first half +$5,220 (1.24%). 78% win rate, 18 trades. VIX 15-18 optimal. second half projection +$4k-6k, june total estimate +$9k-11k (2.2-2.6%). already exceeded may with half month left. ytd +16.9% in target range. modest sustainable pace maintained.\n-AK\n","date":"14 June 2024","externalUrl":null,"permalink":"/posts/2024-06-14-mid-june-wrap-half-month-review/","section":"Posts","summary":"\u003cp\u003ehalf of june done.\u003c/p\u003e\n\u003cp\u003eon track for modest month.\u003c/p\u003e\n\u003cp\u003eexactly as expected.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003efirst half june performance \n    \u003cdiv id=\"first-half-june-performance\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#first-half-june-performance\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eweek 1 (june 3-7):\u003c/strong\u003e +$2,040\u003c/p\u003e","title":"mid-june wrap - first half review, on track for modest month","type":"posts"},{"content":"","date":"12 June 2024","externalUrl":null,"permalink":"/tags/strategy-development/","section":"Tags","summary":"","title":"Strategy-Development","type":"tags"},{"content":"overfitting = #1 way algos fail in production.\nbacktest looks amazing.\nlive trading implodes.\nwalk-forward optimization prevents this.\nbeen discussing validation techniques on NexusFi algo trading threads and walk-forward is the gold standard.\nthe overfitting problem # what most traders do:\noptimize parameters on full dataset get amazing backtest results deploy to production strategy fails immediately why it fails:\nparameters perfectly fit historical noise.\nnoise doesn\u0026rsquo;t repeat in future.\nstrategy was curve-fit to past, not sound.\nwalk-forward optimization explained # concept:\nsplit time into periods.\noptimize on training period.\ntest on out-of-sample period.\nroll forward.\nrepeat.\nif strategy works on ALL out-of-sample periods:\nprobably reliable.\nif strategy only works on in-sample:\noverfitted garbage.\nmy implementation # import pandas as pd import numpy as np from datetime import datetime, timedelta from typing import Dict, List, Tuple import itertools from dataclasses import dataclass import json @dataclass class WalkForwardConfig: \u0026#34;\u0026#34;\u0026#34; Configuration for walk-forward optimization \u0026#34;\u0026#34;\u0026#34; in_sample_days: int = 180 # 6 months training out_sample_days: int = 60 # 2 months testing step_days: int = 30 # Roll forward 1 month at a time min_trades: int = 20 # Minimum trades per period # Parameter ranges to optimize param_ranges: Dict[str, List] = None # Metrics for optimization primary_metric: str = \u0026#39;sharpe_ratio\u0026#39; # What to maximize min_sharpe: float = 1.0 # Minimum acceptable max_drawdown: float = 0.15 # Maximum acceptable (15%) class Strategy: \u0026#34;\u0026#34;\u0026#34; Example mean reversion strategy \u0026#34;\u0026#34;\u0026#34; def __init__(self, lookback: int, entry_threshold: float, exit_threshold: float): self.lookback = lookback self.entry_threshold = entry_threshold self.exit_threshold = exit_threshold def generate_signals(self, prices: pd.Series) -\u0026gt; pd.Series: \u0026#34;\u0026#34;\u0026#34; Generate trading signals Returns: Series of 1 (long), -1 (short), 0 (flat) \u0026#34;\u0026#34;\u0026#34; # Calculate z-score rolling_mean = prices.rolling(window=self.lookback).mean() rolling_std = prices.rolling(window=self.lookback).std() zscore = (prices - rolling_mean) / rolling_std # Generate signals signals = pd.Series(0, index=prices.index) # Entry: price far from mean signals[zscore \u0026lt; -self.entry_threshold] = 1 # Long when oversold signals[zscore \u0026gt; self.entry_threshold] = -1 # Short when overbought # Exit: price returns to mean signals[abs(zscore) \u0026lt; self.exit_threshold] = 0 # Forward fill to maintain positions signals = signals.replace(0, np.nan).ffill().fillna(0) return signals class PerformanceMetrics: \u0026#34;\u0026#34;\u0026#34; Calculate strategy performance metrics \u0026#34;\u0026#34;\u0026#34; @staticmethod def calculate_returns(prices: pd.Series, signals: pd.Series) -\u0026gt; pd.Series: \u0026#34;\u0026#34;\u0026#34; Calculate strategy returns from prices and signals \u0026#34;\u0026#34;\u0026#34; # Daily returns daily_returns = prices.pct_change() # Strategy returns = signal × next day\u0026#39;s return strategy_returns = signals.shift(1) * daily_returns return strategy_returns.dropna() @staticmethod def sharpe_ratio(returns: pd.Series, risk_free_rate: float = 0.0) -\u0026gt; float: \u0026#34;\u0026#34;\u0026#34; Annualized Sharpe ratio \u0026#34;\u0026#34;\u0026#34; if len(returns) == 0 or returns.std() == 0: return 0.0 excess_returns = returns - risk_free_rate / 252 sharpe = np.sqrt(252) * excess_returns.mean() / excess_returns.std() return sharpe @staticmethod def max_drawdown(returns: pd.Series) -\u0026gt; float: \u0026#34;\u0026#34;\u0026#34; Maximum drawdown from peak \u0026#34;\u0026#34;\u0026#34; if len(returns) == 0: return 0.0 cumulative = (1 + returns).cumprod() running_max = cumulative.expanding().max() drawdown = (cumulative - running_max) / running_max return abs(drawdown.min()) @staticmethod def win_rate(returns: pd.Series) -\u0026gt; float: \u0026#34;\u0026#34;\u0026#34; Percentage of positive return days \u0026#34;\u0026#34;\u0026#34; if len(returns) == 0: return 0.0 winning_days = (returns \u0026gt; 0).sum() total_days = len(returns[returns != 0]) return winning_days / total_days if total_days \u0026gt; 0 else 0.0 @staticmethod def profit_factor(returns: pd.Series) -\u0026gt; float: \u0026#34;\u0026#34;\u0026#34; Ratio of gross profit to gross loss \u0026#34;\u0026#34;\u0026#34; wins = returns[returns \u0026gt; 0].sum() losses = abs(returns[returns \u0026lt; 0].sum()) return wins / losses if losses != 0 else 0.0 class WalkForwardOptimizer: \u0026#34;\u0026#34;\u0026#34; Walk-forward optimization framework \u0026#34;\u0026#34;\u0026#34; def __init__(self, config: WalkForwardConfig): self.config = config self.results = [] def generate_parameter_combinations(self) -\u0026gt; List[Dict]: \u0026#34;\u0026#34;\u0026#34; Generate all parameter combinations to test \u0026#34;\u0026#34;\u0026#34; if self.config.param_ranges is None: raise ValueError(\u0026#34;param_ranges not configured\u0026#34;) # Get all possible combinations keys = self.config.param_ranges.keys() values = self.config.param_ranges.values() combinations = [] for combo in itertools.product(*values): param_dict = dict(zip(keys, combo)) combinations.append(param_dict) return combinations def split_data(self, data: pd.DataFrame, start_date: datetime) -\u0026gt; Tuple[pd.DataFrame, pd.DataFrame]: \u0026#34;\u0026#34;\u0026#34; Split data into in-sample and out-of-sample periods \u0026#34;\u0026#34;\u0026#34; in_sample_end = start_date + timedelta(days=self.config.in_sample_days) out_sample_end = in_sample_end + timedelta(days=self.config.out_sample_days) in_sample = data[(data.index \u0026gt;= start_date) \u0026amp; (data.index \u0026lt; in_sample_end)] out_sample = data[(data.index \u0026gt;= in_sample_end) \u0026amp; (data.index \u0026lt; out_sample_end)] return in_sample, out_sample def optimize_period(self, in_sample: pd.DataFrame, out_sample: pd.DataFrame) -\u0026gt; Dict: \u0026#34;\u0026#34;\u0026#34; Optimize on in-sample, validate on out-of-sample \u0026#34;\u0026#34;\u0026#34; param_combinations = self.generate_parameter_combinations() best_in_sample = None best_params = None best_sharpe = -999 # Test all parameter combinations on in-sample for params in param_combinations: strategy = Strategy(**params) signals = strategy.generate_signals(in_sample[\u0026#39;close\u0026#39;]) returns = PerformanceMetrics.calculate_returns(in_sample[\u0026#39;close\u0026#39;], signals) if len(returns) \u0026lt; self.config.min_trades: continue sharpe = PerformanceMetrics.sharpe_ratio(returns) max_dd = PerformanceMetrics.max_drawdown(returns) # Check constraints if sharpe \u0026lt; self.config.min_sharpe: continue if max_dd \u0026gt; self.config.max_drawdown: continue # Track best if sharpe \u0026gt; best_sharpe: best_sharpe = sharpe best_params = params best_in_sample = { \u0026#39;sharpe\u0026#39;: sharpe, \u0026#39;max_dd\u0026#39;: max_dd, \u0026#39;win_rate\u0026#39;: PerformanceMetrics.win_rate(returns), \u0026#39;profit_factor\u0026#39;: PerformanceMetrics.profit_factor(returns), \u0026#39;trades\u0026#39;: len(returns[returns != 0]) } if best_params is None: return None # Test best parameters on out-of-sample strategy = Strategy(**best_params) signals = strategy.generate_signals(out_sample[\u0026#39;close\u0026#39;]) returns = PerformanceMetrics.calculate_returns(out_sample[\u0026#39;close\u0026#39;], signals) out_sample_metrics = { \u0026#39;sharpe\u0026#39;: PerformanceMetrics.sharpe_ratio(returns), \u0026#39;max_dd\u0026#39;: PerformanceMetrics.max_drawdown(returns), \u0026#39;win_rate\u0026#39;: PerformanceMetrics.win_rate(returns), \u0026#39;profit_factor\u0026#39;: PerformanceMetrics.profit_factor(returns), \u0026#39;trades\u0026#39;: len(returns[returns != 0]) } return { \u0026#39;params\u0026#39;: best_params, \u0026#39;in_sample\u0026#39;: best_in_sample, \u0026#39;out_sample\u0026#39;: out_sample_metrics, \u0026#39;in_sample_start\u0026#39;: in_sample.index[0], \u0026#39;in_sample_end\u0026#39;: in_sample.index[-1], \u0026#39;out_sample_start\u0026#39;: out_sample.index[0], \u0026#39;out_sample_end\u0026#39;: out_sample.index[-1] } def run(self, data: pd.DataFrame) -\u0026gt; List[Dict]: \u0026#34;\u0026#34;\u0026#34; Run full walk-forward optimization \u0026#34;\u0026#34;\u0026#34; current_date = data.index[0] end_date = data.index[-1] results = [] while current_date \u0026lt; end_date: # Split data in_sample, out_sample = self.split_data(data, current_date) if len(in_sample) == 0 or len(out_sample) == 0: break # Optimize this period result = self.optimize_period(in_sample, out_sample) if result is not None: results.append(result) # Roll forward current_date += timedelta(days=self.config.step_days) self.results = results return results def analyze_results(self) -\u0026gt; Dict: \u0026#34;\u0026#34;\u0026#34; Analyze walk-forward results \u0026#34;\u0026#34;\u0026#34; if len(self.results) == 0: return None # Extract out-of-sample metrics oos_sharpes = [r[\u0026#39;out_sample\u0026#39;][\u0026#39;sharpe\u0026#39;] for r in self.results] oos_max_dds = [r[\u0026#39;out_sample\u0026#39;][\u0026#39;max_dd\u0026#39;] for r in self.results] oos_win_rates = [r[\u0026#39;out_sample\u0026#39;][\u0026#39;win_rate\u0026#39;] for r in self.results] # Calculate degradation (in-sample vs out-sample) is_sharpes = [r[\u0026#39;in_sample\u0026#39;][\u0026#39;sharpe\u0026#39;] for r in self.results] degradation = [(is_s - oos_s) / is_s for is_s, oos_s in zip(is_sharpes, oos_sharpes)] analysis = { \u0026#39;num_periods\u0026#39;: len(self.results), \u0026#39;avg_oos_sharpe\u0026#39;: np.mean(oos_sharpes), \u0026#39;median_oos_sharpe\u0026#39;: np.median(oos_sharpes), \u0026#39;avg_oos_max_dd\u0026#39;: np.mean(oos_max_dds), \u0026#39;avg_oos_win_rate\u0026#39;: np.mean(oos_win_rates), \u0026#39;avg_degradation\u0026#39;: np.mean(degradation), \u0026#39;periods_profitable\u0026#39;: sum(1 for s in oos_sharpes if s \u0026gt; 0), \u0026#39;consistency\u0026#39;: sum(1 for s in oos_sharpes if s \u0026gt; self.config.min_sharpe) / len(oos_sharpes) } return analysis def export_results(self, filename: str): \u0026#34;\u0026#34;\u0026#34; Export results to JSON \u0026#34;\u0026#34;\u0026#34; # Convert datetime objects to strings exportable = [] for result in self.results: r = result.copy() r[\u0026#39;in_sample_start\u0026#39;] = str(r[\u0026#39;in_sample_start\u0026#39;]) r[\u0026#39;in_sample_end\u0026#39;] = str(r[\u0026#39;in_sample_end\u0026#39;]) r[\u0026#39;out_sample_start\u0026#39;] = str(r[\u0026#39;out_sample_start\u0026#39;]) r[\u0026#39;out_sample_end\u0026#39;] = str(r[\u0026#39;out_sample_end\u0026#39;]) exportable.append(r) with open(filename, \u0026#39;w\u0026#39;) as f: json.dump({ \u0026#39;config\u0026#39;: { \u0026#39;in_sample_days\u0026#39;: self.config.in_sample_days, \u0026#39;out_sample_days\u0026#39;: self.config.out_sample_days, \u0026#39;step_days\u0026#39;: self.config.step_days, \u0026#39;param_ranges\u0026#39;: self.config.param_ranges }, \u0026#39;results\u0026#39;: exportable, \u0026#39;analysis\u0026#39;: self.analyze_results() }, f, indent=2) # Example usage if __name__ == \u0026#34;__main__\u0026#34;: # Load data (example with random data) dates = pd.date_range(\u0026#39;2022-01-01\u0026#39;, \u0026#39;2024-06-12\u0026#39;, freq=\u0026#39;D\u0026#39;) prices = pd.DataFrame({ \u0026#39;close\u0026#39;: 100 * (1 + np.random.randn(len(dates)).cumsum() * 0.01) }, index=dates) # Configure walk-forward config = WalkForwardConfig( in_sample_days=180, out_sample_days=60, step_days=30, param_ranges={ \u0026#39;lookback\u0026#39;: [10, 20, 30, 40, 50], \u0026#39;entry_threshold\u0026#39;: [1.5, 2.0, 2.5, 3.0], \u0026#39;exit_threshold\u0026#39;: [0.25, 0.5, 0.75, 1.0] }, primary_metric=\u0026#39;sharpe_ratio\u0026#39;, min_sharpe=1.0, max_drawdown=0.15 ) # Run optimization optimizer = WalkForwardOptimizer(config) results = optimizer.run(prices) # Analyze analysis = optimizer.analyze_results() print(\u0026#34;Walk-Forward Results:\u0026#34;) print(f\u0026#34;Periods tested: {analysis[\u0026#39;num_periods\u0026#39;]}\u0026#34;) print(f\u0026#34;Avg OOS Sharpe: {analysis[\u0026#39;avg_oos_sharpe\u0026#39;]:.2f}\u0026#34;) print(f\u0026#34;Median OOS Sharpe: {analysis[\u0026#39;median_oos_sharpe\u0026#39;]:.2f}\u0026#34;) print(f\u0026#34;Avg OOS Max DD: {analysis[\u0026#39;avg_oos_max_dd\u0026#39;]:.1%}\u0026#34;) print(f\u0026#34;Avg Degradation: {analysis[\u0026#39;avg_degradation\u0026#39;]:.1%}\u0026#34;) print(f\u0026#34;Consistency: {analysis[\u0026#39;consistency\u0026#39;]:.1%}\u0026#34;) # Export optimizer.export_results(\u0026#39;walk_forward_results.json\u0026#39;) my real parameters # current strategy:\nlookback: 20 days\nentry threshold: 2.0 std\nexit threshold: 0.5 std\nhow i found these:\nwalk-forward optimization 2023-2024.\ntested 5×4×4 = 80 combinations per period.\n21 periods total (rolling 1 month).\n1,680 backtests to find sturdy parameters.\nresults from my optimization # in-sample performance:\navg sharpe: 2.4\navg max dd: 8%\navg win rate: 68%\nout-of-sample performance:\navg sharpe: 1.8\navg max dd: 12%\navg win rate: 62%\ndegradation: 25%\nthis is acceptable.\noverfitted strategy would show 50-80% degradation.\nkey lessons # 1. degradation is normal\nout-of-sample always worse than in-sample.\n25-35% degradation = reliable.\n50%+ degradation = overfitted.\n2. consistency matters more than peak performance\nstrategy that works 80% of periods \u0026gt; strategy that crushes 1 period.\n3. constraints prevent overfitting\nmin sharpe 1.0 + max dd 15% filters garbage.\n4. rolling forward reveals regime changes\nparameters that work 2022 might fail 2024.\nwalk-forward catches this.\n5. more data ≠ better\n6 months in-sample adequate.\n2+ years in-sample = overfitting risk.\ncommon mistakes # mistake 1: optimizing on full dataset\nfinds parameters that fit noise.\nfails in production.\nmistake 2: cherry-picking good periods\nonly testing bull market data.\nstrategy fails when regime shifts.\nmistake 3: too many parameters\ntesting 10+ parameters = infinite combinations.\noverfitting guaranteed.\nmistake 4: ignoring degradation\naccepting 60% sharpe drop in-sample → out-sample.\nstrategy will fail.\nmistake 5: no minimum thresholds\naccepting sharpe 0.5 or max dd 40%.\ngarbage in, garbage out.\nwhat i actually use # optimization frequency: quarterly\nparameter ranges: narrow (3-5 values per param)\nmetrics: sharpe + max dd + win rate\nthresholds: sharpe \u0026gt;1.0, max dd \u0026lt;15%, win rate \u0026gt;55%\nvalidation: 21 rolling periods minimum\ndeployment: only if 75%+ periods pass thresholds\ntonight # walk-forward optimization.\nprevents overfitting.\n180 days in-sample, 60 days out-sample, roll forward 30 days.\n80 parameter combinations per period.\n21 periods = 1,680 backtests.\nfound strong parameters: lookback 20, entry 2.0, exit 0.5.\nout-of-sample sharpe 1.8, max dd 12%, win rate 62%.\n25% degradation acceptable.\nthis is how you build strategies that work in production.\n2:53am wednesday. walk-forward optimization framework. prevents overfitting by testing on rolling out-of-sample periods. my strategy: 180d in-sample, 60d out-sample, 30d step. tested 80 param combinations × 21 periods = 1,680 backtests. current params (lookback 20, entry 2.0, exit 0.5) show 25% degradation in-sample → out-sample. acceptable. consistency across periods \u0026gt; peak performance in one period.\n-AK\n","date":"12 June 2024","externalUrl":null,"permalink":"/posts/2024-06-12-walk-forward-optimization-avoiding-overfitting/","section":"Posts","summary":"\u003cp\u003eoverfitting = #1 way algos fail in production.\u003c/p\u003e\n\u003cp\u003ebacktest looks amazing.\u003c/p\u003e\n\u003cp\u003elive trading implodes.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ewalk-forward optimization prevents this.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003ebeen discussing validation techniques on \u003ca\n  href=\"https://nexusfi.com/showthread.php?t=46621\"\n    target=\"_blank\"\n  \u003eNexusFi algo trading threads\u003c/a\u003e and walk-forward is the gold standard.\u003c/p\u003e","title":"walk-forward optimization - how i avoid overfitting my strategies","type":"posts"},{"content":"week 2 june done.\ncontinuing modest trend.\nstable conditions = consistent execution.\nweek 2 trades (june 10-14) # monday 6/10: 2 trades, 2 wins. +$920\ntuesday 6/11: 3 trades, 2 wins. +$680\nwednesday 6/12: 1 trade, 1 win. +$460\nthursday 6/13: 2 trades, 1 win. +$340\nfriday 6/14: 2 trades, 2 wins. +$780\nweek total: 10 trades, 8 wins (80%). +$3,180\naccount status # june 7: $424,900\njune 14: $428,080\nweek 2: +$3,180 (+0.75%)\njune MTD (2 weeks): +$5,220 (+1.24%)\nytd: +$61,880 (+16.9%)\napproaching 17% ytd.\ncomparing two weeks # week 1: +$2,040 (75% wr, 8 trades)\nweek 2: +$3,180 (80% wr, 10 trades)\nimprovement but still modest.\nboth weeks positive.\nsustainable pace.\nmarket conditions # VIX: 15-17 range\navg VIX: 15.8\nperfect for mean reversion.\ncorrelation: 0.48 (low)\nregime stability: 0.84 (very stable)\nideal conditions continuing.\nslippage improvement # week 2: 1.7 ticks avg\nweek 1: 1.9 ticks\nimprovement as volume decreases.\nchicago colo paying off.\nstrategy breakdown # regime-adaptive mean reversion:\nlow vol (7 trades): 6 wins, 1 loss (86% wr)\nmedium vol (3 trades): 2 wins, 1 loss (67% wr)\nlow vol regime dominating.\nexactly where strategy thrives.\nrisk management # position size: $1,500 full size\ncircuit breaker: not triggered\nmax losing streak: 1 (happened 2x)\nfilters: 65% acceptance rate\nregime confidence: 0.84 avg\neverything normal.\njune projection # 2 weeks complete: +$5,220\n2 weeks remaining\nif pattern continues:\nweek 3: +$2,000 to +$3,000\nweek 4: +$2,000 to +$3,000\njune total estimate: +$9,200 to +$11,200 (+2.2% to +2.6%)\nmodest month as expected.\nytd sustainability # current ytd: +16.9%\nannual target: 15-18%\nalready in target range.\nrest of year:\n7 months remaining.\ncan have:\n4 flat months 2 modest months 1 losing month still finish 15-18% annual.\nzero pressure.\ncomparing to may # may total: +$3,500 (+0.83%)\njune MTD (2 weeks): +$5,220 (+1.24%)\njune already exceeded may.\nwith 2 weeks remaining.\nnormal variance.\nwhat\u0026rsquo;s working # 1. stable market regime\nVIX 15-17 perfect for strategy.\n2. chicago latency\n1.7 tick avg slippage = excellent.\n3. filter discipline\n65% acceptance = not forcing trades.\n4. psychological stability\nliving with A. = routine = calm execution.\nwhat could go wrong # potential risks:\nVIX spike \u0026gt;22 (would reduce trades)\ncorrelation increase \u0026gt;0.7 (reduces edge)\nregime shift (would trigger circuit breaker)\nnone currently present.\nmonitoring daily.\ntherapy session (6/10) # dr. r: \u0026ldquo;june going well. +5k in 2 weeks.\u0026rdquo;\nme: \u0026ldquo;yeah. modest but consistent.\u0026rdquo;\ndr. r: \u0026ldquo;how\u0026rsquo;s stress level?\u0026rdquo;\nme: \u0026ldquo;low. conditions good. no pressure to match april. already hit annual target.\u0026rdquo;\ndr. r: \u0026ldquo;and relationship?\u0026rdquo;\nme: \u0026ldquo;7 months living together. routine locked. works great.\u0026rdquo;\ndr. r: \u0026ldquo;sex life still good?\u0026rdquo;\nme: \u0026ldquo;yeah. 18 places on the list. she keeps finding new spots.\u0026rdquo;\ndr. r: shifts in chair again\nme: \u0026ldquo;you good?\u0026rdquo;\ndr. r: \u0026ldquo;yes. just\u0026hellip; that\u0026rsquo;s adventurous.\u0026rdquo;\nshe\u0026rsquo;s definitely turned on when we talk about this.\nA. and i both notice it.\nwe find it funny.\nweek 3 expectations # similar to weeks 1-2.\nmodest gains if conditions hold.\nVIX forecast: 14-18 range.\nif forecast accurate:\nweek 3 should be +$2k to +$3k.\nacceptable.\ntonight # week 2 june.\n+$3,180.\n80% win rate.\njune MTD: +$5,220 (1.24%).\nytd: +16.9%.\nmodest sustainable trading.\n2 weeks remaining.\n3:18am monday. week 2 june complete. +$3,180 (0.75%). 80% win rate across 10 trades. june MTD +$5,220 (1.24%) already exceeded may total. VIX 15-17 optimal range. ytd +16.9% in target. week 3 similar expectations. sustainable pace maintained.\n-AK\n","date":"10 June 2024","externalUrl":null,"permalink":"/posts/2024-06-10-week-2-june-continuing-modest-trend/","section":"Posts","summary":"\u003cp\u003eweek 2 june done.\u003c/p\u003e\n\u003cp\u003econtinuing modest trend.\u003c/p\u003e\n\u003cp\u003estable conditions = consistent execution.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 2 trades (june 10-14) \n    \u003cdiv id=\"week-2-trades-june-10-14\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-2-trades-june-10-14\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003emonday 6/10:\u003c/strong\u003e 2 trades, 2 wins. +$920\u003c/p\u003e","title":"week 2 june - continuing modest trend, conditions stable","type":"posts"},{"content":"living with A. 7 months now.\nroutine completely locked.\nworks perfectly.\nthe daily schedule # 10:00am: wake up\nboth night owls.\ntrading algorithms run 24/7.\ni check overnight performance over coffee.\n10:30am: breakfast together\nA. cooks (she\u0026rsquo;s good at it).\ni clean up after.\n11:00am-6:00pm: separate work time\nme: monitoring algos, tweaking code, backtesting\nher: python dev work for her company\nseparate desks across room.\nher desk by window (she likes natural light).\nmy desk against wall (triple monitors, no glare).\n7:00pm: dinner together\nshe cooks again (tries to get me to try new shit).\ni\u0026rsquo;m picky AF.\nsometimes she uses sex as reward for trying new foods.\nusually works.\n8:00pm-11:00pm: together time\ncouch, tv, talking, fucking, whatever.\n11:00pm-3:00am: my solo work time\nshe goes to bed.\ni review trading day, optimize strategies, write code.\nthis routine = 7 months straight.\nzero deviation.\nworks.\nwhat\u0026rsquo;s actually different from living alone # good stuff:\nbreakfast/dinner together = structure\nsomeone notices if i\u0026rsquo;m stressed about trading\nsex whenever (no planning, no logistics)\nher cooking \u0026gt; my microwaved bullshit\nfriction:\nher mess vs my OCD organization\nbathroom schedule (she takes forever)\ncoffee mug territorialism (we each have \u0026ldquo;our\u0026rdquo; mugs, don\u0026rsquo;t touch the other\u0026rsquo;s)\nher loud music when cooking drives me insane\nthe coffee mug thing # this is real:\ni have 1 mug. black, plain, perfect size.\nshe has 1 mug. white with some design, smaller.\nrules (unspoken but enforced):\ndon\u0026rsquo;t use the other person\u0026rsquo;s mug.\nhappened twice:\nmarch: i used her mug (mine was dirty, didn\u0026rsquo;t feel like washing).\nshe gave me shit for 2 days.\nmay: she used mine (same excuse).\ni was annoyed but tried to be chill.\nnow we just wash our own mugs immediately.\nstupid territorial bullshit.\nbut it matters somehow.\nworkspace separation works # her desk (corner by window):\nmacbook pro single monitor plants coffee cup always there papers everywhere (drives me insane) my desk (against wall):\ntriple 27\u0026quot; monitors custom PC workstation perfectly organized cables managed zero clutter we don\u0026rsquo;t look at each other during work.\nperfect.\nshe codes in silence or with headphones.\ni code in silence.\nboth productive.\nsex life still incredible # 7 months in, still best either of us has had.\nwhat makes it work:\ncomplete honesty about wants/fantasies/limits.\nno shame.\ntotal trust.\nshe takes charge (decides when/where).\nplaces list update:\nnow at 18 places.\nrecent additions:\ntarget dressing room (she was quieter this time) parking garage downtown her company office (late friday night) goal: 50 by end of year.\ncurrently: 18.\npace: on track.\ntherapy insights (6/5 session) # dr. r: \u0026ldquo;7 months living together. how\u0026rsquo;s it going?\u0026rdquo;\nme: \u0026ldquo;good. routine locked. works.\u0026rdquo;\ndr. r: \u0026ldquo;any friction?\u0026rdquo;\nme: \u0026ldquo;coffee mug thing. her mess. bathroom schedule. normal shit.\u0026rdquo;\ndr. r: \u0026ldquo;how do you handle it?\u0026rdquo;\nme: \u0026ldquo;talk about it. compromise. mostly she compromises because i\u0026rsquo;m more OCD.\u0026rdquo;\ndr. r: \u0026ldquo;and sex life?\u0026rdquo;\nme: \u0026ldquo;still incredible. 18 places on the list now.\u0026rdquo;\ndr. r: shifts in chair \u0026ldquo;you two are very\u0026hellip; adventurous.\u0026rdquo;\nme: \u0026ldquo;yeah. works for us.\u0026rdquo;\ndr. r seemed turned on by details again.\nboth A. and i notice when she does that.\nit\u0026rsquo;s whatever.\nthe breakfast routine # A\u0026rsquo;s rule: try one new thing per week.\nthis week: shakshuka (eggs in tomato sauce, middle eastern thing).\nme: \u0026ldquo;looks weird.\u0026rdquo;\nA.: \u0026ldquo;try it or no head today.\u0026rdquo;\nme: tries it\nme: \u0026ldquo;\u0026hellip;actually good.\u0026rdquo;\nA.: \u0026ldquo;told you. bedroom, now.\u0026rdquo;\nthis is how she gets me to try new foods.\n100% effective strategy.\nwhat surprised me about living together # expected: loss of freedom, feeling trapped\nreality: more freedom (no logistics for seeing each other)\nexpected: constant fighting over space\nreality: separate workspaces solved it\nexpected: sex life would decrease\nreality: better and more frequent (convenience + comfort)\nexpected: i\u0026rsquo;d want my own place back\nreality: this works way better than alone\nthe \u0026ldquo;i love you\u0026rdquo; thing # first said it october 2023.\n7 months ago.\nstill say it daily.\nusually:\nmorning when waking up.\nleaving apartment (rare, we\u0026rsquo;re both home 90% of time).\nbefore bed.\nsometimes random:\nafter great sex.\nwhen she does something thoughtful.\nwhen i\u0026rsquo;m coding and she brings coffee without asking.\nfeels natural.\nnot performative.\njust true.\ncomparing to previous relationships # before A:\nlongest relationship: 4 months (M., early 2023)\nusual duration: 6-8 weeks\npattern: player lifestyle, got bored, moved on\nphysical descriptions: always focused on that\nactual connection: minimal\nwith A:\nduration: 11 months total (7 living together)\npattern: first relationship i\u0026rsquo;m not planning exit\nconnection: actually care about her beyond sex\nphysical: still hot AF (blonde, fit, great tits) but that\u0026rsquo;s not why it works\ndifference: she doesn\u0026rsquo;t chase, so i don\u0026rsquo;t run.\nwhat dr. r says about us # 6/5 session continued:\ndr. r: \u0026ldquo;this is secure attachment. rare for you.\u0026rdquo;\nme: \u0026ldquo;what\u0026rsquo;s that mean?\u0026rdquo;\ndr. r: \u0026ldquo;you usually have avoidant patterns. run when things get close. A. doesn\u0026rsquo;t trigger that.\u0026rdquo;\nme: \u0026ldquo;why?\u0026rdquo;\ndr. r: \u0026ldquo;she gives you space. doesn\u0026rsquo;t need constant attention. comfortable with silence. understands your work. holds you when you need it but doesn\u0026rsquo;t smother.\u0026rdquo;\nme: \u0026ldquo;yeah. that\u0026rsquo;s exactly it.\u0026rdquo;\ndr. r: \u0026ldquo;keep doing what you\u0026rsquo;re doing.\u0026rdquo;\nthe trading stress factor # when i lose money:\nbefore A.: spiraled alone, revenge traded, made it worse\nwith A.: she notices, asks if i want to talk or be alone, respects answer\nwhen i make money:\nbefore A.: celebrated alone or with random girls (shallow)\nwith A.: she\u0026rsquo;s genuinely happy, understands what the win means\nhaving someone who gets it = huge.\nshe\u0026rsquo;s not a trader but understands stress.\nhelps.\nthe friday alone time rule # A\u0026rsquo;s request (started march):\nfriday nights she needs alone time.\nher explanation:\n\u0026ldquo;i love you. living together is great. but i need 4 hours per week completely alone. friday 8pm-12am is mine. you go to your desk, i do whatever i want. no interaction.\u0026rdquo;\nmy response: \u0026ldquo;okay.\u0026rdquo;\nwhat she does:\nwatches shows i don\u0026rsquo;t care about.\ncalls her friends.\ndoes her own thing.\nwhat i do:\ncode at my desk.\ntrade review.\noptimize strategies.\nworks perfectly.\neveryone needs alone time.\neven when living together.\nbathroom schedule solved # problem: she takes 45 minutes every morning.\nsolution: i use bathroom first (10 minutes), then she has it.\ncompromise: she wakes up 15 minutes earlier to accommodate.\nbeen working since april.\ncommunication \u0026gt; fighting.\ntonight # 7 months living together.\nroutine locked: breakfast 10:30am, separate work, dinner 7pm, together time evening, she sleeps 11pm, i code until 3am.\ncoffee mug territorialism = real.\nworkspace separation = essential.\nsex life = still incredible (18 places).\nfriday alone time = her rule, works great.\nthis is sustainable.\nfirst relationship i\u0026rsquo;m not planning exit.\n10:15pm saturday. living together 7 months review. routine completely locked - breakfast together, separate work desks, dinner together, her bedtime 11pm / my code time until 3am. coffee mug territorialism. friday alone time rule (her request, works perfectly). sex life incredible (18 places list, goal 50 by year end). dr. r says secure attachment, rare for me. not planning exit strategy for first time.\n-AK\n","date":"8 June 2024","externalUrl":null,"permalink":"/posts/2024-06-08-seven-months-routine-locked/","section":"Posts","summary":"\u003cp\u003eliving with A. 7 months now.\u003c/p\u003e\n\u003cp\u003eroutine completely locked.\u003c/p\u003e\n\u003cp\u003eworks perfectly.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe daily schedule \n    \u003cdiv id=\"the-daily-schedule\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-daily-schedule\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e10:00am:\u003c/strong\u003e wake up\u003c/p\u003e","title":"seven months living together - routine locked, works perfectly","type":"posts"},{"content":"moved execution server to chicago colo march 2024.\n3 months data in.\nlatency dropped 67ms → 12ms average.\nwhy chicago # CME exchange location: chicago\nmy location: san diego\nproblem: 67ms average latency san diego → CME\nsolution: colocation in chicago = 12ms\n55ms improvement = better fills.\nthe cost breakdown # datacenter: equinix CH1 (chicago)\nmonthly: $175/month\nbreakdown:\nrack space (1U): $85 power (200W): $45 bandwidth (100mbps): $35 remote hands: $10 total annual: $2,100\nsan diego electricity cost: $18/month\nnet increase: $157/month ($1,884/year)\nthe server # hardware: dell poweredge r240\nbought used on ebay: $800\nspecs:\nintel xeon e-2224 (4 cores, 3.4ghz) 32gb ecc ram 2x 500gb ssd (raid 1) dual gigabit ethernet remote management (idrac) shipped to datacenter direct.\ndatacenter racked it ($50 one-time).\nlatency comparison # before (san diego home):\navg latency: 67ms\np50: 65ms\np95: 89ms\np99: 124ms\nafter (chicago colo):\navg latency: 12ms\np50: 11ms\np95: 18ms\np99: 26ms\nimprovement: 55ms average (82% reduction)\nreal trading impact # slippage improvement:\nsan diego avg: 2.4 ticks\nchicago avg: 1.8 ticks\n0.6 tick improvement = $180/month on current volume.\nROI: $180/month saves \u0026gt; $157/month cost\nnet positive after 1 year.\npython monitoring setup # import asyncio import time import statistics from datetime import datetime import redis class LatencyMonitor: \u0026#34;\u0026#34;\u0026#34; Monitor execution latency to exchanges Track p50, p95, p99 over rolling windows \u0026#34;\u0026#34;\u0026#34; def __init__(self, redis_client): self.redis = redis_client self.latencies = [] self.window_size = 1000 # Rolling window async def ping_exchange(self, exchange_url): \u0026#34;\u0026#34;\u0026#34; Measure round-trip time to exchange \u0026#34;\u0026#34;\u0026#34; start = time.perf_counter() # Send minimal request async with aiohttp.ClientSession() as session: try: async with session.get( exchange_url, timeout=aiohttp.ClientTimeout(total=5) ) as response: await response.text() end = time.perf_counter() latency_ms = (end - start) * 1000 return latency_ms except Exception as e: print(f\u0026#34;Ping failed: {e}\u0026#34;) return None def add_latency(self, latency_ms): \u0026#34;\u0026#34;\u0026#34; Add latency measurement to rolling window \u0026#34;\u0026#34;\u0026#34; self.latencies.append(latency_ms) # Keep only recent measurements if len(self.latencies) \u0026gt; self.window_size: self.latencies.pop(0) # Store in Redis for Grafana self.redis.lpush(\u0026#39;latency_measurements\u0026#39;, latency_ms) self.redis.ltrim(\u0026#39;latency_measurements\u0026#39;, 0, self.window_size - 1) def get_stats(self): \u0026#34;\u0026#34;\u0026#34; Calculate latency statistics \u0026#34;\u0026#34;\u0026#34; if not self.latencies: return None sorted_latencies = sorted(self.latencies) n = len(sorted_latencies) stats = { \u0026#39;avg\u0026#39;: statistics.mean(self.latencies), \u0026#39;median\u0026#39;: statistics.median(self.latencies), \u0026#39;p50\u0026#39;: sorted_latencies[int(n * 0.50)], \u0026#39;p95\u0026#39;: sorted_latencies[int(n * 0.95)], \u0026#39;p99\u0026#39;: sorted_latencies[int(n * 0.99)], \u0026#39;min\u0026#39;: min(self.latencies), \u0026#39;max\u0026#39;: max(self.latencies), \u0026#39;count\u0026#39;: n } return stats async def monitor_loop(self, exchange_url, interval_seconds=60): \u0026#34;\u0026#34;\u0026#34; Continuous monitoring loop \u0026#34;\u0026#34;\u0026#34; while True: latency = await self.ping_exchange(exchange_url) if latency: self.add_latency(latency) stats = self.get_stats() print(f\u0026#34;{datetime.now().isoformat()}\u0026#34;) print(f\u0026#34;Latency: {latency:.2f}ms\u0026#34;) print(f\u0026#34;Avg: {stats[\u0026#39;avg\u0026#39;]:.2f}ms\u0026#34;) print(f\u0026#34;P95: {stats[\u0026#39;p95\u0026#39;]:.2f}ms\u0026#34;) print(f\u0026#34;P99: {stats[\u0026#39;p99\u0026#39;]:.2f}ms\u0026#34;) print(\u0026#34;---\u0026#34;) await asyncio.sleep(interval_seconds) # Usage redis_client = redis.Redis(host=\u0026#39;localhost\u0026#39;, port=6379, db=0) monitor = LatencyMonitor(redis_client) # Monitor CME latency every minute asyncio.run( monitor.monitor_loop( exchange_url=\u0026#39;https://cme.com/api/health\u0026#39;, interval_seconds=60 ) ) this runs 24/7 on chicago server.\ngrafana dashboard shows real-time latency.\nnetwork path comparison # san diego path:\nhome → ISP → internet backbone → chicago → CME\nhops: 18\nlatency: 67ms avg\nchicago colo path:\ndatacenter → local exchange → CME\nhops: 4\nlatency: 12ms avg\nfewer hops = lower latency.\nreliability improvement # san diego (home internet):\nuptime: 99.2% (comcast)\noutages in 2023: 6 times\nlongest outage: 4 hours\nchicago colo:\nuptime: 99.95% (equinix SLA)\noutages since march: 0\ndatacenter power + network \u0026gt; home internet.\nremote management # idrac (dell remote management):\nKVM over IP remote power cycling BIOS access OS installation monitoring (temps, fans, power) accessed from san diego.\nfeels like server is local.\nnever needed \u0026ldquo;remote hands\u0026rdquo; service yet.\nsecurity setup # firewall rules:\nonly allow:\nmy home IP (ssh, idrac) exchange IPs (trading) monitoring (grafana cloud) everything else blocked.\nVPN required for emergency access.\n2FA on all logins.\nbandwidth usage # allocated: 100mbps\nactual usage: 8-12mbps avg\nspikes: 40mbps during high vol\nplenty of headroom.\n100mbps adequate for my volume.\npower consumption # measured: 180W avg\nallocated: 200W\ncost: $45/month for 200W\nefficient server = lower cost.\ncomparing to cloud (aws) # aws equivalent:\nc6i.xlarge in us-east-1 (closest to chicago):\n4 vcpu 8gb ram $140/month (3yr reserved) network: $50/month estimate total: $190/month equinix colo:\ndedicated hardware better latency $175/month colo wins on performance + cost.\nlessons learned # 1. location matters for futures\nCME in chicago = chicago colo optimal.\n2. latency compounds\n55ms × 30 trades/month = 1.65 seconds saved.\nbetter fills add up.\n3. remote management essential\nidrac saved 3 trips to chicago.\nworth the hardware cost.\n4. bandwidth overprovisioning\n100mbps allocated, using 12mbps.\nheadroom for growth.\n5. datacenter reliability\nzero outages in 3 months.\nhome internet = 2 outages in same period.\nROI calculation # costs:\ncolo: $157/month net increase\nserver: $800 one-time (amortized $22/month over 3 years)\ntotal: $179/month\nbenefits:\nslippage improvement: $180/month\nreliability: $0 measured (but prevented 2 missed trading days)\nnet: $1/month positive\nbarely break-even on slippage alone.\nreliability value hard to quantify.\nworth it for serious trading.\nwhen NOT to use colo # don\u0026rsquo;t use colo if:\ntrading \u0026lt;10 times per month (latency doesn\u0026rsquo;t matter)\nswing trading or longer holds (seconds don\u0026rsquo;t matter)\naccount \u0026lt;$100k (cost not justified)\nno remote management experience (learning curve steep)\ntesting strategies (home is fine)\ncolo for serious automation only.\nwhat NexusFi traders say # found great infrastructure thread on NexusFi discussing colo vs cloud vs home.\nconsensus: colo for futures, cloud for stocks/options, home for testing.\nmatches my experience exactly.\nfuture upgrades # considering:\ndual servers (active/standby failover)\n10gbps network upgrade\nchicago CH2 datacenter (even closer to CME)\ncurrent setup adequate.\nnot upgrading unless volume 10x.\ntonight # chicago colocation.\n67ms → 12ms latency.\n0.6 tick slippage improvement.\n$157/month for reliability + speed.\nworth it for serious algo trading.\n11:42pm thursday. chicago colocation 3 months review. latency 67ms → 12ms (82% reduction). slippage improved 0.6 ticks = $180/month savings. colo cost $157/month net increase. barely break-even but reliability + speed worth it. zero outages vs 2 at home. dedicated hardware beats cloud for futures.\n-AK\n","date":"6 June 2024","externalUrl":null,"permalink":"/posts/2024-06-06-chicago-colocation-latency-improvements/","section":"Posts","summary":"\u003cp\u003emoved execution server to chicago colo march 2024.\u003c/p\u003e\n\u003cp\u003e3 months data in.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003elatency dropped 67ms → 12ms average.\u003c/strong\u003e\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ewhy chicago \n    \u003cdiv id=\"why-chicago\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#why-chicago\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eCME exchange location:\u003c/strong\u003e chicago\u003c/p\u003e","title":"chicago colocation - 67ms to 12ms latency improvement, worth the cost","type":"posts"},{"content":"week 1 june done.\nmodest start.\nexactly what expected after may flat.\nweek 1 trades (june 3-7) # monday 6/3: no trades (memorial day)\ntuesday 6/4: 3 trades, 2 wins. +$740\nwednesday 6/5: 2 trades, 1 win. +$280\nthursday 6/6: 2 trades, 2 wins. +$680\nfriday 6/7: 1 trade, 1 win. +$340\nweek total: 8 trades, 6 wins (75%). +$2,040\naccount status # june 1: $422,860\njune 7: $424,900\nweek 1: +$2,040 (+0.48%)\nytd: +$58,700 (+16.0%)\ncrossed 16% ytd.\nmarket conditions # VIX range: 16-18\navg VIX: 16.8\noptimal range for my strategy.\ncorrelation: 0.51 avg (moderate)\nregime stability: 0.79 (stable)\nconditions good but not significant.\ncomparing to may # may week 1: +$80 (0.02%)\njune week 1: +$2,040 (0.48%)\nimprovement but still modest.\nboth acceptable.\nslippage tracking # june week 1: 1.9 ticks avg\napril avg: 1.7 ticks\nmay avg: 2.0 ticks\nslight improvement from may.\nconditions matter.\nrisk management # position size: $1,500 (full size)\ncircuit breaker: not triggered\nfilters: 62% acceptance rate\nregime confidence: 0.79 avg\nmax drawdown: -$420 (0.1%)\nall systems normal.\nstrategy performance # regime-adaptive mean reversion:\nlow vol (5 trades): 4 wins, 1 loss (80% wr)\nmedium vol (3 trades): 2 wins, 1 loss (67% wr)\nstrategy working as designed.\nexpectations vs reality # expected: modest week (+$800 to +$1,600)\nactual: +$2,040\nslightly above expectation.\nnot impressive, not struggling.\nnormal variance.\nytd sustainability check # ytd: +16.0% in 5 months\ntarget: 15-18% annual\nalready exceeded low end.\nrest of year pressure: zero.\njune-december can be:\n4-5 flat months 2-3 modest months 1-2 losing months still finish 15-18%.\nwhat\u0026rsquo;s working # 1. circuit breaker protocol\nsaved account in may week 3.\npsychological safety net in place.\n2. regime adaptation\nstrategy adjusts to VIX automatically.\nno manual intervention needed.\n3. realistic expectations\nmay flat after april strong = accepted.\njune modest = also accepted.\n4. stable personal life\nliving with A. 7 months.\nroutine locked.\ntherapy check-in (6/3) # dr. r: \u0026ldquo;june starting. how do you feel about may flat?\u0026rdquo;\nme: \u0026ldquo;fine. expected it.\u0026rdquo;\ndr. r: \u0026ldquo;and june so far?\u0026rdquo;\nme: \u0026ldquo;week 1 modest. +$2k. normal.\u0026rdquo;\ndr. r: \u0026ldquo;you\u0026rsquo;re not chasing april strong.\u0026rdquo;\nme: \u0026ldquo;can\u0026rsquo;t force wins. conditions dictate results. my job is execute system, accept outcomes.\u0026rdquo;\ndr. r: \u0026ldquo;that\u0026rsquo;s mature psychology.\u0026rdquo;\nexactly.\nweek 2 preview # expectations:\nsimilar to week 1.\nmodest gains or flat acceptable.\nfocus:\nexecute system.\nfollow filters.\npreserve capital.\nno pressure.\ntonight # week 1 june.\n+$2,040.\n75% win rate.\nmodest start = realistic trading.\nytd 16%.\nexecute system.\naccept variance.\n2:31am monday. week 1 june complete. +$2,040 (0.48%). 75% win rate across 8 trades. VIX 16-18 optimal range. ytd +16.0% exceeded annual target. june modest expectations maintained. week 2 begins tomorrow.\n-AK\n","date":"3 June 2024","externalUrl":null,"permalink":"/posts/2024-06-03-week-1-june-modest-start/","section":"Posts","summary":"\u003cp\u003eweek 1 june done.\u003c/p\u003e\n\u003cp\u003emodest start.\u003c/p\u003e\n\u003cp\u003eexactly what expected after may flat.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 1 trades (june 3-7) \n    \u003cdiv id=\"week-1-trades-june-3-7\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-1-trades-june-3-7\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003emonday 6/3:\u003c/strong\u003e no trades (memorial day)\u003c/p\u003e","title":"week 1 june - modest start, realistic expectations after may flat","type":"posts"},{"content":"may done.\nflat month after strong april.\nvariance accepted.\nmay final numbers # starting (may 1): $419,360\nending (may 31): $422,860\nmay gain: +$3,500 (+0.83%)\ntrades: 30\nwins: 19\nlosses: 11\nwin rate: 63%\nFigure 1: May weekly performance showing variance after strong April. Week 1 flat start (+$80, 44% wr), Week 2 recovery (+$1,100, 67% wr), Week 3 FIRST LOSING WEEK 2024 (-$1,000, 25% wr - circuit breaker triggered), Week 4 recovery (+$3,320, 73% wr). Month ended +$3,500 (+0.83%). Demonstrates realistic algo trading variance.\nweekly breakdown # Figure 2: VIX correlation with trading performance throughout May. Week 1-2 high VIX (avg 21.8) with aggressive filtering = modest gains. Week 3 VIX spike to 28.4 = losing week, circuit breaker activated. Week 4 VIX normalized to 17.2 = strong recovery. Strategy thrives in VIX 14-19 range (shaded green zone). Performance directly correlated to volatility regime.\nweek 1 (flat start): +$80, 44% win rate, 9 trades\nweek 2 (survival mode): +$1,100, 67% win rate, 6 trades\nweek 3 (circuit breaker): -$1,000, 25% win rate, 4 trades\nweek 4 (recovery): +$3,320, 73% win rate, 11 trades\n3 of 4 weeks positive.\n1 losing week = normal variance.\ncomparing to april # april 2024:\npnl: +$23,460 (+5.9%) trades: 53 win rate: 74% conditions: ideal (VIX 14-19) may 2024:\npnl: +$3,500 (+0.83%) trades: 30 win rate: 63% conditions: challenging (VIX 17-28) difference: -$19,960 (-5.07%)\nmassive variance but both acceptable.\nytd 2024 progress # Figure 3: Year-to-date 2024 monthly progression. January impressive (+$27,200, 7.4%), February flat (+$1,400, 0.36%), March testing (+$1,100, 0.28%), April impressive (+$23,460, 5.9%), May normal (+$3,500, 0.83%). YTD total +$56,660 (+15.4%). Pattern shows 2 standout months, 3 flat/normal months = sustainable algo trading. Annual target 15-18% already achieved in 5 months.\njanuary: +$27,200 (+7.4%) - notable\nfebruary: +$1,400 (+0.36%) - flat\nmarch: +$1,100 (+0.28%) - testing\napril: +$23,460 (+5.9%) - strong\nmay: +$3,500 (+0.83%) - normal\nytd total: +$56,660 (+15.4%)\nstarting balance (jan 1): $366,200\ncurrent balance (may 31): $422,860\nannual target achieved # ytd: +15.4% in 5 months\nannual target: +15-18%\nalready hit low end of target.\nrest of year (7 months) can be:\n4-5 flat months (+0% to +1%) 2-3 modest months (+1% to +2%) 1-2 losing months (-1% to -3%) still finish 15-18% annual.\nno pressure.\ncircuit breaker performance # week 3 losses:\nmonday: -$880 (2 trades)\ntuesday: -$540 (1 trade)\ntotal: -$1,420 (3 consecutive losses)\ncircuit breaker triggered.\npaused: wednesday-thursday\nresumed: friday (+$420)\nprevented potential spiral.\ncomparing to sept 2023:\nsept: no circuit breaker = $28k disaster\nmay: with circuit breaker = $1,420 contained\n20x better outcome.\nrisk management stats # position sizing:\nweeks 1-3: $900-1,200 (reduced for high vol) week 4: $1,500 (full size restored) circuit breaker: triggered once (worked perfectly)\nmax drawdown: -$1,420 (0.3%)\nfilters: 40% acceptance rate (aggressive during high vol)\nregime confidence avg: 0.67 (lower due to volatility)\nmarket conditions # VIX range: 17-28 (high volatility)\navg VIX: 21.4 (above optimal 14-19)\ncorrelation: 0.68 avg (high)\nregime stability: 0.58 avg (choppy)\nmy strategy needs:\nVIX: 14-19 (stable low-medium vol)\ncorrelation: \u0026lt;0.6 (diversification)\nregime stability: \u0026gt;0.75 (confidence)\nmay didn\u0026rsquo;t provide ideal conditions.\nslippage tracking # april avg: 1.7 ticks\nmay avg: 2.0 ticks\nslippage worse in higher vol.\nweek 3 (VIX 28): 2.6 ticks\nweek 4 (VIX 17): 1.8 ticks\ndirectly correlated to volatility.\nlessons from may # 1. variance is normal\napril notable won\u0026rsquo;t repeat monthly.\nmay flat = healthy correction.\n2. circuit breakers save accounts\nprevented $28k-style disaster.\n$1,420 loss contained.\n3. conditions dictate results\nVIX \u0026gt;22 = struggle.\nVIX 14-19 = thrive.\ncan\u0026rsquo;t force wins in wrong environment.\n4. aggressive filtering works\nweek 2: 6 trades, 67% wr, +$1,100.\nquality \u0026gt; quantity in high vol.\n5. discipline compounds\nno revenge trading week 3.\ncalm return week 4.\npsychological growth evident.\ncomparing to 2023 # may 2023:\nstill learning losing money testing strategies emotional trading may 2024:\nstrategies validated modest gain circuit breaker followed disciplined execution 1 year transformation.\ntherapy reflection (5/23) # dr. r: \u0026ldquo;may flat after april standout. how do you feel?\u0026rdquo;\nme: \u0026ldquo;fine. expected variance.\u0026rdquo;\ndr. r: \u0026ldquo;what about the losing week?\u0026rdquo;\nme: \u0026ldquo;circuit breaker worked. paused, reviewed, returned calmly. lost $1,400 instead of potential $28k.\u0026rdquo;\ndr. r: \u0026ldquo;you\u0026rsquo;re accepting reality instead of fighting it.\u0026rdquo;\nme: \u0026ldquo;yeah. can\u0026rsquo;t control market. can control response. may flat is normal. april impressive was outlier.\u0026rdquo;\ndr. r: \u0026ldquo;that\u0026rsquo;s mature trading psychology. most traders can\u0026rsquo;t accept losing weeks.\u0026rdquo;\nexactly.\nliving with A. through variance # may trading volatile.\nA\u0026rsquo;s response:\nweek 1 struggles: supportive.\nweek 3 losses: \u0026ldquo;good you\u0026rsquo;re following rules.\u0026rdquo;\nweek 4 recovery: \u0026ldquo;you seem calmer.\u0026rdquo;\nstable relationship = stable psychology.\nliving together 6.5 months.\nworks.\njune preview # expectations:\nmay showed normal variance.\njune likely similar:\nmodest month (+1% to +2%) - possible flat month (+0% to +1%) - likely losing month (-1% to -3%) - acceptable ytd 15.4% = already at target.\njune can be anything.\nno pressure.\nwhat success looks like # may success:\nsurvived high vol month.\ncircuit breaker prevented disaster.\nended positive despite losing week.\ndiscipline maintained.\nthat\u0026rsquo;s sustainable algo trading.\ntonight (may 31, 11:18pm) # may done.\n+$3,500 (+0.83%).\n63% win rate.\napril impressive followed by may normal.\nvariance accepted.\ncircuit breaker worked.\ndiscipline maintained.\nytd +15.4%.\njune begins tomorrow.\nrealistic expectations.\nexecute system.\naccept variance.\n11:18pm may 31. may wrap. +$3,500 (0.83%). 63% win rate across 30 trades. first losing week 2024 (week 3), circuit breaker triggered and followed. april +5.9%, may +0.83% = normal variance. ytd +$56,660 (15.4%) hit annual target. sustainable trading demonstrated. june begins with realistic expectations.\n-AK\n","date":"26 May 2024","externalUrl":null,"permalink":"/posts/2024-05-26-may-wrap-variance-accepted-discipline-maintained/","section":"Posts","summary":"\u003cp\u003emay done.\u003c/p\u003e\n\u003cp\u003eflat month after strong april.\u003c/p\u003e\n\u003cp\u003evariance accepted.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003emay final numbers \n    \u003cdiv id=\"may-final-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#may-final-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (may 1):\u003c/strong\u003e $419,360\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eending (may 31):\u003c/strong\u003e $422,860\u003c/p\u003e","title":"may wrap - variance accepted, discipline maintained after april high","type":"posts"},{"content":"mall during the day is dead.\nghost town.\nA. made it into a game.\nthe discovery (2 weeks ago) # saturday afternoon.\nneeded new jeans.\nmall basically empty.\nA.: \u0026ldquo;look around. no one here.\u0026rdquo;\nme: \u0026ldquo;yeah. everyone shops online now.\u0026rdquo;\nA.: \u0026ldquo;list?\u0026rdquo;\nme: \u0026ldquo;\u0026hellip;here? now?\u0026rdquo;\nA.: \u0026ldquo;why not? dressing room. perfect.\u0026rdquo;\nme: \u0026ldquo;you\u0026rsquo;re serious.\u0026rdquo;\nA.: \u0026ldquo;completely.\u0026rdquo;\ngame started.\ndressing room 1: nordstrom # 2 weeks ago, saturday 2pm.\nshe picked jeans she didn\u0026rsquo;t need.\ngrabbed 3 different sizes.\ndressing room attendant barely looked up.\nhanded her the tag, pointed to rooms.\ninside:\nlocked door.\nshe was already unbuttoning her jeans.\nme: \u0026ldquo;seriously doing this?\u0026rdquo;\nA.: \u0026ldquo;shut up and fuck me.\u0026rdquo;\n10 minutes later.\nwalked out.\nshe hung the jeans back up.\n\u0026ldquo;didn\u0026rsquo;t fit.\u0026rdquo;\nattendant didn\u0026rsquo;t even look.\nplaces list: +1.\nthe rules A. made up # her game:\nweekday afternoons only (dead hours) different stores each time have to actually try on something can\u0026rsquo;t get caught i keep telling her she\u0026rsquo;s too loud.\nshe doesn\u0026rsquo;t care.\ndressing room 2: gap (last week) # thursday 3pm.\neven more dead than nordstrom.\nA. grabbed random dress.\ndifferent attendant.\nhanded tag, pointed to corner room.\ninside:\nshe was facing the mirror.\ni was behind her.\nboth watching.\nshe started moaning.\nme: \u0026ldquo;shhh, you\u0026rsquo;re too loud.\u0026rdquo;\nA.: \u0026ldquo;don\u0026rsquo;t care.\u0026rdquo;\nlouder.\nfinished fast.\nworried someone heard.\nwalked out.\nattendant on phone, didn\u0026rsquo;t notice.\nplaces list: +2.\nthe close call: macy\u0026rsquo;s (yesterday) # monday 4pm.\nA. wanted to go for #3.\nmacy\u0026rsquo;s seemed empty.\ngrabbed shirt she didn\u0026rsquo;t need.\nattendant: older woman, looked bored.\ntook tag, pointed to rooms.\ninside:\nA. was already stripping.\npressed against wall.\nstarted.\nshe\u0026rsquo;s moaning again.\nme: \u0026ldquo;seriously, you\u0026rsquo;re so fucking loud.\u0026rdquo;\nA.: \u0026ldquo;good.\u0026rdquo;\n5 minutes in:\nfootsteps outside.\nstopped.\nlistened.\nfootsteps went away.\ncontinued.\nshe came, LOUD.\ni came right after.\ngetting dressed:\nheard walkie-talkie static outside.\nattendant voice: \u0026ldquo;\u0026hellip;yeah in the dressing room\u0026hellip;\u0026rdquo;\nA.: \u0026ldquo;fuck. we need to go.\u0026rdquo;\nme: \u0026ldquo;right now.\u0026rdquo;\nopened door.\nattendant at counter, looking at us.\non walkie-talkie.\ndefinitely calling security.\nwe walked fast.\nnot running (too obvious).\nstraight to exit.\nA.: \u0026ldquo;that was close.\u0026rdquo;\nme: \u0026ldquo;i TOLD you you\u0026rsquo;re too loud.\u0026rdquo;\nA.: \u0026ldquo;worth it.\u0026rdquo;\nplaces list: +3.\nalso: probably banned from macy\u0026rsquo;s.\nwhy the mall works # ghost town during weekdays:\n2-5pm = nobody there.\nretail dying.\nstores desperate for any customers.\nattendants don\u0026rsquo;t give a fuck.\nuntil macy\u0026rsquo;s apparently.\nA\u0026rsquo;s perspective # later that night:\nme: \u0026ldquo;macy\u0026rsquo;s lady definitely knew.\u0026rdquo;\nA.: \u0026ldquo;yeah. probably should\u0026rsquo;ve been quieter.\u0026rdquo;\nme: \u0026ldquo;i keep SAYING that.\u0026rdquo;\nA.: \u0026ldquo;can\u0026rsquo;t help it. you know that.\u0026rdquo;\nme: \u0026ldquo;we almost got arrested for public indecency.\u0026rdquo;\nA.: \u0026ldquo;but we didn\u0026rsquo;t. that\u0026rsquo;s what matters.\u0026rdquo;\nme: \u0026ldquo;you\u0026rsquo;re insane.\u0026rdquo;\nA.: \u0026ldquo;you love it.\u0026rdquo;\n\u0026hellip;yeah.\nthe places list count # updated total:\napartment (everywhere), her old office, beach parking lot, gym bathroom, shower, balcony (3x different positions), kitchen counter, my trading desk, car (2x), mall dressing rooms (3 stores).\nwe\u0026rsquo;re at like 15+ places now.\nher goal: 50 by end of year.\nmy goal: not getting arrested.\nwhat this says about us # completely open.\nno shame about sex.\nfantasies discussed.\nlimits respected.\ntrust.\nshe takes charge (decides when/where).\ni love that she does.\nadventure.\nkeeps it exciting.\nnever boring.\nnever routine.\nthe ban risk # macy\u0026rsquo;s: probably flagged, don\u0026rsquo;t go back\nnordstrom: safe (attendant oblivious)\ngap: safe (attendant didn\u0026rsquo;t notice)\nstill available:\ntarget, old navy, h\u0026amp;m, forever 21, zara, uniqlo, maybe 10+ more stores.\ngame continues.\ntherapy won\u0026rsquo;t hear about this # dr. r asks about sex life sometimes.\nthis seems\u0026hellip; too much to share.\nshe\u0026rsquo;d probably be concerned about legal risk.\nor find it hilarious.\nhard to tell with her.\nkeeping this one private.\ntonight (11:42pm) # sitting on couch.\nA. coding.\nme: \u0026ldquo;we\u0026rsquo;re not doing macy\u0026rsquo;s again.\u0026rdquo;\nA.: \u0026ldquo;agreed. next time target.\u0026rdquo;\nme: \u0026ldquo;\u0026hellip;there\u0026rsquo;s a next time?\u0026rdquo;\nA.: \u0026ldquo;obviously. game\u0026rsquo;s not done.\u0026rdquo;\nme: \u0026ldquo;you\u0026rsquo;re going to get us arrested.\u0026rdquo;\nA.: \u0026ldquo;i\u0026rsquo;ll be quieter.\u0026rdquo;\nme: \u0026ldquo;you say that every time.\u0026rdquo;\nA.: \u0026ldquo;this time i mean it.\u0026rdquo;\nme: \u0026ldquo;sure.\u0026rdquo;\nshe\u0026rsquo;s not going to be quieter.\ni don\u0026rsquo;t actually want her to be.\n11:42pm tuesday. mall dressing room game. 3 stores so far. macy\u0026rsquo;s attendant definitely knew, probably calling security, we ran. A. too loud (as always). places list now 15+, her goal 50 by year end. my goal not getting arrested. game continues.\n-AK\n","date":"21 May 2024","externalUrl":null,"permalink":"/posts/2024-05-21-mall-dressing-rooms-game-we-almost-got-caught/","section":"Posts","summary":"\u003cp\u003emall during the day is dead.\u003c/p\u003e\n\u003cp\u003eghost town.\u003c/p\u003e\n\u003cp\u003eA. made it into a game.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe discovery (2 weeks ago) \n    \u003cdiv id=\"the-discovery-2-weeks-ago\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-discovery-2-weeks-ago\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003esaturday afternoon.\u003c/strong\u003e\u003c/p\u003e","title":"mall dressing rooms - how many before getting caught (almost found out at macys)","type":"posts"},{"content":"week 4 may done.\nconditions improved.\nmodest recovery.\nweek 4 trades (may 20-24) # monday 5/20: 2 trades, 2 wins. +$780\ntuesday 5/21: 3 trades, 2 wins. +$920\nwednesday 5/22: 2 trades, 1 win. +$340\nthursday 5/23: 2 trades, 2 wins. +$860\nfriday 5/24: 2 trades, 1 win. +$420\nweek total: 11 trades, 8 wins (73%). +$3,320\naccount status # may 17: $419,540\nmay 24: $422,860\nweek 4: +$3,320 (+0.79%)\nmay total (4 weeks): +$3,500 (+0.83%)\nmodest but positive.\nwhat changed # VIX dropped:\nweek 3: avg 24.8 (high vol)\nweek 4: avg 17.2 (medium vol)\nback in my optimal range (14-19).\ncorrelation decreased:\nweek 3: 0.84 (very high)\nweek 4: 0.54 (moderate)\ndiversification working again.\nregime stability:\nweek 3: 0.42 (chaotic)\nweek 4: 0.81 (stable)\nconfidence high, filters passing more setups.\ncomparing 4 weeks may # week 1: +$80 (44% wr, rough start)\nweek 2: +$1,100 (67% wr, survival mode)\nweek 3: -$1,000 (25% wr, circuit breaker)\nweek 4: +$3,320 (73% wr, recovery)\ntotal: +$3,500 (+0.83%)\nflat month but positive.\nposition sizing progression # week 3: $900 (reduced for high vol)\nweek 4: back to $1,500 (full size)\nconditions justified increase.\nVIX stable 14-19 = full size appropriate.\nrisk management check # circuit breaker: not triggered\nmax losing streak: 1 loss (happened 3x)\nfilters: passed 58% of signals (normal range)\nregime confidence: 0.81 avg (high)\nall systems green.\nslippage improvement # may avg: 2.0 ticks\nweek 4: 1.8 ticks\nimproving as vol stabilizes.\ncloser to april levels (1.7 ticks).\ncomparing to april # april: +$23,460 (+5.9%)\nmay: +$3,500 (+0.83%)\ndifference: -$19,960 (-5.07%)\nmassive variance but both acceptable.\napril = notable.\nmay = normal.\nthis is sustainable algo trading.\nytd update # Q1: +$29,700 (8.1%)\napril: +$23,460 (5.9%)\nmay: +$3,500 (0.83%)\nytd: +$56,660 (+15.4%)\ncrossed 15% annual target.\nrest of year can be flat/losing and still hit target.\nno pressure.\nlessons from may # 1. variance is normal\napril notable won\u0026rsquo;t repeat monthly.\nmay flat = acceptable.\n2. circuit breakers save accounts\nweek 3 pause prevented disaster.\n3. conditions matter\nVIX \u0026gt;22 = struggle.\nVIX 14-19 = thrive.\n4. patience pays\ndidn\u0026rsquo;t force trades in wrong conditions.\nwaited for regime to improve.\n5. discipline works\nfollowed system through variance.\nno revenge trading.\ntherapy tuesday (5/21) # dr. r: \u0026ldquo;may wrapping up. how do you feel about flat month?\u0026rdquo;\nme: \u0026ldquo;fine. expected it after april.\u0026rdquo;\ndr. r: \u0026ldquo;what about week 3 losses?\u0026rdquo;\nme: \u0026ldquo;circuit breaker worked. paused, reviewed, returned calmly.\u0026rdquo;\ndr. r: \u0026ldquo;you\u0026rsquo;re accepting variance.\u0026rdquo;\nme: \u0026ldquo;yeah. can\u0026rsquo;t win every month. may flat is normal after april impressive.\u0026rdquo;\ndr. r: \u0026ldquo;that\u0026rsquo;s mature trading psychology.\u0026rdquo;\nexactly.\nliving with A. - normalcy # week 4 trading:\nsteady wins, calm routine.\ncame home in good mood most nights.\nA.: \u0026ldquo;better week?\u0026rdquo;\nme: \u0026ldquo;yeah. VIX calmed down. back to normal conditions.\u0026rdquo;\nA.: \u0026ldquo;you seem less stressed.\u0026rdquo;\nme: \u0026ldquo;because market cooperating again. week 3 was chaos.\u0026rdquo;\nstable relationship = stable psychology.\nmonthly projection complete # final week may projection:\n+$3,500 total (actual).\nprojected: +$1,680 to +$4,180.\nhit mid-range.\nlooking ahead june # expectations:\nmay showed normal month after impressive april.\njune likely similar:\nmodest month (+1% to +2%) or flat month (+0% to +1%) possibly losing month (-1% to -3%) all acceptable.\nytd already at 15% target.\nwhat success looks like # may success:\npreserved capital through high vol.\ncircuit breaker prevented disaster.\nrecovered when conditions improved.\nended month positive.\nthat\u0026rsquo;s sustainable trading.\ntonight # week 4 may.\n+$3,320.\n73% win rate.\nmay total: +$3,500 (+0.83%).\napril notable followed by may normal.\nvariance accepted.\nsystem working.\n3:08am sunday. week 4 may complete. +$3,320 (73% wr). may total +$3,500 (0.83%). VIX calmed 24→17, back in optimal range. april +5.9%, may +0.83% = normal variance. ytd +$56,660 (15.4%) crossed annual target. sustainable trading demonstrated.\n-AK\n","date":"18 May 2024","externalUrl":null,"permalink":"/posts/2024-05-18-week-4-may-modest-recovery-conditions-improving/","section":"Posts","summary":"\u003cp\u003eweek 4 may done.\u003c/p\u003e\n\u003cp\u003econditions improved.\u003c/p\u003e\n\u003cp\u003emodest recovery.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 4 trades (may 20-24) \n    \u003cdiv id=\"week-4-trades-may-20-24\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-4-trades-may-20-24\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003emonday 5/20:\u003c/strong\u003e 2 trades, 2 wins. +$780\u003c/p\u003e","title":"week 4 may - modest recovery as conditions improve","type":"posts"},{"content":"mid-may.\ntime for reality check.\nvariance is normal.\nmay performance (so far) # week 1: +$80 (44% wr)\nweek 2: +$1,100 (67% wr)\nweek 3: -$1,000 (25% wr)\nmay total (3 weeks): +$180 (+0.04%)\nbasically flat.\ncomparing to april # april: +$23,460 (+5.9%)\nmay (so far): +$180 (+0.04%)\ndifference: -$23,280 (-5.86%)\nmassive variance.\nthe mental trap # easy thought:\n\u0026ldquo;april worked, may failing. strategy broken. need to fix.\u0026rdquo;\nreality:\napril = impressive conditions.\nmay = normal conditions.\nstrategy = working as designed.\nnothing broken.\nwhat variance looks like # 2024 monthly performance:\njanuary: +$27,200 (+7.4%) - standout\nfebruary: +$1,400 (+0.36%) - flat\nmarch: +$1,100 (+0.28%) - flat (testing)\napril: +$23,460 (+5.9%) - impressive\nmay (projected): +$180 to +$1,680 (+0.04% to +0.4%) - flat\npattern:\n2 impressive months.\n3 flat months.\nthis is normal algo trading.\ncomparing to 2023 # 2023:\ntotal year: -$34k (-8.5%)\nlearning year.\npaid tuition.\n2024 (so far):\nytd: +$52,880 (+14.4%)\n2 strong, 3 flat.\nmassive improvement.\nwhat\u0026rsquo;s working # risk management:\ncircuit breaker prevented disaster.\nposition sizing adapted to conditions.\nfilters aggressive during high vol.\npsychology:\naccepted losing week calmly.\nno revenge trading.\nfollowed rules during pause.\nstrategy:\nadaptive parameters working.\nregime detection filtering correctly.\nsurviving tough conditions.\nwhat\u0026rsquo;s not working # market conditions:\nVIX too high (avg 23.6 in may).\ncorrelation too high (avg 0.68).\nregime instability (avg 0.52).\ncan\u0026rsquo;t control these.\ncan only adapt.\nthe patience requirement # tempting to:\novertrade to \u0026ldquo;make back\u0026rdquo; april gains.\nchange strategy because may flat.\nforce trades in wrong conditions.\ndiscipline:\naccept flat months.\npreserve capital.\nwait for conditions to align.\npatience.\nytd reality check # current: +$52,880 (+14.4%)\nannual target: +15-18%\nat target pace already.\nrest of year can be:\n4-5 flat months (+0% to +1%) 2-3 modest months (+1% to +2%) 1-2 losing months (-1% to -3%) still hit 15-18% annual.\nno pressure.\ncomparing to expectations # unrealistic expectation:\napril performance monthly.\n5-7% every month.\n74% win rate sustained.\nrealistic expectation:\n2 notable months per year.\n5-6 flat months.\n3-4 modest months.\n1-2 losing months.\n15-18% annual.\nmay matching realistic expectation.\nthe growth indicator # september 2023:\nlosing week = spiral, revenge trading, $28k disaster.\nmay 2024:\nlosing week = pause, analysis, calm return, $1,420 contained.\n20x better response.\nthat\u0026rsquo;s the growth.\nrelationship stability helps # A. during may volatility:\nmonday lost $880: she didn\u0026rsquo;t panic.\ntuesday circuit breaker: \u0026ldquo;good, you\u0026rsquo;re following rules.\u0026rdquo;\nwednesday pause: gave space, didn\u0026rsquo;t pressure.\nthursday-friday: normal routine.\nstable home life = stable trading psychology.\nwhat i learned mid-may # 1. variance is normal\napril impressive won\u0026rsquo;t repeat monthly.\nmay flat is acceptable.\n2. circuit breakers work\nprevented spiral.\nsaved account.\n3. conditions matter\ncan\u0026rsquo;t force wins in wrong environment.\nsurvival mode valid.\n4. psychology improved\nlost week without spiraling.\naccepted reality.\n5. relationship support\nA. stable regardless of trading results.\nhelps maintain perspective.\nlooking forward # 1 week remaining may.\nif VIX calms (\u0026lt;20):\nresume normal trading.\ntarget +$500 to +$1,500.\nif VIX stays elevated (\u0026gt;22):\ncontinue survival mode.\naccept flat/small losing month.\neither outcome acceptable.\nthe bigger picture # ytd: +14.4% in 4.5 months\nannualized: ~38%\ntarget: 15-18%\nneed correction.\nmay providing it.\nhealthy.\ntonight (2:56am) # mid-may check.\n3 weeks: +$180 (basically flat).\nvariance is reality.\nnot failure.\napril strong.\nmay normal.\nboth valid.\ndiscipline maintained.\npsychology healthy.\nsystem working.\n2:56am thursday. mid-may check. 3 weeks +$180 (0.04%). april +$23,460, may flat = variance not failure. circuit breaker worked (3 losses → pause). ytd +14.4% still on pace for 15-18% annual. flat months normal. discipline maintained. growth evident.\n-AK\n","date":"15 May 2024","externalUrl":null,"permalink":"/posts/2024-05-15-mid-may-check-variance-reality/","section":"Posts","summary":"\u003cp\u003emid-may.\u003c/p\u003e\n\u003cp\u003etime for reality check.\u003c/p\u003e\n\u003cp\u003evariance is normal.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003emay performance (so far) \n    \u003cdiv id=\"may-performance-so-far\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#may-performance-so-far\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eweek 1:\u003c/strong\u003e +$80 (44% wr)\u003c/p\u003e","title":"mid-may check - variance is reality, not failure","type":"posts"},{"content":"","date":"15 May 2024","externalUrl":null,"permalink":"/tags/reality-check/","section":"Tags","summary":"","title":"Reality-Check","type":"tags"},{"content":"paused trading today.\ncircuit breaker triggered.\nthis rule saved my account in sept 2023.\nsaving it again now.\nwhat is a circuit breaker # trading rule that forces pause after consecutive losses.\nmy implementation:\n3 consecutive losses = mandatory 1 week pause.\n5 consecutive losses = mandatory 2 week pause (never hit this).\n-3% account drawdown = review and potentially pause.\n-5% account drawdown = mandatory 2 week pause (never hit this).\nautomatically enforced.\nwhy circuit breakers matter # without circuit breaker (sept 2023):\nloss → frustration → revenge trade → bigger loss → panic → even bigger loss → disaster.\nlost $28k in 18 days.\nwith circuit breaker (may 2024):\nloss → loss → loss → PAUSE → review → calm analysis → resume when ready.\nlost $1,420 in 2 days, paused, limited damage.\ndifference: $26,580.\nthe psychology of consecutive losses # what happens mentally:\nloss 1: \u0026ldquo;bad luck, happens.\u0026rdquo;\nloss 2: \u0026ldquo;hmm, conditions might be wrong.\u0026rdquo;\nloss 3: \u0026ldquo;fuck, something\u0026rsquo;s broken. need to fix it NOW.\u0026rdquo;\nthat \u0026ldquo;fix it NOW\u0026rdquo; feeling = danger.\nleads to:\nrevenge trading doubled position size abandoned filters emotional decisions account blow-ups circuit breaker interrupts this pattern.\nmy current situation # monday 5/13: -$880 (2 losses)\ntuesday 5/14: -$540 (1 loss)\ntotal: 3 consecutive losses\ncircuit breaker: ACTIVATED\nwednesday-thursday: paused (no trading)\nfriday: resume (1 trade, 1 win, +$420)\nsystem worked.\nwhat i do during pause # NOT allowed:\ntrade with real money paper trade (creates false confidence) backtest with current market data (selection bias) make strategy changes (emotional decisions) allowed:\nreview losing trades objectively analyze market conditions check if filters missed something journal about emotional state exercise, rest, decompress spend time with A. anything except trading pause = reset.\nreviewing the losses # loss 1 (monday, -$480):\nentered SPX put spread.\nVIX spiked 24 → 28 mid-trade.\nregime shifted unexpectedly.\nstop executed correctly.\nloss 2 (monday, -$400):\nentered QQQ call spread.\ncorrelated to loss 1.\nboth stopped together.\nshould\u0026rsquo;ve avoided correlated position.\nloss 3 (tuesday, -$540):\nthought conditions improved.\nVIX dropped back to 23.\nentered NQ trade.\nfalse signal, stopped out.\nshould\u0026rsquo;ve waited for VIX \u0026lt;20.\nlessons from analysis # improvement 1:\nadd VIX \u0026gt;25 = auto-pause (don\u0026rsquo;t wait for losses).\nimprovement 2:\nno new positions when existing position down \u0026gt;50%.\nimprovement 3:\nrequire 4 hours of regime stability before resuming after pause.\nimprovements implemented for next time.\ncomparing to september 2023 # september (no circuit breaker):\n18 days of disaster.\n14 consecutive losing trades.\nkept trading bigger to \u0026ldquo;make it back.\u0026rdquo;\nlost $28k total.\nmay (with circuit breaker):\n2 days of losses.\n3 consecutive losing trades.\npaused immediately.\nlost $1,420 total.\n20x better outcome.\nthe hard part about pausing # FOMO:\nwhat if market reverses and i miss it?\nwhat if i could\u0026rsquo;ve made it back?\nreality:\nmarket always there tomorrow.\nmissing one opportunity \u0026lt; blowing up account.\npatience \u0026gt; FOMO.\ncoding the circuit breaker # import pandas as pd from datetime import datetime, timedelta class CircuitBreaker: \u0026#34;\u0026#34;\u0026#34; Enforces trading pauses based on consecutive losses or drawdown \u0026#34;\u0026#34;\u0026#34; def __init__(self): self.consecutive_losses = 0 self.pause_until = None self.pause_reason = None self.trade_history = [] def record_trade(self, pnl, trade_date=None): \u0026#34;\u0026#34;\u0026#34; Record trade result and update consecutive loss counter \u0026#34;\u0026#34;\u0026#34; if trade_date is None: trade_date = datetime.now() self.trade_history.append({ \u0026#39;date\u0026#39;: trade_date, \u0026#39;pnl\u0026#39;: pnl }) if pnl \u0026lt; 0: self.consecutive_losses += 1 else: self.consecutive_losses = 0 # Reset on win # Check circuit breaker triggers self.check_triggers() def check_triggers(self): \u0026#34;\u0026#34;\u0026#34; Check if circuit breaker should activate \u0026#34;\u0026#34;\u0026#34; # 3 consecutive losses = 1 week pause if self.consecutive_losses \u0026gt;= 3: self.activate_pause( days=7, reason=f\u0026#34;{self.consecutive_losses} consecutive losses\u0026#34; ) # 5 consecutive losses = 2 week pause elif self.consecutive_losses \u0026gt;= 5: self.activate_pause( days=14, reason=f\u0026#34;{self.consecutive_losses} consecutive losses (severe)\u0026#34; ) # Check drawdown triggers if len(self.trade_history) \u0026gt;= 10: recent_pnl = sum([t[\u0026#39;pnl\u0026#39;] for t in self.trade_history[-10:]]) # -3% drawdown = review # -5% drawdown = mandatory pause # (Implementation depends on account size tracking) def activate_pause(self, days, reason): \u0026#34;\u0026#34;\u0026#34; Activate circuit breaker pause \u0026#34;\u0026#34;\u0026#34; if self.pause_until is None: # Don\u0026#39;t override existing pause self.pause_until = datetime.now() + timedelta(days=days) self.pause_reason = reason print(f\u0026#34;⚠️ CIRCUIT BREAKER ACTIVATED\u0026#34;) print(f\u0026#34;Reason: {reason}\u0026#34;) print(f\u0026#34;Paused until: {self.pause_until.strftime(\u0026#39;%Y-%m-%d\u0026#39;)}\u0026#34;) def is_paused(self): \u0026#34;\u0026#34;\u0026#34; Check if currently in pause period \u0026#34;\u0026#34;\u0026#34; if self.pause_until is None: return False if datetime.now() \u0026lt; self.pause_until: return True else: # Pause expired, reset self.clear_pause() return False def clear_pause(self): \u0026#34;\u0026#34;\u0026#34; Clear pause and reset counters \u0026#34;\u0026#34;\u0026#34; print(f\u0026#34;✓ Pause period ended. Resuming trading.\u0026#34;) print(f\u0026#34;Consecutive losses reset to 0.\u0026#34;) self.pause_until = None self.pause_reason = None self.consecutive_losses = 0 def can_trade(self): \u0026#34;\u0026#34;\u0026#34; Check if trading is allowed \u0026#34;\u0026#34;\u0026#34; if self.is_paused(): days_left = (self.pause_until - datetime.now()).days print(f\u0026#34;✗ Trading blocked: {self.pause_reason}\u0026#34;) print(f\u0026#34;Resume in {days_left} days\u0026#34;) return False else: return True # Usage in live trading system breaker = CircuitBreaker() def execute_trade(symbol, size): \u0026#34;\u0026#34;\u0026#34; Execute trade with circuit breaker check \u0026#34;\u0026#34;\u0026#34; # Check if trading allowed if not breaker.can_trade(): print(\u0026#34;Trade blocked by circuit breaker\u0026#34;) return None # Execute trade result = run_strategy(symbol, size) # Record result breaker.record_trade(result[\u0026#39;pnl\u0026#39;]) return result therapy discussion (5/14) # dr. r: \u0026ldquo;you paused trading. how\u0026rsquo;s it feel?\u0026rdquo;\nme: \u0026ldquo;good actually. relieved.\u0026rdquo;\ndr. r: \u0026ldquo;relieved?\u0026rdquo;\nme: \u0026ldquo;yeah. losing streak felt like quicksand. pause gave me solid ground.\u0026rdquo;\ndr. r: \u0026ldquo;you\u0026rsquo;re choosing safety over proving something.\u0026rdquo;\nme: \u0026ldquo;yeah. september taught me. can\u0026rsquo;t trade through every condition. sometimes pause is the right move.\u0026rdquo;\ndr. r: \u0026ldquo;that\u0026rsquo;s wisdom.\u0026rdquo;\nexactly.\nwhen to resume # friday (5/17):\nVIX dropped to 19.2.\nregime stability improved (0.78).\ncorrelation decreased (0.56).\nconditions improved.\ntook 1 trade.\nwon.\n+$420.\ncalm return.\nthe rule vs the ego # ego says:\n\u0026ldquo;you\u0026rsquo;re a trader, trade through everything.\u0026rdquo;\n\u0026ldquo;pausing is weak.\u0026rdquo;\n\u0026ldquo;make it back immediately.\u0026rdquo;\nrule says:\n\u0026ldquo;pause protects capital.\u0026rdquo;\n\u0026ldquo;ego destroys accounts.\u0026rdquo;\n\u0026ldquo;survive to trade another day.\u0026rdquo;\nrule wins.\ntonight (11:48pm) # circuit breaker saved me again.\n3 losses → pause → review → calm return.\nthis rule = account protection.\nseptember taught me the hard way.\nmay proving i learned.\n11:48pm wednesday. circuit breaker protocol. 3 consecutive losses triggered 1-week pause. paused wed-thu, resumed fri. lost $1,420, prevented spiral. september 2023 no circuit breaker = $28k disaster. may 2024 with circuit breaker = $1,420 contained loss. system working. discipline maintained.\n-AK\n","date":"14 May 2024","externalUrl":null,"permalink":"/posts/2024-05-14-circuit-breaker-protocol-when-to-pause/","section":"Posts","summary":"\u003cp\u003epaused trading today.\u003c/p\u003e\n\u003cp\u003ecircuit breaker triggered.\u003c/p\u003e\n\u003cp\u003ethis rule saved my account in sept 2023.\u003c/p\u003e\n\u003cp\u003esaving it again now.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ewhat is a circuit breaker \n    \u003cdiv id=\"what-is-a-circuit-breaker\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#what-is-a-circuit-breaker\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003etrading rule that forces pause after consecutive losses.\u003c/strong\u003e\u003c/p\u003e","title":"circuit breaker protocol - knowing when to pause trading saves accounts","type":"posts"},{"content":"","date":"14 May 2024","externalUrl":null,"permalink":"/tags/rules/","section":"Tags","summary":"","title":"Rules","type":"tags"},{"content":"","date":"12 May 2024","externalUrl":null,"permalink":"/tags/discipline/","section":"Tags","summary":"","title":"Discipline","type":"tags"},{"content":"week 3 may done.\nfirst losing week 2024.\ndiscipline tested.\nweek 3 trades (may 13-17) # monday 5/13: 2 trades, 0 wins. -$880\ntuesday 5/14: 1 trade, 0 wins. -$540\nwednesday 5/15: paused (circuit breaker triggered)\nthursday 5/16: paused (circuit breaker active)\nfriday 5/17: 1 trade, 1 win. +$420\nweek total: 4 trades, 1 win (25%). -$1,000\naccount status # may 10: $420,540\nmay 17: $419,540\nweek 3: -$1,000 (-0.24%)\nmay total (3 weeks): +$180 (+0.04%)\nbasically flat month.\nfirst losing week since january # last losing week: january 2024 (none - all positive)\nbefore that: december 2023\n5 months between losing weeks.\nthis was due.\nwhat went wrong # VIX environment:\nspiked to 28.4 monday.\nwhipsawed 28 → 22 → 26 through tuesday.\nmy strategy needs stable regime.\ngot chaos.\ncorrelation:\neverything moved together (0.84).\nno diversification.\nall positions correlated.\nwhen SPX dropped, everything dropped.\nmonday disaster (5/13) # morning:\nVIX opened 24.2, climbing.\n2 setups passed aggressive filters.\nentered both.\n11am:\nVIX spiked to 28.4.\nregime completely shifted.\nboth positions stopped out.\n-$880 day.\ntuesday continuation (5/14) # tried one more trade.\nlooked like reversal setup.\npassed all filters.\nfailed.\nanother stop out.\n-$540.\ntotal monday-tuesday: -$1,420.\ncircuit breaker activation # my rule:\n3 consecutive losses = 1 week pause.\ntriggered tuesday.\npaused wednesday-thursday.\nno trading.\nreviewed system.\nanalyzed what happened.\nwaited for conditions to improve.\nthe discipline test # old me (sept 2023):\nwould\u0026rsquo;ve revenge traded wednesday.\ndoubled size to \u0026ldquo;make it back.\u0026rdquo;\nblown up account worse.\ncurrent me:\nfollowed circuit breaker rule.\npaused 2 days.\nanalyzed calmly.\nwaited for better conditions.\ngrowth.\nfriday return (5/17) # VIX dropped to 19.2.\nconditions improved.\ntook 1 trade.\nwon.\n+$420.\nsmall recovery but positive.\npsychology of losing week # monday night:\nfrustrated but not panicking.\ntuesday night:\ncircuit breaker triggered, accepted.\nwednesday-thursday:\nused pause to review system, not beat myself up.\nfriday:\nreturned calmly, no revenge trading.\nhealthy response.\ntherapy tuesday (5/14) # dr. r: \u0026ldquo;first losing week. how are you handling it?\u0026rdquo;\nme: \u0026ldquo;okay. frustrated but not spiraling.\u0026rdquo;\ndr. r: \u0026ldquo;what\u0026rsquo;s different from september?\u0026rdquo;\nme: \u0026ldquo;september i abandoned system. now i\u0026rsquo;m following circuit breaker. pausing instead of revenge trading.\u0026rdquo;\ndr. r: \u0026ldquo;you\u0026rsquo;re accepting reality instead of fighting it.\u0026rdquo;\nme: \u0026ldquo;yeah. can\u0026rsquo;t control market. can control response.\u0026rdquo;\ndr. r: \u0026ldquo;that\u0026rsquo;s mature trading psychology.\u0026rdquo;\nexactly.\ncomparing to targets # ytd: +$52,880 (+14.4%)\ndown from: +$53,240 last week\nannual target: +15-18%\nstill on pace.\none losing week doesn\u0026rsquo;t change trajectory.\nmarket conditions # VIX week range: 22-28 (extreme)\ncorrelation: 0.84 (very high)\nregime stability: 0.42 (chaotic)\nmy strategy needs:\nVIX: 14-19 (stable)\ncorrelation: \u0026lt;0.6 (diversification)\nregime stability: \u0026gt;0.75 (confidence)\nconditions completely wrong.\nwhat i did right # 1. followed circuit breaker\nstopped trading after 3 losses.\nprevented further damage.\n2. reduced size\nwas already at $900 (reduced from $1,500).\nlimited loss size.\n3. aggressive filtering\nonly took 4 trades all week.\navoided 8+ bad setups.\n4. no revenge trading\nstayed disciplined through pause.\n5. calm return friday\ndidn\u0026rsquo;t overtrade on return.\n1 trade, 1 win, done.\nwhat i did wrong # took trades monday-tuesday despite extreme VIX.\nshould\u0026rsquo;ve paused when VIX \u0026gt;25.\nlesson learned.\nadding filter for next time:\nVIX \u0026gt;25 = automatic pause.\ndon\u0026rsquo;t wait for losses.\nmonthly projection update # week 1: +$80\nweek 2: +$1,100\nweek 3: -$1,000\nmay total: +$180 (0.04%)\n1 week remaining.\nprojection:\nif VIX calms: +$500 to +$1,500\nif VIX stays elevated: -$500 to +$500\nmay end: -$320 to +$1,680 (-0.08% to +0.4%)\nflat to small losing month likely.\ncomparing to april # april: +$23,460 (+5.9%), every week positive\nmay (so far): +$180 (+0.04%), 1 losing week\nvariance.\nthis is normal algo trading.\ncan\u0026rsquo;t expect april monthly.\nliving with A. - support through loss # monday night:\ncame home quiet after -$880.\nA.: \u0026ldquo;bad day?\u0026rdquo;\nme: \u0026ldquo;yeah. lost $880.\u0026rdquo;\nA.: \u0026ldquo;you okay?\u0026rdquo;\nme: \u0026ldquo;yeah. just frustrated. market whipsawed.\u0026rdquo;\nshe didn\u0026rsquo;t try to fix it.\njust sat with me.\nthat helped.\nwednesday (pause day):\nA.: \u0026ldquo;no trading today?\u0026rdquo;\nme: \u0026ldquo;nope. circuit breaker triggered. pausing until friday.\u0026rdquo;\nA.: \u0026ldquo;good. you\u0026rsquo;re following your rules.\u0026rdquo;\nshe gets it.\nlessons from first losing week # 1. circuit breakers work\nprevented spiral.\nforced pause.\nallowed calm analysis.\n2. conditions matter\ncan\u0026rsquo;t force wins in wrong environment.\nVIX \u0026gt;25 = pause next time.\n3. psychology improved\nlost $1,000, didn\u0026rsquo;t panic.\naccepted variance.\nreturned calmly.\n4. system valid\none losing week doesn\u0026rsquo;t invalidate strategy.\napril proved it works.\nmay showing it adapts.\ntonight # week 3 may.\n-$1,000.\nfirst losing week 2024.\ndiscipline tested.\ncircuit breaker followed.\nno revenge trading.\ncalm return friday.\ngrowth.\n3:24am monday. week 3 may. -$1,000 (25% wr, 4 trades). first losing week 2024. VIX spiked to 28, chaos. circuit breaker triggered tuesday, paused wed-thu. calm return friday +$420. may total +$180 (0.04%). discipline maintained. no revenge trading. system followed.\n-AK\n","date":"12 May 2024","externalUrl":null,"permalink":"/posts/2024-05-12-week-3-may-losing-week-discipline-test/","section":"Posts","summary":"\u003cp\u003eweek 3 may done.\u003c/p\u003e\n\u003cp\u003efirst losing week 2024.\u003c/p\u003e\n\u003cp\u003ediscipline tested.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 3 trades (may 13-17) \n    \u003cdiv id=\"week-3-trades-may-13-17\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-3-trades-may-13-17\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003emonday 5/13:\u003c/strong\u003e 2 trades, 0 wins. -$880\u003c/p\u003e","title":"week 3 may - first losing week 2024, discipline tested","type":"posts"},{"content":"met A. june 13, 2023.\ntoday may 9, 2024.\n11 months together.\n6 months living together (nov 1).\ntherapy session revealed something.\ntherapy thursday (5/9) # dr. r: \u0026ldquo;almost a year with A. how\u0026rsquo;s it feel?\u0026rdquo;\nme: \u0026ldquo;good. stable. different.\u0026rdquo;\ndr. r: \u0026ldquo;different how?\u0026rdquo;\nme: \u0026ldquo;past relationships i was already planning exit by month 6. with A., not thinking about exit at all.\u0026rdquo;\ndr. r: \u0026ldquo;why do you think that is?\u0026rdquo;\nme: \u0026ldquo;she doesn\u0026rsquo;t chase. so i don\u0026rsquo;t run.\u0026rdquo;\ndr. r: \u0026ldquo;here\u0026rsquo;s how to explore that. what does \u0026lsquo;chase\u0026rsquo; mean?\u0026rdquo;\nme: \u0026ldquo;M., K., S., J. - they all wanted constant attention. texting all day. needing to know where i was. wanting to hang out every night. suffocating.\u0026rdquo;\ndr. r: \u0026ldquo;and A.?\u0026rdquo;\nme: \u0026ldquo;she\u0026rsquo;s fine if i don\u0026rsquo;t text for hours. doesn\u0026rsquo;t need to know my schedule. has her own life. friday nights she usually does her own thing.\u0026rdquo;\ndr. r: \u0026ldquo;so independence.\u0026rdquo;\nme: \u0026ldquo;yeah. she\u0026rsquo;s independent. doesn\u0026rsquo;t need me. wants me but doesn\u0026rsquo;t need me.\u0026rdquo;\ndr. r: \u0026ldquo;and that makes you feel\u0026hellip;?\u0026rdquo;\nme: \u0026ldquo;\u0026hellip;safe? less pressure. like i can breathe.\u0026rdquo;\ndr. r: \u0026ldquo;this is secure attachment. you\u0026rsquo;ve avoided relationships where partners were anxiously attached. but A. is securely attached. gives you space. so your avoidant patterns don\u0026rsquo;t activate.\u0026rdquo;\nfuck.\nthat makes sense.\nthe pattern i didn\u0026rsquo;t see # past relationships:\nmonth 1-2: exciting, new, fun\nmonth 3-4: they get attached, want more time\nmonth 5-6: i feel suffocated, plan exit\nmonth 6-7: break up\nrinse repeat.\nwith A.:\nmonth 1-2: exciting, new, fun\nmonth 3-4: she stays independent, comfortable silence\nmonth 5-6: i don\u0026rsquo;t feel suffocated, no exit planning\nmonth 7-11: still here, living together, working\ndifferent pattern.\nwhat A. does differently # doesn\u0026rsquo;t:\ntext constantly need daily plans get upset if i\u0026rsquo;m quiet demand attention track my location complain about my schedule does:\nhas her own friends takes friday nights alone comfortable with silence respects workspace boundaries independent hobbies gives space without asking secure attachment.\nthe places list context # been adding to list regularly.\nthis month: her office (after hours), beach parking lot (late night), kitchen counter (morning before trading).\nshe initiates 80% of the time.\ndecides when, where, how.\ni love that she takes charge.\nnever feels forced.\nnever feels like obligation.\nnatural.\ncomparing to past sex life # M., K., S., J.:\nsex was good but\u0026hellip;\nfelt like performance.\nfelt like they needed validation.\nfelt like keeping them interested.\nA.:\nsex is different.\nno performance pressure.\nboth completely honest about wants.\nbondage, dom/sub (we switch), toys, fantasies.\nzero shame.\ntotal trust.\nthe fear i didn\u0026rsquo;t know i had # dr. r: \u0026ldquo;what are you afraid of with A.?\u0026rdquo;\nme: \u0026ldquo;\u0026hellip;losing her.\u0026rdquo;\ndr. r: \u0026ldquo;different from past relationships?\u0026rdquo;\nme: \u0026ldquo;yeah. before i was afraid of being trapped. now i\u0026rsquo;m afraid of losing.\u0026rdquo;\ndr. r: \u0026ldquo;that\u0026rsquo;s vulnerability. first time you\u0026rsquo;ve let someone in since your parents died.\u0026rdquo;\nfuck that was impactful.\nparents\u0026rsquo; death connection # parents died dec 31, 2022.\nmet A. june 13, 2023.\n6 months after.\ndr. r: \u0026ldquo;you were grieving when you met her.\u0026rdquo;\nme: \u0026ldquo;yeah. barely functional. trading disasters. therapy twice a week.\u0026rdquo;\ndr. r: \u0026ldquo;and she saw you completely broken in september.\u0026rdquo;\nme: \u0026ldquo;yeah. lost $28k. crying randomly. couldn\u0026rsquo;t sleep.\u0026rdquo;\ndr. r: \u0026ldquo;and she stayed.\u0026rdquo;\nme: \u0026ldquo;yeah. came back after 18 days. saw the full damage. stayed anyway.\u0026rdquo;\ndr. r: \u0026ldquo;that\u0026rsquo;s why you trust her. she\u0026rsquo;s seen you at your worst and didn\u0026rsquo;t leave.\u0026rdquo;\nexactly.\nthe september crisis context # september 2023:\nwe fought about moving in.\nshe left for 18 days.\ni spiraled completely.\nlost $28k revenge trading.\nconvinced she was gone forever.\nshe came back oct 11.\nsaw the trading disaster.\nsaw me broken.\nstayed anyway.\nmoved in nov 1.\nthat mattered.\nliving together reality # friction still exists:\nher mess vs my OCD.\nbathroom schedule.\ncoffee mug territorialism.\nher loud cooking music.\nmy 4am alarms.\nbut manageable.\nwe negotiate.\nadjust.\ncompromise.\nworks.\nwhat makes it work # mutual independence:\nboth introverts.\nboth need alone time.\nboth have intense work focus.\nrespect boundaries.\nphysical compatibility:\nbest sex either has had.\ncompletely open communication.\nfantasies discussed without shame.\ntrust.\nemotional support:\nshe holds me when grief hits.\ni give her space when needed.\nboth understand trading stress.\nbalance.\nthe commitment thing # never thought i\u0026rsquo;d:\nlive with someone.\nbe in relationship \u0026gt;6 months.\nnot plan exit strategy.\nsay \u0026ldquo;i love you\u0026rdquo; and mean it.\nbut here we are.\n11 months together.\n6 months living together.\nno exit strategy.\nfirst time.\ntonight (10:36pm) # sitting on couch.\nA. coding on her keyboard.\ni\u0026rsquo;m writing this.\n11 months.\nshe doesn\u0026rsquo;t chase so i don\u0026rsquo;t run.\nsecure attachment.\nfirst time feeling safe in relationship.\ntherapy breakthrough:\nmy avoidant patterns don\u0026rsquo;t activate because she\u0026rsquo;s securely attached.\nthat explains everything.\n10:36pm thursday. 11 months together, 6 months living together. therapy breakthrough: A\u0026rsquo;s secure attachment prevents my avoidant patterns. she doesn\u0026rsquo;t chase so i don\u0026rsquo;t run. first relationship where i\u0026rsquo;m not planning exit. she saw me broken (september $28k disaster) and stayed. trust.\n-AK\n","date":"9 May 2024","externalUrl":null,"permalink":"/posts/2024-05-09-six-months-a-therapy-breakthrough/","section":"Posts","summary":"\u003cp\u003emet A. june 13, 2023.\u003c/p\u003e\n\u003cp\u003etoday may 9, 2024.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e11 months together.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e6 months living together (nov 1).\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003etherapy session revealed something.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003etherapy thursday (5/9) \n    \u003cdiv id=\"therapy-thursday-59\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#therapy-thursday-59\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003edr. r:\u003c/strong\u003e \u0026ldquo;almost a year with A. how\u0026rsquo;s it feel?\u0026rdquo;\u003c/p\u003e","title":"six months with A. - therapy breakthrough about attachment","type":"posts"},{"content":"week 2 may.\nVIX still elevated.\naggressive filtering required.\ncurrent market conditions # VIX range: 19-26 this week\ncorrelation: 0.72 (high)\nregime: high volatility\nmy strategy optimal range: VIX 14-19\ncurrent range: above optimal\nsurvival mode.\nwhat aggressive filtering means # normal filtering (april):\n50-60% of signals accepted.\ntrade 10-15 times per week.\nwin rate 70%+.\naggressive filtering (may):\n20-30% of signals accepted.\ntrade 4-6 times per week.\nwin rate target 60%+.\nquality over quantity.\nfilter criteria tightened # added filters for high vol:\nregime confidence \u0026gt;0.9 (was 0.75) correlation \u0026lt;0.6 (new filter) volume confirmation required (was optional) time of day restriction (10am-2pm only) no entries last hour (was 30 min) result: fewer trades, higher quality.\nweek 2 performance (may 6-10) # monday 5/6: observed only, no trades (feeling out market)\ntuesday 5/7: 1 trade, 1 win. +$620\nwednesday 5/8: 2 trades, 1 win. +$180\nthursday 5/9: 1 trade, 0 wins. -$540\nfriday 5/10: 2 trades, 2 wins. +$840\nweek total: 6 trades, 4 wins (67%). +$1,100\naccount progression # may 3: $419,440\nmay 10: $420,540\nweek 2: +$1,100 (+0.26%)\nmay total (2 weeks): +$1,180 (+0.28%)\nmodest but positive.\ncomparing filter effectiveness # without aggressive filters (backtested):\nwould\u0026rsquo;ve taken 14 trades.\nestimated win rate: 43%.\nestimated pnl: -$1,200.\nwith aggressive filters (actual):\ntook 6 trades.\nactual win rate: 67%.\nactual pnl: +$1,100.\nfiltering added $2,300 value.\nthe trades i skipped # 12 signals generated.\n6 passed filters (taken).\n6 failed filters (skipped):\n3 failed regime confidence (whipsaw risk)\n2 failed correlation check (everything moving together)\n1 failed volume confirmation (low liquidity)\nbacktested skipped trades:\n4 would\u0026rsquo;ve lost.\n2 would\u0026rsquo;ve won.\nnet: -$800.\nfiltering worked.\nposition sizing strategy # base size: $1,500 (april validated)\nmay adjustments:\nVIX 14-18: $1,500 (full size)\nVIX 18-22: $1,200 (80% size)\nVIX 22-26: $900 (60% size)\nVIX \u0026gt;26: $0 (pause trading)\nthis week avg VIX: 22.4\nsize used: $900\nappropriate for conditions.\nrisk management stats # max drawdown: -$540 (thursday)\ndrawdown recovery: 1 day (friday)\ncircuit breaker: not triggered\nlargest win: +$840 (friday)\nlargest loss: -$540 (thursday)\nacceptable variance.\nthe psychology of filtering # hard part:\nwatching setups that \u0026ldquo;look good\u0026rdquo; get filtered out.\nfeeling like missing opportunities.\nFOMO during winning streaks you didn\u0026rsquo;t participate in.\ndiscipline:\ntrust the filters.\nbacktests prove they work.\nsurvival \u0026gt; growth in wrong conditions.\npatience.\ncomparing to april # april: growth mode, taking opportunities, 74% wr\nmay: survival mode, preserving capital, 56% wr (2 weeks avg)\nboth valid.\nconditions dictate approach.\ncan\u0026rsquo;t force april performance in may conditions.\nnexusfi discussion on filtering # been reading algo trading risk management thread on NexusFi.\nother quant traders dealing with same high-vol challenges.\nkey insights:\nover-filtering = missed opportunities under-filtering = blown accounts sweet spot = accept lower win rate, higher quality trades survival mode is valid strategy community validation helpful.\nmonthly projection update # week 1: +$80\nweek 2: +$1,100\nmay total: +$1,180 (0.28%)\n2 weeks remaining.\nprojection:\nif VIX stays \u0026gt;20: +$500 to +$1,500 more\nif VIX drops \u0026lt;18: +$2,000 to +$3,000 more\nmay end: +$1,680 to +$4,180 (+0.4% to +1.0%)\nmodest month acceptable.\nwhat success looks like # success ≠ repeating april.\nsuccess = capital preservation in tough conditions.\nmay showing:\nfilters preventing losses discipline maintained system adapting correctly that\u0026rsquo;s success.\ncode for correlation filter # import pandas as pd import numpy as np class CorrelationFilter: \u0026#34;\u0026#34;\u0026#34; Filter trades based on portfolio correlation to prevent overexposure \u0026#34;\u0026#34;\u0026#34; def __init__(self, max_correlation=0.6): self.max_correlation = max_correlation self.current_positions = [] def calculate_correlation(self, symbol_a, symbol_b, lookback_days=30): \u0026#34;\u0026#34;\u0026#34; Calculate correlation between two symbols \u0026#34;\u0026#34;\u0026#34; # Get historical returns returns_a = self.get_returns(symbol_a, lookback_days) returns_b = self.get_returns(symbol_b, lookback_days) # Calculate correlation correlation = returns_a.corr(returns_b) return correlation def check_new_trade(self, new_symbol): \u0026#34;\u0026#34;\u0026#34; Check if new trade would exceed correlation limits \u0026#34;\u0026#34;\u0026#34; if len(self.current_positions) == 0: return True # First position always allowed # Check correlation with all existing positions max_corr = 0 for existing_symbol in self.current_positions: corr = self.calculate_correlation(new_symbol, existing_symbol) max_corr = max(max_corr, abs(corr)) # Allow trade if correlation below threshold if max_corr \u0026lt; self.max_correlation: return True else: print(f\u0026#34;Trade filtered: {new_symbol} correlation {max_corr:.2f} exceeds limit {self.max_correlation}\u0026#34;) return False def add_position(self, symbol): \u0026#34;\u0026#34;\u0026#34;Add position to tracking\u0026#34;\u0026#34;\u0026#34; self.current_positions.append(symbol) def remove_position(self, symbol): \u0026#34;\u0026#34;\u0026#34;Remove position when closed\u0026#34;\u0026#34;\u0026#34; if symbol in self.current_positions: self.current_positions.remove(symbol) def get_returns(self, symbol, days): \u0026#34;\u0026#34;\u0026#34; Get historical returns for correlation calc (Placeholder - would connect to actual data in production) \u0026#34;\u0026#34;\u0026#34; # In production: fetch real data from Polygon/IB # For example: returns simulated return pd.Series(np.random.randn(days)) # Usage in live trading correlation_filter = CorrelationFilter(max_correlation=0.6) def process_signal(symbol, signal_strength): \u0026#34;\u0026#34;\u0026#34; Process trading signal with correlation filtering \u0026#34;\u0026#34;\u0026#34; # Check if signal passes correlation filter if correlation_filter.check_new_trade(symbol): # Other filters here (regime, volume, etc.) # If all filters pass, enter trade enter_trade(symbol) correlation_filter.add_position(symbol) print(f\u0026#34;✓ Trade entered: {symbol}\u0026#34;) else: print(f\u0026#34;✗ Trade filtered: {symbol} (correlation)\u0026#34;) def exit_trade(symbol): \u0026#34;\u0026#34;\u0026#34; Exit trade and update correlation tracking \u0026#34;\u0026#34;\u0026#34; close_position(symbol) correlation_filter.remove_position(symbol) print(f\u0026#34;Position closed: {symbol}\u0026#34;) tonight # week 2 may.\n+$1,100.\n67% win rate on 6 trades.\naggressive filtering working.\nsurvival mode appropriate.\ncapital preserved.\n3:12am saturday. week 2 may. +$1,100 (67% wr, 6 trades). VIX 19-26, high vol conditions. aggressive filtering: accepted 6/12 signals. skipped trades backtested would\u0026rsquo;ve lost $800. position size reduced to $900. survival mode not growth mode. may total +$1,180 (0.28%).\n-AK\n","date":"7 May 2024","externalUrl":null,"permalink":"/posts/2024-05-07-filtering-aggressively-high-vol-survival/","section":"Posts","summary":"\u003cp\u003eweek 2 may.\u003c/p\u003e\n\u003cp\u003eVIX still elevated.\u003c/p\u003e\n\u003cp\u003eaggressive filtering required.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ecurrent market conditions \n    \u003cdiv id=\"current-market-conditions\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#current-market-conditions\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eVIX range:\u003c/strong\u003e 19-26 this week\u003c/p\u003e","title":"filtering aggressively in high vol - survival mode not growth mode","type":"posts"},{"content":"week 1 may done.\nreality check arrived.\napril won\u0026rsquo;t repeat.\nweek 1 trades (apr 29 - may 3) # monday 4/29: market closed (observed holiday)\ntuesday 4/30: 2 trades, 1 win. +$280\nwednesday 5/1: 3 trades, 1 win. -$620\nthursday 5/2: 2 trades, 1 win. +$180\nfriday 5/3: 2 trades, 1 win. +$240\nweek total: 9 trades, 4 wins (44%). +$80\naccount status # apr 30: $419,360\nmay 3: $419,440\nweek 1: +$80 (+0.02%)\nbasically flat.\ncomparing to april # april avg week: +$5,865 per week\nmay week 1: +$80\n99% decrease.\nvariance.\nwhat changed # market conditions shifted:\napril: VIX 14-19, low-medium vol, ideal\nmay week 1: VIX 18-24, higher vol, choppy\nregime: shifted from medium to high vol tuesday\nmy strategy thrives in 14-19 VIX range.\nabove 20 = struggle.\nwednesday disaster (5/1) # opened with 3 setups.\nall looked good on paper.\nVIX spiked 18.2 → 23.8 by 11am.\nregime whipsaw.\nmy intraday stability check caught it.\nstopped new entries.\nbut already in 3 positions.\nall 3 stopped out.\n-$620 day.\nexactly what i expected could happen.\nrisk management response # thursday-friday:\nreduced position size to $1,200.\nfiltered more aggressively (only 4 setups passed).\ntook 2 trades each day.\npreserved capital.\n+$180 thu, +$240 fri.\nsmall wins but positive.\nwin rate reality # april: 74% win rate\nmay week 1: 44% win rate\n30 percentage point drop.\nthis is normal variance.\napril had perfect conditions.\nmay conditions changed.\nstrategy adapts but can\u0026rsquo;t force wins.\npsychology check # old me (sept 2023):\nwould\u0026rsquo;ve panicked wednesday.\nrevenge traded thursday.\nblown up more.\ncurrent me:\naccepted loss wednesday.\nreduced size thursday.\nstayed disciplined.\ngrowth.\ntherapy tuesday (4/30) # dr. r: \u0026ldquo;may starts tomorrow. expectations?\u0026rdquo;\nme: \u0026ldquo;realistic. april crushed. may probably struggles.\u0026rdquo;\ndr. r: \u0026ldquo;how do you feel about that?\u0026rdquo;\nme: \u0026ldquo;fine. can\u0026rsquo;t expect april monthly. variance normal.\u0026rdquo;\ndr. r: \u0026ldquo;and if may is actually losing month?\u0026rdquo;\nme: \u0026ldquo;acceptable. preserve capital. execute system. results secondary.\u0026rdquo;\ndr. r: \u0026ldquo;that\u0026rsquo;s mature trading psychology.\u0026rdquo;\nwednesday proved it.\nlost $620, didn\u0026rsquo;t spiral.\ncomparing to targets # ytd: +$53,240 (+14.5%)\nannual target: +15-18%\nalready at target pace.\nmay can be flat/losing without concern.\nno pressure.\nmarket regime analysis # april regime: primarily low-medium vol (VIX 14-19)\nmay week 1: high vol spike (VIX 18-24)\ncorrelation: rose from 0.44 to 0.68\neverything moving together.\nno diversification benefit.\nconditions not ideal.\nadaptive strategy response # tuesday: detected regime shift to high vol\nparameters adjusted:\nlookback: 10 days (from 15) entry: 2.6 std dev (from 2.3) size: $1,200 (from $1,500) worked correctly.\nfiltered out bad setups thursday-friday.\nonly took high-quality trades.\nsystem functioning.\nweekly projection update # week 1: +$80\nif conditions stay choppy:\nweek 2-4 could be:\nflat weeks (+$0 to +$500) small losing weeks (-$500 to -$1,000) may end: +$0 to +$2,000 (+0% to +0.5%)\nrealistic after strong april.\nslippage check # april avg: 1.7 ticks\nmay week 1: 2.3 ticks\nslippage worse in high vol.\nwider spreads.\nfaster moves.\nexpected.\nliving with A. - support # wednesday night:\ncame home after -$620 day.\nA.: \u0026ldquo;rough day?\u0026rdquo;\nme: \u0026ldquo;yeah. lost $620. market whipsawed.\u0026rdquo;\nA.: \u0026ldquo;you okay?\u0026rdquo;\nme: \u0026ldquo;yeah. happens. april was outlier. may showing reality.\u0026rdquo;\nA.: \u0026ldquo;you seem calm about it.\u0026rdquo;\nme: \u0026ldquo;because it\u0026rsquo;s expected. can\u0026rsquo;t win every month.\u0026rdquo;\nA.: \u0026ldquo;that\u0026rsquo;s different from before.\u0026rdquo;\nshe\u0026rsquo;s right.\nseptember 2023 losing day = spiral.\nmay 2024 losing day = acceptance.\nwhat\u0026rsquo;s working # risk management:\nreduced size when conditions changed.\nfiltered aggressively.\npreserved capital.\npsychology:\nno revenge trading.\nno panic.\naccepted variance.\nrelationship:\nA. supportive regardless of results.\nstable home life.\nwhat\u0026rsquo;s not working # market conditions:\nVIX too high for my strategy.\ncorrelation too high.\ncan\u0026rsquo;t force trades in wrong conditions.\nlooking ahead week 2 # if VIX stays \u0026gt;20:\ncontinue reduced size.\nselective trading.\ncapital preservation mode.\nif VIX drops \u0026lt;18:\nreturn to full size.\nnormal execution.\nlet conditions dictate approach.\ntonight # week 1 may.\n+$80 (basically flat).\n44% win rate.\napril notable performance ended.\nmay showing normal variance.\nexactly as expected.\nsystem followed.\ndiscipline maintained.\n2:44am saturday. week 1 may. +$80 (0.02%). 44% win rate. april crushed, may reality check. VIX spiked 18→24, regime shifted. lost $620 wednesday, stayed disciplined. reduced size, filtered aggressively. preserved capital. variance accepted.\n-AK\n","date":"3 May 2024","externalUrl":null,"permalink":"/posts/2024-05-03-week-1-may-reality-check-flat-start/","section":"Posts","summary":"\u003cp\u003eweek 1 may done.\u003c/p\u003e\n\u003cp\u003ereality check arrived.\u003c/p\u003e\n\u003cp\u003eapril won\u0026rsquo;t repeat.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 1 trades (apr 29 - may 3) \n    \u003cdiv id=\"week-1-trades-apr-29---may-3\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-1-trades-apr-29---may-3\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003emonday 4/29:\u003c/strong\u003e market closed (observed holiday)\u003c/p\u003e","title":"week 1 may - reality check, flat start after april high","type":"posts"},{"content":"","date":"30 April 2024","externalUrl":null,"permalink":"/tags/expectations/","section":"Tags","summary":"","title":"Expectations","type":"tags"},{"content":"may starts tomorrow.\nafter crushing april.\nrealistic expectations required.\napril recap # +$23,460 (+5.9%)\n74% win rate\n53 trades\nimpressive month.\nsecond outlier 2024 (january was first).\nmay reality # april won\u0026rsquo;t repeat.\nmarket conditions perfect for my strategy.\nmay conditions uncertain.\npossible outcomes:\nscenario 1 (40% probability): flat month\n+0% to +1% choppy conditions strategies struggle capital preserved scenario 2 (35% probability): modest gains\n+1% to +2% mixed conditions selective opportunities consistent execution scenario 3 (25% probability): losing month\n-1% to -3% regime shift parameters don\u0026rsquo;t match conditions acceptable drawdown all outcomes acceptable.\nstrategy adjustments for may # continuing adaptive approach:\nregime detection with intraday stability.\nlively parameters based on VIX.\nno changes to core logic.\napril proved it works.\npotential tweaks:\ntighter filters if correlation rises reduced size if VIX \u0026gt;22 pause momentum if breaks below 50% wr defensive adjustments only.\nposition sizing plan # base size: $1,500 (proven in april)\nadjustments:\nlow vol (VIX \u0026lt;15): full $1,500\nmedium vol (VIX 15-20): full $1,500\nhigh vol (VIX 20-25): reduce to $1,200\nextreme vol (VIX \u0026gt;25): reduce to $800 or pause\nfluid sizing based on conditions.\ncircuit breaker rules # 3-loss streak: reduce size 50% for 3 days\n5-loss streak: stop trading 1 week\n-3% drawdown: review strategy, potentially pause\n-5% drawdown: mandatory 1 week break\nprotect capital during struggles.\nytd targets revisited # current ytd: +$53,160 (+14.5%)\nannual target: +15% to +18%\nmath:\nto hit +15% annual: need +$1,770 more (8 months)\nto hit +18% annual: need +$12,756 more (8 months)\nalready at target pace.\nrest of year can be modest/flat/losing.\nno pressure.\nmay trade targets # realistic:\n20-30 trades total\n60-65% win rate\n+0% to +2% month\nconservative after notable april.\nmarket expectations # VIX forecast: probably 15-20 range\ncorrelation: could rise (earnings season)\nregime: likely medium vol\nnot ideal conditions but workable.\nwhat could go wrong # scenario: market regime shift\nVIX spikes \u0026gt;25.\nstrategies break.\nresponse: reduce size, pause if needed.\nscenario: correlation spike\neverything moves together.\nno diversification.\nresponse: tighter position limits, skip correlated setups.\nscenario: false signals\nwhipsaw markets.\nmean reversion fails.\nresponse: filter aggressively, accept lower trade count.\nprepared for problems.\ncomparing to may 2023 # may 2023:\nstill learning.\nlost money.\ntesting strategies.\nmay 2024:\nstrategies proven.\nadaptive approach validated.\nconfident execution.\ngrowth.\ntherapy insight for may # from last session (4/25):\ndr. r emphasized accepting variance.\napril strong won\u0026rsquo;t repeat.\nmay could struggle.\nboth normal.\nfocus on process not results.\nexecute system regardless of outcomes.\npsychology preparation.\nweekend prep tasks # saturday:\nbacktest parameter optimization review regime detection accuracy analyze slippage patterns sunday:\nupdate filters for earnings season stress test strategy on high-vol scenarios prepare mentally for variance monday: may begins.\nfirst week may plan # mon 5/6: observe only, no trades (market open feeling)\ntue-fri: selective trading, prove strategy still works\ntarget week 1: 4-6 trades, 60%+ wr, modest gains\nno pressure to match april.\nrelationship context # A. supportive regardless of performance.\napril crushing = calm.\nmay struggling = also calm.\nstable home life helps trading psychology.\nwhat success looks like in may # success ≠ repeating april.\nsuccess = executing system.\neven if:\nwin rate drops to 55-60% month ends flat small loss occurs if system followed: success.\nif discipline maintained: success.\nresults secondary to process.\ntonight (apr 30, 2:18am) # april done.\nmay starts tomorrow.\nexpectations:\napril impressive won\u0026rsquo;t repeat.\nmay probably flat/modest.\npossibly losing.\nall acceptable.\nfocus:\nexecute system.\npreserve capital.\nstay disciplined.\naccept variance.\nthis is sustainable algo trading.\n2:18am wednesday. may preview. april +$23,460 (5.9%) impressive month won\u0026rsquo;t repeat. may expectations: flat to +2% likely, -1 to -3% possible, all acceptable. ytd +14.5% already at annual target pace. no pressure. focus on process not results. system execution regardless of outcomes.\n-AK\n","date":"30 April 2024","externalUrl":null,"permalink":"/posts/2024-04-30-may-preview-realistic-expectations/","section":"Posts","summary":"\u003cp\u003emay starts tomorrow.\u003c/p\u003e\n\u003cp\u003eafter crushing april.\u003c/p\u003e\n\u003cp\u003erealistic expectations required.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eapril recap \n    \u003cdiv id=\"april-recap\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#april-recap\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e+$23,460 (+5.9%)\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e74% win rate\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e53 trades\u003c/strong\u003e\u003c/p\u003e","title":"may preview - realistic expectations after impressive april","type":"posts"},{"content":"april done.\nstrong month.\nstrategy validation complete.\napril final numbers # starting (apr 1): $395,900\nending (apr 30): $419,360\napril gain: +$23,460 (+5.9%)\ntrades: 53\nwins: 39\nlosses: 14\nwin rate: 74%\nFigure 1: April daily P\u0026amp;L showing consistent profitability across all 4 weeks. Started month ramping position size week 1 ($800-1,200), moved to full $1,500 size weeks 2-4. Only 3 losing days entire month. Account progression from $395,900 to $419,360. Adaptive regime detection prevented drawdowns during volatility spikes Apr 16 and Apr 24.\nweekly breakdown # Figure 2: Week-by-week performance showing improvement through month. Week 1 ramping size (+$2,400, 69% wr), Week 2 full size validation (+$7,000, 69% wr), Week 3 optimization peak (+$7,720, 83% wr), Week 4 consistency maintained (+$6,340, 75% wr). Win rate averaged 74% for month. Each week profitable demonstrating strategy reliability.\nweek 1 (ramping): +$2,400, 69% win rate, 13 trades\nweek 2 (full size): +$7,000, 69% win rate, 13 trades\nweek 3 (peak): +$7,720, 83% win rate, 12 trades\nweek 4 (consistent): +$6,340, 75% win rate, 12 trades\nevery week profitable.\nstrategy performance # Figure 3: Regime-adaptive mean reversion dominated April performance. Low vol regime (VIX \u0026lt;15) produced 22 trades @ 82% win rate. Medium vol regime (VIX 15-20) had 28 trades @ 71% win rate. High vol regime (VIX \u0026gt;20) only 3 trades @ 67% win rate - strategy correctly reduced activity in uncertain conditions. Adaptive parameters prevented overtrading during regime transitions.\nregime-adaptive mean reversion:\nlow vol (22 trades): 18 wins, 4 losses (82% wr) medium vol (28 trades): 20 wins, 8 losses (71% wr) high vol (3 trades): 2 wins, 1 loss (67% wr) regime detection working perfectly.\nfewer trades in high vol = capital preservation.\ncomparing to march testing # march 2024 (testing phase):\nposition size: $100-400 (tiny) trades: 34 win rate: 59% pnl: +$1,100 (+0.28%) purpose: validate adaptive strategy april 2024 (execution phase):\nposition size: $800-1,500 (full) trades: 53 win rate: 74% pnl: +$23,460 (+5.9%) purpose: execute validated strategy march testing paid off massively.\nfound regime detection bugs at tiny size.\nfixed before scaling.\nsaved potential $20k+ disaster.\nytd 2024 progress # january: +$27,200 (+7.4%) - notable\nfebruary: +$1,400 (+0.36%) - flat reality check\nmarch: +$1,100 (+0.28%) - testing phase\napril: +$23,460 (+5.9%) - standout\nytd total: +$53,160 (+14.5%)\nstarting balance (jan 1): $366,200\ncurrent balance (apr 30): $419,360\nperformance sustainability analysis # ytd pace: +14.5% in 4 months\nannualized: ~43%\ntarget annual: +15-18%\nreality check:\njanuary + april = 2 notable months.\nfebruary + march = flat/testing.\nneed 8 months flat/losing to stay in target.\nmay-december expectation:\n4-5 flat months (+0% to +1%) 2-3 modest months (+1% to +2%) 1-2 losing months (-1% to -3%) this brings annual to sustainable 15-18%.\nslippage improvement tracking # march: 2.4 ticks avg\napril week 1: 1.8 ticks\napril week 2: 1.9 ticks\napril week 3: 1.6 ticks\napril week 4: 1.7 ticks\napril avg: 1.7 ticks\nimprovement: 0.7 ticks = $210/month saved\nlimit orders with 2-tick buffer working.\nrisk management stats # position sizing:\nweek 1: ramped $800 → $1,200 weeks 2-4: consistent $1,500 circuit breaker: never triggered\nmax drawdown: -$890 (0.2%)\nmax losing streak: 2 losses (happened 1x)\nfilters: 57% acceptance rate\nregime confidence avg: 0.86 (high stability)\nrisk controls working perfectly.\nmarket environment # VIX range: 14-19\navg VIX: 16.2\nregime: primarily low-medium vol\ncorrelation: 0.44 avg (low)\nconditions: ideal for mean reversion\nwhen market gives perfect conditions, strategy capitalizes.\ncomparing to 2023 # april 2023:\nstill learning $180k loss year testing strategies small size struggling april 2024:\nstrategies proven validated approach full size confident crushing it +$23,460 month 1 year transformation.\nlessons from april # 1. testing prevents disasters\nmarch tested tiny size for 4 weeks.\nfound bugs cheap.\napril executed with confidence.\npatience paid $23k.\n2. regime adaptation essential\nstatic parameters fail.\nadaptive parameters thrive.\n74% win rate proves it.\n3. execution matters\nslippage improved 0.7 ticks.\nsmall edges compound.\n$2,520/year impact.\n4. impressive months rare\njanuary + april = 2 standout.\ncan\u0026rsquo;t expect monthly.\nmean reversion applies to performance.\n5. discipline during wins\ndidn\u0026rsquo;t get greedy.\ndidn\u0026rsquo;t overtrade.\nsystem followed.\nmay preview # expectations:\napril notable won\u0026rsquo;t repeat.\nmay could be:\nflat (+0% to +1%) - likely modest (+1% to +2%) - possible losing (-1% to -3%) - acceptable all outcomes fine.\nfocus: execute system, preserve capital.\nno pressure to match april.\ncomparing strong months 2024 # january: +$27,200 (+7.4%), 68 trades, 76% wr\napril: +$23,460 (+5.9%), 53 trades, 74% wr\nboth during ideal conditions.\ncan\u0026rsquo;t force strong months.\ncan only execute when conditions align.\ntherapy reflection (4/25) # dr. r: \u0026ldquo;april impressive performance. how do you feel?\u0026rdquo;\nme: \u0026ldquo;grateful but realistic.\u0026rdquo;\ndr. r: \u0026ldquo;realistic how?\u0026rdquo;\nme: \u0026ldquo;this won\u0026rsquo;t repeat monthly. market gave perfect conditions. i executed. can\u0026rsquo;t expect this every month.\u0026rdquo;\ndr. r: \u0026ldquo;you\u0026rsquo;re managing expectations proactively.\u0026rdquo;\nme: \u0026ldquo;yeah. january crushed, then february flat. pattern repeats. april crushed, may probably struggles.\u0026rdquo;\ndr. r: \u0026ldquo;acceptance of variance is mature trading psychology.\u0026rdquo;\nexactly.\nwhat\u0026rsquo;s working # strategy: adaptive regime detection\nexecution: improved slippage control\nrisk management: consistent sizing, filters\npsychology: disciplined, realistic expectations\nrelationship: stable home life, A. supportive\nroutine: locked schedule, no distractions\nall systems aligned.\ntonight (apr 30, 11:24pm) # april done.\n+$23,460 (+5.9%).\n74% win rate.\nsecond notable month 2024.\nmarch testing validated adaptive strategy.\napril execution proved it works at scale.\nytd +$53,160 (+14.5%).\nmay begins tomorrow.\nrealistic expectations.\nexecute system.\naccept variance.\n11:24pm apr 30. april wrap. +$23,460 (5.9%). 74% win rate across 53 trades. second notable month 2024 (january +7.4%, april +5.9%). march testing paid off - validated adaptive regime strategy. ytd +14.5%. annualized pace 43% unsustainable. expect correction may-dec. strategy working. execution improving. discipline maintained.\n-AK\n","date":"28 April 2024","externalUrl":null,"permalink":"/posts/2024-04-28-april-wrap-exceptional-month-validation-complete/","section":"Posts","summary":"\u003cp\u003eapril done.\u003c/p\u003e\n\u003cp\u003estrong month.\u003c/p\u003e\n\u003cp\u003estrategy validation complete.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eapril final numbers \n    \u003cdiv id=\"april-final-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#april-final-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (apr 1):\u003c/strong\u003e $395,900\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eending (apr 30):\u003c/strong\u003e $419,360\u003c/p\u003e","title":"april wrap - strong month, strategy validation complete","type":"posts"},{"content":"","date":"28 April 2024","externalUrl":null,"permalink":"/tags/validation/","section":"Tags","summary":"","title":"Validation","type":"tags"},{"content":"week 4 april done.\nmonth wrapping up.\nstaying disciplined.\nweek 4 trades (apr 22-26) # monday 4/22: 2 trades, 2 wins. +$1,640\ntuesday 4/23: 3 trades, 2 wins. +$1,220\nwednesday 4/24: 2 trades, 1 win. +$580\nthursday 4/25: 3 trades, 2 wins. +$1,380\nfriday 4/26: 2 trades, 2 wins. +$1,520\nweek total: 12 trades, 9 wins (75%). +$6,340\naccount status # apr 19: $413,020\napr 26: $419,360\nweek 4: +$6,340\napril final tally (preliminary) # starting (apr 1): $395,900\nending (apr 26): $419,360\napril gain: +$23,460 (+5.9%)\ntrades: 53\nwins: 39\nlosses: 14\nwin rate: 74%\nstrong month.\ncomparing 4 weeks # week 1: +$2,400 (69% wr, ramping size)\nweek 2: +$7,000 (69% wr, full size)\nweek 3: +$7,720 (83% wr, full size)\nweek 4: +$6,340 (75% wr, full size)\nconsistency.\nevery week profitable.\nwin rate 69-83%.\nvalidated strategy.\nrisk management held # position sizing: $1,500 all month (after week 1 ramp)\ncircuit breaker: never triggered\nmax losing streak: 2 losses (happened once)\nfilters: averaged 57% signal acceptance\ndiscipline maintained.\ndidn\u0026rsquo;t get greedy when crushing.\ndidn\u0026rsquo;t panic on red days.\nsystem followed.\nmarket conditions perfect # VIX april range: 14-19\navg VIX: 16.2 (low-medium vol)\nregime stability: high (0.86 avg confidence)\ncorrelation: low (0.44 avg)\nthis is my strategy\u0026rsquo;s sweet spot.\nwhen VIX stays 14-19, adaptive mean reversion prints.\nytd tracking # Q1 total: +$29,700 (8.1%)\napril: +$23,460 (5.9%)\nytd: +$53,160 (14.5%)\nstrong performance.\nannual pace reality check # ytd: +14.5% in 4 months\nannualized pace: ~43%\ntarget: +15-18% annual\ncurrent trajectory: way above target\nneed correction Q2-Q4.\nexpect flat/losing months may-december.\napril = strong like january.\ncomparing standout months # january 2024: +$27,200 (+7.4%)\napril 2024: +$23,460 (+5.9%)\nboth outliers.\n2x notable months per year is realistic.\ncan\u0026rsquo;t expect this monthly.\nmay expectations # after crushing april:\nneed to accept reality.\nmay could be:\nflat month (+0% to +1%) modest gain (+1% to +2%) losing month (-1% to -3%) all acceptable.\napril notable performance won\u0026rsquo;t repeat immediately.\nmean reversion applies to trading performance too.\nslippage final numbers # april avg: 1.7 ticks per trade\nmarch testing: 2.4 ticks\nimprovement: 0.7 ticks = ~$210/month saved\nexecution getting better.\nlimit orders with buffer working.\ncomparing to 2023 # april 2023:\nstill learning.\ntesting strategies.\nsmall size.\nmodest gains.\napril 2024:\nstrategies proven.\nadaptive approach validated.\nfull size execution.\ncrushing it.\n1 year growth.\ntherapy insight (4/23) # dr. r: \u0026ldquo;april crushing it. how do you feel?\u0026rdquo;\nme: \u0026ldquo;good but cautious.\u0026rdquo;\ndr. r: \u0026ldquo;cautious how?\u0026rdquo;\nme: \u0026ldquo;january crushed. february struggled. march tested. april crushed again. pattern says correction coming.\u0026rdquo;\ndr. r: \u0026ldquo;you\u0026rsquo;re managing expectations.\u0026rdquo;\nme: \u0026ldquo;yeah. can\u0026rsquo;t expect 6% months consistently. need flat/losing months to balance.\u0026rdquo;\ndr. r: \u0026ldquo;that\u0026rsquo;s realistic trading psychology. most traders can\u0026rsquo;t accept that.\u0026rdquo;\nexactly.\nwhat i learned april # 1. testing pays off\nmarch tested adaptive strategy tiny size.\napril executed full size with confidence.\npatience = profit.\n2. regime detection critical\nintraday stability checks prevented false triggers.\nfiltered low-confidence setups.\nquality \u0026gt; quantity.\n3. execution matters\nimproved from 2.4 to 1.7 tick slippage.\nsmall improvements compound.\n$210/month = $2,520/year.\n4. emotional control\nbig wins didn\u0026rsquo;t trigger overconfidence.\nstayed disciplined.\nmaturity.\nweekend plans # saturday: rest, gym, review april performance\nsunday: backtest updates, optimize parameters, prepare for may\nno trading.\nmarket closed.\nmonday begins may # fresh month.\nfresh mindset.\nrealistic expectations.\napril crushed.\nmay might struggle.\nboth acceptable.\nfocus: execute system, preserve capital, stay disciplined.\ntonight # week 4 april.\n+$6,340.\nmonth total: +$23,460 (5.9%).\nsecond impressive month 2024.\njanuary +7.4%, april +5.9%.\nytd +14.5%.\nstrong but unsustainable pace.\nmay reality check expected.\n2:36am saturday. week 4 april complete. +$6,340 (75% wr). month final: +$23,460 (5.9%). account $419,360. ytd +$53,160 (14.5%). second standout month 2024. annualized pace 43% unsustainable. expect correction may-december.\n-AK\n","date":"26 April 2024","externalUrl":null,"permalink":"/posts/2024-04-26-week-4-april-finishing-strong/","section":"Posts","summary":"\u003cp\u003eweek 4 april done.\u003c/p\u003e\n\u003cp\u003emonth wrapping up.\u003c/p\u003e\n\u003cp\u003estaying disciplined.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 4 trades (apr 22-26) \n    \u003cdiv id=\"week-4-trades-apr-22-26\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-4-trades-apr-22-26\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003emonday 4/22:\u003c/strong\u003e 2 trades, 2 wins. +$1,640\u003c/p\u003e","title":"week 4 april - finishing month strong, staying disciplined","type":"posts"},{"content":"moved in november 1.\ntoday april 23.\n5.5 months living together.\nworks.\nwhat therapy revealed (tuesday 4/23) # dr. r: \u0026ldquo;almost 6 months living together. how\u0026rsquo;s it going?\u0026rdquo;\nme: \u0026ldquo;good. really good actually.\u0026rdquo;\ndr. r: \u0026ldquo;you sound surprised.\u0026rdquo;\nme: \u0026ldquo;kinda. never lived with anyone before. thought it\u0026rsquo;d be harder.\u0026rdquo;\ndr. r: \u0026ldquo;what makes it work?\u0026rdquo;\nme: \u0026ldquo;she doesn\u0026rsquo;t need constant attention. comfortable with silence. both introverts.\u0026rdquo;\ndr. r: \u0026ldquo;what about the friction you mentioned early on?\u0026rdquo;\nme: \u0026ldquo;still there. her mess, my OCD, bathroom schedule. but manageable.\u0026rdquo;\ndr. r: \u0026ldquo;manageable how?\u0026rdquo;\nme: \u0026ldquo;we negotiate. i clean common areas, she keeps her desk chaos. bathroom rule: first one up gets 30 minutes. coffee mugs: each have 3 designated. works.\u0026rdquo;\ndr. r: \u0026ldquo;you\u0026rsquo;re problem-solving together instead of fighting.\u0026rdquo;\nme: \u0026ldquo;yeah. she suggests solution, i tweak it, we try. if fails, adjust.\u0026rdquo;\ndr. r: \u0026ldquo;that\u0026rsquo;s mature partnership.\u0026rdquo;\nexactly.\nwhat\u0026rsquo;s actually working # separate workspaces:\nmy desk: trading setup, 3 monitors, organized AF\nher desk: coding setup, 2 monitors, papers everywhere, coffee mugs\nboth in same room but different corners.\nshe codes.\ni trade.\ncomfortable silence for hours.\nno interference.\nmorning routine:\n4am: i wake up, she sleeps\n6:30-10am: i trade, she wakes 9:30am\n10am: breakfast together\nlocked routine.\nevening routine:\n5pm: both finish work\n6pm: gym (she runs, i lift)\n7:30pm: dinner (she cooks, i clean)\n8-10pm: her on laptop, me reviewing backtests\n10pm: usually sex\n11pm-midnight: sleep\npredictable. stable.\nthe sex life # still best sex either of us has had.\ncompletely open about everything.\nfantasies, limits, desires.\nbondage, dom/sub (we switch), toys, anal, role play.\nzero shame.\ntotal trust.\nthe places list continues:\nadded 3 new places this month.\nher car (parking garage, late night).\ngym bathroom (quickie, almost caught).\nbalcony again (different position, she rode me facing the view).\nkeeps it exciting.\nfriday night (april 19) # good trading week.\nup $17k month.\ncame home in great mood.\nA.: \u0026ldquo;you\u0026rsquo;re happy.\u0026rdquo;\nme: \u0026ldquo;yeah. crushing it this month.\u0026rdquo;\nA.: \u0026ldquo;i can tell. less stressed lately.\u0026rdquo;\nme: \u0026ldquo;strategy working. tested it march, executing april. feels different.\u0026rdquo;\nA.: \u0026ldquo;different how?\u0026rdquo;\nme: \u0026ldquo;not gambling. systematic. proven edge.\u0026rdquo;\nA.: \u0026ldquo;that\u0026rsquo;s why you\u0026rsquo;re calm about it.\u0026rdquo;\nshe\u0026rsquo;s right.\nseptember 2023 big wins = manic energy.\napril 2024 big wins = calm execution.\nemotional growth maybe.\nthe mess negotiation # ongoing issue:\nher desk = disaster zone.\npapers, coffee mugs, random cables.\ndrives me insane.\nmy desk = pristine.\neverything has place.\ncables managed.\nmonitors aligned.\ncompromise:\nher desk chaos = fine.\ncommon areas = clean.\nworks.\ni clean living room, kitchen, bathroom.\nshe keeps her desk however she wants.\nboundary respected.\ncooking lively # A. loves cooking.\ntries new recipes constantly.\ni\u0026rsquo;m picky AF.\nlike what i like.\nher strategy:\nmakes new thing.\nif i try it and like it: adds to rotation.\nif i don\u0026rsquo;t like it: doesn\u0026rsquo;t make again.\nsometimes uses sex as reward for trying new foods.\nusually works.\nthis week:\nmade some indian curry thing.\nA.: \u0026ldquo;try it.\u0026rdquo;\nme: \u0026ldquo;looks weird.\u0026rdquo;\nA.: \u0026ldquo;try it and i\u0026rsquo;ll do that thing you like later.\u0026rdquo;\nme: \u0026ldquo;\u0026hellip;fine.\u0026rdquo;\ntried it.\nactually good.\nshe did that thing later.\nboth happy.\ncomparing to past relationships # M., K., S., J. (before sept 2023):\nnever lasted \u0026gt;6 months always had exit strategy got bored quickly they wanted traditional relationship shit i wanted freedom A. (june 2023 - present):\n10 months together, 5.5 living together no exit strategy not bored she doesn\u0026rsquo;t want traditional shit either both want independence within relationship difference:\nshe doesn\u0026rsquo;t chase so i don\u0026rsquo;t run.\ntherapy insight:\ndr. r calls it \u0026ldquo;secure attachment.\u0026rdquo;\nfirst time i\u0026rsquo;ve had that.\nparents\u0026rsquo; death context # 14 months since they died.\ngrief mostly integrated now.\nnot consuming.\nstill hits occasionally:\nrandom memory.\nquiet moment.\nher family dinner (reminds me what i lost).\nA. handles it well.\ndoesn\u0026rsquo;t try to fix it.\njust present.\nholds me when needed.\ngives space when needed.\nthat\u0026rsquo;s all i need.\nbathroom schedule solution # early problem:\nboth needed bathroom 6:30-7am.\nconflicts daily.\nsolution:\nfirst one up gets 30 minutes uninterrupted.\nsecond person waits or uses other bathroom.\nworks perfectly.\ni\u0026rsquo;m usually up first (4am).\nshe wakes 9:30am.\nno conflict.\nweekends: she\u0026rsquo;s up first sometimes.\ni wait.\nfair system.\ncoffee mug territorialism # ridiculous problem:\nwe both have favorite mugs.\nkept using each other\u0026rsquo;s.\nminor annoyance became daily friction.\nsolution:\neach designated 3 mugs.\nhers: purple, black, white.\nmine: gray, navy, black.\noff limits to other person.\nfixed stupid problem.\ntonight (10:48pm) # sitting on couch.\nA. coding on new keyboard (valentine\u0026rsquo;s gift).\ni\u0026rsquo;m writing this.\ncomfortable silence.\nno need to talk.\njust\u0026hellip; here.\n5.5 months living together.\nworks.\nseparate spaces in same room.\nrespectful boundaries.\nmutual support.\ngreat sex.\nfirst relationship where i\u0026rsquo;m not planning exit.\nshe saw me completely broken (september $28k disaster).\nstayed.\nthat matters.\n10:48pm tuesday. 5.5 months living together. works because: separate workspaces, comfortable silence, boundaries respected, great sex, she doesn\u0026rsquo;t chase so i don\u0026rsquo;t run. therapy revealed secure attachment pattern. mess negotiation ongoing. cooking compromise working. not planning exit for first time.\n-AK\n","date":"23 April 2024","externalUrl":null,"permalink":"/posts/2024-04-23-five-months-living-together-works/","section":"Posts","summary":"\u003cp\u003emoved in november 1.\u003c/p\u003e\n\u003cp\u003etoday april 23.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e5.5 months living together.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eworks.\u003c/strong\u003e\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ewhat therapy revealed (tuesday 4/23) \n    \u003cdiv id=\"what-therapy-revealed-tuesday-423\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#what-therapy-revealed-tuesday-423\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003edr. r:\u003c/strong\u003e \u0026ldquo;almost 6 months living together. how\u0026rsquo;s it going?\u0026rdquo;\u003c/p\u003e","title":"five months living together - this actually works","type":"posts"},{"content":"week 3 april done.\nthird week at full size $1,500.\nstability holding.\nweek 3 trades (apr 15-19) # monday 4/15: 2 trades, 2 wins. +$1,560\ntuesday 4/16: 3 trades, 2 wins. +$1,480\nwednesday 4/17: 2 trades, 2 wins. +$1,620\nthursday 4/18: 3 trades, 2 wins. +$1,340\nfriday 4/19: 2 trades, 2 wins. +$1,720\nweek total: 12 trades, 10 wins (83%). +$7,720\naccount progression # apr 1: $395,900\napr 12: $405,300\napr 19: $413,020\napril total (3 weeks): +$17,120 (+4.3%)\ncrushing it.\ncomparing 3 weeks # week 1: +$2,400 (69% wr, ramping size)\nweek 2: +$7,000 (69% wr, full size)\nweek 3: +$7,720 (83% wr, full size)\nimprovement week over week.\nwin rate climbing.\nstrategy optimizing.\nvalidation complete.\nwhat changed week 3 # improved regime detection:\nintraday stability checks.\n0 false regime triggers.\nfiltered 3 low-confidence setups.\nall 3 would\u0026rsquo;ve lost.\nsaved ~$900.\ntighter entry execution:\nadded limit orders with 2-tick buffer.\nslippage down to 1.6 ticks avg.\nwas 1.9 ticks week 2.\nsmall improvement = $360 saved.\nrisk management check # position sizing: consistent $1,500\nmax losing streak: 1 loss (only happened once)\ncircuit breaker: not triggered\nwin rate: 83% this week\nfilters: passing 58% of signals (selective)\nall systems green.\nmarket conditions ideal # VIX range: 14-17 (low to medium vol)\nregime stability: high (0.88 avg confidence)\ncorrelation: low (0.42)\nsetups: excellent quality\nthis is the environment my strategy thrives in.\nwhen VIX stays 14-17, mean reversion prints.\nmonthly projection update # april progress (3 weeks):\nweek 1: +$2,400\nweek 2: +$7,000\nweek 3: +$7,720\ntotal: +$17,120 (4.3%)\n1 week left.\nprojection:\nif maintains 70%+ win rate:\nweek 4: +$4-6k\napril end: +$21-23k (5.3% to 5.8%)\nstrong month but need to watch annual pace.\nytd reality check # Q1 end: +$29,700 (8.1%)\napril (so far): +$17,120 (4.3%)\nytd current: +$46,820 (12.8%)\nannualized pace: ~51%\nNOT SUSTAINABLE.\nneed flat/losing months Q2-Q4 to bring annual back to 15-18% range.\napril standout like january.\ncan\u0026rsquo;t expect this every month.\ncomparing to targets # annual target: +15% to +18% ($55k to $66k total)\ncurrent ytd: +12.8% ($46,820)\nremaining budget: +2.2% to +5.2% for rest of year\nthat\u0026rsquo;s 8 months remaining.\nneed flat/modest gains may-december.\nnext week final push # week 4 (apr 22-26):\nmaintain discipline.\ndon\u0026rsquo;t get greedy.\nkeep full size.\ntarget 60%+ win rate.\ngoal: +$4-6k to finish strong\ntotal april target: $21-23k\nrealistic but ambitious.\ntherapy tuesday (4/16) # dr. r: \u0026ldquo;three weeks full size. how\u0026rsquo;s it feel?\u0026rdquo;\nme: \u0026ldquo;good. confident. not anxious like past full size periods.\u0026rdquo;\ndr. r: \u0026ldquo;what\u0026rsquo;s different?\u0026rdquo;\nme: \u0026ldquo;september 2023 full size was overconfident without validation. march 2024 tested tiny size first. april executing proven strategy.\u0026rdquo;\ndr. r: \u0026ldquo;evidence-based confidence.\u0026rdquo;\nme: \u0026ldquo;exactly. not gambling. executing business plan.\u0026rdquo;\ndr. r: \u0026ldquo;how\u0026rsquo;s home life affecting trading?\u0026rdquo;\nme: \u0026ldquo;stable. A\u0026rsquo;s been great. routine locked. no distractions.\u0026rdquo;\nexactly.\nstrategy evolution # january: static parameters, low vol, crushing\nfebruary: static parameters, higher vol, struggling\nmarch: tested adaptive parameters, tiny size\napril: executing adaptive strategy, full size, back to crushing\nthe testing in march paid off.\nvalidated adaptive approach before committing capital.\npatience = profit.\nslippage improvement tracking # march testing: 2.4 ticks avg (small size)\napril week 1: 1.8 ticks avg\napril week 2: 1.9 ticks avg\napril week 3: 1.6 ticks avg\nimproving execution.\nlimit orders with buffer working.\ntonight # week 3 april.\n+$7,720.\n83% win rate.\nthird consecutive strong week.\nfull size validated.\nadaptive strategy working perfectly.\n1 week left to finish april strong.\n3:08am monday. week 3 april complete. +$7,720 (83% wr). full size $1,500 all week. regime detection improvements working - 0 false triggers. month total +$17,120 (4.3%). account $413,020. ytd +12.8%. strong month but watching annual pace.\n-AK\n","date":"21 April 2024","externalUrl":null,"permalink":"/posts/2024-04-21-week-3-april-stability-maintained/","section":"Posts","summary":"\u003cp\u003eweek 3 april done.\u003c/p\u003e\n\u003cp\u003ethird week at full size $1,500.\u003c/p\u003e\n\u003cp\u003estability holding.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 3 trades (apr 15-19) \n    \u003cdiv id=\"week-3-trades-apr-15-19\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-3-trades-apr-15-19\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003emonday 4/15:\u003c/strong\u003e 2 trades, 2 wins. +$1,560\u003c/p\u003e","title":"week 3 april - stability maintained at full size","type":"posts"},{"content":"week 3 april going strong.\nadaptive strategy crushing it.\nbeen refining regime detection logic.\ncurrent performance (apr 1-17) # trades: 29\nwins: 20\nlosses: 9\nwin rate: 69%\npnl: +$11,200 (+2.8%)\naccount: $407,100\nytd: +$40,900 (+11.2%)\nthe regime detection problem i fixed # original logic (from march):\n3-day confirmation before regime shift.\nproblem:\nintraday whipsaws still happening.\nVIX spikes up for 2 hours → wrong regime → false signals.\ncost:\n4 losing trades in past 2 weeks from false regime triggers.\n~$1,200 in preventable losses.\nimproved detection logic # added intraday regime validation layer.\nimport pandas as pd import numpy as np from datetime import datetime, timedelta class ImprovedRegimeDetection: \u0026#34;\u0026#34;\u0026#34; Enhanced regime detection with intraday stability checks \u0026#34;\u0026#34;\u0026#34; def __init__(self): # VIX thresholds self.low_vol_threshold = 15 self.high_vol_threshold = 20 # Confirmation settings self.daily_confirmation_days = 3 self.intraday_stability_hours = 2 # Regime history self.daily_regime_history = [] self.intraday_vix_samples = [] def classify_regime(self, vix_level): \u0026#34;\u0026#34;\u0026#34; Classify volatility regime based on VIX level \u0026#34;\u0026#34;\u0026#34; if vix_level \u0026lt; self.low_vol_threshold: return \u0026#39;low_vol\u0026#39; elif vix_level \u0026lt; self.high_vol_threshold: return \u0026#39;medium_vol\u0026#39; else: return \u0026#39;high_vol\u0026#39; def check_intraday_stability(self, current_vix): \u0026#34;\u0026#34;\u0026#34; Verify regime is stable intraday before accepting \u0026#34;\u0026#34;\u0026#34; # Add current sample self.intraday_vix_samples.append({ \u0026#39;timestamp\u0026#39;: datetime.now(), \u0026#39;vix\u0026#39;: current_vix, \u0026#39;regime\u0026#39;: self.classify_regime(current_vix) }) # Keep only last 3 hours of samples (one per 15min bar = 12 samples) cutoff_time = datetime.now() - timedelta(hours=3) self.intraday_vix_samples = [ s for s in self.intraday_vix_samples if s[\u0026#39;timestamp\u0026#39;] \u0026gt; cutoff_time ] # Need at least 2 hours of data (8 samples) if len(self.intraday_vix_samples) \u0026lt; 8: return None # Not enough data yet # Check if regime has been stable for last 2 hours last_8_samples = self.intraday_vix_samples[-8:] regimes = [s[\u0026#39;regime\u0026#39;] for s in last_8_samples] # Calculate regime consistency unique_regimes = set(regimes) if len(unique_regimes) == 1: # Perfect stability - same regime for 2 hours return regimes[0], 1.0 # regime, confidence elif len(unique_regimes) == 2: # Some instability - calculate majority regime_counts = {} for r in regimes: regime_counts[r] = regime_counts.get(r, 0) + 1 dominant_regime = max(regime_counts, key=regime_counts.get) confidence = regime_counts[dominant_regime] / len(regimes) # Only accept if 75%+ samples agree if confidence \u0026gt;= 0.75: return dominant_regime, confidence else: return None # Too unstable else: # High instability - 3+ regimes in 2 hours return None # Reject, too much whipsaw def update_daily_regime(self, eod_vix): \u0026#34;\u0026#34;\u0026#34; Update daily regime confirmation (end of day only) \u0026#34;\u0026#34;\u0026#34; daily_regime = self.classify_regime(eod_vix) # Add to daily history self.daily_regime_history.append(daily_regime) # Keep only last N days if len(self.daily_regime_history) \u0026gt; self.daily_confirmation_days: self.daily_regime_history.pop(0) # Check daily confirmation if len(self.daily_regime_history) == self.daily_confirmation_days: if all(r == daily_regime for r in self.daily_regime_history): return daily_regime, True # Confirmed return daily_regime, False # Not yet confirmed def get_trading_regime(self, current_vix, is_eod=False): \u0026#34;\u0026#34;\u0026#34; Get current trading regime with full validation Returns: regime (str): Current confirmed regime confidence (float): Confidence level (0-1) source (str): \u0026#39;intraday\u0026#39; or \u0026#39;daily\u0026#39; \u0026#34;\u0026#34;\u0026#34; # End of day: update daily regime if is_eod: daily_regime, confirmed = self.update_daily_regime(current_vix) if confirmed: return daily_regime, 1.0, \u0026#39;daily\u0026#39; # Intraday: check stability intraday_result = self.check_intraday_stability(current_vix) if intraday_result is not None: regime, confidence = intraday_result return regime, confidence, \u0026#39;intraday\u0026#39; # Fallback: use daily regime if available if len(self.daily_regime_history) \u0026gt; 0: return self.daily_regime_history[-1], 0.5, \u0026#39;daily_fallback\u0026#39; # Ultimate fallback: classify current VIX with low confidence return self.classify_regime(current_vix), 0.3, \u0026#39;instant\u0026#39; # Usage in production detector = ImprovedRegimeDetection() def process_trading_signal(prices, current_vix, is_eod=False): \u0026#34;\u0026#34;\u0026#34; Process trading signal with regime validation \u0026#34;\u0026#34;\u0026#34; # Get regime with confidence regime, confidence, source = detector.get_trading_regime( current_vix, is_eod=is_eod ) print(f\u0026#34;Regime: {regime} (confidence: {confidence:.1%}, source: {source})\u0026#34;) # Only trade with high confidence regimes if confidence \u0026gt;= 0.75: # Proceed with strategy using confirmed regime print(f\u0026#34;✓ Trading enabled in {regime} regime\u0026#34;) return True else: # Skip trading during uncertain regime transitions print(f\u0026#34;✗ Trading paused - regime uncertain (confidence: {confidence:.1%})\u0026#34;) return False backtesting the improvement # tested on march-april data:\nold logic (3-day confirmation only):\ntotal trades: 29 false regime triggers: 6 win rate: 62% pnl: +$9,400 new logic (intraday stability + 3-day):\ntotal trades: 23 false regime triggers: 0 win rate: 74% pnl: +$12,800 improvement: +$3,400 (36%)\n6 fewer trades but higher quality.\nreal-world example this week # tuesday april 16:\nVIX opened 16.2 (medium vol).\n10:30am spike to 19.8 (triggered high vol).\nold logic would\u0026rsquo;ve switched to high vol params immediately.\nnew logic waited:\nchecked intraday stability.\n11 out of 12 samples (2 hours) showed medium vol.\nspike was noise, not regime change.\nstayed in medium vol params.\nentered 2 trades that would\u0026rsquo;ve been skipped.\nboth won. +$1,480.\nsaved by stability check.\nwhat stability check prevents # prevents:\nwhipsaw regime changes during news events false signals from VIX intraday spikes parameter switching mid-trend overtrading during uncertain conditions accepts:\nsustained regime changes (VIX stays elevated 2+ hours) end-of-day confirmed shifts (3 consecutive days) gradual transitions with high confidence filtering trades by regime confidence # confidence levels:\n0.9-1.0 (perfect stability):\ntrade full size aggressive entries all setups allowed 0.75-0.89 (good stability):\ntrade 75% size selective entries high-quality setups only \u0026lt;0.75 (uncertain):\nno new trades hold existing positions wait for clarity this week (apr 15-17):\navg regime confidence: 0.88\ntrades taken: 8\ntrades skipped due to low confidence: 3\nquality over quantity.\ncombining with adaptive parameters # regime detection feeds into adaptive strategy.\nworkflow:\ndetect regime with confidence if confidence \u0026gt;75%: use regime-specific params if confidence \u0026lt;75%: stay flat or reduce size end-of-day: update daily regime confirmation parameters by regime:\nlow vol (VIX \u0026lt;15):\nlookback: 20 days entry: 2.0 std dev size: 0.5% risk medium vol (VIX 15-20):\nlookback: 15 days entry: 2.3 std dev size: 0.4% risk high vol (VIX \u0026gt;20):\nlookback: 10 days entry: 2.6 std dev size: 0.3% risk regime determines parameters automatically.\ncode performance # processing time:\nintraday stability check: ~2ms\ndaily regime update: ~1ms\ntotal overhead: negligible.\ndata storage:\nkeep 12 intraday samples (3 hours @ 15min bars)\nkeep 3 daily regime classifications\nmemory: ~1KB\nscales perfectly.\napril results so far # week 1: +$2,400 (69% wr)\nweek 2: +$7,000 (69% wr)\nweek 3 (partial): +$1,800 (75% wr)\nmonth total: +$11,200 (2.8%)\nregime detection upgrade working.\nfewer trades, higher win rate, better pnl.\nlearned from nexusfi discussion # been discussing adaptive strategies on NexusFi algo trading forum.\nother quant traders dealing with same regime detection issues.\nkey insights:\nconfirmation prevents whipsaw but creates lag intraday stability check solves both problems confidence scoring lets you scale risk dynamically filtering low-confidence periods increases win rate community feedback validated approach.\ntonight # improved regime detection live for 1 week.\n0 false triggers.\n74% win rate.\nstability checks working perfectly.\nquality trades only.\n2:54am thursday. regime detection improvements. added intraday stability layer (2-hour confirmation). prevents VIX spike whipsaws. week 3 april: 8 trades, 6 wins (75% wr). month total +$11,200 (2.8%). account $407,100. ytd +11.2%.\n-AK\n","date":"18 April 2024","externalUrl":null,"permalink":"/posts/2024-04-18-regime-detection-improvements-faster-adaptation/","section":"Posts","summary":"\u003cp\u003eweek 3 april going strong.\u003c/p\u003e\n\u003cp\u003eadaptive strategy crushing it.\u003c/p\u003e\n\u003cp\u003ebeen refining regime detection logic.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ecurrent performance (apr 1-17) \n    \u003cdiv id=\"current-performance-apr-1-17\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#current-performance-apr-1-17\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003etrades:\u003c/strong\u003e 29\u003c/p\u003e","title":"regime detection improvements - faster market adaptation working","type":"posts"},{"content":"week 2 april done.\nfirst full week at $1,500 size.\nvalidation complete.\nweek 2 trades (apr 8-12) # monday 4/8: 3 trades, 2 wins. +$1,840\ntuesday 4/9: 2 trades, 1 win. +$720\nwednesday 4/10: 3 trades, 2 wins. +$1,620\nthursday 4/11: 2 trades, 2 wins. +$1,480\nfriday 4/12: 3 trades, 2 wins. +$1,340\nweek total: 13 trades, 9 wins (69%). +$7,000\naccount status # apr 5: $398,300\napr 12: $405,300\ntwo weeks april: +$9,400\ncrushing it.\nfull size performance # $1,500 per trade all week.\n69% win rate maintained.\nsame as $800-1,200 size last week.\nstrategy scales.\nno degradation at full size.\nvalidation complete.\nadaptive strategy working # monday: high vol regime (VIX 19), conservative entries, 2/3 wins\ntuesday: dropped to medium vol (VIX 16), moderate entries, 1/2 wins\nwednesday-friday: low vol (VIX 14-15), aggressive entries, 6/8 wins\nregime detection adapting perfectly.\nlow vol = higher win rate.\nexactly as designed.\nslippage at full size # march testing (small size): 2.4 ticks avg\napril week 2 (full size): 1.9 ticks avg\nslippage improved at larger size.\nbetter fills.\ninstitutional-level liquidity.\n0.2 std dev buffer working.\ncomparing to targets # april target: +$8-11k total\nweek 1: +$2,400\nweek 2: +$7,000\ntwo weeks total: +$9,400\nalready hit low end of target with 2 weeks left.\nexceeding expectations.\nthe testing payoff math # march testing cost:\n4 weeks testing.\n+$1,100 profit (basically flat).\nopportunity cost: ~$8k (if had traded full size).\nmarch testing benefit:\nfound regime detection bug.\nfound slippage issues.\nvalidated strategy before committing.\napril proof testing worked:\nweek 1: +$2,400 (69% wr)\nweek 2: +$7,000 (69% wr)\nwould\u0026rsquo;ve lost $20k+ without march testing.\nmarch \u0026ldquo;cost\u0026rdquo; $7k opportunity.\nmarch saved $20k+ disaster.\nnet benefit: +$13k.\ntherapy tuesday (4/9) # dr. r: \u0026ldquo;full size first week. how\u0026rsquo;s it feel?\u0026rdquo;\nme: \u0026ldquo;good. confident. no anxiety.\u0026rdquo;\ndr. r: \u0026ldquo;different from past full size trading?\u0026rdquo;\nme: \u0026ldquo;yeah. september 2023 i was full size but overconfident and strategies were breaking. now full size with validated edge.\u0026rdquo;\ndr. r: \u0026ldquo;what\u0026rsquo;s the difference internally?\u0026rdquo;\nme: \u0026ldquo;september felt like gambling. april feels like executing business plan.\u0026rdquo;\ndr. r: \u0026ldquo;confidence from process vs confidence from ego.\u0026rdquo;\nme: \u0026ldquo;exactly.\u0026rdquo;\nvalidation matters.\nliving with A. - excitement # thursday night:\ngreat trading week.\nup $7k already.\nA.: \u0026ldquo;you\u0026rsquo;re in a good mood.\u0026rdquo;\nme: \u0026ldquo;yeah. full size working. made $7k this week.\u0026rdquo;\nA.: \u0026ldquo;that\u0026rsquo;s amazing. also you seem\u0026hellip; calm about it.\u0026rdquo;\nme: \u0026ldquo;calm?\u0026rdquo;\nA.: \u0026ldquo;yeah. like this is normal. not freaking out.\u0026rdquo;\nme: \u0026ldquo;because it\u0026rsquo;s systematic. strategy works. not luck.\u0026rdquo;\nA.: \u0026ldquo;that\u0026rsquo;s growth. september you\u0026rsquo;d be manic after big week.\u0026rdquo;\nshe\u0026rsquo;s right.\nseptember: big week = overconfidence = disaster following week.\napril: big week = validation = continue execution.\nemotional maturity.\nmonthly projection update # april progress:\nweek 1: +$2,400\nweek 2: +$7,000\ntotal: +$9,400 (2.4%)\n2 weeks left.\nprojection:\nif maintains 69% wr and $1,500 size:\nweek 3-4: +$6-8k more.\napril end: +$15-17k (3.8% to 4.3%)\nstrong month but not excessive.\nyear to date tracking # Q1 end: +$29,700 (8.1%)\napril (so far): +$9,400 (2.4%)\nytd current: +$39,100 (10.7%)\nstrong start to year.\nrisk management check # circuit breaker: not triggered\nmax losing streak: 1 loss only\nwin rate: 69% (consistent)\nslippage: 1.9 ticks (acceptable)\nfilters: passing 55% of signals\nall systems green.\nmarket conditions # VIX: 14-19 range (low to medium)\nsetups: high quality\nregime shifts: 3 times this week (all caught correctly)\nconditions: ideal for adaptive mean reversion\nif market stays like this:\napril could be +$15k+.\nif market shifts:\nstrategy will adapt.\nthat\u0026rsquo;s the point of adaptive params.\nwhat\u0026rsquo;s working # 1. march testing\nfound issues at tiny size.\nvalidated gradually.\nnow executing with confidence.\n2. regime adaptation\nstrategy adjusts to conditions.\nnot static parameters.\n3. emotional control\nno overconfidence after big week.\nno anxiety about continuing.\njust executing system.\n4. relationship stability\nA. supports without pressure.\nhome life calm.\ncan focus on trading.\ntonight # week 2 april.\nfirst full week $1,500 size.\n+$7,000.\n69% win rate.\nvalidation complete.\nmarch testing paid off.\nstrategy works at scale.\n3:22am sunday. week 2 april. first full week full size $1,500. +$7,000. 69% win rate maintained. two weeks april total +$9,400 (2.4%). adaptive strategy working perfectly - regime detection caught 3 shifts. slippage improved at full size (1.9 ticks). march testing paid off. validation complete.\n-AK\n","date":"14 April 2024","externalUrl":null,"permalink":"/posts/2024-04-14-full-size-first-week-validation/","section":"Posts","summary":"\u003cp\u003eweek 2 april done.\u003c/p\u003e\n\u003cp\u003efirst full week at $1,500 size.\u003c/p\u003e\n\u003cp\u003evalidation complete.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 2 trades (apr 8-12) \n    \u003cdiv id=\"week-2-trades-apr-8-12\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-2-trades-apr-8-12\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003emonday 4/8:\u003c/strong\u003e 3 trades, 2 wins. +$1,840\u003c/p\u003e","title":"full size first week - validation complete","type":"posts"},{"content":"first week april done.\nramping to full size.\nconfidence building.\nweek 1 april trades (apr 1-5) # monday 4/1: 3 trades, 2 wins. +$520 ($800 size)\ntuesday 4/2: 2 trades, 2 wins. +$680 ($800 size)\nwednesday 4/3: 3 trades, 2 wins. +$440 ($800 size)\nthursday 4/4: 2 trades, 1 win. +$180 ($800 size)\nfriday 4/5: 3 trades, 2 wins. +$580 ($1,200 size - increased mid-week)\nweek total: 13 trades, 9 wins (69%). +$2,400\naccount status # apr 1: $395,900\napr 5: $398,300\nweek 1 progress: +$2,400\nsolid start.\nposition sizing progression # march final week: $400 size\napril week 1 mon-thu: $800 size\napril week 1 fri: $1,200 size\nnext week target: full size $1,500\ngradual ramp working.\nhit 69% win rate at $800.\nincreased to $1,200 friday.\nstill holding 67% (2/3 trades).\nconfidence justified.\nadaptive strategy performance # regime detection: working perfectly\nmonday: low vol regime (VIX 14), tight stops\nwednesday: medium vol regime (VIX 17), moderate stops\nfriday: back to low vol (VIX 15), tight stops\nstrategy adapted correctly each time.\nslippage managed:\nadded 0.2 std dev buffer to entries.\naveraging 1.8 ticks slippage (down from 2.5 in march).\nacceptable range.\ncomparing to march testing # march week 4: $400 size, 63% win rate, +$432\napril week 1: $800-1,200 size, 69% win rate, +$2,400\n5.6x profit increase.\nlarger size + maintained win rate = results.\ntesting phase validated.\nwhat\u0026rsquo;s different now # march mindset: tentative, testing, uncertain\napril mindset: confident, validated, ready\nkey difference:\nmarch = finding problems.\napril = executing proven strategy.\n4 weeks testing paid off.\ntherapy tuesday (4/2) # dr. r: \u0026ldquo;back to larger size. nervous?\u0026rdquo;\nme: \u0026ldquo;no. tested thoroughly. strategy works.\u0026rdquo;\ndr. r: \u0026ldquo;what about march 2023 flashback?\u0026rdquo;\nme: \u0026ldquo;march 2023 i rushed. this time i took 4 weeks testing tiny size.\u0026rdquo;\ndr. r: \u0026ldquo;feels different?\u0026rdquo;\nme: \u0026ldquo;yeah. march 2023 was hope. april 2024 is confidence from evidence.\u0026rdquo;\ndr. r: \u0026ldquo;that\u0026rsquo;s the distinction. hope vs evidence.\u0026rdquo;\nexactly.\nliving with A. - support # wednesday night:\ngood trading day.\ncame home in solid mood.\nA.: \u0026ldquo;good day?\u0026rdquo;\nme: \u0026ldquo;yeah. strategy working. up $2k this week.\u0026rdquo;\nA.: \u0026ldquo;back to full size soon?\u0026rdquo;\nme: \u0026ldquo;next week probably. hit 69% win rate at $800.\u0026rdquo;\nA.: \u0026ldquo;you seem\u0026hellip; lighter. less stressed than march.\u0026rdquo;\nme: \u0026ldquo;march was testing unknown. now it\u0026rsquo;s executing known.\u0026rdquo;\nA.: \u0026ldquo;confidence looks good on you.\u0026rdquo;\nshe\u0026rsquo;s right.\nmarch = anxiety about whether strategy would work.\napril = calm from knowing it works.\nmarket conditions ideal # VIX: 14-17 range (low to medium vol)\nregime shifts: only 2 this week (manageable)\ncorrelation: low (0.4)\nsetups: high quality\nconditions favor mean reversion.\nadaptive strategy succeeding.\nweekly projection for april # week 1: +$2,400 (done)\nweek 2 target: +$2,000-3,000 (full size $1,500)\nweek 3 target: +$2,000-3,000\nweek 4 target: +$2,000-3,000\napril total target: +$8-11k (+2% to 2.8%)\nrealistic after flat march.\nrisk management check # circuit breaker: not triggered\nmax losing streak: 1 loss (wednesday)\nposition sizing: gradual ramp\nfilters: passing 60% of signals (high quality focus)\nsystem functioning perfectly.\nthe march patience payoff # march felt slow:\n4 weeks testing.\nonly +$1,100 profit.\nwanted to rush.\napril shows why patience mattered:\nfound regime detection issues at $100 size (cheap lesson).\nfound slippage problems at $200 size (cheap lesson).\nvalidated at $400 size.\nnow executing at $800-1,200 with confidence.\nmarch cost $1,100 to learn.\nwould\u0026rsquo;ve cost $40k+ without testing.\nlooking ahead # week 2 (apr 8-12):\nfull size $1,500 all week.\ntarget 60%+ win rate.\ntarget +$2-3k.\nif struggles:\ndrop back to $800 size.\nreassess.\nif maintains:\ncontinue full size rest of april.\ntonight # first week april.\n+$2,400.\n69% win rate.\nramped from $800 to $1,200.\nnext week: full size $1,500.\nmarch testing paid off.\nconfidence justified by evidence.\n2:48am sunday. first week april. +$2,400. 69% win rate across 13 trades. ramped position size $800→$1,200. adaptive strategy working - regime detection perfect, slippage managed. march testing paid off. full size $1,500 next week. confidence from evidence not hope.\n-AK\n","date":"7 April 2024","externalUrl":null,"permalink":"/posts/2024-04-07-ramping-to-full-size-confidence-building/","section":"Posts","summary":"\u003cp\u003efirst week april done.\u003c/p\u003e\n\u003cp\u003eramping to full size.\u003c/p\u003e\n\u003cp\u003econfidence building.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 1 april trades (apr 1-5) \n    \u003cdiv id=\"week-1-april-trades-apr-1-5\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-1-april-trades-apr-1-5\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003emonday 4/1:\u003c/strong\u003e 3 trades, 2 wins. +$520 ($800 size)\u003c/p\u003e","title":"ramping to full size - confidence building week by week","type":"posts"},{"content":"march done.\ntesting month complete.\nfoundation built for Q2.\nmarch final numbers # starting (mar 1): $394,800\nending (mar 31): $395,900\nmarch gain: +$1,100 (+0.28%)\ntrades: 34\nwins: 20\nlosses: 14\nwin rate: 59%\nFigure 1: March testing period showing flat account progression during strategy validation. Week 1 paper trading (no real money), Week 2 live at $100 size, Week 3 $200 size, Week 4 $400 size. Account barely moved during testing - capital preservation successful. Testing phase = risk management.\nweekly breakdown # Figure 2: Gradual position size ramp through March. Started paper trading at $0 real money (67% win rate), increased to $100 size week 2 (50% win rate as reality hit), then $200 size week 3 (60% win rate improved), ending $400 size week 4 (58% win rate held). Slow ramp = cheap lessons.\nweek 1 (paper): 12 trades, 67% win rate, $0 real money\nweek 2 ($100): 4 trades, 50% win rate, +$18\nweek 3 ($200): 10 trades, 60% win rate, +$650\nweek 4 ($400): 8 trades, 63% win rate, +$432\ntotal real money: +$1,100\nslow ramp worked.\nQ1 2024 summary # Figure 3: Q1 performance showing strong January (+7.4%), realistic February (+0.36%), and flat March testing period (+0.28%). Account progressed from $366,200 to $395,900. Q1 YTD: +$29,700 (+8.1%). January was outlier - one of 2x strong months per year allowed. Feb/Mar show sustainable performance.\njanuary: +$27,200 (+7.4%) - notable month\nfebruary: +$1,400 (+0.36%) - flat/reality check\nmarch: +$1,100 (+0.28%) - testing phase\nQ1 total: +$29,700 (+8.1%)\nQ1 annualized pace: ~32%\nNOT SUSTAINABLE.\nneed Q2-Q4 correction.\nyear to date reality check # starting balance (jan 1): $366,200\ncurrent balance (mar 31): $395,900\nytd gain: +$29,700 (+8.1%)\nstrong Q1 performance.\nadaptive strategy validation # testing results:\npaper trading: 67% win rate (unrealistic)\nlive $100-400: 57% win rate (realistic)\nissues found and fixed:\nregime detection too slow (fixed with 3-hour confirmation) slippage underestimated (added 0.2 std dev buffer) fill delays on entries (switched to limit orders with 2-tick buffer) false regime triggers (confirmation logic improved) strategy ready for larger size.\napril plan # week 1 (apr 1-5): $800 size\nweek 2 (apr 8-12): $1,200 size\nweek 3-4 (apr 15-30): full size $1,500 if validated\ntarget april: +$2-4k (+0.5% to 1%)\nconservative ramp.\ncomparing to march 2023 # march 2023:\ntested 2 weeks paper.\njumped to full size immediately.\nlost $40k.\nmarch 2024:\ntested 4 weeks with gradual size ramp.\nfound issues at tiny size.\ncost $1,100 to learn instead of $40k.\npatience paid off.\ntherapy friday (3/29) # dr. r: \u0026ldquo;month of testing complete. how do you feel?\u0026rdquo;\nme: \u0026ldquo;good. ready to increase size in april.\u0026rdquo;\ndr. r: \u0026ldquo;confident or overconfident?\u0026rdquo;\nme: \u0026ldquo;confident. tested thoroughly. found issues. fixed them.\u0026rdquo;\ndr. r: \u0026ldquo;what if april struggles?\u0026rdquo;\nme: \u0026ldquo;then back down to smaller size. not committed to full size until proven.\u0026rdquo;\ndr. r: \u0026ldquo;that\u0026rsquo;s mature risk management.\u0026rdquo;\nme: \u0026ldquo;march 2023 taught me expensive lesson. march 2024 showed i learned.\u0026rdquo;\nexactly.\nliving with A. - 5 months # moved in: november 1, 2023\ntoday: march 31, 2024\n5 months living together.\nwhat\u0026rsquo;s working:\nroutine locked.\ncomfortable silence.\nmutual respect for space.\nshe helps with code bugs.\ni clean while she cooks.\nwhat\u0026rsquo;s still friction:\nher mess vs my OCD (ongoing).\nbathroom schedule conflicts (solved with 2nd bathroom rule).\ncoffee mug territorialism (we each have 3 designated mugs now).\nbut manageable.\nrelationship stable.\nmarch lessons # 1. testing takes time\n4 weeks felt slow.\nwanted to rush to full size.\npatience prevented disaster.\n2. paper trading optimistic\n67% win rate paper → 57% live.\nreality has friction.\n3. gradual ramp works\n$0 → $100 → $200 → $400 → next: $1,500.\nfound issues at each step.\ncheap lessons.\n4. capital preservation matters\nmarch: +$1,100 (basically flat).\npreserved capital while learning.\nbetter than losing testing.\nQ2 outlook # april: ramp to full size\nmay: first full month with adaptive strategy\njune: evaluate and adjust\nQ2 target: +$5-8k total (+1.3% to 2%)\nconservative after Q1 significant performance.\ntonight (mar 31, 11:12pm) # march done.\n+$1,100 (+0.28%).\n59% win rate.\ntesting month complete.\nadaptive strategy validated.\nissues found and fixed.\nQ1: +$29,700 (8.1%).\njanuary notable, feb/mar realistic.\nQ2 begins tomorrow.\nfoundation built.\n11:12pm mar 31. march wrap. +$1,100 (0.28%). 59% win rate across 34 trades. testing period with gradual size ramp $0→$100→$200→$400. found regime detection issues, slippage problems, fixed before scaling. Q1 total +$29,700 (8.1%) - january standout, need Q2-Q4 correction to sustainable 15-18% annual. april begins full size ramp.\n-AK\n","date":"31 March 2024","externalUrl":null,"permalink":"/posts/2024-03-31-march-wrap-testing-month-foundation-built/","section":"Posts","summary":"\u003cp\u003emarch done.\u003c/p\u003e\n\u003cp\u003etesting month complete.\u003c/p\u003e\n\u003cp\u003efoundation built for Q2.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003emarch final numbers \n    \u003cdiv id=\"march-final-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#march-final-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (mar 1):\u003c/strong\u003e $394,800\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eending (mar 31):\u003c/strong\u003e $395,900\u003c/p\u003e","title":"march wrap - testing month, foundation built for Q2","type":"posts"},{"content":"","date":"31 March 2024","externalUrl":null,"permalink":"/tags/testing/","section":"Tags","summary":"","title":"Testing","type":"tags"},{"content":"","date":"21 March 2024","externalUrl":null,"permalink":"/tags/patience/","section":"Tags","summary":"","title":"Patience","type":"tags"},{"content":"week 3 march done.\nstill testing adaptive strategy.\npatience required.\nweek 3 trades (mar 18-22) # monday 3/18: 2 trades, 1 win. +$140\ntuesday 3/19: 3 trades, 2 wins. +$220\nwednesday 3/20: 2 trades, 1 win. +$105\nthursday 3/21: 3 trades, 2 wins. +$185\nfriday 3/22: waiting (still morning)\nweek 3 total (4 days): 10 trades, 6 wins (60%). +$650\nposition sizing update # week 2: $100 per trade\nweek 3: $200 per trade (after hitting 60% threshold)\nincreased size mid-week wednesday.\nwin rate held at 60%.\nconfidence building.\naccount status # mar 12: $394,818\nmar 21: $395,468\nmarch total: +$668\nstill basically flat month.\ntesting phase = not about profit.\nadaptive strategy performance # regime detection working better:\n3-hour intraday confirmation.\ncaught 4 regime shifts this week.\nonly 1 false trigger (tuesday).\n80% accuracy on regime classification.\nacceptable.\nslippage still high:\naveraging 2.5 ticks per trade.\nadded 0.2 std dev buffer to entries.\nhelps but not perfect.\nparameters adapting correctly:\nlow vol (2 days): tight stops, aggressive entries\nmedium vol (1 day): moderate stops\nhigh vol (1 day): wide stops, conservative entries\nworking as designed.\ncomparing weeks # week 1 (paper): 67% win rate, $2,840 simulated\nweek 2 (live $100): 50% win rate, $18 real\nweek 3 (live $200): 60% win rate, $650 real\nimprovement.\nstill below paper trading but getting closer.\nthe impatience problem # been testing 3 weeks.\nonly made $668.\npart of me wants to jump to full size.\n\u0026ldquo;strategy is working, 60% win rate, just increase size.\u0026rdquo;\nbut march 2023 flashback:\nfelt same way.\njumped to full size too early.\nlost $40k.\npatience required.\ntherapy tuesday (3/19) # dr. r: \u0026ldquo;how\u0026rsquo;s testing going?\u0026rdquo;\nme: \u0026ldquo;good. 60% win rate. but only making $200-300 per week.\u0026rdquo;\ndr. r: \u0026ldquo;and that bothers you?\u0026rdquo;\nme: \u0026ldquo;yeah. could be making $2-3k per week at full size.\u0026rdquo;\ndr. r: \u0026ldquo;or could be losing $2-3k per week if strategy breaks.\u0026rdquo;\nme: \u0026ldquo;\u0026hellip;true.\u0026rdquo;\ndr. r: \u0026ldquo;what\u0026rsquo;s the rush?\u0026rdquo;\nme: \u0026ldquo;january made $27k. february flat. march flat. feels like wasting time.\u0026rdquo;\ndr. r: \u0026ldquo;or building foundation so april-december can be consistent?\u0026rdquo;\nme: \u0026ldquo;yeah. i know you\u0026rsquo;re right. just impatient.\u0026rdquo;\ndr. r: \u0026ldquo;impatience killed you in march 2023. patience saved you in march 2024.\u0026rdquo;\nneeded to hear that.\nliving with A. - normalcy # week 3 march = normal.\nno drama.\nno fights.\njust\u0026hellip; routine.\nmornings:\nwake 4am.\ntrade 6:30-10am (testing).\nbreakfast with A. 10am.\nevenings:\ngym 6pm.\ndinner 7:30pm.\ncode/review backtests 8-10pm.\nweekends:\nsaturday: her time (shopping, friends, whatever).\nsunday: my time (strategy work, gym, rest).\ncomfortable.\nthe places list # saturday night (mar 16).\ngood testing week.\nA. in playful mood after girls night.\nA.: \u0026ldquo;list?\u0026rdquo;\nme: \u0026ldquo;where?\u0026rdquo;\nA.: \u0026ldquo;shower. right now.\u0026rdquo;\nshower, 11pm:\nhot water.\nsteam everywhere.\nshe was up against the tile wall.\nboth came hard.\nplaces list updated: shower, late night, steam, hot water, almost slipped.\nmarch plan update # original plan:\nweek 1: paper trade\nweek 2: $100 size\nweek 3: $200 size\nweek 4: $400 size\napril: full size if validated\nreality check:\nhitting milestones but not rushing.\nupdated plan:\nweek 4 (mar 25-29): $400 size IF win rate stays \u0026gt;55%\nearly april (apr 1-5): $800 size IF still working\nmid april: full size ($1,500) IF confidence high\nslower ramp = safer.\nslippage analysis # week 3 data:\n10 trades.\naverage slippage: 2.4 ticks.\ncost: $24 per trade avg.\non $200 size: $24 = 12% of position.\non full $1,500 size: $24 = 1.6% of position.\nslippage impact decreases with size.\nanother reason to increase gradually.\nmarket conditions # VIX: 17-20 range (medium vol)\nregime shifts: 4 times this week\ncorrelation: moderate (0.6)\nconditions ideal for testing.\nnot too calm.\nnot too chaotic.\ngood environment to validate adaptive params.\nmonthly projection # march progress (3 weeks):\nweek 1: paper trading\nweek 2: +$18\nweek 3: +$650\ntotal: +$668\nfinal week projection: +$300-500\nmarch end: +$968 to +$1,168 total\n~0.25% to 0.30% gain.\nway below january (+7.4%).\nrealistic for testing month.\ntonight # week 3 march testing.\nincreased to $200 size.\n60% win rate maintained.\npatience paying off.\nmarch 2023: rushed, lost $40k.\nmarch 2024: patient, learning, profitable.\nthis is the way.\n2:52am friday. week 3 march testing. increased to $200 size after hitting 60% win rate. 10 trades, 6 wins, +$650 week. march total +$668 (basically flat). regime detection working better. slippage still high but manageable. patience required - not rushing to full size. march 2023 flashback reminder.\n-AK\n","date":"21 March 2024","externalUrl":null,"permalink":"/posts/2024-03-21-week-3-march-still-testing-patience-required/","section":"Posts","summary":"\u003cp\u003eweek 3 march done.\u003c/p\u003e\n\u003cp\u003estill testing adaptive strategy.\u003c/p\u003e\n\u003cp\u003epatience required.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 3 trades (mar 18-22) \n    \u003cdiv id=\"week-3-trades-mar-18-22\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-3-trades-mar-18-22\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003emonday 3/18:\u003c/strong\u003e 2 trades, 1 win. +$140\u003c/p\u003e","title":"week 3 march - still testing, patience required","type":"posts"},{"content":"week 1-2 march testing.\nadaptive strategy live.\nmixed results.\ntesting approach # week 1 (mar 4-8):\npaper trading only.\nlogging all signals.\nno real money.\nweek 2 (mar 11-15 so far):\nlive trading tiny size.\n$100 per trade max.\ntesting regime detection.\npaper trading results (week 1) # trades: 12\nwins: 8\nlosses: 4\nwin rate: 67%\npaper pnl: +$2,840 (simulated on full size)\nlooked promising.\nlive testing results (week 2 so far) # monday-tuesday (mar 11-12):\ntrades: 4\nwins: 2\nlosses: 2\nwin rate: 50%\nreal pnl: +$18 (on $100 size)\nissues found:\nregime whipsaw on monday false signal tuesday morning slippage worse than expected fill delays on entries reality different from paper trading.\nregime detection issues # monday mar 11:\nVIX opened 17.8 (medium vol).\nby 11am: jumped to 20.4 (high vol).\nregime switched mid-day.\nmy confirmation logic requires 3 days.\nstuck in wrong regime for 6 hours.\nlost 2 trades because parameters didn\u0026rsquo;t match conditions.\nneed faster regime detection for intraday.\nparameter adjustment # original confirmation: 3 days\nupdated: 3 hours for intraday regime shifts\ntested tuesday mar 12:\nVIX moved 18.2 → 19.8 → 18.5 in 4 hours.\n3-hour confirmation prevented false regime change.\nworked better.\ncomparing to february static # february (static params):\nmean reversion: 57% win rate\ntotal trades: 37\nnet: +$1,400\nmarch week 2 (adaptive, tiny size):\nmean reversion: 50% win rate (so far)\ntotal trades: 4\nnet: +$18\ntoo early to judge.\nneed more trades.\nslippage reality check # paper trading: assumed 1 tick slippage\nlive trading: getting 2-3 tick slippage\non $100 trades: not material\non full size ($1,500): would be $40-60 per trade\nannual impact if continues:\nassuming 300 trades/year.\nextra 2 ticks = $12,000-18,000 drag.\nsignificant.\nneed to add slippage buffer to entry/exit logic.\naccount status # mar 1: $394,800\nmar 12: $394,818\nbasically flat.\ntesting phase = capital preservation.\ngood.\ntherapy tuesday (3/12) # dr. r: \u0026ldquo;testing new strategy. how\u0026rsquo;s it going?\u0026rdquo;\nme: \u0026ldquo;mixed. paper trading looked great. live trading showing issues.\u0026rdquo;\ndr. r: \u0026ldquo;what kind of issues?\u0026rdquo;\nme: \u0026ldquo;regime detection too slow. slippage worse than expected. reality different from simulation.\u0026rdquo;\ndr. r: \u0026ldquo;frustrating?\u0026rdquo;\nme: \u0026ldquo;yeah but expected. testing phase is for finding this shit.\u0026rdquo;\ndr. r: \u0026ldquo;how\u0026rsquo;s different from february?\u0026rdquo;\nme: \u0026ldquo;february i was trading full size when strategies failed. now testing tiny size before committing.\u0026rdquo;\ndr. r: \u0026ldquo;learning from experience.\u0026rdquo;\nexactly.\nliving with A. - coding help # sunday night (mar 10):\nstuck on regime detection bug.\ncouldn\u0026rsquo;t figure out why confirmation logic failing.\nA.: \u0026ldquo;what\u0026rsquo;s wrong?\u0026rdquo;\nme: \u0026ldquo;regime filter isn\u0026rsquo;t working. keeps false-triggering.\u0026rdquo;\nA.: \u0026ldquo;show me the code.\u0026rdquo;\nspent 30 minutes reviewing my logic.\nA.: \u0026ldquo;you\u0026rsquo;re checking VIX once at market open. need to check every bar.\u0026rdquo;\nme: \u0026ldquo;\u0026hellip;fuck. you\u0026rsquo;re right.\u0026rdquo;\nA.: \u0026ldquo;also your 3-day confirmation is calendar days not trading days.\u0026rdquo;\nme: \u0026ldquo;\u0026hellip;double fuck.\u0026rdquo;\nfixed both bugs in 10 minutes.\nthis is why living together works.\nshe understands code.\ncan actually help with trading problems.\nwhat i\u0026rsquo;m learning # 1. paper trading optimistic\nno slippage reality.\nno fill delays.\nperfect executions.\nreal trading has friction.\n2. regime detection hard\nintraday volatility swings.\nfalse signals.\nconfirmation vs responsiveness tradeoff.\n3. testing phase essential\ntiny size = cheap lessons.\nfinding bugs before committing capital.\nworth the time.\nnext steps # rest of week 2 (mar 13-15):\ncontinue $100 size.\nfocus on regime detection tuning.\nlog all slippage.\nweek 3 (mar 18-22):\nif win rate \u0026gt;60%: increase to $200 size.\nif win rate \u0026lt;55%: back to paper trading.\nweek 4 (mar 25-29):\nif still working: $400 size.\nif broken: pause and reassess.\nno rush to full size.\nmonthly projection # march target: flat to +1% ($0 to $4k)\ncurrently: +$18 (basically flat)\nfine.\ntesting month = not about profit.\nabout validating strategy before committing.\ncomparing to past disasters # march 2023:\ntested strategy for 2 weeks on paper.\nlooked great.\nwent live full size immediately.\nlost $40k in 3 weeks.\nmarch 2024:\ntesting strategy for 4+ weeks.\nstarting tiny size.\nfinding issues before they cost real money.\ngrowth.\ntonight # week 1-2 march testing.\npaper trading: 67% win rate.\nlive trading: 50% win rate.\nreality different from simulation.\nfinding bugs before they matter.\ntesting phase working as designed.\n3:15am wednesday. adaptive strategy testing. week 1 paper trading looked good (67% wr). week 2 live at $100 size showing reality (50% wr). regime detection too slow, slippage worse than expected. A. helped fix bugs in confirmation logic. account flat at $394,818. testing phase = capital preservation.\n-AK\n","date":"12 March 2024","externalUrl":null,"permalink":"/posts/2024-03-12-adaptive-strategy-testing-mixed-results/","section":"Posts","summary":"\u003cp\u003eweek 1-2 march testing.\u003c/p\u003e\n\u003cp\u003eadaptive strategy live.\u003c/p\u003e\n\u003cp\u003emixed results.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003etesting approach \n    \u003cdiv id=\"testing-approach\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#testing-approach\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eweek 1 (mar 4-8):\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca\n  href=\"https://www.investopedia.com/terms/p/papertrade.asp\"\n    target=\"_blank\"\n  \u003epaper trading\u003c/a\u003e only.\u003c/p\u003e","title":"adaptive strategy testing - mixed results, learning curve","type":"posts"},{"content":"","date":"3 March 2024","externalUrl":null,"permalink":"/tags/adaptation/","section":"Tags","summary":"","title":"Adaptation","type":"tags"},{"content":"february crushed my strategies.\nmean reversion dropped from 81% to 57% win rate.\nmarket regime changed.\nstrategies need to adapt.\nbeen discussing regime adaptation on r/algotrading. other algo traders dealing with same shit.\nwhat changed # january environment:\nVIX: 12-15\ncorrelation: low\nmarket: range-bound\nsetups: clean mean reversion\nfebruary environment:\nVIX: 18-22\ncorrelation: high\nmarket: whipsaw/trending\nsetups: false signals everywhere\nsame strategies, different regime = failure.\nthe problem with static parameters # my mean reversion parameters optimized on 2023 data.\ncurrent settings:\nlookback: 20 days\nentry threshold: 2.0 std dev\nexit threshold: 0.5 std dev\nworked great january.\nfailed february.\nwhy?\nhigher volatility = wider standard deviations.\n2.0 std dev in low vol ≠ 2.0 std dev in high vol.\nentries trigger too early.\nexits trigger too late.\nstatic parameters can\u0026rsquo;t handle regime changes.\nsolution: changing regime detection # built vol regime filter this weekend.\nadapts parameters based on current VIX level.\nimport pandas as pd import numpy as np from datetime import datetime, timedelta class RegimeAdaptiveStrategy: \u0026#34;\u0026#34;\u0026#34; Mean reversion strategy that adapts parameters based on volatility regime \u0026#34;\u0026#34;\u0026#34; def __init__(self): # Regime thresholds (VIX levels) self.low_vol_threshold = 15 self.high_vol_threshold = 20 # Parameter sets for each regime self.params = { \u0026#39;low_vol\u0026#39;: { \u0026#39;lookback\u0026#39;: 20, \u0026#39;entry_std\u0026#39;: 2.0, \u0026#39;exit_std\u0026#39;: 0.5, \u0026#39;position_size\u0026#39;: 0.005 # 0.5% risk }, \u0026#39;medium_vol\u0026#39;: { \u0026#39;lookback\u0026#39;: 15, \u0026#39;entry_std\u0026#39;: 2.3, \u0026#39;exit_std\u0026#39;: 0.7, \u0026#39;position_size\u0026#39;: 0.004 # 0.4% risk }, \u0026#39;high_vol\u0026#39;: { \u0026#39;lookback\u0026#39;: 10, \u0026#39;entry_std\u0026#39;: 2.6, \u0026#39;exit_std\u0026#39;: 1.0, \u0026#39;position_size\u0026#39;: 0.003 # 0.3% risk } } def detect_regime(self, vix_level): \u0026#34;\u0026#34;\u0026#34; Classify current volatility regime \u0026#34;\u0026#34;\u0026#34; if vix_level \u0026lt; self.low_vol_threshold: return \u0026#39;low_vol\u0026#39; elif vix_level \u0026lt; self.high_vol_threshold: return \u0026#39;medium_vol\u0026#39; else: return \u0026#39;high_vol\u0026#39; def get_adaptive_params(self, vix_level): \u0026#34;\u0026#34;\u0026#34; Return parameters appropriate for current regime \u0026#34;\u0026#34;\u0026#34; regime = self.detect_regime(vix_level) return self.params[regime], regime def calculate_mean_reversion_signal(self, prices, vix_level): \u0026#34;\u0026#34;\u0026#34; Calculate mean reversion signal with adaptive parameters \u0026#34;\u0026#34;\u0026#34; # Get regime-appropriate parameters params, regime = self.get_adaptive_params(vix_level) # Calculate rolling mean and std dev lookback = params[\u0026#39;lookback\u0026#39;] rolling_mean = prices.rolling(window=lookback).mean() rolling_std = prices.rolling(window=lookback).std() # Calculate z-score z_score = (prices - rolling_mean) / rolling_std # Generate signals based on regime-specific thresholds entry_threshold = params[\u0026#39;entry_std\u0026#39;] exit_threshold = params[\u0026#39;exit_std\u0026#39;] signal = pd.Series(0, index=prices.index) # Long entry: price significantly below mean signal[z_score \u0026lt; -entry_threshold] = 1 # Short entry: price significantly above mean signal[z_score \u0026gt; entry_threshold] = -1 # Exit: return to mean signal[(z_score \u0026gt; -exit_threshold) \u0026amp; (z_score \u0026lt; exit_threshold)] = 0 return signal, z_score, regime def backtest_adaptive_strategy(self, prices, vix_data, start_date, end_date): \u0026#34;\u0026#34;\u0026#34; Backtest regime-adaptive mean reversion strategy \u0026#34;\u0026#34;\u0026#34; # Filter data to date range prices = prices[start_date:end_date] vix_data = vix_data[start_date:end_date] # Initialize tracking trades = [] equity_curve = [100000] # Start with $100k current_position = 0 entry_price = 0 for i in range(20, len(prices)): # Skip first 20 days for lookback current_price = prices.iloc[i] current_vix = vix_data.iloc[i] # Get signal and regime signal, z_score, regime = self.calculate_mean_reversion_signal( prices.iloc[:i+1], current_vix ) current_signal = signal.iloc[-1] # Get position size for current regime params, _ = self.get_adaptive_params(current_vix) position_size_pct = params[\u0026#39;position_size\u0026#39;] # Entry logic if current_position == 0 and current_signal != 0: # Enter new position current_position = current_signal entry_price = current_price entry_equity = equity_curve[-1] # Exit logic elif current_position != 0 and current_signal == 0: # Exit position if current_position == 1: # Long position pnl_pct = (current_price - entry_price) / entry_price else: # Short position pnl_pct = (entry_price - current_price) / entry_price # Apply position size to PnL trade_return = pnl_pct * position_size_pct * equity_curve[-1] equity_curve.append(equity_curve[-1] + trade_return) trades.append({ \u0026#39;entry_date\u0026#39;: prices.index[i-1], \u0026#39;exit_date\u0026#39;: prices.index[i], \u0026#39;entry_price\u0026#39;: entry_price, \u0026#39;exit_price\u0026#39;: current_price, \u0026#39;direction\u0026#39;: \u0026#39;long\u0026#39; if current_position == 1 else \u0026#39;short\u0026#39;, \u0026#39;pnl\u0026#39;: trade_return, \u0026#39;regime\u0026#39;: regime, \u0026#39;vix_level\u0026#39;: current_vix }) current_position = 0 else: # Hold position or stay flat equity_curve.append(equity_curve[-1]) # Calculate performance metrics trades_df = pd.DataFrame(trades) total_trades = len(trades_df) winning_trades = len(trades_df[trades_df[\u0026#39;pnl\u0026#39;] \u0026gt; 0]) win_rate = (winning_trades / total_trades * 100) if total_trades \u0026gt; 0 else 0 total_pnl = trades_df[\u0026#39;pnl\u0026#39;].sum() if total_trades \u0026gt; 0 else 0 # Calculate by regime regime_stats = trades_df.groupby(\u0026#39;regime\u0026#39;).agg({ \u0026#39;pnl\u0026#39;: [\u0026#39;count\u0026#39;, \u0026#39;sum\u0026#39;, \u0026#39;mean\u0026#39;], }).round(2) return { \u0026#39;total_trades\u0026#39;: total_trades, \u0026#39;win_rate\u0026#39;: win_rate, \u0026#39;total_pnl\u0026#39;: total_pnl, \u0026#39;final_equity\u0026#39;: equity_curve[-1], \u0026#39;regime_stats\u0026#39;: regime_stats, \u0026#39;trades\u0026#39;: trades_df } # Usage example strategy = RegimeAdaptiveStrategy() # Test on recent data (simulated for this example) # In production, would use real price/VIX data dates = pd.date_range(\u0026#39;2023-01-01\u0026#39;, \u0026#39;2024-02-29\u0026#39;, freq=\u0026#39;D\u0026#39;) prices = pd.Series(100 + np.random.randn(len(dates)).cumsum(), index=dates) vix_data = pd.Series(15 + np.random.randn(len(dates)) * 3, index=dates).clip(10, 30) # Backtest results = strategy.backtest_adaptive_strategy( prices=prices, vix_data=vix_data, start_date=\u0026#39;2023-06-01\u0026#39;, end_date=\u0026#39;2024-02-29\u0026#39; ) print(f\u0026#34;Total Trades: {results[\u0026#39;total_trades\u0026#39;]}\u0026#34;) print(f\u0026#34;Win Rate: {results[\u0026#39;win_rate\u0026#39;]:.1f}%\u0026#34;) print(f\u0026#34;Total PnL: ${results[\u0026#39;total_pnl\u0026#39;]:,.0f}\u0026#34;) print(f\u0026#34;Final Equity: ${results[\u0026#39;final_equity\u0026#39;]:,.0f}\u0026#34;) print(\u0026#34;\\nRegime Breakdown:\u0026#34;) print(results[\u0026#39;regime_stats\u0026#39;]) backtesting the adaptive strategy # tested on jan-feb 2024 data:\nstatic parameters (old):\ntotal trades: 37 win rate: 57% pnl: +$1,400 adaptive parameters (new):\ntotal trades: 31 win rate: 68% pnl: +$4,800 improvement: +$3,400 (243%)\nfewer trades, higher quality, better win rate.\nregime breakdown # low vol regime (VIX \u0026lt; 15):\njanuary primarily.\n22 trades.\nwin rate: 77%.\nstrategy: aggressive entries, tight exits.\nmedium vol regime (VIX 15-20):\nearly february.\n12 trades.\nwin rate: 67%.\nstrategy: moderate entries, wider exits.\nhigh vol regime (VIX \u0026gt; 20):\nlate february.\n8 trades.\nwin rate: 50%.\nstrategy: conservative entries, even wider exits.\nfewer trades in high vol = capital preservation.\nimplementation challenges # real-time VIX data:\nneed live VIX feed.\npolygon.io provides this.\nupdate regime classification every bar.\nparameter switching:\ncan\u0026rsquo;t change mid-trade.\nonly apply new params to new positions.\nexisting positions use entry regime params.\nwhipsaw risk:\nregime changes frequently = confusion.\nsolution: require 3-day confirmation before regime shift.\nprevents false regime classifications.\ncode for production # class ProductionRegimeStrategy: \u0026#34;\u0026#34;\u0026#34; Production-ready adaptive strategy with regime confirmation \u0026#34;\u0026#34;\u0026#34; def __init__(self): self.strategy = RegimeAdaptiveStrategy() self.regime_history = [] self.confirmation_days = 3 self.current_regime = \u0026#39;medium_vol\u0026#39; self.current_position = None def update_regime(self, vix_level): \u0026#34;\u0026#34;\u0026#34; Update regime with confirmation logic to prevent whipsaw \u0026#34;\u0026#34;\u0026#34; detected_regime = self.strategy.detect_regime(vix_level) # Add to history self.regime_history.append(detected_regime) # Keep only last N days if len(self.regime_history) \u0026gt; self.confirmation_days: self.regime_history.pop(0) # Confirm regime change: must be consistent for N days if len(self.regime_history) == self.confirmation_days: if all(r == detected_regime for r in self.regime_history): if detected_regime != self.current_regime: print(f\u0026#34;Regime change confirmed: {self.current_regime} → {detected_regime}\u0026#34;) self.current_regime = detected_regime return self.current_regime def process_bar(self, prices, vix_level): \u0026#34;\u0026#34;\u0026#34; Process new bar with regime awareness \u0026#34;\u0026#34;\u0026#34; # Update regime (with confirmation) current_regime = self.update_regime(vix_level) # Get appropriate parameters params, _ = self.strategy.get_adaptive_params(vix_level) # Generate signal signal, z_score, _ = self.strategy.calculate_mean_reversion_signal( prices, vix_level ) # Trade logic if self.current_position is None and signal.iloc[-1] != 0: # Enter new position with current regime params self.current_position = { \u0026#39;direction\u0026#39;: \u0026#39;long\u0026#39; if signal.iloc[-1] == 1 else \u0026#39;short\u0026#39;, \u0026#39;entry_price\u0026#39;: prices.iloc[-1], \u0026#39;entry_regime\u0026#39;: current_regime, \u0026#39;params\u0026#39;: params # Lock in params at entry } print(f\u0026#34;Entered {self.current_position[\u0026#39;direction\u0026#39;]} at {prices.iloc[-1]:.2f} in {current_regime} regime\u0026#34;) elif self.current_position is not None and signal.iloc[-1] == 0: # Exit position exit_price = prices.iloc[-1] entry_price = self.current_position[\u0026#39;entry_price\u0026#39;] if self.current_position[\u0026#39;direction\u0026#39;] == \u0026#39;long\u0026#39;: pnl_pct = (exit_price - entry_price) / entry_price * 100 else: pnl_pct = (entry_price - exit_price) / entry_price * 100 print(f\u0026#34;Exited {self.current_position[\u0026#39;direction\u0026#39;]} at {exit_price:.2f}, PnL: {pnl_pct:+.2f}%\u0026#34;) self.current_position = None march testing plan # week 1 (mar 4-8):\nimplement adaptive strategy in live system.\npaper trade only.\nlog all signals and regime changes.\nweek 2-3 (mar 11-22):\ncontinue paper trading.\ncompare to actual february performance.\nverify improvement.\nweek 4 (mar 25-29):\nif paper trading successful: go live with tiny size ($100/trade).\ntest for 1 week.\napril:\nif march successful: full size with adaptive params.\ntonight # february showed static parameters fail in regime changes.\nbuilt adaptive strategy this weekend.\nbacktests show +243% improvement.\nmarch = testing phase.\nnot rushing back to full size.\nverify adaptation works live.\n2:28am sunday. strategy overhaul. february crushed static parameters (81% → 57% win rate). built regime-adaptive strategy adjusting lookback/thresholds/size based on VIX. backtests show 68% win rate vs 57% static. march paper trading adaptive params before going live.\n-AK\n","date":"3 March 2024","externalUrl":null,"permalink":"/posts/2024-03-03-strategy-overhaul-adapting-to-regime-change/","section":"Posts","summary":"\u003cp\u003efebruary crushed my strategies.\u003c/p\u003e\n\u003cp\u003emean reversion dropped from 81% to 57% win rate.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003emarket regime changed.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003estrategies need to adapt.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003ebeen discussing \u003ca\n  href=\"https://www.reddit.com/r/algotrading/\"\n    target=\"_blank\"\n  \u003eregime adaptation on r/algotrading\u003c/a\u003e. other algo traders dealing with same shit.\u003c/p\u003e","title":"strategy overhaul - adapting algos to new market regime","type":"posts"},{"content":"february done.\nreality check month.\njanuary impressive performance won\u0026rsquo;t repeat.\nfebruary final numbers # starting (feb 1): $393,400\nending (feb 29): $394,800\nfebruary gain: +$1,400 (+0.36%)\ntrades: 37\nwins: 21\nlosses: 16\nwin rate: 57%\nFigure 1: February daily volatility showing choppy conditions. Peaked at $396,780 on Feb 7 after clearing Sept recovery, then struggled through weeks 2-3 with strategy breakdown. Ended month barely positive at $394,800. Market regime shift visible in price action.\nweekly breakdown # Figure 2: Win rate declining through February from 62% week 1 to 50% week 3 as mean reversion strategies failed in whipsaw markets. Week 4 modest recovery to 54% with tighter risk management. Net gains volatile - only week 3 showed losses but overall month choppy.\nweek 1 (feb 1-7): +$3,380, 62% win rate (13 trades)\nweek 2 (feb 8-14): +$1,240, 55% win rate (11 trades)\nweek 3 (feb 20-21): -$1,380, 50% win rate (4 trades)\nweek 4 (feb 26-28): +$1,560, 56% win rate (9 trades)\ngross total: +$4,800\nnet after fees/slippage: +$1,400\nstrategy performance breakdown # Figure 3: Market regime shift evident in strategy performance. Mean reversion win rate dropped from 81% in January to 56% in February. Momentum strategy also declined from 68% to 45% win rate. Trade count reduced as tighter filters applied - mean reversion down from 42 to 28 trades, momentum from 19 to 9 trades.\nmean reversion (28 trades):\n16 wins, 12 losses (57%) january: 81% win rate decline: -24 percentage points gross: +$2,340 momentum (9 trades):\n4 wins, 5 losses (44%) january: 68% win rate decline: -24 percentage points gross: -$940 momentum shut down after week 2.\nnot working in current regime.\ncomparing january to february # january 2024 (strong):\n+$27,200 (+7.4%) 76% win rate 68 trades strategies crushing it february 2024 (reality):\n+$1,400 (+0.36%) 57% win rate 37 trades strategies struggling january = outlier.\none of maybe 2x per year notable months.\nfebruary = normal.\nmodest gain in choppy conditions = acceptable.\nyear to date 2024 # starting balance (jan 1): $366,200\ncurrent balance (feb 29): $394,800\nytd gain: +$28,600 (+7.8%)\nytd months: 2\nwhat went wrong february # 1. market regime shift\njanuary: range-bound, low vol\nfebruary: whipsaw, higher vol\nmean reversion calibrated for ranges.\nfailed in trending/choppy environment.\n2. parameter mismatch\nstrategies optimized on 2023 data.\nfebruary market different.\nneed recalibration.\n3. correlation spike\neverything moving together.\nno diversification.\nall positions correlated.\n4. vol expansion\nVIX: 13-15 (jan) → 18-22 (feb)\nwider stops = more losses.\nrisk management adjustments # position sizing progression:\njanuary: 0.5% per trade\nearly feb: 0.4% per trade\nlate feb: 0.3% per trade\nworked:\nsmaller losses preserved capital.\nfebruary could\u0026rsquo;ve been -5% without adjustments.\ncircuit breaker triggered 2x:\nstopped trading after 3 losses.\nprevented spiraling.\nsystem working even when strategies aren\u0026rsquo;t.\ntherapy friday (2/23) # dr. r: \u0026ldquo;february rough after january high. how are you processing?\u0026rdquo;\nme: \u0026ldquo;frustrated but not panicking.\u0026rdquo;\ndr. r: \u0026ldquo;what\u0026rsquo;s different from september disaster?\u0026rdquo;\nme: \u0026ldquo;september i abandoned system. now i\u0026rsquo;m following circuit breaker, reducing size, not revenge trading.\u0026rdquo;\ndr. r: \u0026ldquo;you\u0026rsquo;re accepting reality instead of fighting it.\u0026rdquo;\nme: \u0026ldquo;yeah. january was standout. can\u0026rsquo;t expect that monthly. february showing normal performance.\u0026rdquo;\ndr. r: \u0026ldquo;that\u0026rsquo;s mature trading psychology. most traders can\u0026rsquo;t accept losing months.\u0026rdquo;\nme: \u0026ldquo;still sucks though.\u0026rdquo;\ndr. r: \u0026ldquo;allowed to suck and still be healthy.\u0026rdquo;\nexactly.\nliving with A. - stress management # february trading stress high.\ncircuit breakers triggered.\nstrategies failing.\ncame home frustrated multiple times.\nA\u0026rsquo;s approach:\ndidn\u0026rsquo;t try to fix it.\ndidn\u0026rsquo;t ask too many questions.\njust present.\ntuesday 2/27:\nrough day.\ncame home quiet.\nA.: \u0026ldquo;food?\u0026rdquo;\nme: \u0026ldquo;yeah.\u0026rdquo;\nmade dinner.\ndidn\u0026rsquo;t force conversation.\nafter dinner:\nA.: \u0026ldquo;want to talk or want silence?\u0026rdquo;\nme: \u0026ldquo;silence works.\u0026rdquo;\nsat together on couch.\nher coding, me reviewing backtests.\ncomfortable silence.\nthat\u0026rsquo;s the shit that works.\nmarch strategy overhaul planned # weekend feb 24-25:\nran extensive analysis.\nfindings:\nmean reversion needs different parameters for high vol momentum strategy broken entirely need vol regime filter possibly add short-term scalping for choppy markets march plan:\nweek 1: parameter optimization on recent data\nweek 2-3: paper trade new parameters\nweek 4: small size live test ($100/trade)\napril: full size if validated\nnot abandoning algo trading.\nadapting to new regime.\nrealistic performance expectations # january taught me:\n7% months happen but rare.\nmaybe 2x per year.\ncannot plan for that.\nfebruary taught me:\nflat months happen.\nsometimes strategies don\u0026rsquo;t work.\nthat\u0026rsquo;s normal.\nsustainable annual target: 15-18%\nrequires:\n8-9 winning months (+1% to +3%) 2-3 flat months (-0.5% to +0.5%) 1-2 losing months (-1% to -3%) february = flat month.\nacceptable.\ncomparing to 2023 # february 2023:\nstill learning.\nlosing money.\ntesting strategies on small size.\nfebruary 2024:\nstrategies proven but regime-dependent.\none year experience.\ncapital preserved through drawdown.\ngrowth.\ntonight (feb 29, 10:58pm) # february done.\n+$1,400 (+0.36%).\n57% win rate.\nbarely positive but preserved capital.\njanuary notable month won\u0026rsquo;t repeat.\nfebruary reality check accepted.\nmarch strategy overhaul begins.\nthis is sustainable algo trading:\nsome months crush.\nsome months struggle.\npreserve capital through both.\n10:58pm feb 29. february wrap. +$1,400 (0.36%). 57% win rate across 37 trades. mean reversion dropped from 81% to 57% win rate. january notable performance (+7.4%) not sustainable. february flat month = normal. ytd +$28,600 (7.8%) needs correction through flat/losing months. march strategy overhaul planned.\n-AK\n","date":"29 February 2024","externalUrl":null,"permalink":"/posts/2024-02-29-february-wrap-choppy-month-reality-check/","section":"Posts","summary":"\u003cp\u003efebruary done.\u003c/p\u003e\n\u003cp\u003ereality check month.\u003c/p\u003e\n\u003cp\u003ejanuary impressive performance won\u0026rsquo;t repeat.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003efebruary final numbers \n    \u003cdiv id=\"february-final-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#february-final-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (feb 1):\u003c/strong\u003e $393,400\u003c/p\u003e","title":"february wrap - choppy month, reality check after january high","type":"posts"},{"content":"weeks 2-3 february rough.\nstrategies not working.\nmarket regime shifted.\nweeks 2-3 trades (feb 8-16, feb 20-21) # week 2 (feb 8-14):\nvalentine\u0026rsquo;s day week.\ntook wed off for date.\nweek 2 total: 11 trades, 6 wins (55%). +$1,240\nweek 3 (feb 20-21 so far):\npresidents day monday (market closed).\ntuesday-wednesday only.\nweek 3 so far: 4 trades, 2 wins (50%). -$380\ncombined weeks 2-3: -$1,140 net after week 3 losses eating week 2 gains\naccount status # feb 7: $396,780\nfeb 21: $395,640\ndown from sept peak recovery.\nwin rate declining # february progression:\nweek 1: 62% week 2: 55% week 3: 50% below 60% consistently.\nmean reversion struggling:\njanuary: 81% win rate\nfebruary: 56% win rate\n25% decline.\nmarket regime change confirmed.\nwhat\u0026rsquo;s wrong # 1. whipsaw markets\nmean reversion expects ranges.\ncurrent market: false breakouts, reversals failing.\nstrategy designed for different conditions.\n2. correlation breakdown\neverything moving together.\nno diversification benefit.\nall positions correlated +0.8.\n3. volatility spike\nVIX: 18 → 22 (week 2-3)\nmy strategies calibrated for VIX 12-16.\nhigher vol = wider stops = more losses.\ncircuit breaker triggered twice # thursday 2/15:\ntrade 1: loss\ntrade 2: loss\ntrade 3: loss\n3-loss circuit breaker triggered.\nstopped trading rest of day.\ntuesday 2/20:\ntrade 1: loss\ntrade 2: loss\ntrade 3: loss\ncircuit breaker triggered again.\nstopped trading.\nsystem working but concerning pattern.\ntherapy tuesday (2/20) # dr. r: \u0026ldquo;circuit breaker triggered twice in 6 days. what\u0026rsquo;s happening?\u0026rdquo;\nme: \u0026ldquo;strategies failing. market changed.\u0026rdquo;\ndr. r: \u0026ldquo;how are you handling it?\u0026rdquo;\nme: \u0026ldquo;frustrated but not spiraling. following system.\u0026rdquo;\ndr. r: \u0026ldquo;different from september?\u0026rdquo;\nme: \u0026ldquo;september i abandoned system and revenge traded. now i\u0026rsquo;m stopping when circuit breaker hits.\u0026rdquo;\ndr. r: \u0026ldquo;what\u0026rsquo;s the plan?\u0026rdquo;\nme: \u0026ldquo;reduce size more. tighten filters. maybe pause mean reversion entirely.\u0026rdquo;\ndr. r: \u0026ldquo;sounds data-driven not emotional.\u0026rdquo;\nme: \u0026ldquo;yeah. losing money sucks but not panicking.\u0026rdquo;\ngrowth.\ncomparing to september disaster # september 2023:\nstrategies failing abandoned system revenge traded A. left lost $28k in 18 days february 2024:\nstrategies failing following circuit breaker not revenge trading A. stable down $1,140 in 2 weeks difference: discipline.\nrisk management response # current: 0.4% per trade\nnew (starting feb 22): 0.3% per trade\nreason: lower win rate means smaller positions.\nalso:\npausing momentum entirely only mean reversion A+ setups 3-loss circuit breaker stays may go to EOD only (exit intraday) living with A. - trading stress # tuesday night (2/20):\ncame home after second circuit breaker trigger.\nfrustrated AF.\nA.: \u0026ldquo;rough day?\u0026rdquo;\nme: \u0026ldquo;yeah. third losing streak in week.\u0026rdquo;\nA.: \u0026ldquo;want to talk about it?\u0026rdquo;\nme: \u0026ldquo;not really. just frustrated.\u0026rdquo;\nA.: \u0026ldquo;ok. i\u0026rsquo;ll be here when you do.\u0026rdquo;\nleft me alone.\ncame back 30 min later with food.\ndidn\u0026rsquo;t make me talk.\nexactly what i needed.\njanuary standout month reality check # january: +$27,200 (+7.4%)\nway above normal.\nthat was notable month.\none of maybe 2x per year.\ncannot sustain that.\nfebruary showing reality:\nstrategies have edge but it\u0026rsquo;s modest.\n1-3% monthly is normal.\n7% month = outlier.\nregression to mean.\nstrategy adjustment planning # weekend analysis (2/24-25):\nneed to:\nanalyze why mean reversion failing test different parameters for current regime possibly add new strategy for high vol backtest on recent data (jan-feb) not abandoning system.\nadapting to new conditions.\nmarket conditions # VIX: 22 (high)\ncorrelation: everything moving together\nvolume: erratic\nrange-bound assumption broken\ntrending environment maybe?\nneed momentum strategies instead of mean reversion.\nbut momentum hasn\u0026rsquo;t worked either.\nchallenging environment.\nmonthly projection # february so far (3 weeks):\nweek 1: +$3,380\nweek 2: +$1,240\nweek 3: -$1,380\nnet: +$3,240\n1 week left.\nprojection: flat to slightly negative month.\nfine.\njanuary crushed it.\nfebruary struggling.\nthat\u0026rsquo;s normal trading.\nlooking ahead # last week february (2/26-28):\nreduced risk to 0.3%.\nonly A+ setups.\nmay take thursday-friday off entirely.\npreserve capital.\nmarch:\nstrategy overhaul.\nadapt to new regime.\nmaybe 2-3 week testing period with tiny size.\ntonight # weeks 2-3 february rough.\ndown $1,140 net.\ncircuit breaker triggered 2x.\nstrategies not working in current conditions.\nbut following discipline.\nnot spiraling.\nthis is the process.\n3:42am thursday. weeks 2-3 february rough. combined -$1,140. circuit breaker triggered twice in 6 days. win rate declined from 62% to 50%. mean reversion failing in whipsaw markets. reduced risk to 0.3%, tighter filters. not panicking - following system. february likely flat month after january notable performance.\n-AK\n","date":"21 February 2024","externalUrl":null,"permalink":"/posts/2024-02-21-week-2-3-february-struggling/","section":"Posts","summary":"\u003cp\u003eweeks 2-3 february rough.\u003c/p\u003e\n\u003cp\u003estrategies not working.\u003c/p\u003e\n\u003cp\u003emarket regime shifted.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweeks 2-3 trades (feb 8-16, feb 20-21) \n    \u003cdiv id=\"weeks-2-3-trades-feb-8-16-feb-20-21\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#weeks-2-3-trades-feb-8-16-feb-20-21\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eweek 2 (feb 8-14):\u003c/strong\u003e\u003c/p\u003e","title":"weeks 2-3 february - struggling, strategy adjustment needed","type":"posts"},{"content":"valentine\u0026rsquo;s day.\nfirst one living with someone.\nfirst one that didn\u0026rsquo;t feel forced.\nmorning (6:30am) # woke up 4am as usual.\nA. still sleeping.\ntraded 6:30-10am.\n3 trades, 2 wins. +$840.\nshe woke up 9:30am.\ncame out to trading desk with coffee.\ndidn\u0026rsquo;t say anything.\njust sat on couch behind me while i finished last trade.\nthat\u0026rsquo;s the shit that matters.\nbreakfast (10:15am) # A.: \u0026ldquo;good morning. happy valentine\u0026rsquo;s day.\u0026rdquo;\nme: \u0026ldquo;you too. made $840 this morning.\u0026rdquo;\nA.: \u0026ldquo;nice. i made reservations for tonight. 7:30pm.\u0026rdquo;\nme: \u0026ldquo;works. where?\u0026rdquo;\nA.: \u0026ldquo;that italian place you like. the one with the steak.\u0026rdquo;\nme: \u0026ldquo;perfect.\u0026rdquo;\nA.: \u0026ldquo;also i got you something.\u0026rdquo;\nme: \u0026ldquo;i got you something too.\u0026rdquo;\nA.: \u0026ldquo;you actually remembered?\u0026rdquo;\nme: \u0026ldquo;don\u0026rsquo;t sound so surprised.\u0026rdquo;\nwhat i got her # mechanical keyboard.\ncustom keycaps.\npurple and black (her favorite colors).\n$340.\nshe\u0026rsquo;s been using shitty laptop keyboard for her python work.\ndrives me insane watching her code on that thing.\npractical gift.\nwhat she got me # new monitors.\ndual 32\u0026quot; 4K.\n$1,100.\nmy current setup: mismatched monitors from 2021.\nbeen bitching about it for months.\nshe paid attention.\nafternoon setup # spent 2 hours setting up new monitors.\ncable management.\ncolor calibration.\nworkspace optimization.\nA. set up her keyboard.\ntyping sounds satisfying AF.\nshe\u0026rsquo;s been coding on it all afternoon with huge smile.\nmutual gift success.\ntherapy context (last session 2/13) # dr. r: \u0026ldquo;valentine\u0026rsquo;s day tomorrow. first one living together. how are you feeling?\u0026rdquo;\nme: \u0026ldquo;fine. it\u0026rsquo;s just a day.\u0026rdquo;\ndr. r: \u0026ldquo;A. expecting anything?\u0026rdquo;\nme: \u0026ldquo;probably. she made dinner reservations.\u0026rdquo;\ndr. r: \u0026ldquo;and you?\u0026rdquo;\nme: \u0026ldquo;got her a keyboard. she needs it for work.\u0026rdquo;\ndr. r: \u0026ldquo;practical gift. does she know you well enough to appreciate that?\u0026rdquo;\nme: \u0026ldquo;yeah. she gets it. we\u0026rsquo;re not flowers and chocolate people.\u0026rdquo;\ndr. r: \u0026ldquo;how\u0026rsquo;s different from past relationships?\u0026rdquo;\nme: \u0026ldquo;M., K., S., J. - they all wanted traditional romantic shit. got offended when i didn\u0026rsquo;t do it.\u0026rdquo;\ndr. r: \u0026ldquo;and A.?\u0026rdquo;\nme: \u0026ldquo;she made reservations at the place with steak. not some fancy romantic shit i\u0026rsquo;d hate. she knows me.\u0026rdquo;\ndr. r: \u0026ldquo;mutual understanding.\u0026rdquo;\nexactly.\ndinner (7:30pm) # restaurant not crowded surprisingly.\nvalentine\u0026rsquo;s day usually nightmare.\nappetizer: calamari (shared)\nher main: pasta with seafood\nmy main: ribeye, medium rare, perfect\nwine: she had red, i had water (trading tomorrow)\nconversation topics:\nher new work project (data pipeline optimization) my february trading (choppy, adapting) weekend plans (none, just rest) gym routine adjustments no forced romance.\njust comfortable.\ncomparing to past valentine\u0026rsquo;s days # 2023 (with J.):\nshe wanted expensive dinner, flowers, jewelry.\ni bought flowers, took her to overpriced restaurant.\nshe complained flowers were wrong type.\nbroke up 2 weeks later.\n2022 (with S.):\n\u0026ldquo;forgot\u0026rdquo; valentine\u0026rsquo;s day on purpose.\nshe was pissed for a week.\nproved my point that holiday is bullshit.\nalso broke up shortly after.\n2024 (with A.):\npractical gifts we both wanted.\nsteak dinner at normal restaurant.\nhome by 9:30pm.\nboth happy.\ngrowth maybe?\nor just found right person.\nback home (9:45pm) # A.: \u0026ldquo;best valentine\u0026rsquo;s day i\u0026rsquo;ve had.\u0026rdquo;\nme: \u0026ldquo;same. low bar though.\u0026rdquo;\nA.: \u0026ldquo;why\u0026rsquo;s that?\u0026rdquo;\nme: \u0026ldquo;usually hate this holiday. forced romance. overpriced everything.\u0026rdquo;\nA.: \u0026ldquo;i like that we just did normal us. steak and keyboards.\u0026rdquo;\nme: \u0026ldquo;you get it.\u0026rdquo;\nA.: \u0026ldquo;i do. also\u0026hellip;\u0026rdquo;\nme: \u0026ldquo;yeah?\u0026rdquo;\nA.: \u0026ldquo;list?\u0026rdquo;\nme: \u0026ldquo;\u0026hellip;on valentine\u0026rsquo;s day?\u0026rdquo;\nA.: \u0026ldquo;why not? we\u0026rsquo;re already breaking tradition.\u0026rdquo;\nme: \u0026ldquo;fair point. where?\u0026rdquo;\nA.: \u0026ldquo;new monitors. your desk. right now.\u0026rdquo;\nme: \u0026ldquo;you want to fuck at my trading desk?\u0026rdquo;\nA.: \u0026ldquo;i want you to fuck me at your trading desk while we both stare at those new 4K monitors.\u0026rdquo;\nme: \u0026ldquo;\u0026hellip;that\u0026rsquo;s fucking hot.\u0026rdquo;\ntrading desk (10:15pm) # cleared everything off desk.\nshe was bent over it.\nfucked her from behind.\nboth of us watching those new monitors.\nshe came hard, i came right after.\nplaces list updated: trading desk, valentine\u0026rsquo;s night, new monitors, stared at 4K screens the whole time.\nwhat makes this different # she understands:\ntrading stress need for routine practical over romantic comfortable silence that sometimes i need space i understand:\nher work obsession need for friday alone time cooking as stress relief that she processes differently mutual respect.\nliving together check-in (3.5 months) # moved in: november 1, 2023\ncurrent: february 14, 2024\nwhat\u0026rsquo;s working:\nseparate workspaces (essential) breakfast together every morning dinner together most nights gym schedules aligned both introverts who get it what\u0026rsquo;s still friction:\nher mess vs my OCD bathroom schedule conflicts coffee mug territorialism her loud music while cooking my late night keyboard typing but manageable friction.\nnothing relationship-ending.\ncomparing to september # september 2023:\nrelationship new (3 months).\nnot living together yet.\nshe left for 18 days.\ni spiraled completely.\nlost $28k trading emotionally.\nfebruary 2024:\nliving together (3.5 months).\nrelationship stable.\nmarket choppy but managing it.\nshe\u0026rsquo;s here.\nstability = everything.\ngrief check # parents died december 31, 2022.\n14 months ago.\nvalentine\u0026rsquo;s day = nothing special grief-wise.\nmostly processed.\noccasional background moments but manageable.\ndr. r calls it \u0026ldquo;integration.\u0026rdquo;\ngrief doesn\u0026rsquo;t disappear.\njust becomes part of normal instead of consuming everything.\naccurate.\ntonight (11:15pm) # sitting on couch.\nA. next to me coding on new keyboard.\ni\u0026rsquo;m writing this.\nfirst valentine\u0026rsquo;s day that felt real.\nnot performative.\nnot forced.\njust\u0026hellip; us.\nsteak, monitors, keyboard, sex at trading desk.\nthis is what works.\n11:15pm valentine\u0026rsquo;s day. first one living together. practical gifts - keyboard for her ($340), dual monitors for me ($1,100). steak dinner, home by 9:30pm, fucked at trading desk staring at new 4K screens. comfortable. real. no forced romance. she gets it. living together 3.5 months, working.\n-AK\n","date":"14 February 2024","externalUrl":null,"permalink":"/posts/2024-02-14-valentines-day-trading-and-relationship/","section":"Posts","summary":"\u003cp\u003evalentine\u0026rsquo;s day.\u003c/p\u003e\n\u003cp\u003efirst one living with someone.\u003c/p\u003e\n\u003cp\u003efirst one that didn\u0026rsquo;t feel forced.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003emorning (6:30am) \n    \u003cdiv id=\"morning-630am\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#morning-630am\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003ewoke up 4am as usual.\u003c/p\u003e","title":"valentine's day - trading and living with someone who gets it","type":"posts"},{"content":"data feeds = foundation of algo trading.\ngarbage data = garbage trades.\ni\u0026rsquo;ve used both polygon.io and alpha vantage extensively.\nspent months researching data feeds when i started trading. NexusFi community helped narrow down options to these two.\nhere\u0026rsquo;s the real comparison.\nwhat i need from data feeds # 1. historical data\nbacktesting requires years of data.\nneed:\ndaily bars (2+ years) intraday bars (1+ year) options data (greeks, chain) 2. real-time data\nlive trading requires:\n\u0026lt;100ms latency reliable websocket no gaps/missing bars 3. API quality\npython integration must be:\nwell documented stable endpoints reasonable rate limits 4. cost\npaying for what i actually use.\nnot enterprise pricing for retail needs.\npolygon.io - my primary feed # what i use it for:\nstocks, options, real-time websocket.\npricing (my tier):\n$199/month - starter plan\nunlimited historical real-time websocket options data included pros:\nspeed: 50-80ms latency on websocket\nreliability: 99.8% uptime (i track it)\noptions data: full chain, greeks, IV\ndocumentation: excellent python examples\nrate limits: generous (100 req/min)\ncons:\ncost: $199/month (not cheap for retail)\nlearning curve: REST + websocket combo\noptions lag: greeks update every 5min (not real-time)\ncode example:\nfrom polygon import RESTClient from polygon import WebSocketClient import asyncio # REST client for historical data rest_client = RESTClient(api_key=\u0026#34;YOUR_KEY\u0026#34;) def get_historical_bars(symbol, from_date, to_date): \u0026#34;\u0026#34;\u0026#34; Get historical daily bars from Polygon \u0026#34;\u0026#34;\u0026#34; aggs = rest_client.get_aggs( ticker=symbol, multiplier=1, timespan=\u0026#34;day\u0026#34;, from_=from_date, to=to_date, limit=50000 ) bars = [] for agg in aggs: bars.append({ \u0026#39;timestamp\u0026#39;: agg.timestamp, \u0026#39;open\u0026#39;: agg.open, \u0026#39;high\u0026#39;: agg.high, \u0026#39;low\u0026#39;: agg.low, \u0026#39;close\u0026#39;: agg.close, \u0026#39;volume\u0026#39;: agg.volume }) return bars # Websocket client for real-time data def handle_msg(msgs): \u0026#34;\u0026#34;\u0026#34;Process real-time messages\u0026#34;\u0026#34;\u0026#34; for msg in msgs: if msg[\u0026#39;ev\u0026#39;] == \u0026#39;A\u0026#39;: # Aggregate (bar) print(f\u0026#34;Symbol: {msg[\u0026#39;sym\u0026#39;]}\u0026#34;) print(f\u0026#34;Close: ${msg[\u0026#39;c\u0026#39;]:.2f}\u0026#34;) print(f\u0026#34;Volume: {msg[\u0026#39;v\u0026#39;]:,}\u0026#34;) async def run_websocket(): \u0026#34;\u0026#34;\u0026#34;Real-time data stream\u0026#34;\u0026#34;\u0026#34; ws = WebSocketClient( api_key=\u0026#34;YOUR_KEY\u0026#34;, feed=\u0026#39;stocks\u0026#39;, on_message=handle_msg ) # Subscribe to SPY 1-minute bars ws.subscribe(\u0026#39;A.SPY\u0026#39;) await ws.run() # Usage historical = get_historical_bars(\u0026#39;SPY\u0026#39;, \u0026#39;2023-01-01\u0026#39;, \u0026#39;2024-02-11\u0026#39;) print(f\u0026#34;Retrieved {len(historical)} bars\u0026#34;) # Real-time streaming asyncio.run(run_websocket()) real performance (my experience):\njanuary 2024:\n2.3M API calls 99.9% success rate avg latency: 67ms 0 outages worth $199/month for serious trading.\nalpha vantage - backup feed # what i use it for:\nbackup historical data, free tier testing.\npricing (my tier):\nfree tier:\n25 API calls per day 5 calls per minute premium: $49.99/month\n1200 calls per day still rate limited pros:\ncost: free tier exists\nsimplicity: REST-only, easy to learn\ncrypto included: btc/eth data free\nfundamental data: earnings, balance sheets\ncons:\nrate limits: brutal (5/min on free, still limited on paid)\nno websocket: REST polling only (high latency)\nreliability: occasional downtime/slow responses\nno options: stocks only (no greeks, no chain)\ncode example:\nimport requests import time ALPHA_VANTAGE_KEY = \u0026#34;YOUR_KEY\u0026#34; def get_intraday_data(symbol, interval=\u0026#39;5min\u0026#39;): \u0026#34;\u0026#34;\u0026#34; Get intraday bars from Alpha Vantage Rate limited to 5 calls per minute \u0026#34;\u0026#34;\u0026#34; url = f\u0026#34;https://www.alphavantage.co/query\u0026#34; params = { \u0026#39;function\u0026#39;: \u0026#39;TIME_SERIES_INTRADAY\u0026#39;, \u0026#39;symbol\u0026#39;: symbol, \u0026#39;interval\u0026#39;: interval, \u0026#39;apikey\u0026#39;: ALPHA_VANTAGE_KEY, \u0026#39;outputsize\u0026#39;: \u0026#39;full\u0026#39; } response = requests.get(url, params=params) data = response.json() # Check for rate limit if \u0026#39;Note\u0026#39; in data: print(\u0026#34;Rate limit hit - waiting 60 seconds\u0026#34;) time.sleep(60) return get_intraday_data(symbol, interval) # Parse time series time_series = data.get(f\u0026#39;Time Series ({interval})\u0026#39;, {}) bars = [] for timestamp, values in time_series.items(): bars.append({ \u0026#39;timestamp\u0026#39;: timestamp, \u0026#39;open\u0026#39;: float(values[\u0026#39;1. open\u0026#39;]), \u0026#39;high\u0026#39;: float(values[\u0026#39;2. high\u0026#39;]), \u0026#39;low\u0026#39;: float(values[\u0026#39;3. low\u0026#39;]), \u0026#39;close\u0026#39;: float(values[\u0026#39;4. close\u0026#39;]), \u0026#39;volume\u0026#39;: int(values[\u0026#39;5. volume\u0026#39;]) }) return bars def get_daily_data(symbol): \u0026#34;\u0026#34;\u0026#34; Get daily historical data Full history (20+ years available) \u0026#34;\u0026#34;\u0026#34; url = f\u0026#34;https://www.alphavantage.co/query\u0026#34; params = { \u0026#39;function\u0026#39;: \u0026#39;TIME_SERIES_DAILY_ADJUSTED\u0026#39;, \u0026#39;symbol\u0026#39;: symbol, \u0026#39;apikey\u0026#39;: ALPHA_VANTAGE_KEY, \u0026#39;outputsize\u0026#39;: \u0026#39;full\u0026#39; } response = requests.get(url, params=params) data = response.json() time_series = data.get(\u0026#39;Time Series (Daily)\u0026#39;, {}) bars = [] for timestamp, values in time_series.items(): bars.append({ \u0026#39;timestamp\u0026#39;: timestamp, \u0026#39;open\u0026#39;: float(values[\u0026#39;1. open\u0026#39;]), \u0026#39;high\u0026#39;: float(values[\u0026#39;2. high\u0026#39;]), \u0026#39;low\u0026#39;: float(values[\u0026#39;3. low\u0026#39;]), \u0026#39;close\u0026#39;: float(values[\u0026#39;4. close\u0026#39;]), \u0026#39;adjusted_close\u0026#39;: float(values[\u0026#39;5. adjusted close\u0026#39;]), \u0026#39;volume\u0026#39;: int(values[\u0026#39;6. volume\u0026#39;]) }) return bars # Usage with rate limit handling spy_intraday = get_intraday_data(\u0026#39;SPY\u0026#39;, \u0026#39;5min\u0026#39;) print(f\u0026#34;Retrieved {len(spy_intraday)} 5-minute bars\u0026#34;) time.sleep(12) # Wait for rate limit (5 calls/min = 12 sec between) spy_daily = get_daily_data(\u0026#39;SPY\u0026#39;) print(f\u0026#34;Retrieved {len(spy_daily)} daily bars\u0026#34;) real performance (my experience):\nfree tier:\n25 calls per day = useless for live trading frequent \u0026ldquo;please wait\u0026rdquo; responses occasional 500 errors premium tier ($49/month):\n1200 calls per day = ~50/hour still too limited for real-time better for EOD strategies only good for testing, not for production.\nhead-to-head comparison # Feature Polygon.io Alpha Vantage Price $199/month Free / $49.99/month Historical data Unlimited Limited calls Real-time Websocket, \u0026lt;100ms REST polling, 1-5 sec Options data Full chain + greeks None Rate limits 100/min 5/min (free), 75/min (paid) Reliability 99.8% ~95% Latency 50-80ms 1000-5000ms Python support Excellent Basic Learning curve Moderate Easy when to use each # polygon.io:\nserious algo trading options strategies real-time execution need reliability alpha vantage:\nlearning/testing EOD strategies only tight budget fundamental analysis my current setup # primary: polygon.io ($199/month)\nbackup: alpha vantage free tier\nwhy both?\npolygon outage = switch to alpha vantage for EOD data.\nhappened once in 2023.\nsaved my ass.\nredundancy matters.\nother feeds i\u0026rsquo;ve tested # IEX cloud:\ngood real-time expensive for retail limited historical yahoo finance (yfinance python):\nfree unreliable rate limited randomly banned my IP twice quandl:\nexpensive academic data focus not for day trading thetadata:\noptions specialist great for greeks too expensive ($150/month just options) polygon wins for all-around use.\ncost justification # polygon: $199/month\nlost $40k march 2023 on bad backtest (garbage data contributed).\n$199/month = $2,388/year\nsaved that in one trade by having reliable data.\nworth it.\nrate limit handling # polygon rate limits: 100 req/min\nnever hit it in production.\nalpha vantage: 5 req/min free, 75 paid\nhit it constantly.\nsolution for alpha vantage:\nimport time from datetime import datetime class RateLimitedClient: \u0026#34;\u0026#34;\u0026#34; Wrapper for Alpha Vantage with automatic rate limiting \u0026#34;\u0026#34;\u0026#34; def __init__(self, api_key, calls_per_minute=5): self.api_key = api_key self.calls_per_minute = calls_per_minute self.min_interval = 60.0 / calls_per_minute # Seconds between calls self.last_call_time = 0 def call_api(self, url, params): \u0026#34;\u0026#34;\u0026#34; Make API call with automatic rate limiting \u0026#34;\u0026#34;\u0026#34; # Calculate wait time elapsed = time.time() - self.last_call_time if elapsed \u0026lt; self.min_interval: wait_time = self.min_interval - elapsed print(f\u0026#34;Rate limit: waiting {wait_time:.1f} seconds\u0026#34;) time.sleep(wait_time) # Make call params[\u0026#39;apikey\u0026#39;] = self.api_key response = requests.get(url, params=params) # Update last call time self.last_call_time = time.time() return response.json() # Usage client = RateLimitedClient(api_key=\u0026#34;YOUR_KEY\u0026#34;, calls_per_minute=5) # This will automatically space calls 12 seconds apart for symbol in [\u0026#39;SPY\u0026#39;, \u0026#39;QQQ\u0026#39;, \u0026#39;IWM\u0026#39;, \u0026#39;DIA\u0026#39;, \u0026#39;GLD\u0026#39;]: data = client.call_api( \u0026#34;https://www.alphavantage.co/query\u0026#34;, {\u0026#39;function\u0026#39;: \u0026#39;TIME_SERIES_DAILY\u0026#39;, \u0026#39;symbol\u0026#39;: symbol} ) print(f\u0026#34;Retrieved {symbol} data\u0026#34;) makes alpha vantage tolerable.\ndata quality comparison # tested on same day (feb 1, 2024):\nSPY close price discrepancies:\npolygon: $491.62\nalpha vantage: $491.62\nyahoo finance: $491.58 (off by $0.04)\npolygon and alpha vantage match.\nyahoo occasionally wrong.\nnever use yahoo for production.\ntonight # polygon.io = primary feed, $199/month, worth every dollar.\nalpha vantage = backup, free tier adequate for emergencies.\nyahoo finance = never for production.\ndata quality = edge protection.\ngarbage data destroys accounts.\n2:47am sunday. data feed comparison. polygon.io $199/month primary feed - 50-80ms latency, options data, 99.8% reliability. alpha vantage backup - free tier adequate for testing, rate limits brutal for production. lost $40k march 2023 partly from bad data - $199/month cheap insurance.\n-AK\n","date":"11 February 2024","externalUrl":null,"permalink":"/posts/2024-02-11-polygon-vs-alpha-vantage-data-feed-comparison/","section":"Posts","summary":"\u003cp\u003edata feeds = foundation of algo trading.\u003c/p\u003e\n\u003cp\u003egarbage data = garbage trades.\u003c/p\u003e\n\u003cp\u003ei\u0026rsquo;ve used both polygon.io and alpha vantage extensively.\u003c/p\u003e\n\u003cp\u003espent months researching data feeds when i started trading. NexusFi community helped narrow down options to these two.\u003c/p\u003e","title":"polygon.io vs alpha vantage - which data feed for algo trading","type":"posts"},{"content":"first week february done.\nchoppy as expected.\ntighter risk working.\nweek 1 february trades (feb 1-2, 5-7) # thursday 2/1: 2 trades, 1 win. +$480\nfriday 2/2: 3 trades, 2 wins. +$920\nmonday 2/5: 3 trades, 2 wins. +$740\ntuesday 2/6: 2 trades, 1 win. +$380\nwednesday 2/7: 3 trades, 2 wins. +$860\nweek total: +$3,380\naccount status # jan 31: $393,400\nfeb 7: $396,780\ncleared sept peak ($395,680).\nfull recovery complete.\nwin rate check # week 1 feb: 13 trades, 8 wins (62%)\nbelow 70% threshold.\nexpected with choppy conditions.\nrisk adjustment working:\nreduced from 0.5% to 0.4% per trade.\nsmaller wins but also smaller losses.\nprotecting capital.\nstrategy breakdown # mean reversion (9 trades):\n6 wins, 3 losses (67%) net: +$2,340 still primary but struggling momentum (4 trades):\n2 wins, 2 losses (50%) net: +$1,040 breakeven zone market not cooperating.\ncomparing to january peak # january best week: +$7,300, 76% win rate\nfebruary week 1: +$3,380, 62% win rate\nperformance cut in half.\nreasons:\nVIX up (16 → 18) volume choppy setups lower quality risk reduced to 0.4% expected variance.\nnot panicking.\ncircuit breaker almost triggered # monday 2/5:\n3 trades scheduled.\nfirst trade: loss.\nsecond trade: loss.\n3-loss circuit breaker armed.\nthird trade: win.\ncircuit breaker disarmed.\ncame close.\nsystem working as designed.\nrecovery milestone achieved # sept peak (before disaster): $395,680\nsept end (after disaster): $367,680\ntoday: $396,780\n$1,100 above sept peak.\ntook 5 months from disaster to recovery:\nsept: disaster (-$28k) oct: survival nov: recovery start (+$23k) dec: grief survival (+$3.6k) jan: growth (+$27k) feb week 1: milestone (+$3.4k) full circle.\nwhat\u0026rsquo;s different from september # september 2023 (at peak):\noverconfident ignored warning signs relationship unstable grief suppressed february 2024 (at recovery):\ncautious respecting market conditions relationship stable grief processed same account level.\ndifferent foundation.\ntherapy tuesday (2/6) # dr. r: \u0026ldquo;you crossed sept peak. full recovery. how does it feel?\u0026rdquo;\nme: \u0026ldquo;good but waiting for collapse.\u0026rdquo;\ndr. r: \u0026ldquo;still trauma response?\u0026rdquo;\nme: \u0026ldquo;yeah. feels like jinx.\u0026rdquo;\ndr. r: \u0026ldquo;what\u0026rsquo;s the evidence? data says what?\u0026rdquo;\nme: \u0026ldquo;market choppy. win rate 62%. conditions shifting.\u0026rdquo;\ndr. r: \u0026ldquo;and you\u0026rsquo;re responding how?\u0026rdquo;\nme: \u0026ldquo;reduced risk. stricter filters. protecting capital.\u0026rdquo;\ndr. r: \u0026ldquo;that\u0026rsquo;s data-driven caution. not trauma.\u0026rdquo;\nme: \u0026ldquo;feels like waiting for disaster though.\u0026rdquo;\ndr. r: \u0026ldquo;feeling vs action. you feel cautious but act systematically. that\u0026rsquo;s healthy.\u0026rdquo;\ndistinction matters.\nrisk management validation # position sizing reduction:\njanuary: 0.5% risk per trade\nfebruary: 0.4% risk per trade\nimpact:\nsmaller gains: week 1 gains down 54% from jan avg\nsmaller losses: max loss $320 (was $450 in jan)\nprotecting downside.\nliving with A. - routine adjusted # morning routine same:\n4am wake.\n6:30-10am trade.\n10am breakfast.\nevening adjusted:\nA. started new project at work.\ngetting home later (8pm instead of 7pm).\ndinner pushed to 8:30pm.\nstill works.\nflexibility \u0026gt; rigidity.\nmarket conditions deteriorating # signals:\nVIX: 18 (was 13-15 in jan)\nvolume: erratic spikes and drops\nsetups: quality declining\ncorrelation: everything moving together\nnot crash signals.\nbut choppier environment.\nstrategy:\nmaintain 0.4% risk through february.\nheavily favor mean reversion.\npass momentum unless A+ setup.\ntarget: +$3-5k per week (conservative).\nstrategy consideration # mean reversion struggling:\njanuary: 81% win rate\nfebruary week 1: 67% win rate\nmarket regime shift.\nmean reversion works best in stable/ranging markets.\ncurrent: whipsaw conditions.\noption 1: ride it out, market will stabilize\noption 2: reduce mean reversion, add different strategy\ndecision: ride it out for 2 more weeks.\nif win rate stays \u0026lt;65%, adjust.\nlooking ahead # week 2 feb (feb 8-14):\nvalentine\u0026rsquo;s day wednesday.\nA. expects something.\nplanning date night.\ntrading:\ncontinue 0.4% risk.\nstrict filters.\ntarget +$3-5k week.\nmonthly projection:\nif maintains $3.5k/week avg: +$14-17k month.\nway below january (+$27k).\nbut sustainable in choppy market.\ntonight # first week february.\n+$3,380.\n62% win rate.\ncleared sept peak.\nfull recovery complete.\nmarket conditions changed.\nadapting based on this.\nthis is the process.\n3:18am thursday. first week february. +$3,380. 62% win rate. cleared sept peak at $396,780. full recovery from september disaster complete (5 months). market choppy, reduced risk to 0.4%, tighter filters. performance cut in half from january but protecting capital.\n-AK\n","date":"7 February 2024","externalUrl":null,"permalink":"/posts/2024-02-07-first-week-february-choppy-conditions/","section":"Posts","summary":"\u003cp\u003efirst week february done.\u003c/p\u003e\n\u003cp\u003echoppy as expected.\u003c/p\u003e\n\u003cp\u003etighter risk working.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 1 february trades (feb 1-2, 5-7) \n    \u003cdiv id=\"week-1-february-trades-feb-1-2-5-7\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-1-february-trades-feb-1-2-5-7\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003ethursday 2/1:\u003c/strong\u003e 2 trades, 1 win. +$480\u003c/p\u003e","title":"first week february - choppy conditions, tighter risk","type":"posts"},{"content":"backtesting is where most algo traders hurt themselves.\nthey optimize parameters until strategy looks perfect on historical data.\nthen go live and it fails immediately.\nclassic overfitting.\nlearned this the hard way. saw countless traders on NexusFi backtesting discussions make same mistake when i joined in 2023.\nwhat is overfitting # you tune parameters so precisely to past data that strategy captures noise instead of signal.\nexample:\nyou backtest mean reversion with lookback period from 5 to 50 days.\nfind that 23 days gives perfect sharpe ratio on 2023 data.\ngo live with 23 days.\njanuary 2024 hits and strategy fails completely.\nwhy?\n23 days wasn\u0026rsquo;t edge.\nit was coincidence.\nyou fit noise.\nhow i got burned (march 2023) # lost $40k in one month on \u0026ldquo;perfect\u0026rdquo; backtest strategy.\nwhat i did wrong:\ntested momentum strategy with 50+ parameter combinations.\npicked best sharpe ratio (2.8 on 2022 data).\nparameters:\nlookback: 17 days entry threshold: 1.8 std dev exit threshold: 0.6 std dev position size: 2.1% risk looked amazing.\nwent live march 2023.\ncompletely failed.\nlost $40k in 3 weeks.\nlesson learned the expensive way.\nmy overfitting prevention system # built after march disaster.\n5 rules i follow religiously:\n1. walk-forward analysis # never optimize on full dataset.\nsplit data into chunks:\ntrain: optimize parameters test: verify performance walk forward: repeat process def walk_forward_analysis(data, train_period, test_period): \u0026#34;\u0026#34;\u0026#34; Walk-forward optimization to prevent overfitting \u0026#34;\u0026#34;\u0026#34; results = [] for i in range(0, len(data) - train_period - test_period, test_period): # Split data train_data = data[i:i+train_period] test_data = data[i+train_period:i+train_period+test_period] # Optimize on training data best_params = optimize_strategy(train_data) # Test on unseen data test_results = backtest_strategy(test_data, best_params) results.append({ \u0026#39;train_sharpe\u0026#39;: best_params[\u0026#39;sharpe\u0026#39;], \u0026#39;test_sharpe\u0026#39;: test_results[\u0026#39;sharpe\u0026#39;], \u0026#39;degradation\u0026#39;: best_params[\u0026#39;sharpe\u0026#39;] - test_results[\u0026#39;sharpe\u0026#39;] }) return results # Real usage results = walk_forward_analysis( data=historical_data, train_period=252, # 1 year training test_period=63 # 3 months testing ) # Check for overfitting avg_degradation = np.mean([r[\u0026#39;degradation\u0026#39;] for r in results]) if avg_degradation \u0026gt; 0.5: print(\u0026#34;WARNING: Likely overfitting\u0026#34;) if strategy crushes training but fails testing = overfitting.\n2. parameter stability check # good parameters shouldn\u0026rsquo;t be hyper-sensitive.\ntest nearby values.\nif sharpe drops 50% when changing lookback from 23 to 24 days = overfitting.\nif sharpe stays similar from 20-30 days = sturdy edge.\ndef parameter_stability_test(data, base_params, param_to_test, test_range): \u0026#34;\u0026#34;\u0026#34; Test parameter stability - solid edge vs curve fit \u0026#34;\u0026#34;\u0026#34; results = [] base_sharpe = backtest_strategy(data, base_params)[\u0026#39;sharpe\u0026#39;] for value in test_range: test_params = base_params.copy() test_params[param_to_test] = value test_sharpe = backtest_strategy(data, test_params)[\u0026#39;sharpe\u0026#39;] degradation = (base_sharpe - test_sharpe) / base_sharpe * 100 results.append({ \u0026#39;param_value\u0026#39;: value, \u0026#39;sharpe\u0026#39;: test_sharpe, \u0026#39;degradation_pct\u0026#39;: degradation }) # Good strategy: degradation stays under 20% for nearby values nearby_results = [r for r in results if abs(r[\u0026#39;param_value\u0026#39;] - base_params[param_to_test]) \u0026lt;= 5] avg_nearby_degradation = np.mean([r[\u0026#39;degradation_pct\u0026#39;] for r in nearby_results]) if avg_nearby_degradation \u0026gt; 20: print(f\u0026#34;WARNING: Parameter {param_to_test} is unstable\u0026#34;) print(f\u0026#34;Nearby degradation: {avg_nearby_degradation:.1f}%\u0026#34;) return False return True # Test lookback period stability stable = parameter_stability_test( data=historical_data, base_params={\u0026#39;lookback\u0026#39;: 20, \u0026#39;threshold\u0026#39;: 1.5}, param_to_test=\u0026#39;lookback\u0026#39;, test_range=range(15, 31) # Test 15-30 days ) i want strategies that work across parameter ranges.\nnot pinpoint precision.\n3. limit parameter count # more parameters = more overfitting risk.\nmy rule: max 4 tunable parameters per strategy.\nmean reversion (3 parameters):\nlookback period entry threshold exit threshold momentum (4 parameters):\nlookback period entry threshold exit threshold position sizing multiplier keep it simple.\n4. out-of-sample validation # always hold back 20% data that optimizer never sees.\nfinal check before going live.\ndef final_validation(full_data, optimal_params): \u0026#34;\u0026#34;\u0026#34; Final out-of-sample test on completely unseen data \u0026#34;\u0026#34;\u0026#34; # Split: 80% train/optimize, 20% final validation split_idx = int(len(full_data) * 0.8) optimization_data = full_data[:split_idx] validation_data = full_data[split_idx:] # Backtest on validation data (never used for optimization) validation_results = backtest_strategy(validation_data, optimal_params) print(f\u0026#34;Optimization Sharpe: {optimal_params[\u0026#39;sharpe\u0026#39;]:.2f}\u0026#34;) print(f\u0026#34;Validation Sharpe: {validation_results[\u0026#39;sharpe\u0026#39;]:.2f}\u0026#34;) print(f\u0026#34;Degradation: {(optimal_params[\u0026#39;sharpe\u0026#39;] - validation_results[\u0026#39;sharpe\u0026#39;]):.2f}\u0026#34;) # Decision criteria if validation_results[\u0026#39;sharpe\u0026#39;] \u0026lt; 1.0: print(\u0026#34;REJECT: Validation Sharpe too low\u0026#34;) return False degradation_pct = (optimal_params[\u0026#39;sharpe\u0026#39;] - validation_results[\u0026#39;sharpe\u0026#39;]) / optimal_params[\u0026#39;sharpe\u0026#39;] * 100 if degradation_pct \u0026gt; 30: print(f\u0026#34;REJECT: Degradation {degradation_pct:.1f}% too high\u0026#34;) return False print(\u0026#34;PASS: Strategy validated for live trading\u0026#34;) return True if validation fails = back to drawing board.\nno exceptions.\n5. monte carlo simulation # test strategy across thousands of random scenarios.\nresamples historical data with replacement.\nshows worst-case and best-case outcomes.\ndef monte_carlo_validation(data, params, n_simulations=1000): \u0026#34;\u0026#34;\u0026#34; Monte Carlo simulation - test across randomized scenarios \u0026#34;\u0026#34;\u0026#34; results = [] for i in range(n_simulations): # Resample data with replacement (bootstrap) bootstrap_data = data.sample(n=len(data), replace=True).sort_index() # Run backtest on resampled data sim_results = backtest_strategy(bootstrap_data, params) results.append({ \u0026#39;sharpe\u0026#39;: sim_results[\u0026#39;sharpe\u0026#39;], \u0026#39;max_dd\u0026#39;: sim_results[\u0026#39;max_drawdown\u0026#39;], \u0026#39;win_rate\u0026#39;: sim_results[\u0026#39;win_rate\u0026#39;] }) # Analyze distribution sharpe_dist = [r[\u0026#39;sharpe\u0026#39;] for r in results] print(f\u0026#34;Sharpe Distribution:\u0026#34;) print(f\u0026#34; Mean: {np.mean(sharpe_dist):.2f}\u0026#34;) print(f\u0026#34; Median: {np.median(sharpe_dist):.2f}\u0026#34;) print(f\u0026#34; 5th percentile: {np.percentile(sharpe_dist, 5):.2f}\u0026#34;) print(f\u0026#34; 95th percentile: {np.percentile(sharpe_dist, 95):.2f}\u0026#34;) # Decision: 5th percentile must be profitable if np.percentile(sharpe_dist, 5) \u0026lt; 0.5: print(\u0026#34;REJECT: 5th percentile Sharpe too low\u0026#34;) return False return True # Validate with Monte Carlo passed = monte_carlo_validation( data=historical_data, params=optimal_params, n_simulations=1000 ) if 5th percentile is garbage = strategy too fragile.\nred flags i watch for # 1. too-perfect backtest\nsharpe \u0026gt; 3.0 = suspicious.\nwin rate \u0026gt; 85% = suspicious.\nmax drawdown \u0026lt; 5% = suspicious.\nreal trading has losses.\nif backtest doesn\u0026rsquo;t show them = overfitting.\n2. parameter precision\noptimal value: 23.47 days lookback.\nno way.\nround to whole numbers.\nif strategy needs decimals = overfitting.\n3. degradation on new data\nbacktest 2023: sharpe 2.5\nlive trading jan 2024: sharpe 0.8\nstrategy failed.\noverfitting confirmed.\nmy current mean reversion strategy # parameters (survived all tests):\nlookback: 20 days (stable from 15-25)\nentry threshold: 2.0 std dev (stable from 1.8-2.2)\nexit threshold: 0.5 std dev (stable from 0.4-0.7)\nwalk-forward results:\navg training sharpe: 1.6\navg testing sharpe: 1.4\ndegradation: 0.2 (acceptable)\nout-of-sample validation:\noptimization sharpe: 1.5\nvalidation sharpe: 1.3\ndegradation: 13% (good)\nmonte carlo (1000 sims):\nmean sharpe: 1.4\n5th percentile sharpe: 0.9\npassed all tests.\nlive performance (nov 2023 - jan 2024):\nsharpe: 1.2\nwithin expected range.\nhow i backtest now # class RobustBacktester: \u0026#34;\u0026#34;\u0026#34; Backtesting system with overfitting prevention built-in \u0026#34;\u0026#34;\u0026#34; def __init__(self, data, train_pct=0.6, validation_pct=0.2): self.full_data = data # Split data train_end = int(len(data) * train_pct) val_end = train_end + int(len(data) * validation_pct) self.train_data = data[:train_end] # 60% train self.test_data = data[train_end:val_end] # 20% test self.validation_data = data[val_end:] # 20% validation (unseen) def optimize_parameters(self, param_grid): \u0026#34;\u0026#34;\u0026#34;Step 1: Optimize on training data only\u0026#34;\u0026#34;\u0026#34; best_sharpe = -999 best_params = None for params in param_grid: results = backtest_strategy(self.train_data, params) if results[\u0026#39;sharpe\u0026#39;] \u0026gt; best_sharpe: best_sharpe = results[\u0026#39;sharpe\u0026#39;] best_params = params return best_params, best_sharpe def test_stability(self, params): \u0026#34;\u0026#34;\u0026#34;Step 2: Test parameter stability\u0026#34;\u0026#34;\u0026#34; # Test lookback stability lookback_stable = parameter_stability_test( self.train_data, params, \u0026#39;lookback\u0026#39;, range(params[\u0026#39;lookback\u0026#39;]-5, params[\u0026#39;lookback\u0026#39;]+6) ) # Test threshold stability threshold_stable = parameter_stability_test( self.train_data, params, \u0026#39;threshold\u0026#39;, np.arange(params[\u0026#39;threshold\u0026#39;]-0.3, params[\u0026#39;threshold\u0026#39;]+0.4, 0.1) ) return lookback_stable and threshold_stable def walk_forward_test(self, params): \u0026#34;\u0026#34;\u0026#34;Step 3: Walk-forward analysis\u0026#34;\u0026#34;\u0026#34; results = walk_forward_analysis( data=self.test_data, train_period=126, # 6 months test_period=63 # 3 months ) avg_degradation = np.mean([r[\u0026#39;degradation\u0026#39;] for r in results]) return avg_degradation \u0026lt; 0.5 # Max 0.5 Sharpe degradation def monte_carlo_test(self, params): \u0026#34;\u0026#34;\u0026#34;Step 4: Monte Carlo validation\u0026#34;\u0026#34;\u0026#34; return monte_carlo_validation( self.test_data, params, n_simulations=1000 ) def final_validation(self, params): \u0026#34;\u0026#34;\u0026#34;Step 5: Final test on completely unseen data\u0026#34;\u0026#34;\u0026#34; results = backtest_strategy(self.validation_data, params) # Require validation Sharpe \u0026gt; 1.0 and degradation \u0026lt; 30% train_sharpe = backtest_strategy(self.train_data, params)[\u0026#39;sharpe\u0026#39;] degradation_pct = (train_sharpe - results[\u0026#39;sharpe\u0026#39;]) / train_sharpe * 100 return results[\u0026#39;sharpe\u0026#39;] \u0026gt; 1.0 and degradation_pct \u0026lt; 30 def run_full_validation(self): \u0026#34;\u0026#34;\u0026#34;Run complete validation pipeline\u0026#34;\u0026#34;\u0026#34; print(\u0026#34;Step 1: Optimizing parameters...\u0026#34;) best_params, train_sharpe = self.optimize_parameters(param_grid) print(f\u0026#34; Best training Sharpe: {train_sharpe:.2f}\u0026#34;) print(\u0026#34;\\nStep 2: Testing parameter stability...\u0026#34;) if not self.test_stability(best_params): print(\u0026#34; FAILED: Parameters unstable\u0026#34;) return None print(\u0026#34; PASSED\u0026#34;) print(\u0026#34;\\nStep 3: Walk-forward analysis...\u0026#34;) if not self.walk_forward_test(best_params): print(\u0026#34; FAILED: High degradation in walk-forward\u0026#34;) return None print(\u0026#34; PASSED\u0026#34;) print(\u0026#34;\\nStep 4: Monte Carlo simulation...\u0026#34;) if not self.monte_carlo_test(best_params): print(\u0026#34; FAILED: Poor performance in Monte Carlo\u0026#34;) return None print(\u0026#34; PASSED\u0026#34;) print(\u0026#34;\\nStep 5: Final validation on unseen data...\u0026#34;) if not self.final_validation(best_params): print(\u0026#34; FAILED: Validation test failed\u0026#34;) return None print(\u0026#34; PASSED\u0026#34;) print(\u0026#34;\\n✓ Strategy validated - ready for live trading\u0026#34;) return best_params # Usage backtester = RobustBacktester(data=historical_data) validated_params = backtester.run_full_validation() if validated_params: print(f\u0026#34;\\nGoing live with: {validated_params}\u0026#34;) else: print(\u0026#34;\\nStrategy rejected - back to drawing board\u0026#34;) tonight # backtesting saved me.\nmarch 2023: didn\u0026rsquo;t validate properly, lost $40k.\nnow: 5-step validation process, strategies survive live trading.\noverfitting kills accounts.\nsound validation saves them.\n2:35am monday. backtesting overfitting prevention. lost $40k march 2023 on overfit strategy. built 5-step validation: walk-forward, stability, parameter limits, out-of-sample, monte carlo. current mean reversion passed all tests, performing live within expected range.\n-AK\n","date":"4 February 2024","externalUrl":null,"permalink":"/posts/2024-02-04-backtesting-overfitting-how-i-avoid-it/","section":"Posts","summary":"\u003cp\u003ebacktesting is where most algo traders hurt themselves.\u003c/p\u003e\n\u003cp\u003ethey optimize parameters until strategy looks perfect on historical data.\u003c/p\u003e\n\u003cp\u003ethen go live and it fails immediately.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eclassic overfitting.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003elearned this the hard way. saw countless traders on \u003ca\n  href=\"https://nexusfi.com/showthread.php?t=5429\"\n    target=\"_blank\"\n  \u003eNexusFi backtesting discussions\u003c/a\u003e make same mistake when i joined in 2023.\u003c/p\u003e","title":"backtesting overfitting - how i avoid curve-fitting my algos","type":"posts"},{"content":"january done.\n$27k month.\nfull recovery from september disaster complete.\njanuary final numbers # starting (jan 1): $366,200\nending (jan 31): $393,400\njanuary gain: +$27,200 (+7.42%)\ntrades: 68\nwins: 52\nlosses: 16\nwin rate: 76%\nFigure 1: January 2024 daily account progression. Started $366.2k, ended $393.4k. Steady climb all month with only minor pullbacks. Consistent execution delivered consistent growth.\nweekly breakdown # Figure 2: Weekly performance metrics. Week 1 started strongest (86% win rate), natural regression through month, ended week 5 at 67% but still profitable. Gains remained consistent despite win rate variance.\nweek 1 (jan 2-5): +$7,200, 86% win rate (14 trades)\nweek 2 (jan 8-12): +$7,300, 76% win rate (17 trades)\nweek 3 (jan 15-19): +$6,220, 79% win rate (14 trades)\nweek 4 (jan 22-26): +$6,480, 71% win rate (17 trades)\nweek 5 (jan 29-31): +$3,200, 67% win rate (6 trades)\nmonthly total: +$30,400\nwait, math doesn\u0026rsquo;t match.\nrecalculating\u0026hellip;\nactual total from weekly: +$30,400\nactual account change: +$27,200\ndifference: -$3,200\nwhat happened: commissions, fees, overnight holding costs.\nreality check: gross vs net.\nnet is what matters.\nstrategy performance # Figure 3: Mean reversion dominated January with 81% win rate across 42 trades. Momentum was secondary but still profitable at 68% across 19 trades. Clear edge in mean reversion strategies.\nmean reversion (42 trades):\n34 wins, 8 losses (81%) gross: +$21,340 primary strategy consistent edge momentum (19 trades):\n13 wins, 6 losses (68%) gross: +$5,860 secondary strategy more selective other (7 trades):\n5 wins, 2 losses (71%) gross: +$3,200 experimental/opportunistic mean reversion = primary edge confirmed.\ncomparing key months # september 2023 (disaster):\n-$28,000 (-7.08%) 12% win rate emotional chaos A. left for 18 days november 2023 (recovery):\n+$23,480 (+6.92%) 84% win rate systematic execution A. moved in permanently january 2024 (growth):\n+$27,200 (+7.42%) 76% win rate consistent discipline relationship stable pattern: stability = performance.\naccount milestones # sept peak (before disaster): $395,680\nsept end (after disaster): $367,680\noct end (recovery start): $362,560\nnov end (recovery strong): $386,040\ndec end (survival mode): $366,200\njan end (growth mode): $393,400\n$2,280 away from sept peak.\nlikely recover fully in first week february.\nfull circle: sept disaster → jan recovery.\ntook 4 months.\nrisk management review # position sizing: 0.5% per trade (consistent)\ncircuit breaker triggered: 0 times\n3-loss streaks: 1 (week 4, handled correctly)\nfilters enforced: passed 34 potential trades\nestimated saves: ~$4,800\nsystem functioning.\nwhat worked # 1. routine locked\nwake 4am.\ntrade 6:30-10am.\nbreakfast with A. 10am.\ncode 11am-5pm.\ngym 6pm.\ndinner 7pm.\nno variance.\n2. mental clarity\ngrief processed (mostly).\nno fog.\nsharp execution.\n3. relationship stable\nA. solid.\nliving together works.\nno drama.\n4. filters enforced\nquality over quantity.\npatience = profit.\nwhat i\u0026rsquo;m watching # 1. win rate declining trend\nweek 1: 86% week 5: 67% natural regression but monitor for \u0026lt;70% 2. market conditions shifting\nVIX rising (14 → 16) volume declining february likely choppier 3. overconfidence risk\n$27k month feels easy september started same way must maintain respect february adjustments # position sizing: reduce to 0.4% (from 0.5%)\nstrategy focus: heavily favor mean reversion\nmomentum trades: only A+ setups\nfilters: stricter quality thresholds\ntarget: +$5-10k month (conservative)\nreason: market conditions changing, don\u0026rsquo;t chase january performance.\ntherapy friday (1/26) # dr. r: \u0026ldquo;january crushing it. $27k month. what\u0026rsquo;s the internal experience?\u0026rdquo;\nme: \u0026ldquo;waiting for collapse.\u0026rdquo;\ndr. r: \u0026ldquo;trauma response or data?\u0026rdquo;\nme: \u0026ldquo;trauma. data says market shifting but nothing collapsed yet.\u0026rdquo;\ndr. r: \u0026ldquo;can you hold both? success now AND caution for future?\u0026rdquo;\nme: \u0026ldquo;\u0026hellip;trying. feels like waiting for september repeat.\u0026rdquo;\ndr. r: \u0026ldquo;september you were suppressing grief and relationship was unstable. now?\u0026rdquo;\nme: \u0026ldquo;grief processed. A. solid. filters working.\u0026rdquo;\ndr. r: \u0026ldquo;different foundation. similar performance doesn\u0026rsquo;t mean similar outcome.\u0026rdquo;\nneeded to hear that.\ncomparing 2023 to 2024 start # january 2023:\ninherited $400k paper trading → real money joined NexusFi for support started learning with real capital january 2024:\nrecovered from $180k loss systematic strategies proven relationship stable mental clarity achieved growth.\nthe places list # friday night (1/26).\nstrong week.\napproaching recovery milestone.\nA.: \u0026ldquo;you\u0026rsquo;re thinking about the list.\u0026rdquo;\nme: \u0026ldquo;how do you know?\u0026rdquo;\nA.: \u0026ldquo;you get that look.\u0026rdquo;\nme: \u0026ldquo;what look?\u0026rdquo;\nA.: \u0026ldquo;predatory.\u0026rdquo;\nme: \u0026ldquo;\u0026hellip;accurate.\u0026rdquo;\nA.: \u0026ldquo;where?\u0026rdquo;\nme: \u0026ldquo;gym bathroom. after hours. late night.\u0026rdquo;\nA.: \u0026ldquo;we have a key?\u0026rdquo;\nme: \u0026ldquo;i have a key.\u0026rdquo;\nA.: \u0026ldquo;this is why i love you.\u0026rdquo;\ngym, 11:30pm:\nempty building.\nweights room bathroom.\nquick but intense.\nshe was bent over the sink, i fucked her from behind.\nboth came hard.\nplaces list updated: gym bathroom, after hours, mirrors everywhere, adrenaline.\ntonight (jan 31, 11:45pm) # january done.\n+$27,200.\n76% win rate.\nexceeded every target.\nfull recovery nearly complete.\nseptember disaster feels distant.\nbut not forgotten.\nrespect maintained.\nfebruary tomorrow.\nexpecting choppy conditions.\nadjusting position size.\ntightening filters.\nmaintaining \u0026gt; growing.\nthis is the way.\n11:45pm jan 31. january wrap. +$27.2k month (7.42%). 76% win rate across 68 trades. mean reversion dominated at 81%. $2,280 from full sept recovery. four months sept disaster to jan recovery. A. solid, grief processed, filters working. february adjustments: 0.4% size, stricter filters, conservative $5-10k target.\n-AK\n","date":"31 January 2024","externalUrl":null,"permalink":"/posts/2024-01-31-january-wrap-27k-month-full-recovery/","section":"Posts","summary":"\u003cp\u003ejanuary done.\u003c/p\u003e\n\u003cp\u003e$27k month.\u003c/p\u003e\n\u003cp\u003efull recovery from september disaster complete.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ejanuary final numbers \n    \u003cdiv id=\"january-final-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#january-final-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estarting (jan 1):\u003c/strong\u003e $366,200\u003c/p\u003e","title":"january wrap - $27k month, full recovery complete","type":"posts"},{"content":"","date":"28 January 2024","externalUrl":null,"permalink":"/tags/consistency/","section":"Tags","summary":"","title":"Consistency","type":"tags"},{"content":"week 4 done.\nfinishing strong.\nmomentum maintained.\nweek 4 trades (jan 22-26) # monday 1/22: 4 trades, 3 wins. +$1,840\ntuesday 1/23: 3 trades, 2 wins. +$1,430\nwednesday 1/24: 4 trades, 3 wins. +$1,570\nthursday 1/25: 3 trades, 2 wins. +$1,140\nfriday 1/26: 3 trades, 2 wins. +$1,500\nweek total: +$6,480\naccount status # jan 19: $386,920\njan 26: $393,400\njanuary progress (4 weeks): +$27,200 (+7.42%)\nbeat original target by 4.5x.\nwin rate check # week 4: 17 trades, 12 wins (71%)\njanuary combined (4 weeks): 62 trades, 48 wins (77%)\ndropped from 80% to 77%.\nexpected variance.\nstill well above 75% target.\nstrategy breakdown week 4 # mean reversion (12 trades):\n9 wins, 3 losses (75%) net: +$4,920 still primary edge momentum (5 trades):\n3 wins, 2 losses (60%) net: +$1,560 secondary, selective mean reversion maintaining dominance.\nrisk management notes # week 4 had 3 consecutive losses (wed-thu).\nfirst losing streak since november.\n3-loss circuit breaker almost triggered.\nstopped after loss #3 wednesday afternoon.\nresumed thursday morning fresh.\ncircuit breaker working as designed.\ndidn\u0026rsquo;t spiral.\ndidn\u0026rsquo;t revenge trade.\njust stopped and reset.\nwhat i\u0026rsquo;m watching # win rate declining:\nweek 1: 86% week 2: 76% week 3: 79% week 4: 71% natural regression.\nbut watching for trend continuation.\nif drops below 70% next week, reducing size to 0.4% risk.\nproactive adjustment.\nmarket conditions changing # VIX creeping up: 14 → 16 range\nvolume declining: late january exhaustion\nsetups getting pickier: quality decreasing slightly\nnot red flags yet.\nbut monitoring closely.\nfebruary might be choppier.\ncomparing to november # november 2023 (recovery): +$23,480, 84% win rate\njanuary 2024 (4 weeks): +$27,200, 77% win rate\nbeat november on total gain.\nlower win rate but higher volume = more profit.\nevolution.\ntherapy tuesday (1/23) # dr. r: \u0026ldquo;four weeks january. $27k month. how does it feel?\u0026rdquo;\nme: \u0026ldquo;good. cautious. waiting for the other shoe.\u0026rdquo;\ndr. r: \u0026ldquo;waiting for disaster?\u0026rdquo;\nme: \u0026ldquo;always. september taught me that.\u0026rdquo;\ndr. r: \u0026ldquo;difference between healthy caution and trauma response?\u0026rdquo;\nme: \u0026ldquo;\u0026hellip;fair point.\u0026rdquo;\ndr. r: \u0026ldquo;healthy caution: i monitor risk and adjust. trauma response: i wait for collapse.\u0026rdquo;\nme: \u0026ldquo;which one am i doing?\u0026rdquo;\ndr. r: \u0026ldquo;you tell me. are you adjusting based on data or expecting disaster?\u0026rdquo;\nme: \u0026ldquo;\u0026hellip;adjusting based on data. watching win rate. planning size reduction if needed.\u0026rdquo;\ndr. r: \u0026ldquo;that\u0026rsquo;s healthy caution. trauma would be \u0026lsquo;i\u0026rsquo;m about to lose everything.\u0026rsquo;\u0026rdquo;\nuseful distinction.\nliving with A. - routine locked # morning routine perfected:\n4am wake.\n6:30am-10am trade.\n10am breakfast together.\nA.: \u0026ldquo;you want eggs?\u0026rdquo;\nme: \u0026ldquo;always.\u0026rdquo;\nsame conversation every morning.\ncomfort in repetition.\nevening routine:\n6pm gym.\n7pm dinner together.\n8pm code or read.\n11pm bed.\nlocked.\nweekend plans # saturday (1/27):\nA. wants to try new sushi place.\ni hate sushi.\nshe\u0026rsquo;s planning \u0026ldquo;incentives.\u0026rdquo;\nthis pattern works too well.\nsunday (1/28):\nrest day.\nstrategy review.\nprep for february.\njanuary target status # original target: +$5-8k month\nactual (4 weeks): +$27,200\nbeat low target: 5.4x\nbeat high target: 3.4x\nweek 5 (jan 29-31): 3 trading days left\nconservative projection: +$30k month final\nlooking ahead to february # expecting:\nhigher volatility (VIX rising) choppier conditions lower win rate (70-75% range) need tighter risk management adjusting:\nstricter filters 0.4% risk per trade (down from 0.5%) focus heavily on mean reversion reduce momentum trades proactive not reactive.\naccount milestone approaching # current: $393,400\nsept peak (before disaster): $395,680\n$2,280 away from recovering fully.\nlikely hit next week.\nfull circle.\nsept disaster → nov recovery → jan growth → feb consolidation (hopefully).\ntonight # four weeks january.\n+$27,200.\n77% win rate.\noriginal target crushed.\nmaintaining discipline through success.\nmonitoring for warning signs.\npreparing for february variance.\nthis is working.\n2:14am sunday. week 4 january. +$6,480. four weeks combined +$27.2k. 77% win rate. had first losing streak (3 losses) since november, circuit breaker worked. market conditions shifting slightly. preparing for choppier february.\n-AK\n","date":"28 January 2024","externalUrl":null,"permalink":"/posts/2024-01-28-week-4-january-finishing-strong/","section":"Posts","summary":"\u003cp\u003eweek 4 done.\u003c/p\u003e\n\u003cp\u003efinishing strong.\u003c/p\u003e\n\u003cp\u003emomentum maintained.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 4 trades (jan 22-26) \n    \u003cdiv id=\"week-4-trades-jan-22-26\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-4-trades-jan-22-26\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003emonday 1/22:\u003c/strong\u003e 4 trades, 3 wins. +$1,840\u003c/p\u003e","title":"week 4 january - finishing strong, maintaining momentum","type":"posts"},{"content":"week 3 done.\nalmost there.\npushing toward $20k month.\nweek 3 trades (jan 15-19) # monday 1/15: market closed (MLK day)\ntuesday 1/16: 4 trades, 3 wins. +$1,680\nwednesday 1/17: 3 trades, 2 wins. +$1,140\nthursday 1/18: 4 trades, 3 wins. +$1,920\nfriday 1/19: 3 trades, 3 wins. +$1,480\nweek total: +$6,220\naccount status # jan 12: $380,700\njan 19: $386,920\njanuary progress: +$20,720 (+5.66%)\nhit $20k month target.\nwin rate holding # week 3: 14 trades, 11 wins (79%)\njanuary combined: 45 trades, 36 wins (80%)\nconsistency maintaining.\nthree weeks. 80% win rate. $20k+ month.\nthis is what systematic trading looks like.\nstrategy performance (week 3) # mean reversion (9 trades):\n8 wins, 1 loss (89%) net: +$4,840 still primary edge momentum (5 trades):\n3 wins, 2 losses (60%) net: +$1,380 secondary, selective january target crushed # original target: +$5-8k month\ncurrent (3 weeks): +$20,720\nbeat low target: 4.1x\nbeat high target: 2.6x\n1.5 weeks left.\nconservative projection: +$24-28k month.\nwhat\u0026rsquo;s working (still) # 1. routine unbreakable\nwake 4am.\ntrade 6:30am-10am.\nbreakfast with A. 10am.\ncode 11am-5pm.\ngym 6pm.\ndinner 7pm.\nlocked.\n2. mental clarity maintained\nno fog.\nno grief interference.\nsharp execution.\n3. filters working\npassed 9 potential trades this week.\nestimated saves: ~$1,600.\npatience = performance.\n4. position sizing consistent\n0.5% risk every trade.\nno variance.\nno exceptions.\ntherapy friday (1/19) # dr. r: \u0026ldquo;three weeks january. $20k month. how do you feel?\u0026rdquo;\nme: \u0026ldquo;good. cautious. remembering september.\u0026rdquo;\ndr. r: \u0026ldquo;september before disaster. similar performance.\u0026rdquo;\nme: \u0026ldquo;exactly. don\u0026rsquo;t want to repeat.\u0026rdquo;\ndr. r: \u0026ldquo;what\u0026rsquo;s different now?\u0026rdquo;\nme: \u0026ldquo;filters enforced. A. stable. not overconfident. respecting system.\u0026rdquo;\ndr. r: \u0026ldquo;awareness is the difference. you see the parallels. you\u0026rsquo;re adjusting.\u0026rdquo;\nme: \u0026ldquo;also\u0026hellip; grief processed. september i was ignoring it. now it\u0026rsquo;s integrated.\u0026rdquo;\ndr. r: \u0026ldquo;that\u0026rsquo;s huge. september you were suppressing. now you\u0026rsquo;re processing.\u0026rdquo;\nkey distinction.\nliving with A. - food negotiations # tuesday night:\nA.: \u0026ldquo;there\u0026rsquo;s this thai place we should try.\u0026rdquo;\nme: \u0026ldquo;i don\u0026rsquo;t like thai food.\u0026rdquo;\nA.: \u0026ldquo;you\u0026rsquo;ve never had thai food.\u0026rdquo;\nme: \u0026ldquo;correct logic. maintaining position.\u0026rdquo;\nA.: \u0026ldquo;what if i make it worth your while?\u0026rdquo;\nme: \u0026ldquo;\u0026hellip;how worth my while?\u0026rdquo;\nA.: \u0026ldquo;very.\u0026rdquo;\nthursday night - thai restaurant:\nverdict: actually decent. spicy AF but good.\nfriday night:\nA.: \u0026ldquo;told you thai was good.\u0026rdquo;\nme: \u0026ldquo;you bribed me with sex.\u0026rdquo;\nA.: \u0026ldquo;worked though.\u0026rdquo;\nme: \u0026ldquo;unfortunately yes.\u0026rdquo;\nthe places list # saturday night (jan 20).\ngood trading week.\nA. in playful mood.\nme: \u0026ldquo;list?\u0026rdquo;\nA.: \u0026ldquo;where?\u0026rdquo;\nme: \u0026ldquo;storage room. apartment building basement. late night.\u0026rdquo;\nA.: \u0026ldquo;that\u0026rsquo;s sketchy as hell.\u0026rdquo;\nme: \u0026ldquo;exactly.\u0026rdquo;\nstorage room, 11pm:\nquick but intense.\nshe was moaning loud as fuck, had to cover her mouth.\nalmost got caught when someone opened basement door.\ngot dressed fast, walked out casual.\nplaces list updated: storage room, basement, late night, almost caught, adrenaline rush.\ncomparing to november # november (recovery month): +$23,480, 84% win rate\njanuary (so far): +$20,720, 80% win rate\nsimilar performance.\nkey difference:\nnovember: recovering from disaster.\njanuary: building from strength.\npsychological shift matters.\nmarket conditions check # volume: normal, healthy\nvolatility: VIX 13-15 (ideal range)\nsetups: quality consistent\nno red flags.\nrisk management review # no losing streaks.\n3-loss circuit breaker: not triggered.\nfilters: working perfectly.\nposition sizing: no variance.\nsystem functioning.\nstrategy consideration # mean reversion: 89% win rate week 3.\ncrushing it.\nmomentum: 60% win rate week 3.\ndecent but choppy.\ndecision: keep both but favor mean reversion 2:1 ratio.\nlooking ahead # week 4 (jan 22-26):\n1.5 weeks left january.\ntargeting +$4-8k more.\nfinal projection: +$24-28k month.\nmaintaining \u0026gt; growing.\ndon\u0026rsquo;t force trades.\nrespect system.\ntonight # three weeks january.\n+$20,720.\n80% win rate.\nhit monthly target.\nmaintaining consistency.\nnot getting overconfident.\nremembering september lessons.\n3:28am sunday. week 3 january. +$6,220. three weeks total +$20.7k. 80% win rate. hit monthly target with 1.5 weeks left. A. bribed me with sex to try thai food (worked). storage room almost caught moment added to list.\n-AK\n","date":"21 January 2024","externalUrl":null,"permalink":"/posts/2024-01-21-week-3-january-almost-there/","section":"Posts","summary":"\u003cp\u003eweek 3 done.\u003c/p\u003e\n\u003cp\u003ealmost there.\u003c/p\u003e\n\u003cp\u003epushing toward $20k month.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 3 trades (jan 15-19) \n    \u003cdiv id=\"week-3-trades-jan-15-19\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-3-trades-jan-15-19\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003emonday 1/15:\u003c/strong\u003e market closed (MLK day)\u003c/p\u003e","title":"week 3 january - almost there, pushing toward $20k month","type":"posts"},{"content":"week 2 done.\nconsistency building.\nno drama.\nweek 2 trades (jan 8-12) # monday 1/8: 3 trades, 2 wins. +$1,240\ntuesday 1/9: 4 trades, 3 wins. +$1,680\nwednesday 1/10: 3 trades, 2 wins. +$980\nthursday 1/11: 4 trades, 3 wins. +$1,820\nfriday 1/12: 3 trades, 3 wins. +$1,580\nweek total: +$7,300\naccount status # jan 5: $373,400\njan 12: $380,700\njanuary progress: +$14,500 (+3.96%)\ntwo weeks crushing.\nwin rate maintaining # week 2: 17 trades, 13 wins (76%)\nweek 1: 14 trades, 12 wins (86%)\ncombined january: 31 trades, 25 wins (81%)\nslightly lower than week 1 but still solid.\nexpected regression from 86%.\n75%+ is target. maintaining.\nstrategy performance # mean reversion (12 trades):\n10 wins, 2 losses (83%) net: +$5,640 primary edge momentum (5 trades):\n3 wins, 2 losses (60%) net: +$1,660 secondary, more selective comparing to 2023 # january 2024 (2 weeks): +$14,500, 81% win rate\nnovember 2023 (best month): +$23,480, 84% win rate\non pace for: +$29k month if continues\nrealistic expectation: +$18-22k month (variance will hit)\nwhat\u0026rsquo;s working # 1. routine locked\nwake 4am every day.\ntrade 6:30am-10am.\nbreakfast with A. 10am.\ncode/strategy work 11am-5pm.\ngym 6pm.\ndinner with A. 7pm.\nno variance. no chaos.\n2. mental clarity maintained\nno grief fog.\nsharp focus.\nquick decisions.\n3. filters enforced\npassed 12 potential trades this week.\nestimated saves: ~$2,000.\npatience paying off.\n4. proper position sizing\n0.5% risk every trade.\nno exceptions.\nno emotional adjustments.\ntherapy tuesday (1/9) # dr. r: \u0026ldquo;two weeks into 2024. still feeling clear?\u0026rdquo;\nme: \u0026ldquo;+$14.5k so far. 81% win rate. yeah, clear.\u0026rdquo;\ndr. r: \u0026ldquo;any grief moments?\u0026rdquo;\nme: \u0026ldquo;few. but manageable. background noise like you said.\u0026rdquo;\ndr. r: \u0026ldquo;how do you handle them now?\u0026rdquo;\nme: \u0026ldquo;pause. acknowledge. move on. don\u0026rsquo;t fight them.\u0026rdquo;\ndr. r: \u0026ldquo;integration working.\u0026rdquo;\nme: \u0026ldquo;also helps that trading is going well. easier to process grief when not stressed about account.\u0026rdquo;\ndr. r: \u0026ldquo;chicken and egg. mental clarity enables good trading. good trading reduces stress. positive cycle.\u0026rdquo;\nexactly.\nliving with A. - normalcy # wednesday night:\nA.: \u0026ldquo;you seem\u0026hellip; lighter.\u0026rdquo;\nme: \u0026ldquo;lighter how?\u0026rdquo;\nA.: \u0026ldquo;less heavy. like december weight is gone.\u0026rdquo;\nme: \u0026ldquo;processed the anniversary. feels different now.\u0026rdquo;\nA.: \u0026ldquo;good different?\u0026rdquo;\nme: \u0026ldquo;yeah. grief is still there. but it\u0026rsquo;s not crushing me.\u0026rdquo;\nA.: \u0026ldquo;you\u0026rsquo;re sleeping better too. not tossing and turning.\u0026rdquo;\nme: \u0026ldquo;didn\u0026rsquo;t realize you noticed.\u0026rdquo;\nA.: \u0026ldquo;i notice everything.\u0026rdquo;\nshe does.\nthe places list # friday night.\nsecond strong week.\nmomentum building.\nme: \u0026ldquo;list?\u0026rdquo;\nA.: \u0026ldquo;you\u0026rsquo;re predictable.\u0026rdquo;\nme: \u0026ldquo;you love it.\u0026rdquo;\nA.: \u0026ldquo;i do. where?\u0026rdquo;\nme: \u0026ldquo;car. parking lot overlook. ocean view. late night.\u0026rdquo;\nA.: \u0026ldquo;beach parking lot? classy.\u0026rdquo;\nme: \u0026ldquo;works though.\u0026rdquo;\nplaces list updated: car, beach parking lot, ocean view, january night, windows fogged.\njanuary target status # original target: +$5-8k month\ncurrent (2 weeks): +$14,500\nbeat target already with 2.5 weeks left.\nnew projection: +$20-25k month if maintains.\nrisk management check # no losing streaks.\nlongest: 1 loss, then win.\n3-loss circuit breaker: not needed.\nfilters working.\nposition sizing consistent.\nsystem functioning.\nmarket conditions # volume: normal\nvolatility: manageable (VIX 12-14)\nsetups: quality improving\nbest trading environment since september (before disaster).\nwhat\u0026rsquo;s different from september # september (before disaster):\ntrading well overconfident ignored warning signs A. and i had issues brewing january (now):\ntrading well confident but cautious respecting filters A. and i solid key: not repeating september mistakes.\nsuccess doesn\u0026rsquo;t mean invincible.\nstrategy adjustment consideration # mean reversion: crushing it (83% week 2)\nmomentum: decent but choppy (60% week 2)\nthinking: focus more on mean reversion through january.\nmomentum when setups perfect.\nquality over quantity.\nlooking ahead # week 3 (jan 15-19):\nmaintain consistency.\nexpect some losses (variance).\nstay systematic.\nmonthly projection:\ncurrently +$14.5k (2 weeks).\nneed +$5.5k more to hit +$20k month.\nachievable.\ntonight # two weeks january.\n+$14,500.\n81% win rate.\nno drama.\nno chaos.\njust consistent execution.\nthis is what works.\n3:05am sunday. week 2 january. +$7,300. two weeks combined +$14.5k. 81% win rate. consistency building. no grief fog. routine locked. A. says i seem lighter. momentum maintaining.\n-AK\n","date":"14 January 2024","externalUrl":null,"permalink":"/posts/2024-01-14-week-2-january-consistency-building/","section":"Posts","summary":"\u003cp\u003eweek 2 done.\u003c/p\u003e\n\u003cp\u003econsistency building.\u003c/p\u003e\n\u003cp\u003eno drama.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 2 trades (jan 8-12) \n    \u003cdiv id=\"week-2-trades-jan-8-12\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-2-trades-jan-8-12\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003emonday 1/8:\u003c/strong\u003e 3 trades, 2 wins. +$1,240\u003c/p\u003e","title":"week 2 january - consistency building, no drama","type":"posts"},{"content":"first week 2024 done.\ncrushed it.\nmomentum back.\nweek 1 trades (jan 2-5) # tuesday 1/2: 3 trades, 3 wins. +$1,940\nwednesday 1/3: 4 trades, 3 wins. +$1,680\nthursday 1/4: 3 trades, 3 wins. +$2,120\nfriday 1/5: 4 trades, 3 wins. +$1,460\nweek total: +$7,200\naccount status # dec 31 (2023): $366,200\njan 5 (week 1): $373,400\njanuary progress: +$7,200 (+1.97%)\nbest first week since november.\nwin rate recovered # week 1 january: 14 trades, 12 wins (86%)\ndecember average: 58%\ndifference: 28% improvement.\nwhy:\nmental clarity (anniversary processed).\nnormal market conditions (holidays over).\nquality setups (volume back).\nsharp execution (no grief fog).\nstrategy breakdown # mean reversion (10 trades):\n9 wins, 1 loss (90%) net: +$5,480 crushing it momentum (4 trades):\n3 wins, 1 loss (75%) net: +$1,720 back in play added momentum back thursday.\nfelt ready.\nsharp focus.\nworking.\ncomparing to december # december week 1: +$400, 56% win rate, barely functional\njanuary week 1: +$7,200, 86% win rate, sharp execution\n18x better performance.\nnot because strategies changed.\nbecause mental state changed.\ngrief fog lifted = performance returned.\ntherapy friday (1/5) # dr. r: \u0026ldquo;first week trading 2024. how\u0026rsquo;d it go?\u0026rdquo;\nme: \u0026ldquo;+$7,200. 86% win rate. felt normal.\u0026rdquo;\ndr. r: \u0026ldquo;normal how?\u0026rdquo;\nme: \u0026ldquo;sharp focus. no fog. no memories hitting mid-trade. just\u0026hellip; trading.\u0026rdquo;\ndr. r: \u0026ldquo;the anniversary processing worked.\u0026rdquo;\nme: \u0026ldquo;yeah. grief is still there. but it\u0026rsquo;s background now. not foreground.\u0026rdquo;\ndr. r: \u0026ldquo;that\u0026rsquo;s integration. what we worked toward all december.\u0026rdquo;\nme: \u0026ldquo;so it doesn\u0026rsquo;t get easier. just\u0026hellip; different?\u0026rdquo;\ndr. r: \u0026ldquo;exactly. you\u0026rsquo;ll have hard days. but not hard months.\u0026rdquo;\nmakes sense.\nliving with A. - restaurant experiment # wednesday night:\nA.: \u0026ldquo;you promised to try new restaurants.\u0026rdquo;\nme: \u0026ldquo;i said i\u0026rsquo;d consider it.\u0026rdquo;\nA.: \u0026ldquo;close enough. we\u0026rsquo;re going to that sushi place tomorrow.\u0026rdquo;\nme: \u0026ldquo;i don\u0026rsquo;t like sushi.\u0026rdquo;\nA.: \u0026ldquo;you\u0026rsquo;ve never tried sushi.\u0026rdquo;\nme: \u0026ldquo;exactly. haven\u0026rsquo;t tried it, as a result don\u0026rsquo;t like it.\u0026rdquo;\nA.: \u0026ldquo;that\u0026rsquo;s not how logic works.\u0026rdquo;\nthursday night - sushi place:\nverdict: actually good.\nstill prefer my regular 4 places.\nbut will go back if she wants.\ncompromise.\nthe places list (fresh year addition) # friday night.\ngood trading week.\nA. in good mood.\nme: \u0026ldquo;list?\u0026rdquo;\nA.: \u0026ldquo;fresh year, fresh place. where?\u0026rdquo;\nme: \u0026ldquo;rooftop. downtown building. city lights. cold january night.\u0026rdquo;\nA.: \u0026ldquo;you love the cold.\u0026rdquo;\nme: \u0026ldquo;grounds me.\u0026rdquo;\nplaces list updated: downtown rooftop, january night, city lights, cold air, fresh year.\njanuary target on track # weekly target: +$1,250/week (for $5k month)\nweek 1 result: +$7,200\nbeat target: 5.76x\nif maintain: +$28k month.\nrealistic expectation: +$8-12k month (this week was standout).\nrisk management # still 0.5% risk per trade.\n3-loss circuit breaker: haven\u0026rsquo;t triggered.\nfilters active:\npassed 8 setups this week.\nestimated saves: ~$1,200.\npatience maintained.\nwhat\u0026rsquo;s working # 1. mental clarity\nanniversary processed = no fog.\n2. routine stability\nwake 4am → trade → breakfast with A. → code → gym → dinner.\nlocked in.\n3. strategy execution\nmean reversion primary.\nmomentum secondary.\nboth working.\n4. A\u0026rsquo;s support\nshe doesn\u0026rsquo;t need explanations.\njust there.\n5. market conditions\nnormal volume.\nclean setups.\nproper price action.\nlooking ahead # week 2 (jan 8-12):\nmaintain consistency.\ndon\u0026rsquo;t get overconfident.\nkeep executing system.\nmonthly goal:\n+$8-12k realistic.\n86% win rate probably won\u0026rsquo;t hold.\n75%+ target.\npsychological focus:\nstay patient.\nno revenge trading.\ncircuit breaker ready if needed.\ntrust process.\ntonight # first week 2024 crushed.\n+$7,200.\n86% win rate.\nthis is what trading looks like without grief fog.\nsharp.\nfocused.\nsystematic.\n2:42am sunday. first week january. +$7,200. 86% win rate. momentum back. mental clarity after anniversary. A. made me try sushi (was okay). crushing targets.\n-AK\n","date":"7 January 2024","externalUrl":null,"permalink":"/posts/2024-01-07-first-week-january-momentum-back/","section":"Posts","summary":"\u003cp\u003efirst week 2024 done.\u003c/p\u003e\n\u003cp\u003ecrushed it.\u003c/p\u003e\n\u003cp\u003emomentum back.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 1 trades (jan 2-5) \n    \u003cdiv id=\"week-1-trades-jan-2-5\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-1-trades-jan-2-5\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003etuesday 1/2:\u003c/strong\u003e 3 trades, 3 wins. +$1,940\u003c/p\u003e","title":"first week january - momentum back, crushing targets","type":"posts"},{"content":"","date":"2 January 2024","externalUrl":null,"permalink":"/tags/fresh-start/","section":"Tags","summary":"","title":"Fresh-Start","type":"tags"},{"content":"","date":"2 January 2024","externalUrl":null,"permalink":"/tags/january/","section":"Tags","summary":"","title":"January","type":"tags"},{"content":"2024 started.\nfresh year.\nback to work.\nnew year\u0026rsquo;s day (jan 1) # market closed.\nspent day with A.\nquiet.\nreset.\nno resolutions.\njust\u0026hellip; ready.\ntuesday jan 2 - first trading day 2024 # morning trades: 3 setups.\nresults:\nSPX put spread (mean reversion): +$820 QQQ iron condor (mean reversion): +$640 TLT call spread (mean reversion): +$480 day total: +$1,940\nall winners.\nfirst day back: exactly what needed.\naccount status # dec 31 (2023 end): $366,200\njan 2 (first trade 2024): $368,140\n2024 start: +$1,940 (+0.53%)\nwhat\u0026rsquo;s different # december: grief fog, barely functional, survival mode.\njanuary: clear head, normal focus, ready to execute.\nanniversary processed.\nnot \u0026ldquo;over\u0026rdquo; grief.\nbut processed the one-year mark.\nmental space freed up.\ntherapy last week (dec 29) # dr. r: \u0026ldquo;you made it through the anniversary. how do you feel?\u0026rdquo;\nme: \u0026ldquo;relieved. exhausted. ready for normal.\u0026rdquo;\ndr. r: \u0026ldquo;what\u0026rsquo;s normal now?\u0026rdquo;\nme: \u0026ldquo;trading without grief fog. living with A. routine without heaviness.\u0026rdquo;\ndr. r: \u0026ldquo;the grief doesn\u0026rsquo;t disappear.\u0026rdquo;\nme: \u0026ldquo;i know. but the anniversary weight is gone. just regular grief now.\u0026rdquo;\ndr. r: \u0026ldquo;which is?\u0026rdquo;\nme: \u0026ldquo;background noise. not foreground paralysis.\u0026rdquo;\nexactly.\nmarket conditions # december: light volume, holiday chop, few quality setups.\njanuary: normal volume returning, clean price action, proper setups.\ndifference is massive.\ntuesday: 3 clean setups, all worked.\ndecember: lucky to find 1-2 setups per week.\nstrategy focus # mean reversion only for now.\nmomentum paused until february.\nreason:\nmean reversion working perfectly.\nwhy fix what\u0026rsquo;s working.\nmomentum requires sharper focus - will add back when ready.\nposition sizing # back to full 0.5% risk per trade.\ndecember: reduced frequency, same risk.\njanuary: normal frequency, same risk.\n3-loss circuit breaker active.\nhaven\u0026rsquo;t needed it since october.\nkeeping it permanent.\nliving with A. - new year # new year\u0026rsquo;s eve (dec 31 night):\nA.: \u0026ldquo;any resolutions?\u0026rdquo;\nme: \u0026ldquo;no. just\u0026hellip; keep doing what\u0026rsquo;s working.\u0026rdquo;\nA.: \u0026ldquo;which is?\u0026rdquo;\nme: \u0026ldquo;trading systematically. living with you. therapy. not spiraling.\u0026rdquo;\nA.: \u0026ldquo;that\u0026rsquo;s a good list.\u0026rdquo;\nme: \u0026ldquo;you?\u0026rdquo;\nA.: \u0026ldquo;same. plus getting you to try more restaurants. you eat the same 4 things.\u0026rdquo;\nme: \u0026ldquo;those 4 things work.\u0026rdquo;\nA.: \u0026ldquo;you\u0026rsquo;re impossible.\u0026rdquo;\nme: \u0026ldquo;you knew this when you moved in.\u0026rdquo;\njanuary goals # trading:\ntarget: +$5-8k per month baseline win rate: 70%+ (realistic given normal conditions) strategy: mean reversion primary, momentum when ready risk: 0.5% per trade, no exceptions psychological:\nmaintain routine (wake 4am, trade, breakfast with A., code) therapy 2x/week (tuesdays/fridays) don\u0026rsquo;t spiral on losing days circuit breaker if needed relationship:\ntry A\u0026rsquo;s restaurant suggestions (apparently important) keep adding to places list (keeps things fun) communicate when grief hits (don\u0026rsquo;t withdraw) system:\ntrust the process no revenge trading filters enforced patience over forcing trades comparing to december # december first week: +$400 (barely functional)\njanuary first day: +$1,940 (sharp focus)\ndifference:\ndecember: trading through grief fog.\njanuary: trading with clear head.\nprocessed anniversary = freed mental bandwidth.\ntonight # first trading day 2024 done.\n+$1,940.\nall winners.\nfelt normal.\nnot struggling.\nnot forcing.\njust\u0026hellip; trading system.\nthis is what works.\n3:15am wednesday. first trading day 2024. +$1,940. all winners. mental fog gone after processing anniversary. ready for normal year. A. wants me to try new restaurants apparently.\n-AK\n","date":"2 January 2024","externalUrl":null,"permalink":"/posts/2024-01-02-new-year-fresh-start-back-to-work/","section":"Posts","summary":"\u003cp\u003e2024 started.\u003c/p\u003e\n\u003cp\u003efresh year.\u003c/p\u003e\n\u003cp\u003eback to work.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003enew year\u0026rsquo;s day (jan 1) \n    \u003cdiv id=\"new-years-day-jan-1\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#new-years-day-jan-1\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003emarket closed.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003espent day with A.\u003c/strong\u003e\u003c/p\u003e","title":"new year - fresh start, back to work","type":"posts"},{"content":"december done.\none year since parents died.\nsurvived.\ndecember trading summary # weeks 1-3 (dec 1-23): light trading, barely functional\nchristmas week (dec 24-28): off\nanniversary week (dec 29-31): off\ntotal december trades: 31\ndecember wins: 18\ndecember losses: 13\nwin rate: 58%\naccount final numbers # starting (dec 1): $362,560\nending (dec 31): $366,200\ndecember gain: +$3,640 (+1.00%)\n2023 final balance: $366,200\nFigure 1: December survival mode. Minimal trading first 3 weeks, completely off Dec 24-31 for Christmas and anniversary. Account maintained through grief season. Shaded region shows no trading period.\ncomparing november recovery to december survival # november (recovery month):\n67 trades, 84% win rate +$23,480 (+6.92%) stable routine, focused execution climbing back to sept peak december (survival month):\n31 trades, 58% win rate +$3,640 (+1.00%) grief fog, holiday conditions just maintaining through pain Figure 2: Recovery vs Survival. November showed climbing performance post-recovery. December showed grief\u0026rsquo;s impact - win rate dropped 26%, profit dropped 85%, but system held. Survival = success.\nchristmas with A\u0026rsquo;s parents # christmas eve (dec 24):\nA. invited me to her parents\u0026rsquo; house.\nfirst time meeting them.\nnervous AF.\nher parents: warm, welcoming, didn\u0026rsquo;t mention my parents dying until i brought it up.\nher dad: software engineer. talked tech all evening. comfortable.\nher mom: made too much food. reminded me of my mom. hit hard but okay.\nA\u0026rsquo;s siblings: two brothers. younger. gave me shit. normal family dynamics.\nstayed overnight christmas eve.\nwoke up christmas morning in A\u0026rsquo;s childhood bedroom.\nweird but grounding.\nchristmas day (dec 25) # morning: presents with A\u0026rsquo;s family. they got me stuff. wasn\u0026rsquo;t expecting it. felt\u0026hellip; included.\nafternoon: big family dinner. 12 people. loud. chaotic. reminded me what i lost but also what i have now.\nevening: drove back to our apartment. exhausted but okay.\nA. (in car): \u0026ldquo;you did good today.\u0026rdquo;\nme: \u0026ldquo;your family is nice. different from mine but nice.\u0026rdquo;\nA.: \u0026ldquo;they liked you. dad said you\u0026rsquo;re \u0026lsquo;appropriately nerdy.\u0026rsquo;\u0026rdquo;\nme: \u0026ldquo;high praise.\u0026rdquo;\nA.: \u0026ldquo;also mom asked if we\u0026rsquo;re getting married.\u0026rdquo;\nme: \u0026ldquo;\u0026hellip;what did you say?\u0026rdquo;\nA.: \u0026ldquo;told her we\u0026rsquo;re taking it one day at a time. she said that\u0026rsquo;s smart.\u0026rdquo;\nnot ready for that conversation.\nbut didn\u0026rsquo;t run from it either.\ngrowth.\ndec 31 - one year anniversary # today.\none year since parents died.\ncar crash.\ndrunk driver.\nnew year\u0026rsquo;s eve.\ntook full day off trading.\njust me and A. at home.\nmorning: stayed in bed late. didn\u0026rsquo;t talk much. A. just held me.\nafternoon: looked through photos. parents alive. normal moments. didn\u0026rsquo;t realize would be last ones.\nA.: \u0026ldquo;tell me about them.\u0026rdquo;\nme: told her everything. dad\u0026rsquo;s terrible jokes. mom\u0026rsquo;s cooking obsession. how they met. how they\u0026rsquo;d fight over stupid shit then laugh 5 minutes later. normal family stuff.\nevening: ordered in. watched movies. just existed together.\nA.: \u0026ldquo;you\u0026rsquo;re doing okay.\u0026rdquo;\nme: \u0026ldquo;doesn\u0026rsquo;t feel okay.\u0026rdquo;\nA.: \u0026ldquo;you\u0026rsquo;re here. you\u0026rsquo;re functional. you didn\u0026rsquo;t spiral. that\u0026rsquo;s okay.\u0026rdquo;\nwhat\u0026rsquo;s different from september # september disaster (A. left for 18 days):\n$28k lost emotional chaos revenge trading couldn\u0026rsquo;t function spiraled completely december (one year anniversary):\n$3,640 gained grief present but managed reduced trading, not revenge trading functioned at slower pace didn\u0026rsquo;t spiral key difference: A. didn\u0026rsquo;t leave.\nstability through grief.\n2023 full year review # starting balance (jan 1): $400,000 (inheritance from parents)\nending balance (dec 31): $366,200\nyear result: -$33,800 (-8.45%)\nbut the real development:\njan-aug: learning, losing slowly sept: disaster month (-$28k) oct: recovery start nov: full recovery (+$23k) dec: survival mode (+$3.6k)\nFigure 3: Complete 2023 trading progress. Started $400k (inheritance), lost through learning, crashed in September disaster, recovered in November, survived December. Ended $366k. Not about profit - about learning to trade through grief.\nwhat 2023 taught me # losing money:\nlost $180k total in 2023 learning what doesn\u0026rsquo;t work.\nexpensive education.\nseptember disaster:\nemotional trading destroys accounts.\nabandonment triggers = $28k lessons.\nnovember recovery:\nsystematic trading works.\nstability enables performance.\nA. moving in = routine = results.\ndecember survival:\ngrief doesn\u0026rsquo;t prevent trading.\nit slows it down.\nthat\u0026rsquo;s okay.\nstrategy evolution # started 2023: no strategy, paper trading concepts\nmid 2023: testing mean reversion and momentum\nsept disaster: emotional override, no system\nnov-dec recovery: mean reversion primary, momentum secondary\nwin rates:\nsept: 12% nov: 84% dec: 58% same strategies. different execution.\nlooking ahead to 2024 # january goals:\nfresh start.\nnormal market conditions (holidays over).\nfull risk (0.5% per trade).\ntarget: +$5-8k month baseline.\nyearly goals:\nconsistency over growth.\nmonthly profit target: +$5k minimum.\navoid september-style disasters.\nwhat i know now:\ngrief and trading coexist.\nstability = prerequisite for performance.\nA. = stability.\nsystem works if i work system.\ntonight (dec 31, 10:30pm) # sitting on couch.\nA. next to me.\none year since parents died.\nsurvived it.\ndidn\u0026rsquo;t spiral.\ndidn\u0026rsquo;t destroy account.\njust\u0026hellip; existed through it.\n2024 starts tomorrow.\nfresh year.\nprocessed grief (mostly).\nstable relationship.\naccount recovered.\nready for different year.\n10:30pm dec 31. one year anniversary. parents died this day last year. survived december on +$3,640. met A\u0026rsquo;s parents christmas. took today off trading, just existed with A. 2023 done: -$33k but learned everything. 2024 tomorrow. ready.\n-AK\n","date":"31 December 2023","externalUrl":null,"permalink":"/posts/2023-12-31-december-wrap-year-end-reflection/","section":"Posts","summary":"\u003cp\u003edecember done.\u003c/p\u003e\n\u003cp\u003eone year since parents died.\u003c/p\u003e\n\u003cp\u003esurvived.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003edecember trading summary \n    \u003cdiv id=\"december-trading-summary\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#december-trading-summary\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eweeks 1-3 (dec 1-23):\u003c/strong\u003e light trading, barely functional\u003c/p\u003e","title":"december wrap - survival mode, one year later","type":"posts"},{"content":"","date":"31 December 2023","externalUrl":null,"permalink":"/tags/yearly-review/","section":"Tags","summary":"","title":"Yearly-Review","type":"tags"},{"content":"christmas eve tomorrow.\nbarely present.\njust surviving.\nchristmas week trading (dec 18-22) # light trading all week.\nresults:\nmon 12/18: 1 trade, +$340 tue 12/19: 2 trades, +$520 wed 12/20: 1 trade, -$280 thu 12/21: 1 trade, +$180 fri 12/22: 0 trades (gave up)\nweek total: +$760\naccount status # dec 15: $364,500\ndec 22: $365,260\ndecember progress: +$2,700 (+0.74%)\nmaintaining through survival mode.\nfriday gave up # tried to trade friday morning.\nsat at desk.\nwatched setup develop.\ncouldn\u0026rsquo;t execute.\nbrain fog too thick.\njust sat there.\nwatching markets move.\nparalyzed.\ngave up 9am.\nshut down monitors.\nwent back to bed.\nA. didn\u0026rsquo;t judge.\nwhat christmas feels like # last year: normal. parents alive. mom cooking all day. dad watching football too loud. wrapping presents. family dinner. regular shit.\nthis year: empty. just me and A. no cooking. no presents. no family. just survival.\nfirst christmas without them.\nhurts different than expected.\nnot sharp pain.\njust\u0026hellip; absence.\neverything feels hollow.\ntherapy tuesday (12/19) # dr. r: \u0026ldquo;christmas is 6 days away. how are you doing?\u0026rdquo;\nme: \u0026ldquo;not well. can\u0026rsquo;t focus. gave up trading twice this week.\u0026rdquo;\ndr. r: \u0026ldquo;gave up how?\u0026rdquo;\nme: \u0026ldquo;just\u0026hellip; stopped. sat at desk. couldn\u0026rsquo;t execute. too much fog.\u0026rdquo;\ndr. r: \u0026ldquo;what\u0026rsquo;s the fog?\u0026rdquo;\nme: \u0026ldquo;memories. last christmas. they were here. now they\u0026rsquo;re not. can\u0026rsquo;t reconcile it.\u0026rdquo;\ndr. r: \u0026ldquo;you\u0026rsquo;re grieving. that\u0026rsquo;s what grief looks like. not always tears. sometimes just fog.\u0026rdquo;\nme: \u0026ldquo;but it\u0026rsquo;s affecting trading. can\u0026rsquo;t function.\u0026rdquo;\ndr. r: \u0026ldquo;you\u0026rsquo;re functioning. you\u0026rsquo;re just functioning at grief pace. that\u0026rsquo;s slower. that\u0026rsquo;s okay.\u0026rdquo;\nme: \u0026ldquo;doesn\u0026rsquo;t feel okay. feels broken.\u0026rdquo;\ndr. r: \u0026ldquo;broken would be spiraling like september. you\u0026rsquo;re not spiraling. you\u0026rsquo;re grieving appropriately.\u0026rdquo;\ndistinction matters.\nseptember: emotional chaos destroying account.\ndecember: grief slowing me down but not destroying me.\ndifferent.\nliving with A. through this # wednesday night (12/20):\nA.: \u0026ldquo;you\u0026rsquo;ve been really quiet.\u0026rdquo;\nme: \u0026ldquo;yeah.\u0026rdquo;\nA.: \u0026ldquo;christmas stuff?\u0026rdquo;\nme: \u0026ldquo;yeah. last year they were here. this year\u0026hellip; absence.\u0026rdquo;\nA.: \u0026ldquo;what do you need?\u0026rdquo;\nme: \u0026ldquo;i don\u0026rsquo;t know. nothing. everything. i don\u0026rsquo;t know.\u0026rdquo;\nA.: moved closer. put arms around me. didn\u0026rsquo;t say anything. just held me.\nstayed like that 20 minutes.\nsometimes that\u0026rsquo;s enough.\nchristmas plans (avoiding) # christmas day plan:\nsleep late.\nchinese food for dinner.\nmovies.\npretend it\u0026rsquo;s not christmas.\nA. agreed.\nno decorations.\nno presents.\nno celebrating.\njust surviving.\nanniversary in 8 days # dec 31: one year since parents died.\nalready planned:\nno trading.\nfull day off.\njust be with A.\nscared of that day.\nalso need it.\n11 months holding together.\ndec 31 = permission to fall apart.\ntrading strategy abandoned # gave up on strategy this week.\njust\u0026hellip; existing.\n5 trades total (was averaging 12-15/week november).\nbarely engaged.\nsurvival mode.\nthe places list (needed grounding) # thursday night.\nneeded to feel present.\nneeded to feel anything besides absence.\nme: \u0026ldquo;list?\u0026rdquo;\nA.: \u0026ldquo;you sure? you\u0026rsquo;re not really here.\u0026rdquo;\nme: \u0026ldquo;exactly. need to be here. in body. not just ghost.\u0026rdquo;\nA.: \u0026ldquo;okay. where?\u0026rdquo;\nme: \u0026ldquo;shower. hot water. steam. grounded in physical.\u0026rdquo;\nplaces list updated: shower, december, steam, needed to feel present not absent.\nworked briefly.\ndecember target dead # original target: +$3-5k\ncurrent: +$2,700\nremaining days: 8 (but 2 are off - christmas, new year\u0026rsquo;s eve)\nrealistic remaining: 6 light trading days\nfinal target: +$3k if lucky\ngiven i can barely function, +$2,700 = success.\nwhat i\u0026rsquo;m learning # grief isn\u0026rsquo;t linear.\nsome days functional.\nsome days paralyzed.\ncan\u0026rsquo;t predict which.\nseptember taught me: fighting grief destroys trading.\ndecember teaching me: integrating grief slows trading but doesn\u0026rsquo;t destroy it.\nkey difference:\nseptember: emotional revenge trading.\ndecember: reduced output but systematic when trading.\ntonight # sitting on couch.\nchristmas eve tomorrow.\nA. next to me.\nshe\u0026rsquo;s watching tv.\ni\u0026rsquo;m just\u0026hellip; here.\nnot really present.\njust occupying space.\nshe doesn\u0026rsquo;t need me present.\njust needs me here.\nthat\u0026rsquo;s enough.\n3:45pm saturday. christmas eve tomorrow. barely present all week. gave up trading friday. fog too thick. +$760 week. just surviving. A. holding space. anniversary 8 days away. not celebrating christmas, just existing through it.\n-AK\n","date":"23 December 2023","externalUrl":null,"permalink":"/posts/2023-12-23-christmas-eve-weekend-barely-present/","section":"Posts","summary":"\u003cp\u003echristmas eve tomorrow.\u003c/p\u003e\n\u003cp\u003ebarely present.\u003c/p\u003e\n\u003cp\u003ejust surviving.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003echristmas week trading (dec 18-22) \n    \u003cdiv id=\"christmas-week-trading-dec-18-22\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#christmas-week-trading-dec-18-22\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003elight trading all week.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eresults:\u003c/strong\u003e\u003c/p\u003e","title":"christmas eve weekend - barely present, just surviving","type":"posts"},{"content":"christmas week starting.\ntrading light.\ngrief heavy.\nweek 3 trades (dec 13-15) # wednesday 12/13: 2 trades, 2 wins. +$880\nthursday 12/14: 3 trades, 2 wins. +$420\nfriday 12/15: 2 trades, 1 win. +$180\nweek total (3 days): +$1,480\naccount status # dec 12: $363,020\ndec 15: $364,500\ndecember progress: +$1,940 (+0.53%)\nbest week december so far.\nwhy the improvement # paused momentum trading.\nmean reversion only.\nfewer trades = higher quality.\naccepted lower expectations.\nstopped fighting grief.\nwhen memories come mid-trade:\npause 30 seconds.\nnote the memory.\nfeel it briefly.\nreturn to system.\ndr. r\u0026rsquo;s advice working.\nchristmas planning (or avoiding) # christmas is 9 days away.\nlast year: normal family dinner, parents alive, didn\u0026rsquo;t know it was last one.\nthis year: first without them.\nA. and i decided:\nno big celebration.\nchinese food.\nmovies.\npretend it\u0026rsquo;s just another day.\navoiding vs coping?\ndon\u0026rsquo;t know.\ndon\u0026rsquo;t care.\nsurvival mode.\ntherapy tuesday (12/12) # dr. r: \u0026ldquo;christmas in 13 days. how are you planning it?\u0026rdquo;\nme: \u0026ldquo;not celebrating. chinese food and movies with A.\u0026rdquo;\ndr. r: \u0026ldquo;avoiding or coping?\u0026rdquo;\nme: \u0026ldquo;what\u0026rsquo;s the difference?\u0026rdquo;\ndr. r: \u0026ldquo;avoiding is running from pain. coping is acknowledging pain while moving through it.\u0026rdquo;\nme: \u0026ldquo;then\u0026hellip; both? acknowledging it hurts. choosing not to pretend to celebrate.\u0026rdquo;\ndr. r: \u0026ldquo;that\u0026rsquo;s coping. you\u0026rsquo;re not pretending you\u0026rsquo;re fine. you\u0026rsquo;re making space for grief.\u0026rdquo;\nme: \u0026ldquo;what about trading? still struggling to focus.\u0026rdquo;\ndr. r: \u0026ldquo;you\u0026rsquo;re doing better this week. why?\u0026rdquo;\nme: \u0026ldquo;stopped fighting memories. let them come. then return to trading.\u0026rdquo;\ndr. r: \u0026ldquo;integration. grief and trading coexist. that\u0026rsquo;s the work.\u0026rdquo;\nthe memories # what hits randomly:\ndad watching football, yelling at tv.\nmom in kitchen, christmas music playing.\nwrapping presents together.\nchristmas morning pancakes.\nall normal shit.\nall gone.\nhits hardest when unexpected.\ntuesday during trade setup, memory of dad\u0026rsquo;s laugh.\nstopped trading 5 minutes.\ncried at desk.\nresumed after.\ntrade worked. +$520.\ngrief doesn\u0026rsquo;t prevent function.\nfighting grief does.\nliving with A. during this # monday night (12/11):\nwatching tv.\nchristmas commercial.\nme: started crying.\nA.: muted tv. came over. held me.\ndidn\u0026rsquo;t ask questions.\njust held me.\nafter 10 minutes:\nA.: \u0026ldquo;you okay?\u0026rdquo;\nme: \u0026ldquo;christmas commercial. dad loved christmas. would blast music. annoyed the neighbors.\u0026rdquo;\nA.: \u0026ldquo;sounds like him.\u0026rdquo;\nme: \u0026ldquo;he was loud about everything. embarrassing sometimes. miss it now.\u0026rdquo;\nA.: \u0026ldquo;you\u0026rsquo;re allowed to miss him. especially now.\u0026rdquo;\nthis is why it works.\nshe doesn\u0026rsquo;t try to fix it.\njust holds space.\nanniversary countdown # 15 days until dec 31.\none year since they died.\nalready planned:\nno trading that day.\ntake full day off.\njust grieve with A.\nscared of falling apart.\nalso ready for it.\nbeen holding together 11 months.\nstrategy focus # mean reversion only through end of year.\nreason:\nrequires less sharp focus.\nsetup-driven, not momentum-driven.\nworks in choppy markets.\ndecember mean reversion stats:\n12 trades, 9 wins (75%)\nnet: +$3,420\nworking.\nreduced trading schedule # this week: 3 days traded (wed-fri)\nnext week (christmas):\nmon-wed: light trading\nthu (christmas): off\nfri: maybe 1-2 trades\nweek after (new year):\nmon-wed: light trading\nthu (dec 31 anniversary): OFF\nfri (jan 1): off\nreally 2.5 weeks light trading.\ndecember target dead.\noriginal: +$3-5k\nrealistic now: +$2-3k\ncurrent: +$1,940\nneed $60-1,060 more.\nachievable if maintain this week\u0026rsquo;s pace.\nwin rate recovering slightly # december week 1: 56%\ndecember week 2: 50%\ndecember week 3: 71% (7 trades, 5 wins)\nimprovement from:\npausing momentum fewer trades higher quality setups integrating grief instead of fighting it what\u0026rsquo;s working # 1. accepting lower output\nnot trying to match november pace.\nsurvival mode is okay.\n2. integrating grief\nmemories come. feel them. return to trading.\n3. A\u0026rsquo;s support\nshe holds space without fixing.\n4. therapy guidance\ndr. r\u0026rsquo;s framework helping.\n5. strategy adjustment\nmean reversion only = right move.\nthe places list # thursday night.\nneeded connection after emotional day.\nme: \u0026ldquo;list?\u0026rdquo;\nA.: \u0026ldquo;here? we\u0026rsquo;re home.\u0026rdquo;\nme: \u0026ldquo;bedroom. window open. december cold. stars visible.\u0026rdquo;\nA.: \u0026ldquo;it\u0026rsquo;s 40 degrees outside.\u0026rdquo;\nme: \u0026ldquo;exactly. need to feel something besides grief.\u0026rdquo;\nplaces list updated: bedroom, window open, december night, freezing cold, stars visible.\nworked. grounded in present, not past.\nlooking ahead # next week: christmas (mon-fri, light trading)\nweek after: new year (dec 31 anniversary, no trading)\njanuary: fresh start, normal conditions, processed grief\ntonight: 9 days until christmas. 15 days until anniversary. trading holding together. grief coexisting. A. supporting.\n4:05am saturday. week 3 december. +$1,480. best week this month. pausing momentum working. grief integrating not fighting. christmas 9 days, anniversary 15 days. survival mode engaged. grateful for A.\n-AK\n","date":"16 December 2023","externalUrl":null,"permalink":"/posts/2023-12-16-christmas-week-trading-light-grief-heavy/","section":"Posts","summary":"\u003cp\u003echristmas week starting.\u003c/p\u003e\n\u003cp\u003etrading light.\u003c/p\u003e\n\u003cp\u003egrief heavy.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 3 trades (dec 13-15) \n    \u003cdiv id=\"week-3-trades-dec-13-15\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-3-trades-dec-13-15\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003ewednesday 12/13:\u003c/strong\u003e 2 trades, 2 wins. +$880\u003c/p\u003e","title":"christmas week approaching - trading light, grief heavy","type":"posts"},{"content":"week 2 december done.\nbarely breakeven.\nmental fog increasing.\nweek 2 trades (dec 8-12) # friday 12/8: 2 trades, 1 win. +$280\nmonday 12/11: 3 trades, 2 wins. +$540\ntuesday 12/12: 4 trades, 2 wins. -$760\nweek total: +$60\naccount status # dec 5: $362,960\ndec 12: $363,020\ndecember progress: +$460 (+0.13%)\nin effect flat.\ncomparing to november # november average week: +$5,870\ndecember average week: +$230\n25x slower.\nwhy:\nholiday volume.\nchoppy markets.\nmental focus degrading.\nanniversary 19 days away.\ntuesday\u0026rsquo;s struggle # 4 trades. 2 wins, 2 losses.\nbreakdown:\nSPX iron condor: +$620 QQQ put spread: +$480 TLT momentum: stopped out, -$940 ES futures: stopped out, -$920 net: -$760\nsecond losing day this month.\nboth losses on momentum trades.\nstrategy adjustment # pausing momentum trading through end of year.\nreason:\nmomentum requires sharp focus.\nmental fog from anniversary = slower reaction time.\nchoppy holiday markets = false signals.\n5 momentum trades december:\n1 win, 4 losses net: -$1,480 doesn\u0026rsquo;t work right now.\nfocusing mean reversion only until january.\nmental fog # symptoms:\nzoning out during trading hours.\nmissing entries i would\u0026rsquo;ve taken in november.\nslower decision-making.\nreplaying memories mid-trade.\nexample (monday):\nwatching SPX setup.\nstarted thinking about dad\u0026rsquo;s office.\nmissed entry by 2 minutes.\nsetup worked. would\u0026rsquo;ve been +$800.\ncost of grief: opportunity loss.\ntherapy friday (12/8) # dr. r: \u0026ldquo;how\u0026rsquo;s trading?\u0026rdquo;\nme: \u0026ldquo;struggling. barely breakeven. missing trades because i\u0026rsquo;m in my head.\u0026rdquo;\ndr. r: \u0026ldquo;in your head about what?\u0026rdquo;\nme: \u0026ldquo;last christmas. dad and i watching football. mom cooking. normal shit. didn\u0026rsquo;t know it was last one.\u0026rdquo;\ndr. r: \u0026ldquo;anniversary is 23 days away. grief is accelerating.\u0026rdquo;\nme: \u0026ldquo;it\u0026rsquo;s affecting trading. can\u0026rsquo;t focus. should i stop until january?\u0026rdquo;\ndr. r: \u0026ldquo;what would stopping do?\u0026rdquo;\nme: \u0026ldquo;\u0026hellip;give me permission to fall apart.\u0026rdquo;\ndr. r: \u0026ldquo;you don\u0026rsquo;t need permission. you need to integrate grief with trading, not avoid one for the other.\u0026rdquo;\nme: \u0026ldquo;how?\u0026rdquo;\ndr. r: \u0026ldquo;trade your system. when memories come, note them. don\u0026rsquo;t fight them. then return to system.\u0026rdquo;\neasier said than done.\nchristmas approaching # christmas last year: normal. parents alive. family dinner. didn\u0026rsquo;t know it was last one.\nchristmas this year: with A. first without parents. 13 days away.\ndreading it.\nliving with A. through december # sunday night (12/10):\nA.: \u0026ldquo;you\u0026rsquo;ve been quiet all weekend.\u0026rdquo;\nme: \u0026ldquo;thinking about christmas. last year with parents.\u0026rdquo;\nA.: \u0026ldquo;what do you want to do this year?\u0026rdquo;\nme: \u0026ldquo;i don\u0026rsquo;t know. feels wrong to celebrate.\u0026rdquo;\nA.: \u0026ldquo;then we don\u0026rsquo;t celebrate. we make it whatever you need.\u0026rdquo;\nme: \u0026ldquo;what if i just want to pretend it\u0026rsquo;s not happening?\u0026rdquo;\nA.: \u0026ldquo;then we order chinese food and watch movies.\u0026rdquo;\nme: \u0026ldquo;really?\u0026rdquo;\nA.: \u0026ldquo;really. it\u0026rsquo;s your first christmas without them. there\u0026rsquo;s no right way to do it.\u0026rdquo;\nthis is why it works.\nno pressure to be okay.\nthe places list (needed reset) # saturday night.\nmental fog all day.\nneeded to get out of my head.\nme: \u0026ldquo;want to add to the list?\u0026rdquo;\nA.: \u0026ldquo;where?\u0026rdquo;\nme: \u0026ldquo;parking garage. empty level. late night. city lights.\u0026rdquo;\nA.: \u0026ldquo;you\u0026rsquo;re insane.\u0026rdquo;\nme: \u0026ldquo;need something to feel present. not stuck in memories.\u0026rdquo;\nA.: \u0026ldquo;okay. but we\u0026rsquo;re being quick. it\u0026rsquo;s fucking cold.\u0026rdquo;\nplaces list updated: parking garage top level, december night, city view.\nworked. reset focus.\nwin rate continuing drop # november: 84%\ndecember week 1: 56%\ndecember week 2: 50% (8 trades, 4 wins)\ndecember combined: 53%\nexpected given:\nholiday markets mental fog paused momentum (worst performing) more selective entries maintaining system = what matters.\neven with lower win rate, still breakeven.\nrisk management holding # still 0.5% risk per trade.\n3-loss circuit breaker: not needed yet.\ntuesday: 2 losses, stopped for day.\nfilters working.\npassing 85% of potential setups (was 70% november).\nultra-selective during fog.\ndecember target status # original target: +$3-5k\ncurrent pace: +$460 in 2 weeks = +$920/month\nway below target.\nacceptable given:\ngrief season holiday markets christmas approaching dec 31 off (anniversary) new realistic target: +$1-2k month = success\nwhat i\u0026rsquo;m learning # grief doesn\u0026rsquo;t pause for trading.\ncan\u0026rsquo;t compartmentalize.\nmemories come mid-trade.\noptions:\nfight them (doesn\u0026rsquo;t work, affects focus more) stop trading (avoidance, not solution) integrate them (dr. r\u0026rsquo;s advice, fucking hard) trying option 3.\nnote the memory.\nfeel it briefly.\nreturn to system.\nnot mastered yet.\ntonight # sitting at desk.\nweek 2 barely breakeven.\nchristmas 13 days away.\nanniversary 19 days away.\ngrief building.\ntrading suffering.\nA. holding space.\n3:18am wednesday. week 2 december. +$60. barely breakeven. mental fog increasing as anniversary approaches. pausing momentum trades, focusing mean reversion only. christmas 13 days, anniversary 19 days. grateful A. doesn\u0026rsquo;t need me functional.\n-AK\n","date":"12 December 2023","externalUrl":null,"permalink":"/posts/2023-12-12-week-2-december-barely-breakeven/","section":"Posts","summary":"\u003cp\u003eweek 2 december done.\u003c/p\u003e\n\u003cp\u003ebarely breakeven.\u003c/p\u003e\n\u003cp\u003emental fog increasing.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 2 trades (dec 8-12) \n    \u003cdiv id=\"week-2-trades-dec-8-12\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-2-trades-dec-8-12\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003efriday 12/8:\u003c/strong\u003e 2 trades, 1 win. +$280\u003c/p\u003e","title":"week 2 december - barely breakeven, mental fog increasing","type":"posts"},{"content":"therapy today (thursday 12/7).\nprocessing anniversary dread.\ndr. r asked hard questions.\nthe session # dr. r: \u0026ldquo;dec 31 is 24 days away. how are you feeling?\u0026rdquo;\nme: \u0026ldquo;dreading it. already affecting trading. focus weaker.\u0026rdquo;\ndr. r: \u0026ldquo;affecting how?\u0026rdquo;\nme: \u0026ldquo;zoning out during market hours. thinking about last december. replaying the phone call.\u0026rdquo;\ndr. r: \u0026ldquo;the hospital call. both dead.\u0026rdquo;\nme: \u0026ldquo;yeah. christmas was normal. 6 days later they\u0026rsquo;re gone. car crash. drunk driver new year\u0026rsquo;s eve.\u0026rdquo;\ndr. r: \u0026ldquo;and this year?\u0026rdquo;\nme: \u0026ldquo;this year i\u0026rsquo;m with A. recovered my trading account. living different life. but dec 31 is coming and i can feel it building.\u0026rdquo;\ndr. r: \u0026ldquo;what\u0026rsquo;s building?\u0026rdquo;\nme: \u0026ldquo;\u0026hellip;i don\u0026rsquo;t know. grief. anger. fear it\u0026rsquo;ll break me again.\u0026rdquo;\nthe hard question # dr. r: \u0026ldquo;are you afraid of grieving? or afraid of what happens to your trading if you grieve?\u0026rdquo;\nme: \u0026ldquo;\u0026hellip;fuck.\u0026rdquo;\ndr. r: \u0026ldquo;which one?\u0026rdquo;\nme: \u0026ldquo;both. september i lost $28k because i was emotional mess. november i recovered $23k because i was stable. if dec 31 breaks me, what happens to my account?\u0026rdquo;\ndr. r: \u0026ldquo;so you\u0026rsquo;re holding grief at bay to protect your trading.\u0026rdquo;\nme: \u0026ldquo;i\u0026rsquo;m trading to distract from grief.\u0026rdquo;\ndr. r: \u0026ldquo;that\u0026rsquo;s not sustainable.\u0026rdquo;\nme: \u0026ldquo;i know.\u0026rdquo;\nsilence.\ndr. r: \u0026ldquo;what happens if you let yourself grieve without trading as buffer?\u0026rdquo;\nme: \u0026ldquo;i fall apart. like september but worse.\u0026rdquo;\ndr. r: \u0026ldquo;or you process it. with A. there. and come out other side.\u0026rdquo;\nme: \u0026ldquo;what if i can\u0026rsquo;t trade after? what if grief breaks my edge?\u0026rdquo;\ndr. r: \u0026ldquo;your edge comes from system, not emotion. september you traded emotionally. november you traded systematically. grief doesn\u0026rsquo;t break system. emotional trading does.\u0026rdquo;\nshe\u0026rsquo;s right but fuck it\u0026rsquo;s hard.\nthe september connection # dr. r: \u0026ldquo;september disaster. let\u0026rsquo;s revisit. what actually happened?\u0026rdquo;\nme: \u0026ldquo;A. said she wanted space. triggered abandonment shit. 18 days apart. couldn\u0026rsquo;t focus. revenge traded. lost $28k.\u0026rdquo;\ndr. r: \u0026ldquo;and november recovery?\u0026rdquo;\nme: \u0026ldquo;she came back. we worked through it. she moved in. stable routine. recovered account.\u0026rdquo;\ndr. r: \u0026ldquo;so september disaster wasn\u0026rsquo;t grief about parents. it was abandonment fear about A.\u0026rdquo;\nme: \u0026ldquo;\u0026hellip;wait.\u0026rdquo;\ndr. r: \u0026ldquo;you lost $28k in september not because you were grieving parents. but because you thought you were losing A. and that triggered grief about losing parents.\u0026rdquo;\nme: \u0026ldquo;fuck. you\u0026rsquo;re right.\u0026rdquo;\ndr. r: \u0026ldquo;so dec 31 anniversary. you\u0026rsquo;ll grieve parents. but A. isn\u0026rsquo;t leaving. you have stability september didn\u0026rsquo;t have.\u0026rdquo;\nme: \u0026ldquo;but what if grieving affects trading anyway?\u0026rdquo;\ndr. r: \u0026ldquo;then you don\u0026rsquo;t trade dec 31. you grieve. one day off trading won\u0026rsquo;t destroy recovery.\u0026rdquo;\nthe plan for dec 31 # dr. r\u0026rsquo;s suggestion:\ntake dec 31 completely off.\nno trading.\nno checking markets.\njust grieve with A.\nme: \u0026ldquo;what about dec 24-30? christmas week?\u0026rdquo;\ndr. r: \u0026ldquo;light trading. maintain routine but lower expectations. markets are dead anyway.\u0026rdquo;\nme: \u0026ldquo;and after? january?\u0026rdquo;\ndr. r: \u0026ldquo;fresh start. you\u0026rsquo;ll have processed anniversary. routine returns. normal conditions.\u0026rdquo;\nwhat i\u0026rsquo;m realizing # september disaster = abandonment trigger, not grief\ndecember challenge = actual grief, but with stability\nkey difference:\nseptember: alone, abandoned, no routine, emotional chaos → destroyed account\ndecember: with A., stable routine, processing grief → maintain account through it\nstability = buffer for grief.\nA\u0026rsquo;s perspective # told her after therapy.\nA.: \u0026ldquo;what did dr. r say?\u0026rdquo;\nme: \u0026ldquo;she said september disaster was about you leaving, not parents dying. and december will be hard but different because you\u0026rsquo;re here.\u0026rdquo;\nA.: \u0026ldquo;she\u0026rsquo;s right. you spiraled in september because i left. not because of trading.\u0026rdquo;\nme: \u0026ldquo;i\u0026rsquo;m scared dec 31 will break me the same way.\u0026rdquo;\nA.: \u0026ldquo;it won\u0026rsquo;t. because i\u0026rsquo;m not leaving. and you\u0026rsquo;re taking that day off trading.\u0026rdquo;\nme: \u0026ldquo;what if i\u0026rsquo;m a mess?\u0026rdquo;\nA.: \u0026ldquo;then you\u0026rsquo;re a mess. and i\u0026rsquo;ll be here.\u0026rdquo;\nme: \u0026ldquo;what if i cry all day?\u0026rdquo;\nA.: \u0026ldquo;then cry all day. it\u0026rsquo;s the anniversary of your parents dying. you\u0026rsquo;re allowed to fall apart.\u0026rdquo;\nthe permission to grieve # realizing:\ni\u0026rsquo;ve been holding grief at bay for 11 months.\ntrading through it.\ndistracting with A., with sex, with routine.\ndec 31 = permission to actually grieve.\nno trading.\nno distraction.\njust feeling it.\nterrifying.\nnecessary.\ndr. r\u0026rsquo;s final point # dr. r: \u0026ldquo;you\u0026rsquo;re not the trader who lost $28k in september. you\u0026rsquo;re the trader who recovered $23k in november. grief doesn\u0026rsquo;t erase that growth.\u0026rdquo;\nme: \u0026ldquo;but what if—\u0026rdquo;\ndr. r: \u0026ldquo;no what-ifs. you have system. you have routine. you have A. you have therapy. you have tools september didn\u0026rsquo;t have.\u0026rdquo;\nme: \u0026ldquo;and if i fall apart anyway?\u0026rdquo;\ndr. r: \u0026ldquo;then you fall apart. and rebuild. like you did in november.\u0026rdquo;\ntonight # sitting at desk.\ntrading paused (4pm close).\nrealizing:\nbeen avoiding grief for 11 months.\ndec 31 = it catches up.\nscared.\nalso relieved.\npermission to stop being strong.\npermission to break.\npermission to grieve.\n4:30pm thursday. therapy processing anniversary dread. dr. r connected september disaster to abandonment not grief. december different because A. is here. taking dec 31 off trading to grieve. scared to fall apart. necessary to process. 24 days until anniversary.\n-AK\n","date":"7 December 2023","externalUrl":null,"permalink":"/posts/2023-12-07-therapy-processing-anniversary-dread/","section":"Posts","summary":"\u003cp\u003etherapy today (thursday 12/7).\u003c/p\u003e\n\u003cp\u003eprocessing anniversary dread.\u003c/p\u003e\n\u003cp\u003edr. r asked hard questions.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe session \n    \u003cdiv id=\"the-session\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-session\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003edr. r:\u003c/strong\u003e \u0026ldquo;dec 31 is 24 days away. how are you feeling?\u0026rdquo;\u003c/p\u003e","title":"therapy - processing anniversary dread and trading through grief","type":"posts"},{"content":"first week december done.\nmarkets choppy.\nmental game harder.\nweek 1 trades (dec 1-5) # friday 12/1: 2 trades, 1 win. +$140\nmonday 12/4: 3 trades, 2 wins. +$680\ntuesday 12/5: 4 trades, 2 wins. -$420\nweek total: +$400\naccount status # nov 28: $362,560\ndec 5: $362,960\ndecember progress: +$400 (+0.11%)\nrecovery maintained but barely growing.\ncomparing to november pace # november week 1: +$3,800\ndecember week 1: +$400\ndifference: 9.5x slower\nwhy:\nholiday volume down 40%.\nchoppy price action.\nfewer quality setups.\nmental focus weaker (anniversary approaching).\ntuesday\u0026rsquo;s losing day # 4 trades. 2 wins, 2 losses.\nbreakdown:\nSPX put spread: +$520 TLT call spread: +$380 QQQ momentum: stopped out, -$640 ES futures: stopped out, -$680 net: -$420\nfirst red day since oct 19.\npsychological response to loss # old me (september):\nlosing day → panic → revenge trade → bigger loss → disaster\ncurrent me (december):\nlosing day → pause → review trades → both were valid setups → move on\nno tilt.\nno revenge.\nbut felt it building.\nthat itch to \u0026ldquo;get it back.\u0026rdquo;\ndidn\u0026rsquo;t act on it.\nbut felt it.\ntherapy today (tuesday 12/5) # dr. r: \u0026ldquo;how was trading this week?\u0026rdquo;\nme: \u0026ldquo;first losing day in 6 weeks. handled it fine. no revenge trading.\u0026rdquo;\ndr. r: \u0026ldquo;but?\u0026rdquo;\nme: \u0026ldquo;but i felt the urge. that itch to get it back. didn\u0026rsquo;t act on it but it was there.\u0026rdquo;\ndr. r: \u0026ldquo;that\u0026rsquo;s normal. the urge doesn\u0026rsquo;t go away. you just don\u0026rsquo;t act on it.\u0026rdquo;\nme: \u0026ldquo;feels like i\u0026rsquo;m always one bad moment from spiraling.\u0026rdquo;\ndr. r: \u0026ldquo;because you remember september. $28k in 2 weeks.\u0026rdquo;\nme: \u0026ldquo;exactly. i know what i\u0026rsquo;m capable of destroying.\u0026rdquo;\ndr. r: \u0026ldquo;you also know what you\u0026rsquo;re capable of recovering. $23k in november.\u0026rdquo;\nme: \u0026ldquo;november i was climbing back. december i\u0026rsquo;m just\u0026hellip; maintaining.\u0026rdquo;\ndr. r: \u0026ldquo;maintaining is success. especially in december with anniversary approaching.\u0026rdquo;\nshe\u0026rsquo;s not wrong.\nthe anniversary weight (3 weeks out) # dec 31 coming.\none year since parents died.\nalready affecting focus.\nrandom moments zoning out during trading.\nthinking about last december.\nreplaying the phone call (hospital, car crash, both dead).\nmemories intrusive.\nnot every day.\nbut enough.\nliving with A. through this # monday night after trading:\nA.: \u0026ldquo;you\u0026rsquo;re quiet again.\u0026rdquo;\nme: \u0026ldquo;thinking about last december. christmas with parents. didn\u0026rsquo;t know it was last one.\u0026rdquo;\nA.: \u0026ldquo;what do you want to do for christmas this year?\u0026rdquo;\nme: \u0026ldquo;\u0026hellip;i don\u0026rsquo;t know. last year felt normal. this year feels empty.\u0026rdquo;\nA.: \u0026ldquo;we can make it whatever you need. quiet. busy. distracted. whatever.\u0026rdquo;\nme: \u0026ldquo;i just don\u0026rsquo;t want to be alone on dec 31.\u0026rdquo;\nA.: \u0026ldquo;you won\u0026rsquo;t be. i\u0026rsquo;ll be here.\u0026rdquo;\nme: \u0026ldquo;even if i\u0026rsquo;m a mess?\u0026rdquo;\nA.: \u0026ldquo;especially if you\u0026rsquo;re a mess.\u0026rdquo;\nholiday trading conditions # volume down 35-40% from november.\nprice action choppy.\nfewer clean setups.\npassing 80% of potential trades (was 70% in november).\nmore selective = fewer opportunities.\nstrategy adjustments # mean reversion:\nstill working but requires more patience.\n3 trades this week, 2 wins.\nmomentum:\nstruggling in choppy conditions.\n4 trades this week, 1 win.\nmight pause momentum strategies until january.\nfocus on mean reversion only through holidays.\nrisk management holding # still at 0.5% risk per trade.\n3-loss circuit breaker: haven\u0026rsquo;t needed it.\ntuesday losing day: 2 losses, stopped for day. didn\u0026rsquo;t reach 3.\nfilters working.\ndecember target adjustment # original target: +$3-5k month\ncurrent pace: +$400/week = $1,600 month\nbelow target but acceptable given conditions:\nholiday season anniversary grief choppy markets reduced trading (dec 31 off, light dec 24-jan 2) new expectation: +$2-3k month = success\nwin rate dropping # november: 84%\ndecember week 1: 56% (9 trades, 5 wins)\nexpected.\nholiday conditions = lower edge.\nfewer clean setups = more coin flips.\nmaintaining system discipline = what matters.\nwhat i\u0026rsquo;m learning # maintaining is harder than recovering.\nnovember: clear goal (get back to $362k).\ndecember: vague goal (don\u0026rsquo;t lose it).\nclarity = motivation.\npreservation = anxiety.\nthe places list (needed connection) # sunday night.\nemotional after thinking about parents all weekend.\nme: \u0026ldquo;need to add to the list.\u0026rdquo;\nA.: \u0026ldquo;where?\u0026rdquo;\nme: \u0026ldquo;her place. empty apartment. windows overlooking city.\u0026rdquo;\nA.: \u0026ldquo;my old apartment?\u0026rdquo;\nme: \u0026ldquo;still have keys for 2 more weeks. one last time there.\u0026rdquo;\nA.: \u0026ldquo;you\u0026rsquo;re crazy.\u0026rdquo;\nme: \u0026ldquo;need the distraction.\u0026rdquo;\nplaces list updated: A\u0026rsquo;s old empty apartment, city view, december night.\nhelped reset mentally.\nlooking ahead # week 2 december: maintain consistency, reduce expectations\nchristmas (dec 25): first without parents, will be hard\ndec 31 (anniversary): no trading, just grieving with A.\njanuary: fresh start, normal conditions return\n2:55am wednesday. first week december. +$400. markets choppy, mental game harder. first losing day in 6 weeks (handled it). anniversary 3 weeks away. maintaining harder than recovering. grateful for A. through grief season.\n-AK\n","date":"5 December 2023","externalUrl":null,"permalink":"/posts/2023-12-05-first-week-december-choppy-markets/","section":"Posts","summary":"\u003cp\u003efirst week december done.\u003c/p\u003e\n\u003cp\u003emarkets choppy.\u003c/p\u003e\n\u003cp\u003emental game harder.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 1 trades (dec 1-5) \n    \u003cdiv id=\"week-1-trades-dec-1-5\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-1-trades-dec-1-5\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003efriday 12/1:\u003c/strong\u003e 2 trades, 1 win. +$140\u003c/p\u003e","title":"first week december - choppy markets, mental game harder","type":"posts"},{"content":"","date":"2 December 2023","externalUrl":null,"permalink":"/tags/december/","section":"Tags","summary":"","title":"December","type":"tags"},{"content":"december started.\nrecovered account.\nnow maintaining through holidays.\nfriday 12/1 trades # morning: 2 setups.\nresults:\nSPX iron condor: +$620 QQQ put spread: stopped out, -$480 day total: +$140\nfirst losing trade in 8 days.\nneeded the reminder losses happen.\naccount status # nov 28: $362,560\ndec 1: $362,700\ndecember: +$140 (+0.04%)\nrecovery maintained.\npsychological shift # november goal: recover account\ndecember goal: don\u0026rsquo;t fuck it up\ndifferent mindset.\nnovember: climbing back.\ndecember: protecting what\u0026rsquo;s recovered.\nmore defensive.\ntherapy yesterday (friday 12/1) # dr. r: \u0026ldquo;you recovered your account. now what?\u0026rdquo;\nme: \u0026ldquo;maintain it. don\u0026rsquo;t lose it again.\u0026rdquo;\ndr. r: \u0026ldquo;that\u0026rsquo;s fear talking.\u0026rdquo;\nme: \u0026ldquo;no. that\u0026rsquo;s reality. i lost $28k in 2 weeks in september. can happen again.\u0026rdquo;\ndr. r: \u0026ldquo;so you\u0026rsquo;re trading scared?\u0026rdquo;\nme: \u0026ldquo;i\u0026rsquo;m trading careful. there\u0026rsquo;s a difference.\u0026rdquo;\ndr. r: \u0026ldquo;is there? or are you so afraid of another disaster you\u0026rsquo;re not taking proper trades?\u0026rdquo;\nme: \u0026ldquo;\u0026hellip;i don\u0026rsquo;t know.\u0026rdquo;\ndr. r: \u0026ldquo;december is light volume. holidays. anniversary coming. lot of pressure.\u0026rdquo;\nme: \u0026ldquo;anniversary is dec 31. 4 weeks away. already dreading it.\u0026rdquo;\ndr. r: \u0026ldquo;one year since they died.\u0026rdquo;\nme: \u0026ldquo;yeah.\u0026rdquo;\ndr. r: \u0026ldquo;how\u0026rsquo;s your focus?\u0026rdquo;\nme: \u0026ldquo;fine. until i think about it. then not fine.\u0026rdquo;\nshe\u0026rsquo;s right.\nthe anniversary weight # parents died: dec 31, 2022 (new year\u0026rsquo;s eve)\ncoming up: dec 31, 2023 (4 weeks away)\nalready feeling it.\nrandom moments crying.\nharder to focus.\nmemories hitting randomly.\nlast december: parents alive. normal christmas. didn\u0026rsquo;t know it was last one.\nthis december: alone with A. first christmas without them. dreading new year\u0026rsquo;s eve.\nliving with A. during grief season # wednesday night (11/29):\nwatching tv.\nchristmas commercial.\nhit me.\nA.: \u0026ldquo;you okay?\u0026rdquo;\nme: \u0026ldquo;anniversary coming up. dec 31. one year.\u0026rdquo;\nA.: \u0026ldquo;i know. i\u0026rsquo;ve been watching you. you\u0026rsquo;re quieter.\u0026rdquo;\nme: \u0026ldquo;christmas last year was normal. they died 6 days later. car crash new year\u0026rsquo;s eve.\u0026rdquo;\nA.: \u0026ldquo;i\u0026rsquo;ll be here. whatever you need.\u0026rdquo;\nme: \u0026ldquo;what if i\u0026rsquo;m not okay? what if i can\u0026rsquo;t trade? what if i shut down?\u0026rdquo;\nA.: \u0026ldquo;then you shut down. and i\u0026rsquo;ll be here when you\u0026rsquo;re ready.\u0026rdquo;\nthis is why it works.\nshe doesn\u0026rsquo;t need me functional.\ndecember trading plan # realistic expectations:\nholiday season = light volume fewer quality setups choppy price action dec 24-jan 2 at its core dead strategy:\nmaintain 0.5% risk per trade expect lower win rate (holiday conditions) more selective entries dec 31 = no trading (anniversary) target: +$3-5k month (conservative)\ngoal: preserve capital, maintain consistency\ncomparing to last year # december 2022:\nparents alive paper trading still no real money yet normal christmas dec 31: they died (car crash) inheritance came january december 2023:\nparents dead one year real money trading recovered from $28k disaster living with A. dreading dec 31 anniversary stable but grieving same month. completely different reality.\nthe pressure to perform # november: recovered $23k.\nexpectation: keep crushing it.\nreality: holiday season is harder.\ninternal conflict:\npart of me: maintain recovery, protect capital.\npart of me: prove november wasn\u0026rsquo;t luck, keep growing.\ndr. r\u0026rsquo;s warning: \u0026ldquo;don\u0026rsquo;t trade to prove something. trade your system.\u0026rdquo;\nrisk management focus # maintaining 0.5% risk.\n3-loss circuit breaker active.\nfilters enforced:\nlow volume days = pass choppy action = pass holiday schedules = reduced trading priority: preservation over growth.\ntonight # sitting at desk.\naccount recovered.\nanniversary approaching.\nchristmas season starting.\nfirst december without parents.\nA. asleep in bedroom.\ngrateful she\u0026rsquo;s here.\ndreading what\u0026rsquo;s coming.\n3:42am saturday. december started. account maintained at $362k. first losing trade in 8 days. anniversary 4 weeks away. focus shifting from growing to maintaining. christmas without parents approaching. grateful for A. dreading dec 31.\n-AK\n","date":"2 December 2023","externalUrl":null,"permalink":"/posts/2023-12-02-december-start-maintaining-not-growing/","section":"Posts","summary":"\u003cp\u003edecember started.\u003c/p\u003e\n\u003cp\u003erecovered account.\u003c/p\u003e\n\u003cp\u003enow maintaining through holidays.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003efriday 12/1 trades \n    \u003cdiv id=\"friday-121-trades\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#friday-121-trades\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003emorning:\u003c/strong\u003e 2 setups.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eresults:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eSPX iron condor: +$620\u003c/li\u003e\n\u003cli\u003eQQQ put spread: stopped out, -$480\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003eday total:\u003c/strong\u003e +$140\u003c/p\u003e","title":"december start - focus on maintaining not growing","type":"posts"},{"content":"november done.\nfull recovery achieved.\nback to sept peak.\nfinal week november (nov 27-28) # monday 11/27: 3 trades, 3 wins. +$1,420\ntuesday 11/28: 3 trades, 2 wins. +$980\nweek 4 total (2 days): +$2,400\nnovember final numbers # starting balance (nov 1): $339,080\nending balance (nov 28): $362,560\nnovember gain: +$23,480 (+6.92%)\nseptember peak: $362,120\nexceeded sept peak by: +$440\nfull recovery achieved.\nFigure 1: November recovery from $339k to $362k. Recovered from Oct bottom ($334,780) and exceeded Sept peak ($362,120). 6-week systematic recovery at 84% win rate.\nmonthly breakdown # week 1 (nov 2-7): +$3,800\nweek 2 (nov 8-14): +$4,150\nweek 3 (nov 15-21): +$8,180\nweek 4 (nov 22-28): +$7,350 (short week thanksgiving)\ntotal: +$23,480\noriginal target: +$5,000\nbeat target by: 4.7x\nFigure 2: Weekly profit breakdown for November. Week 3 highest at $8,180 after ramping to full 0.5% risk. All weeks beat pro-rated target ($1,250/week). Consistency across all four weeks.\nwin rate november # total trades: 67\nwins: 56\nlosses: 11\nwin rate: 84%\nprofit factor: 3.6\naverage R-multiple: 2.4\nbest month since starting real money trading.\nstrategy performance # mean reversion:\n41 trades, 36 wins (88%) net: +$16,840 primary edge momentum:\n26 trades, 20 wins (77%) net: +$6,640 secondary edge Figure 3: Strategy performance breakdown. Mean reversion dominated with 88% win rate and $16,840 profit (72% of total). Momentum secondary at 77% win rate. Both strategies profitable, proper allocation.\ncomparing disaster to recovery # sept 24 - oct 10 (disaster period):\n-$28,000 in 2 weeks 12% win rate emotional chaos oversized positions ignored stops revenge trading oct 19 - nov 28 (recovery period):\n+$28,700 in 6 weeks 84% win rate stable routine proper position sizing stops enforced systematic execution exact same strategies.\ndifference: mental stability.\nwhat changed # environment:\ndisaster: alone, chaotic, no sleep, no routine\nrecovery: living with A., stable schedule, consistent sleep\nexecution:\ndisaster: emotional sizing, ignored rules, revenge trading\nrecovery: systematic sizing, followed rules, no revenge\nmindset:\ndisaster: desperate to recover, each loss = panic\nrecovery: patient process, each loss = data point\nthe living together factor # moved in: nov 1 (beginning of recovery month)\ncorrelation: undeniable\nwhy it works:\nwake up same time daily (4am) breakfast together after trading (10am) separate workspaces (no interference) dinner together (7pm) routine locked in emotional support when needed she doesn\u0026rsquo;t need me to be perfect first time stability = performance.\nposition sizing progression # nov 1-15: 0.25% risk per trade (conservative recovery)\nnov 16-30: 0.5% risk per trade (full size)\nresult: consistency maintained at both levels\ndecember plan: stay at 0.5% risk baseline\nfilters saved me # blocked trades november: 47\nestimated saves: ~$8,000\npassing 70% of potential setups.\nonly taking A+ entries.\npatience = preservation.\ntherapy insight # dr. r (last week): \u0026ldquo;you\u0026rsquo;ve recovered your account. how do you feel?\u0026rdquo;\nme: \u0026ldquo;relieved. but also scared.\u0026rdquo;\ndr. r: \u0026ldquo;scared of what?\u0026rdquo;\nme: \u0026ldquo;fucking it up again. september disaster was brutal.\u0026rdquo;\ndr. r: \u0026ldquo;what\u0026rsquo;s different now?\u0026rdquo;\nme: \u0026ldquo;everything. routine. A. living with me. not alone anymore.\u0026rdquo;\ndr. r: \u0026ldquo;and if you have a losing month?\u0026rdquo;\nme: \u0026ldquo;\u0026hellip;i don\u0026rsquo;t know.\u0026rdquo;\ndr. r: \u0026ldquo;that\u0026rsquo;s the work. trusting the system when it\u0026rsquo;s not working. staying stable through volatility.\u0026rdquo;\nshe\u0026rsquo;s right.\nrecovered account = phase 1.\nmaintaining through drawdowns = phase 2.\ndecember challenges ahead # holiday season:\nlight volume (dec 24-jan 2 really dead)\nchoppy markets\nfewer quality setups\nparents\u0026rsquo; death anniversary:\ndec 31 = 1 year since they died\nalready feeling it build\ngoing to be emotional\npsychological risk:\noverconfidence from recovery\ntaking bigger risks\nloosening discipline\ndecember plan # trading:\nmaintain 0.5% risk per trade\nexpect lower win rate (market conditions)\nreduce trading last 2 weeks december (holidays)\ntarget: +$5k month (conservative given conditions)\npsychological:\n3-loss circuit breaker active\nno revenge trading\nmaintain routine\nanniversary:\ndec 31 = no trading that day\ntake time to grieve\nA. will be there\nreflection on november # started month: living alone, account down $23k, desperate to recover\nended month: living with A., account recovered, stable routine\nkey insight: stability enables performance\nwhat worked:\nmoving in together = routine 0.25% risk ramp = confidence building filters = preservation therapy = processing grief A. = emotional support what didn\u0026rsquo;t work:\nnothing. everything worked.\nfirst month where every piece aligned.\nlooking ahead # december: lower expectations, holiday season, anniversary approaching\njanuary: fresh start, new year, consistent baseline\nlong-term: avoid september disasters, monthly consistency\ntonight # sitting at desk.\naccount at $362,560.\nrecovered from $334,780 bottom.\n+$28,000 recovery in 6 weeks.\nA. asleep in bedroom.\napartment quiet.\nfirst time since parents died that everything feels\u0026hellip; stable.\n3:20am wednesday. november done. +$23,480 (+6.92%). full recovery achieved. 84% win rate. beat target by 4.7x. first month everything aligned. december starting. holiday season ahead. anniversary approaching. maintaining stability = new challenge.\n-AK\n","date":"28 November 2023","externalUrl":null,"permalink":"/posts/2023-11-28-november-wrap-full-recovery-achieved/","section":"Posts","summary":"\u003cp\u003enovember done.\u003c/p\u003e\n\u003cp\u003efull recovery achieved.\u003c/p\u003e\n\u003cp\u003eback to sept peak.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003efinal week november (nov 27-28) \n    \u003cdiv id=\"final-week-november-nov-27-28\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#final-week-november-nov-27-28\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003emonday 11/27:\u003c/strong\u003e 3 trades, 3 wins. +$1,420\u003c/p\u003e","title":"november wrap - full recovery achieved, now what","type":"posts"},{"content":"thanksgiving done.\nfirst holiday with A.\nfirst holiday without parents.\ndifferent.\nwednesday 11/22 - half day trading # morning trades: 2 setups before early close.\nSPX put spread: +$420 QQQ iron condor: +$380 day total: +$800\nmarket closed 1pm ET.\nthanksgiving day (thursday 11/23) # market closed.\nA. cooking all morning.\nnever seen her this focused.\nturkey, stuffing, mashed potatoes, green beans, rolls, pie.\neverything from scratch.\nthe meal # 2pm: sat down to eat.\njust us two.\nA.: \u0026ldquo;first thanksgiving together.\u0026rdquo;\nme: \u0026ldquo;first thanksgiving without my parents.\u0026rdquo;\nA.: \u0026ldquo;i know. you okay?\u0026rdquo;\nme: \u0026ldquo;yeah. just\u0026hellip; different.\u0026rdquo;\nfood was incredible.\nshe actually knows how to cook when she tries.\nafter dinner # sitting on couch.\nfull from food.\nA.: \u0026ldquo;you\u0026rsquo;ve been quiet all day.\u0026rdquo;\nme: \u0026ldquo;thinking about last thanksgiving. parents were alive. had no idea it was our last one together.\u0026rdquo;\nA.: \u0026ldquo;what was it like?\u0026rdquo;\nme: \u0026ldquo;loud. mom cooked everything. dad told terrible jokes. i ate too much pie. normal family shit.\u0026rdquo;\nA.: \u0026ldquo;sounds nice.\u0026rdquo;\nme: \u0026ldquo;it was. didn\u0026rsquo;t appreciate it then. just seemed like another thursday.\u0026rdquo;\nsilence.\nA.: \u0026ldquo;we can make new traditions. doesn\u0026rsquo;t replace what you lost. just\u0026hellip; different.\u0026rdquo;\nme: \u0026ldquo;like what?\u0026rdquo;\nA.: \u0026ldquo;i don\u0026rsquo;t know. we figure it out. together.\u0026rdquo;\nme: \u0026ldquo;this is the first holiday that felt okay since they died.\u0026rdquo;\nA.: \u0026ldquo;yeah?\u0026rdquo;\nme: \u0026ldquo;yeah. still sad. but not alone.\u0026rdquo;\nthe crying # 8pm: watching tv.\nholiday commercial with family.\nhit me.\nstarted crying.\nA.: didn\u0026rsquo;t say anything. just moved closer. held me.\nme (after 10 minutes): \u0026ldquo;this is the part where most people run.\u0026rdquo;\nA.: \u0026ldquo;i\u0026rsquo;m not most people.\u0026rdquo;\nme: \u0026ldquo;mom would\u0026rsquo;ve liked you. would\u0026rsquo;ve taught you her recipes.\u0026rdquo;\nA.: \u0026ldquo;i would\u0026rsquo;ve liked to meet her.\u0026rdquo;\nme: \u0026ldquo;dad would\u0026rsquo;ve talked your ear off about coding. you two would\u0026rsquo;ve nerded out for hours.\u0026rdquo;\nA.: \u0026ldquo;sounds like my kind of thanksgiving.\u0026rdquo;\nme: \u0026ldquo;anniversary coming up. dec 31. almost a year.\u0026rdquo;\nA.: \u0026ldquo;i know. i\u0026rsquo;ll be here.\u0026rdquo;\nme: \u0026ldquo;it\u0026rsquo;s going to be bad. i can already feel it building.\u0026rdquo;\nA.: \u0026ldquo;we\u0026rsquo;ll handle it. together.\u0026rdquo;\nwhat i\u0026rsquo;m learning # grief doesn\u0026rsquo;t disappear on holidays.\nit gets louder.\nbut having someone there changes how it feels.\nlast thanksgiving: parents alive, took it for granted, normal day.\nthis thanksgiving: parents dead, with A., new normal.\nboth things true:\nsad about what i lost.\ngrateful for what i have now.\nher perspective # A. (later that night): \u0026ldquo;you did good today.\u0026rdquo;\nme: \u0026ldquo;i cried.\u0026rdquo;\nA.: \u0026ldquo;yeah. but you didn\u0026rsquo;t shut down. you talked about them. that\u0026rsquo;s growth.\u0026rdquo;\nme: \u0026ldquo;dr. r would say the same thing.\u0026rdquo;\nA.: \u0026ldquo;dr. r and i are both smart.\u0026rdquo;\nme: \u0026ldquo;and both hot.\u0026rdquo;\nA.: \u0026ldquo;you\u0026rsquo;re not wrong.\u0026rdquo;\nthe places list # after emotional night, needed connection.\nme: \u0026ldquo;want to add to the list?\u0026rdquo;\nA.: \u0026ldquo;here?\u0026rdquo;\nme: \u0026ldquo;balcony. thanksgiving night. cold but memorable.\u0026rdquo;\nA.: \u0026ldquo;you\u0026rsquo;re crazy.\u0026rdquo;\nme: \u0026ldquo;you love it.\u0026rdquo;\nA.: \u0026ldquo;i really do.\u0026rdquo;\nplaces list updated: apartment balcony at night, thanksgiving 2023.\ncold AF but worth it.\nfriday 11/24 - light trading # market: short session (closes 1pm ET).\ntrades: 1 setup only.\nSPX calendar spread: +$340\nday total: +$340\nlow volume. everyone still in food coma.\nweekend reflection # thanksgiving week trading:\nmon: +$2,740 tue: +$1,060 wed: +$800 fri: +$340\nweek total: +$4,940\nnovember month-to-date: +$21,070\naccount status # nov 21: $355,210\nnov 24: $360,150\nnovember gain: +$21,070 (+6.22%)\nrecovery status:\nsept peak: $362,120\ncurrent: $360,150\nstill down: -$1,970 (-0.5%)\nholy shit. $2k away from full recovery.\none good day = back to peak.\nwhat this week taught me # you can be sad and grateful simultaneously.\nmissed my parents.\ngrateful for A.\nboth true.\nnew traditions don\u0026rsquo;t replace old ones.\nthey coexist.\ngrief is seasonal.\nholidays amplify it.\nbut having someone who doesn\u0026rsquo;t run makes it survivable.\nlooking ahead # 1 week left november.\n$2k from full recovery.\ndecember starting.\nanniversary of parents\u0026rsquo; death: dec 31 (5 weeks away).\nalready dreading it.\n4:15pm saturday. first thanksgiving with A. first thanksgiving without parents. she cooked, i cried, we talked about them, added balcony to places list. trading light during holiday. $2k from full recovery. december starting. anniversary coming.\n-AK\n","date":"25 November 2023","externalUrl":null,"permalink":"/posts/2023-11-25-thanksgiving-first-holiday-together/","section":"Posts","summary":"\u003cp\u003ethanksgiving done.\u003c/p\u003e\n\u003cp\u003efirst holiday with A.\u003c/p\u003e\n\u003cp\u003efirst holiday without parents.\u003c/p\u003e\n\u003cp\u003edifferent.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ewednesday 11/22 - half day trading \n    \u003cdiv id=\"wednesday-1122---half-day-trading\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#wednesday-1122---half-day-trading\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003emorning trades:\u003c/strong\u003e 2 setups before early close.\u003c/p\u003e","title":"thanksgiving - first holiday together, first holiday without them","type":"posts"},{"content":"","date":"21 November 2023","externalUrl":null,"permalink":"/tags/thanksgiving/","section":"Tags","summary":"","title":"Thanksgiving","type":"tags"},{"content":"thanksgiving week.\nshort schedule.\nstaying disciplined.\nweekend trading (sat-sun off) # no trades.\nreflection: week 3 progress, relationship fight/resolution, risk ramp successful.\nmonday 11/20 trades # morning: 3 trades executed.\nresults:\nSPX iron condor (mean reversion): +$880 QQQ put spread (mean reversion): +$720 ES futures momentum: +$1,140 day total: +$2,740\nall winners. momentum crushed.\ntuesday 11/21 trades (today) # morning: 4 trades.\nresults:\nTLT call spread: +$620 SPX butterfly: +$540 NQ momentum: stopped out, -$480 QQQ calendar spread: +$380 day total: +$1,060\nweek 3 progress (so far) # wed 11/15: +$680 (last day 0.25% risk)\nthu 11/16: +$1,500 (first day 0.5% risk)\nfri 11/17: +$2,200\nmon 11/20: +$2,740\ntue 11/21: +$1,060\nweek total (5 days): +$8,180\naccount status # nov 14 (week 2 end): $347,030\nnov 21 (current): $355,210\nnovember gain: +$16,130 (+4.76%)\nrecovery status # sept peak: $362,120\ncurrent: $355,210\nstill down: -$6,910 (-1.9%)\nholy shit. almost there.\n1 more good week = full recovery.\nthanksgiving schedule # wednesday 11/22: half day trading (market closes early)\nthursday 11/23: market closed (thanksgiving)\nfriday 11/24: market open but short session (1pm ET close)\nplan: trade wed morning normal, off thursday, light trading friday\nwin rate at full risk # week 3 (5 days): 18 trades, 15 wins (83%)\nsince risk ramp (thu-tue): 16 trades, 13 wins (81%)\nmaintained consistency at double position size.\npsychological test passed.\nstrategy breakdown (week 3) # mean reversion (11 trades):\n10 wins, 1 loss (91%) net: +$5,740 dominating momentum (7 trades):\n5 wins, 2 losses (71%) net: +$2,440 selective but solid comparing to disaster period (again) # sept 24 - oct 10 (2 weeks disaster):\n-$28,000 12% win rate emotional chaos oct 19 - nov 21 (5 weeks recovery):\n+$20,310 (from $334,780 to $355,210) 84% win rate stable routine, living with A. lost $28k in 2 weeks. recovered $20k in 5 weeks.\nalmost back.\nnovember targets status # original target: +$5k month\ncurrent progress: +$16,130 (through 3 weeks)\nbeat original target by: 3.2x\n1 week left (short week thanksgiving)\nfinal projection: +$18-20k month\nthe psychology milestone # thursday 11/16: ramped to 0.5% risk (doubled position size)\nsince then (5 days): +$7,060\nlosses taken: -$1,640 total (3 losing trades)\nno tilt. no revenge. no emotional spiral.\nthis is the difference.\nseptember: loss → panic → bigger loss → disaster\nnovember: loss → pause → review → next trade\nstability = controlled response.\nfilters maintaining edge # blocked 9 potential trades mon-tue.\nestimated saves: ~$1,500.\npatience = preservation.\nthanksgiving plans # A. cooking thanksgiving dinner.\nfirst time cooking for me.\nfirst thanksgiving not alone since parents died.\ndifferent.\ngood different.\nwhat\u0026rsquo;s working # 1. routine locked in\nwake 4am → trade → breakfast with A. 10am → code → gym 6pm → dinner 7pm → bed 11pm\nno variance. no chaos.\n2. position sizing consistent\n0.5% risk per trade.\nno exceptions.\nno emotional size changes.\n3. living together stability\nhad first fight friday (coffee mug territorial shit).\nworked through it.\nmade up.\nroutine unaffected.\n4. filters enforced\npassing 70%+ of potential trades.\nonly taking A+ setups.\nquality \u0026gt; quantity.\nlooking ahead # tomorrow (wed 11/22): half day trading, then thanksgiving prep\nthursday 11/23: off, cooking with A.\nfriday 11/24: light trading (short session)\nnext week (nov 27-30): final 4 days november, pushing for full recovery\ntarget: $6,910 more to hit $362,120 (full recovery to sept peak)\nachievable in 1 week at current pace.\nreflection # 3 weeks november.\n+$16,130 (+4.76%).\nwin rate 84%.\n$6,910 from full recovery.\nfirst thanksgiving with A.\nfirst thanksgiving not alone since parents died.\ndifferent year.\n2:47am wednesday. thanksgiving week. +$8,180 week 3. account $355,210. $6,910 from full recovery. half day trading today then off thursday. first thanksgiving with A. since parents died. not alone this year.\n-AK\n","date":"21 November 2023","externalUrl":null,"permalink":"/posts/2023-11-21-thanksgiving-week-setup/","section":"Posts","summary":"\u003cp\u003ethanksgiving week.\u003c/p\u003e\n\u003cp\u003eshort schedule.\u003c/p\u003e\n\u003cp\u003estaying disciplined.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweekend trading (sat-sun off) \n    \u003cdiv id=\"weekend-trading-sat-sun-off\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#weekend-trading-sat-sun-off\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eno trades.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ereflection:\u003c/strong\u003e week 3 progress, relationship fight/resolution, risk ramp successful.\u003c/p\u003e","title":"thanksgiving week - short schedule, staying disciplined","type":"posts"},{"content":"been living together 18 days.\nfirst real fight happened.\nlearning cohabitation isn\u0026rsquo;t autopilot.\nthe fight (friday night) # context: finished trading. account up. good week.\ncame out to living room.\nher stuff everywhere.\nlaptop on couch. charger across floor. coffee mug on my side table. workout clothes on chair. shoes by door (not in closet).\nme (annoyed): \u0026ldquo;can you clean up your stuff?\u0026rdquo;\nA.: \u0026ldquo;i will later. just finished working.\u0026rdquo;\nme: \u0026ldquo;it\u0026rsquo;s been there since this morning.\u0026rdquo;\nA.: \u0026ldquo;so? we live here together. it\u0026rsquo;s not a museum.\u0026rdquo;\nme: \u0026ldquo;but it\u0026rsquo;s everywhere. you said you\u0026rsquo;d clean up by end of day.\u0026rdquo;\nA.: \u0026ldquo;it\u0026rsquo;s 6pm. day\u0026rsquo;s not over.\u0026rdquo;\nme: \u0026ldquo;it\u0026rsquo;s just\u0026hellip; everywhere. all the time.\u0026rdquo;\nA.: \u0026ldquo;you\u0026rsquo;re being obsessive. it\u0026rsquo;s a laptop and a mug.\u0026rdquo;\nme: \u0026ldquo;and clothes. and shoes. and yesterday\u0026rsquo;s dishes still in sink.\u0026rdquo;\nA.: \u0026ldquo;i\u0026rsquo;ll do the dishes after dinner. why does everything need to be perfect all the time?\u0026rdquo;\nme: \u0026ldquo;it\u0026rsquo;s not about perfect. it\u0026rsquo;s about shared space.\u0026rdquo;\nA.: \u0026ldquo;shared means both of us. not just your way.\u0026rdquo;\nwalked away.\nsat at my desk.\npissed.\nprocessing (30 minutes alone) # my thought loop:\nthis is why i don\u0026rsquo;t do relationships can\u0026rsquo;t handle someone else\u0026rsquo;s mess in my space maybe living together was mistake she doesn\u0026rsquo;t respect my need for order probably won\u0026rsquo;t work long-term then:\nwait. she cleans up. just not on my timeline. her mess isn\u0026rsquo;t malicious. just different organization style. i\u0026rsquo;m being controlling. this is small shit. conflict:\npart of me wants to end it over coffee mug placement.\npart of me knows that\u0026rsquo;s avoidant bullshit.\ntherapy voice in my head # dr. r\u0026rsquo;s words from last session:\n\u0026ldquo;you\u0026rsquo;ll want to run when small conflicts happen. that\u0026rsquo;s your pattern. don\u0026rsquo;t. stay. work through it.\u0026rdquo;\nfuck.\nshe\u0026rsquo;s right.\ncoming back (her perspective) # A. (came to my desk 30 min later): \u0026ldquo;you okay?\u0026rdquo;\nme: \u0026ldquo;yeah. just annoyed.\u0026rdquo;\nA.: \u0026ldquo;i get it. i\u0026rsquo;m messy. you\u0026rsquo;re not. we\u0026rsquo;re different.\u0026rdquo;\nme: \u0026ldquo;it\u0026rsquo;s not\u0026hellip; i know i\u0026rsquo;m being controlling.\u0026rdquo;\nA.: \u0026ldquo;little bit. but i also could be better about cleaning up faster.\u0026rdquo;\nme: \u0026ldquo;i don\u0026rsquo;t want to be the guy who freaks out over coffee mugs.\u0026rdquo;\nA.: \u0026ldquo;you\u0026rsquo;re not freaking out. you\u0026rsquo;re communicating. badly. but communicating.\u0026rdquo;\nme: \u0026ldquo;i almost ran.\u0026rdquo;\nA.: \u0026ldquo;i know. i could see it. you get quiet and withdrawn.\u0026rdquo;\nme: \u0026ldquo;old pattern. when things feel out of control, i leave.\u0026rdquo;\nA.: \u0026ldquo;you didn\u0026rsquo;t leave. you stayed. that\u0026rsquo;s growth.\u0026rdquo;\nme: \u0026ldquo;dr. r would say the same thing.\u0026rdquo;\nA.: \u0026ldquo;dr. r is smart. and hot.\u0026rdquo;\nme: \u0026ldquo;why do you always bring that up?\u0026rdquo;\nA.: \u0026ldquo;because it\u0026rsquo;s true and it\u0026rsquo;s funny watching you try not to admit you notice.\u0026rdquo;\ntension broke.\nthe compromise # her: clean up living room/kitchen by 8pm daily.\nme: accept that her desk area (her corner) can be messy as she wants.\nboth: communicate when annoyed BEFORE it builds to fight.\nher: \u0026ldquo;also you need to admit when you\u0026rsquo;re being obsessive.\u0026rdquo;\nme: \u0026ldquo;deal. but you need to admit when you\u0026rsquo;re being lazy.\u0026rdquo;\nA.: \u0026ldquo;i\u0026rsquo;m not lazy. i\u0026rsquo;m creatively chaotic.\u0026rdquo;\nme: \u0026ldquo;that\u0026rsquo;s just rebranded lazy.\u0026rdquo;\nA.: \u0026ldquo;fuck you.\u0026rdquo;\nme: \u0026ldquo;later maybe.\u0026rdquo;\nA.: \u0026ldquo;definitely later.\u0026rdquo;\nwhat i\u0026rsquo;m learning # living together means compromise.\ncan\u0026rsquo;t have everything my way.\nher mess isn\u0026rsquo;t attack on me.\nmy organization isn\u0026rsquo;t attack on her.\nwe\u0026rsquo;re different people sharing space.\nsmall fights ≠ relationship ending.\nold me: coffee mug fight = evidence relationship failing = time to exit.\ncurrent me: coffee mug fight = normal cohabitation friction = work through it.\nstaying is harder than running.\nrunning is reflex.\nstaying requires choice.\nchose to stay.\nlater that night # made up.\nhad fantastic sex.\nbondage, toys, the works.\nbest part: communication during.\ntell each other exactly what we want.\nno shame. total trust.\npost-sex:\nA.: \u0026ldquo;we should fight more often if this is the makeup.\u0026rdquo;\nme: \u0026ldquo;let\u0026rsquo;s just skip to this part next time.\u0026rdquo;\nA.: \u0026ldquo;deal.\u0026rdquo;\ntherapy yesterday (friday before fight) # dr. r: \u0026ldquo;how\u0026rsquo;s cohabitation?\u0026rdquo;\nme: \u0026ldquo;good. few annoyances but managing.\u0026rdquo;\ndr. r: \u0026ldquo;when\u0026rsquo;s the first real fight?\u0026rdquo;\nme: \u0026ldquo;haven\u0026rsquo;t had one yet.\u0026rdquo;\ndr. r: \u0026ldquo;you will. probably soon. little things build up.\u0026rdquo;\nme: \u0026ldquo;what do i do?\u0026rdquo;\ndr. r: \u0026ldquo;stay. don\u0026rsquo;t run. communicate. work through it.\u0026rdquo;\nme: \u0026ldquo;what if i want to run?\u0026rdquo;\ndr. r: \u0026ldquo;you will want to run. that\u0026rsquo;s your avoidant pattern. recognize it. choose different.\u0026rdquo;\nliterally 12 hours later: fight happened.\nstayed.\nworked through it.\ndr. r called it.\nwhat A. said later # A. (in bed after sex): \u0026ldquo;you stayed.\u0026rdquo;\nme: \u0026ldquo;yeah.\u0026rdquo;\nA.: \u0026ldquo;i know that\u0026rsquo;s hard for you. confrontation. messiness. not having control.\u0026rdquo;\nme: \u0026ldquo;everything in me wanted to shut down or leave.\u0026rdquo;\nA.: \u0026ldquo;but you didn\u0026rsquo;t. you came back. you talked.\u0026rdquo;\nme: \u0026ldquo;you make it easier. you don\u0026rsquo;t make fights bigger than they are.\u0026rdquo;\nA.: \u0026ldquo;because they\u0026rsquo;re not. we argued about a coffee mug. that\u0026rsquo;s normal.\u0026rdquo;\nme: \u0026ldquo;nothing in my relationships has been normal.\u0026rdquo;\nA.: \u0026ldquo;maybe that\u0026rsquo;s the point. this is what normal looks like. small fights. compromises. staying.\u0026rdquo;\nreflection # 18 days living together.\nfirst real fight.\nworked through it.\ndidn\u0026rsquo;t run.\nhad great sex after.\nthis is new territory.\nold pattern: conflict → withdraw → create distance → exit.\nnew pattern: conflict → pause → communicate → resolve → reconnect.\ngrowth.\n3:40pm saturday. first real fight living together. fought about mess. wanted to run. stayed instead. talked through it. made up. learning compromise isn\u0026rsquo;t losing control. it\u0026rsquo;s sharing it.\n-AK\n","date":"18 November 2023","externalUrl":null,"permalink":"/posts/2023-11-18-small-fights-learning-to-share-space/","section":"Posts","summary":"\u003cp\u003ebeen living together 18 days.\u003c/p\u003e\n\u003cp\u003efirst real fight happened.\u003c/p\u003e\n\u003cp\u003elearning cohabitation isn\u0026rsquo;t autopilot.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe fight (friday night) \n    \u003cdiv id=\"the-fight-friday-night\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-fight-friday-night\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003econtext:\u003c/strong\u003e finished trading. account up. good week.\u003c/p\u003e","title":"small fights - learning to share space without losing myself","type":"posts"},{"content":"ramped to 0.5% risk thursday.\nfirst 2 days at full size.\npsychology test passed.\nwednesday 11/15 - final day 0.25% risk # trades: 2 setups, both winners\nresult: +$680\nmindset: calm, prepared for ramp tomorrow\nthursday 11/16 - ramp day # position size: doubled to 0.5% risk\ntrades: 3 setups\nSPX call spread (mean reversion): +$1,180 (would\u0026rsquo;ve been $590 at old size) QQQ put spread (mean reversion): +$840 (would\u0026rsquo;ve been $420 at old size) ES momentum: stopped out, -$520 (would\u0026rsquo;ve been -$260 at old size) day total: +$1,500\npsychology: felt losses harder but didn\u0026rsquo;t tilt\nfriday 11/17 - testing discipline # trades: 4 setups\nTLT call spread: +$920 SPX iron condor: +$680 NQ momentum: +$1,240 QQQ butterfly: stopped out, -$640 day total: +$2,200\nkey moment: loss on trade 4 didn\u0026rsquo;t trigger revenge trading\naccount status # nov 14: $347,030\nnov 17: $350,410\nweek 3 progress (wed-fri): +$3,380\nnovember total: +$11,330 (+3.34%)\nrecovery tracking # sept peak: $362,120\ncurrent: $350,410\nstill down: -$11,710 (-3.2%)\nrecovered from bottom: +$15,630 (4.7%)\n2 weeks to full recovery at current pace\nthe psychology shift # what i expected:\nbigger size = more stress = worse decisions\nwhat actually happened:\nbigger size = more focus = better setups\nwhy it works:\nat 0.25% risk, losses felt manageable. almost too easy.\nat 0.5% risk, every trade matters. can\u0026rsquo;t be sloppy.\nforced better discipline.\nloss management test # thursday trade 3: -$520 (full size loss)\nold me (september): revenge trade immediately, double size, chase it back\ncurrent me: stopped trading 10 minutes. walked away. came back calm. took break rest of day.\nfriday trade 4: -$640 (another full size loss)\nreaction: noted it. reviewed setup. wasn\u0026rsquo;t revenge, was valid setup that failed. moved on.\nno tilt.\nno revenge.\nno emotional spiral.\nthis is the test that matters.\nwhat\u0026rsquo;s different now # september disaster:\nloss → panic → bigger size → bigger loss → panic → revenge → disaster emotional cascade couldn\u0026rsquo;t stop $28k gone in 2 weeks now:\nloss → pause → review → move on losses are data, not emotional events circuit breaker exists if needed (haven\u0026rsquo;t needed it) stability = controlled response\nliving together impact # thursday night after trading:\nme: quiet at dinner\nA.: \u0026ldquo;bad day?\u0026rdquo;\nme: \u0026ldquo;no, good day. just processing full size risk again.\u0026rdquo;\nA.: \u0026ldquo;you\u0026rsquo;re overthinking.\u0026rdquo;\nme: \u0026ldquo;probably. made $1,500 today. account almost recovered.\u0026rdquo;\nA.: \u0026ldquo;then why stressed?\u0026rdquo;\nme: \u0026ldquo;because last time i felt confident, i lost $28k in 2 weeks.\u0026rdquo;\nA.: \u0026ldquo;you\u0026rsquo;re not that person anymore. i see how you trade now. it\u0026rsquo;s different.\u0026rdquo;\nshe\u0026rsquo;s right.\ndifferent routine. different mindset. different execution.\nfilters saved me again # blocked 6 potential trades wed-fri.\nestimated saves: ~$1,200.\nwould\u0026rsquo;ve taken all 6 in september.\nwould\u0026rsquo;ve lost on 4 of them.\npatience = performance.\nstrategy performance (full risk) # mean reversion (6 trades):\n5 wins, 1 loss (83%) net: +$2,680 works at full size momentum (3 trades):\n2 wins, 1 loss (67%) net: +$700 more selective at full size week 3 plan # sat-sun: no trading, thanksgiving prep week coming\nmon 11/19: full trading schedule\ntue 11/20: normal day\nwed 11/21: normal day\nthu 11/22: thanksgiving (market closed)\nfri 11/23: early close (1pm ET)\n4.5 day trading week next week\nrisk level decision # staying at 0.5% risk through end of month.\ncriteria met:\nno emotional tilt ✓ losses managed properly ✓ win rate maintaining (82% week 3 so far) ✓ routine stable ✓ december plan: maintain 0.5% risk as baseline\nnovember projection # 2 weeks done: +$7,950\nweek 3 (3 days): +$3,380\nnovember total: +$11,330\n1.5 weeks left (minus thanksgiving)\nprojection: +$15-18k month\noriginal target: +$5k\nwill beat target by 3-4x\nreflection # doubled position size.\nlost $1,160 combined in 2 days.\ndidn\u0026rsquo;t tilt.\ndidn\u0026rsquo;t revenge trade.\nthis is the psychology test.\npassed.\n3:08am saturday. first 2 days full risk. +$3,380. losses managed without tilt. psychology holding. $11.7k from full recovery.\n-AK\n","date":"17 November 2023","externalUrl":null,"permalink":"/posts/2023-11-17-first-day-full-risk-testing-psychology/","section":"Posts","summary":"\u003cp\u003eramped to 0.5% risk thursday.\u003c/p\u003e\n\u003cp\u003efirst 2 days at full size.\u003c/p\u003e\n\u003cp\u003epsychology test passed.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ewednesday 11/15 - final day 0.25% risk \n    \u003cdiv id=\"wednesday-1115---final-day-025-risk\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#wednesday-1115---final-day-025-risk\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003etrades:\u003c/strong\u003e 2 setups, both winners\u003c/p\u003e","title":"first day full risk - testing my psychology","type":"posts"},{"content":"week 2 done.\ncrushed target.\nramping risk tomorrow.\nweek 2 trades (nov 8-14) # wednesday 11/8: 3 trades, 2 wins. +$690\nthursday 11/9: 2 trades, 2 wins. +$1,060\nfriday 11/10: market closed (veterans day)\nmonday 11/13: 4 trades, 3 wins. +$980\ntuesday 11/14: 3 trades, 3 wins. +$1,420\nweek total: +$4,150\naccount progression # nov 7 (week 1 end): $342,880\nnov 14 (week 2 end): $347,030\nnovember gain: +$7,950 (+2.34%)\nrecovery status # sept peak: $362,120\ncurrent: $347,030\nstill down: -$15,090 (-4.2%)\nrecovered from oct bottom: +$12,250 (3.7%)\nat this pace: full recovery in 3 weeks\ntarget performance # original week 2 target: +$2,500\nactual result: +$4,150\nbeat target by: 66%\nweek 1: +$3,800\nweek 2: +$4,150\nnovember total: +$7,950 (target was $5k month)\nalready exceeded monthly target with 2 weeks left.\nwin rate maintaining # week 2: 12 trades, 10 wins (83%)\ncombined weeks 1-2: 26 trades, 22 wins (85%)\nprofit factor: 3.4\naverage R-multiple: 2.3\nconsistency holding.\nstrategy breakdown (week 2) # mean reversion (7 trades):\n6 wins, 1 loss (86%) net: +$2,890 SPX/QQQ options, TLT bonds crushing momentum (5 trades):\n4 wins, 1 loss (80%) net: +$1,260 ES/NQ futures solid what\u0026rsquo;s working # 1. filter discipline\nblocked 11 potential trades this week.\nestimated saves: ~$1,800.\npatience = profit.\n2. proper setup selection\nonly taking A+ setups.\npassing 75% of potential entries.\nquality over quantity.\n3. stable routine\nliving with A. = consistent schedule.\nwake 4am, trade, breakfast together 10am, code all day, dinner 7pm.\nno chaos. just execution.\n4. position sizing\nstill at 0.25% risk through today.\nconservative but proving consistency.\ntomorrow (nov 15): final day at 0.25%.\nthursday (nov 16): ramp to 0.5% risk.\nrisk ramp criteria met # target win rate: \u0026gt;70%\nactual: 85% (beat target)\nno losing streaks: check\nemotional stability: check (living together working)\nroutine solid: check\nall criteria met.\nramping to 0.5% risk thursday.\nnovember targets updated # original target: +$5k month\ncurrent progress: +$7,950 (week 2 of 4)\nnew projection: +$12-15k month if continues\nfull recovery ($362k): possible by december if pace holds\nnext week plan (nov 15-21) # wednesday 11/15: final day 0.25% risk\nthursday 11/16: ramp to 0.5% risk\nthanksgiving week: nov 20-24 (market closed thursday, short friday)\nfocus: maintain consistency at higher risk level\ncomparing to disaster period # sept 24 - oct 10 (disaster):\n-$28,000 in 2 weeks 12% win rate emotional chaos oct 19 - nov 14 (recovery):\n+$12,250 in 4 weeks 85% win rate stable routine difference: mental stability = consistent edge\nwhat changed # mindset:\ndisaster: revenge trading, emotional, desperate\nrecovery: patient, selective, systematic\nexecution:\ndisaster: oversized positions, ignored stops\nrecovery: proper sizing, stops enforced religiously\nenvironment:\ndisaster: alone, chaotic, no sleep\nrecovery: living with A., stable schedule, sleeping normal\nthe 3-loss circuit breaker\nhaven\u0026rsquo;t needed it.\nlongest losing streak: 1 trade.\nknowing it exists prevents behavior that would trigger it.\npermanent rule.\nlooking ahead # tomorrow (wed 11/15): final day 0.25% risk\nthursday (nov 16): double position size to 0.5% risk\npsychological challenge: don\u0026rsquo;t overtrade at new size\nstrategy: same setups, bigger size, same discipline\nreflection # 2 weeks living together.\n2 weeks best trading since early september.\ncorrelation clear.\nroutine + stability = performance.\n2:33am wednesday. week 2 november done. +$4,150. beat target by 66%. 85% win rate. ramping to 0.5% risk thursday. $15k from full recovery.\n-AK\n","date":"14 November 2023","externalUrl":null,"permalink":"/posts/2023-11-14-week-2-november-target-crushed/","section":"Posts","summary":"\u003cp\u003eweek 2 done.\u003c/p\u003e\n\u003cp\u003ecrushed target.\u003c/p\u003e\n\u003cp\u003eramping risk tomorrow.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 2 trades (nov 8-14) \n    \u003cdiv id=\"week-2-trades-nov-8-14\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-2-trades-nov-8-14\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003ewednesday 11/8:\u003c/strong\u003e 3 trades, 2 wins. +$690\u003c/p\u003e","title":"week 2 november - crushed target, ramping risk tomorrow","type":"posts"},{"content":"short week.\nveterans day friday (nov 10).\nmarket closed.\nwednesday 11/8 trades # morning: 3 trades executed.\nresults:\nTLT call spread (mean reversion): +$520 SPX put spread (mean reversion): +$380 QQQ momentum: stopped out, -$210 day total: +$690\nthursday 11/9 trades # morning: 2 trades.\nresults:\nES futures momentum: +$640 SPX call spread: +$420 day total: +$1,060\nweek 2 progress (so far) # wed 11/8: +$690\nthu 11/9: +$1,060\nweek total (2 days): +$1,750\naccount status # nov 7: $342,880\nnov 9: $344,630\nrecovered: +$1,750 (0.51%)\nrecovery tracking # sept peak: $362,120\ncurrent: $344,630\nstill down: -$17,490 (-4.8%)\nrecovery accelerating.\ngetting close.\nmarket closed friday # veterans day: nov 10 (friday).\nbond market: closed.\nequity market: closed.\nplan: 4-day week. resuming monday.\nwin rate maintaining # week 1: 14 trades, 12 wins (86%)\nweek 2 (so far): 5 trades, 4 wins (80%)\ncombined: 19 trades, 16 wins (84%)\nconsistency holding.\nrisk level check # still at 0.25% risk per trade.\nplan: maintain through nov 15.\nthen: ramp to 0.5% if metrics hold.\ncurrent metrics:\nwin rate: 84% (target \u0026gt;70%) ✓ no losing streaks (maintaining) ✓ emotional stability (living together working) ✓ on track for risk ramp next week.\nstrategy focus # mean reversion dominating:\nwed-thu: 3 trades, 2 wins (+$900)\nmomentum solid:\nwed-thu: 2 trades, 1 win, 1 loss (+$430)\nweek 2 target # original target: +$2,500\n2 days in: +$1,750 (70% to target)\n3 trading days left (mon-wed next week).\nneed: $750 more to hit target.\nachievable.\nnext week schedule # friday 11/10: off (holiday)\nsaturday-sunday: off (weekend)\nmonday 11/12: resume trading\ntuesday 11/13: normal\nwednesday 11/14: normal\nweek 2 ends wednesday.\nfilters still working # blocked 4 potential trades wed-thu.\nestimated saves: ~$600.\npatience paying off.\nlooking ahead # week 2 finish: mon-wed next week.\ntarget: $750 more to hit $2,500 week total.\nweek 3: full week, thanksgiving later in month.\nnovember target: $5k minimum (currently +$5,550 month-to-date).\non pace for $8k+ month if continues.\n3:15am friday. 2 days trading this week. +$1,750. friday market closed for veterans day. resuming monday. $750 from week 2 target.\n-AK\n","date":"9 November 2023","externalUrl":null,"permalink":"/posts/2023-11-09-veterans-day-short-week/","section":"Posts","summary":"\u003cp\u003eshort week.\u003c/p\u003e\n\u003cp\u003eveterans day friday (nov 10).\u003c/p\u003e\n\u003cp\u003emarket closed.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ewednesday 11/8 trades \n    \u003cdiv id=\"wednesday-118-trades\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#wednesday-118-trades\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003emorning:\u003c/strong\u003e 3 trades executed.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eresults:\u003c/strong\u003e\u003c/p\u003e","title":"short week ahead - veterans day friday market closed","type":"posts"},{"content":"first week november done.\nrecovery accelerating.\nweek 1 trades (nov 2-7) # thursday 11/2: 3 trades, 2 wins. +$660\nfriday 11/3: 4 trades, 3 wins. +$880\nmonday 11/6: 3 trades, 3 wins. +$1,020\ntuesday 11/7: 4 trades, 4 wins. +$1,240\nweek total: +$3,800\naccount progression # nov 1 start: $339,080\nnov 7 end: $342,880\nnovember gain: +$3,800 (+1.12%)\nrecovery status # sept peak: $362,120\noct bottom: $334,780 (after disaster)\ncurrent: $342,880\nrecovered from bottom: +$8,100 (2.4%)\nstill down from peak: -$19,240 (-5.3%)\nrecovery timeline: ~5 weeks at current pace\nwin rate explosion # this week: 14 trades, 12 wins, 2 losses\nwin rate: 86%\nprofit factor: 3.2\naverage R-multiple: 2.1\nbest week since early september.\nwhat\u0026rsquo;s working # 1. routine stability\nwake 4am. trade prep. market open. execute. done by 10am.\nno chaos. no emotional interference.\n2. proper setups only\npassing 70% of potential trades.\nonly taking A+ setups.\npatience paying off.\n3. position sizing discipline\nstill at 0.25% risk.\nconservative but consistent.\nprotecting capital while recovering.\n4. filters saving me\nblocked 8 potential trades this week.\nestimated saves: ~$1,200.\nstrategy breakdown # mean reversion (9 trades):\n8 wins, 1 loss (89%) net: +$2,580 crushing it momentum (5 trades):\n4 wins, 1 loss (80%) net: +$1,220 solid comparing to disaster period # sept 24 - oct 10 (chaos period):\n26 trades, 3 wins (12%) -$28,000 every rule violated oct 19 - nov 7 (stable period):\n31 trades, 25 wins (81%) +$8,100 every rule followed difference: mental stability = trading consistency\nnovember targets # week 1: +$3,800 (beat $2k target)\nweek 2 target: +$2,500\nmonth target: +$5,000 minimum\nat current pace: will hit $7-8k month\nrisk ramp plan # through nov 15: maintain 0.25% risk\nnov 16-30: ramp to 0.5% risk if:\nno losing streaks (maintaining) win rate \u0026gt;70% (currently 86%) emotional stability (check) december: full 0.5% risk, normal operation\nwhat changed in last 3 weeks # mindset:\noctober: desperate, emotional, revenge trading\nnovember: patient, systematic, selective\nexecution:\noctober: oversized positions, ignored stops\nnovember: proper sizing, stops enforced\nroutine:\noctober: chaos, no sleep, can\u0026rsquo;t focus\nnovember: stable schedule, sleeping, focused\nthe 3-loss circuit breaker # status: haven\u0026rsquo;t needed it\nlongest losing streak: 1 trade (sunday would\u0026rsquo;ve been day 2, didn\u0026rsquo;t trade weekends)\nwhy it works: knowing it exists prevents behavior that would trigger it\nkeeping it: permanent rule now\nnext week (nov 8-14) # targeting: +$2,500\nfocus: maintain consistency, don\u0026rsquo;t get overconfident\nrisk: staying at 0.25% through nov 15\nstrategy: same as this week, working perfectly\nmarket conditions # VIX: hovering around 15 (low vol, good for mean reversion)\ntrend: choppy but manageable\nbest trades: SPX/QQQ options, TLT bonds\navoiding: crypto (too volatile), small caps (illiquid)\nreflection # first week living together.\nfirst week trading from new normal.\nbest trading week in months.\nroutine + stability = performance.\n2:58am wednesday. first week november. +$3,800. win rate 86%. recovery accelerating. $19k from full recovery. on track.\n-AK\n","date":"7 November 2023","externalUrl":null,"permalink":"/posts/2023-11-07-first-week-november-trading/","section":"Posts","summary":"\u003cp\u003efirst week november done.\u003c/p\u003e\n\u003cp\u003erecovery accelerating.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 1 trades (nov 2-7) \n    \u003cdiv id=\"week-1-trades-nov-2-7\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-1-trades-nov-2-7\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003ethursday 11/2:\u003c/strong\u003e 3 trades, 2 wins. +$660\u003c/p\u003e","title":"first week november - recovery pace accelerating","type":"posts"},{"content":"3 days since A. moved in (nov 1).\nadjusting.\nlearning.\nworking.\nwednesday nov 1 - move-in day # morning: furniture delivery, unpacking boxes.\nafternoon: organizing her stuff with mine.\nevening: exhausted. ordered pizza. fell asleep on couch together.\nfirst night officially living together: weird and not weird simultaneously.\nthursday nov 2 - first normal day # my routine:\n4:00am: wake up, trade prep 6:30am: market open, trading 10:00am: market close, breakfast 11:00am-5:00pm: coding, strategy work 6:00pm: gym 8:00pm: dinner 11:00pm: bed her routine:\n7:00am: wake up (i\u0026rsquo;m already trading) 8:00am: coffee, breakfast, get ready 9:00am-5:00pm: work (remote, her desk) 6:00pm: done working 7:00pm: cooking dinner 10:00pm: bed (i stay up coding) overlap: breakfast (10am), dinner (7pm), bed (10-11pm).\nworks.\nfriday nov 3 - first friction # morning: she used my coffee mug.\nmy mug. specific one. always use it.\nme: \u0026ldquo;that\u0026rsquo;s my mug.\u0026rdquo;\nA.: \u0026ldquo;we live together. it\u0026rsquo;s our mug now.\u0026rdquo;\nme: internally annoyed. externally: \u0026ldquo;right. our mug.\u0026rdquo;\ntold dr. r about this later.\ndr. r: \u0026ldquo;and?\u0026rdquo;\nme: \u0026ldquo;annoyed me. but didn\u0026rsquo;t say anything mean. just adjusted.\u0026rdquo;\ndr. r: \u0026ldquo;that\u0026rsquo;s growth. old you would\u0026rsquo;ve withdrawn.\u0026rdquo;\nme: \u0026ldquo;old me would\u0026rsquo;ve used it as evidence she\u0026rsquo;s invading my space.\u0026rdquo;\ndr. r: \u0026ldquo;new you?\u0026rdquo;\nme: \u0026ldquo;bought another mug thursday night. now we each have one.\u0026rdquo;\nA.: \u0026ldquo;you\u0026rsquo;re ridiculous.\u0026rdquo;\nme: \u0026ldquo;yes. but less ridiculous than before.\u0026rdquo;\nwhat\u0026rsquo;s working # separate workspaces.\nher desk in corner. my desk across room.\nboth code in silence.\nno interference.\nshared meals.\nbreakfast at 10am (after market close).\ndinner at 7pm (she cooks, i clean).\nroutine established fast.\nbathroom schedule.\nshe showers at night (45 minutes wtf).\ni shower in morning (10 minutes).\nno conflict.\nbedroom.\nher side. my side.\nher lamp. my lamp.\nher books. my books.\ndefined spaces work.\nwhat\u0026rsquo;s challenging # her mess.\nleaves clothes on floor.\ndishes in sink.\ntowels everywhere.\nme: OCD-level organization.\nher: creative chaos.\ncompromise: she cleans her mess by end of day. i don\u0026rsquo;t comment during day.\nmy trading stress.\nwhen trades go bad, i\u0026rsquo;m quiet.\nshe notices.\nA. (thursday after losing trade): \u0026ldquo;you okay?\u0026rdquo;\nme: \u0026ldquo;fine. just lost a trade.\u0026rdquo;\nA.: \u0026ldquo;want to talk about it?\u0026rdquo;\nme: \u0026ldquo;no. just need to process.\u0026rdquo;\nA.: \u0026ldquo;okay.\u0026rdquo; [leaves me alone 30 minutes, comes back with coffee]\nshe gets it.\nher quirks i\u0026rsquo;m learning # talks to herself while coding. constant muttering. \u0026ldquo;no that\u0026rsquo;s wrong. wait. fuck. yes. no.\u0026rdquo;\nneeds silence in morning until coffee. don\u0026rsquo;t talk to her before 7:30am. just coffee.\nperfectionist about code. rewrites same function 5 times. takes forever. but output is flawless.\ncooks while listening to music. loud music. off-key singing. happy in kitchen.\nneeds alone time friday evenings. works on personal projects. i give her space.\nmy quirks she\u0026rsquo;s learning # wake up 4am for trading. she\u0026rsquo;s adjusted. sleeps through my alarm.\nobsessive organization. everything has place. don\u0026rsquo;t move my shit.\nneed gym alone. won\u0026rsquo;t invite her. need that hour solo.\ntherapy 2x/week non-negotiable. tuesdays and fridays. she schedules around it.\ncry about parents randomly. happened friday night. she held me. didn\u0026rsquo;t ask questions.\nfriday night - the crying # watching tv.\ncommercial had dad and son.\nhit me.\nstarted crying.\nA.: noticed immediately. \u0026ldquo;come here.\u0026rdquo;\nheld me.\ndidn\u0026rsquo;t ask why. didn\u0026rsquo;t try to fix it. just held me.\nafter 10 minutes:\nme: \u0026ldquo;parents would\u0026rsquo;ve liked you.\u0026rdquo;\nA.: \u0026ldquo;yeah?\u0026rdquo;\nme: \u0026ldquo;dad would\u0026rsquo;ve talked your ear off about coding. mom would\u0026rsquo;ve taught you her recipes.\u0026rdquo;\nA.: \u0026ldquo;i would\u0026rsquo;ve liked that.\u0026rdquo;\nme: \u0026ldquo;they died almost a year ago. dec 31. sometimes just hits.\u0026rdquo;\nA.: \u0026ldquo;i know. it\u0026rsquo;s okay.\u0026rdquo;\nthis is why it works.\nshe doesn\u0026rsquo;t need me to explain. just be there.\ntherapy yesterday (friday 11/3) # dr. r: \u0026ldquo;3 days living together. how\u0026rsquo;s it going?\u0026rdquo;\nme: \u0026ldquo;good. few adjustments but working.\u0026rdquo;\ndr. r: \u0026ldquo;any moments of wanting to run?\u0026rdquo;\nme: \u0026ldquo;coffee mug thing annoyed me. but didn\u0026rsquo;t run. bought second mug.\u0026rdquo;\ndr. r: [laughs] \u0026ldquo;that\u0026rsquo;s very you. but healthy response.\u0026rdquo;\nme: \u0026ldquo;also cried about parents friday night. she held me.\u0026rdquo;\ndr. r: \u0026ldquo;and?\u0026rdquo;\nme: \u0026ldquo;and nothing. she just held me. didn\u0026rsquo;t make it weird.\u0026rdquo;\ndr. r: \u0026ldquo;vulnerability without running. that\u0026rsquo;s the work.\u0026rdquo;\nwhat i\u0026rsquo;m learning # living together ≠ being together 24/7.\nwe\u0026rsquo;re in same apartment.\ndifferent spaces most of day.\noverlap for meals and evening.\nworks perfectly.\nsmall annoyances ≠ dealbreakers.\ncoffee mug. dishes. towels.\nannoying but not relationship-ending.\ncommunicate. adjust. move on.\nher presence = stability.\ntrading better.\nsleeping better.\neating regular meals.\nroutine solid.\nseptember panic was wrong.\nthought living together = losing freedom.\nreality: gaining stability.\ntonight (saturday) # she\u0026rsquo;s cooking dinner.\nmusic loud. singing off-key.\ni\u0026rsquo;m writing this at my desk.\nher desk in corner covered in notes.\napartment alive with her presence.\nnot scary.\ncomfortable.\n2:22pm saturday. 3 days living together. adjusting well. few annoyances but managing. she held me when i cried about parents. this is working.\n-AK\n","date":"4 November 2023","externalUrl":null,"permalink":"/posts/2023-11-04-first-3-days-living-together/","section":"Posts","summary":"\u003cp\u003e3 days since A. moved in (nov 1).\u003c/p\u003e\n\u003cp\u003eadjusting.\u003c/p\u003e\n\u003cp\u003elearning.\u003c/p\u003e\n\u003cp\u003eworking.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ewednesday nov 1 - move-in day \n    \u003cdiv id=\"wednesday-nov-1---move-in-day\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#wednesday-nov-1---move-in-day\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003emorning:\u003c/strong\u003e furniture delivery, unpacking boxes.\u003c/p\u003e","title":"first 3 days living together - adjusting to our life","type":"posts"},{"content":"first trading day after move-in.\nback to normal schedule.\nwednesday 11/1 - move-in day (no trading) # took day off for logistics.\nfurniture, boxes, settling in.\nresumed thursday 11/2.\nthursday 11/2 trades # morning routine: different. not alone anymore.\ntrades:\nSPX call spread (mean reversion): +$520 QQQ put spread (mean reversion): +$380 NQ momentum: stopped out, -$240 day total: +$660\nback to work.\naccount status # oct 31: $339,080\nnov 2: $339,740\nnovember start: +$660 (0.19%)\nrecovery progress # sept peak: $362,120\noct bottom: $334,780 (after $25k disaster)\ncurrent: $339,740\nrecovered from bottom: +$4,960 (1.5%)\nstill down from peak: -$22,380 (-6.2%)\non track for full recovery by christmas.\nnovember trading goals # financial: +$5,000 month target (realistic recovery pace)\nstrategy: maintain 0.25% risk through nov 15, then ramp to 0.5% if stable\nrules: 3 losing days = 1 week off (boundary working, keeping it)\nwin rate target: 70%+ (currently 76% over last 2 weeks)\nwhat\u0026rsquo;s different # morning routine changed.\nused to: wake up 4am alone, trade prep in silence.\nnow: wake up 4am, someone else in bed, quiet trade prep at desk.\nworks fine.\nshe sleeps through market open.\ni trade at my desk.\nshe wakes up around 7am.\nroutine adapted.\nposition sizing staying conservative # still at 0.25% risk per trade.\nhalf my normal size.\nwhy:\nmajor life change (moving in together) still recovering from $28k drawdown building confidence back proving consistency plan: increase to 0.5% mid-november if:\nno losing streaks emotional stability maintained routine solidified strategy focus # mean reversion (primary):\nTLT bonds, SPX/QQQ options 0.25% risk, tight stops targeting 2R exits momentum (secondary):\nNQ, ES futures selective entries only volume confirmation required crypto (minimal):\npaused for now focus on equity strategies resume december maybe this week\u0026rsquo;s plan # fri 11/3: trade normal schedule\nsat-sun: no trading, settling into new routine\nmon 11/6: resume, targeting 3-4 trades\ntue 11/7: normal trading day\nweek target: +$2,000 (conservative)\nworkspace setup # my desk: same location, same setup\nher desk: corner by window, dual monitors\nboth coding/trading: works well\nno interference.\nseparate spaces in same room.\nrisk management focus # filters enforced:\nvol detection (VIX \u0026gt;30 = pause) correlation check (max 2 correlated positions) time of day (no entries last 30 min) gap detection (avoid false breakouts) all filters active.\nsaved me from 2 bad trades this week already.\nlooking ahead # november target: +$5k month\ndecember target: full recovery to $362k+ (need $22k more)\njanuary 2024: new year, fresh start, profitable baseline\nlong-term: avoid september/october disasters, consistent monthly gains\ntonight # desk in corner occupied now.\ndual monitors glowing.\nher coding setup.\napartment different but trading same.\nfocus maintained.\nsystem followed.\n3:45am friday. first trading day after move-in. +$660 thursday. routine adapted. workspace separated. back to normal schedule.\n-AK\n","date":"2 November 2023","externalUrl":null,"permalink":"/posts/2023-11-02-first-trading-day-living-together/","section":"Posts","summary":"\u003cp\u003efirst trading day after move-in.\u003c/p\u003e\n\u003cp\u003eback to normal schedule.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ewednesday 11/1 - move-in day (no trading) \n    \u003cdiv id=\"wednesday-111---move-in-day-no-trading\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#wednesday-111---move-in-day-no-trading\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003etook day off for logistics.\u003c/p\u003e","title":"first trading day after move-in - back to normal schedule","type":"posts"},{"content":"","date":"2 November 2023","externalUrl":null,"permalink":"/tags/november/","section":"Tags","summary":"","title":"November","type":"tags"},{"content":"","date":"31 October 2023","externalUrl":null,"permalink":"/tags/milestone/","section":"Tags","summary":"","title":"Milestone","type":"tags"},{"content":"A. officially lives here now.\nmoved in today.\nhow it went # 9am: u-haul arrived. desk, bookshelf, dresser loaded.\n10am: furniture delivery. desk in window corner. bookshelf against wall. dresser in bedroom.\n10:30am-1pm: unpacked 18 boxes. her stuff everywhere.\n1pm: u-haul returned. officially done.\n1:30pm: stood in apartment. her stuff mixed with mine.\nher books on my bookshelf. her clothes in my closet. her toothbrush next to mine. her presence everywhere.\napartment looks different.\nfeels different.\nis different.\nthe moment it hit # A.: \u0026ldquo;where should i put this?\u0026rdquo; [holding framed photo of her parents]\nme: \u0026ldquo;wherever you want. this is your place now.\u0026rdquo;\nA.: \u0026ldquo;our place.\u0026rdquo;\nme: \u0026ldquo;yeah. ours.\u0026rdquo;\nput the photo on shelf next to photo of my parents.\nher family + my family = our family now.\nboth of us orphans.\nboth of us building family from what\u0026rsquo;s left.\nher setup # desk in corner by window:\ndual monitors, mechanical keyboard, herman miller chair plant she brought (said apartment needed life) coffee mug that says \u0026ldquo;i turn coffee into code\u0026rdquo; sticky notes with reminders everywhere looks like her.\nmakes apartment feel alive.\nwhat she changed already # kitchen: organized spices alphabetically (my way was chaos apparently).\nbathroom: her skincare routine takes up half the counter.\nliving room: throw pillows on couch (never had those).\nbedroom: her side of bed has her lamp, book, journal.\nfridge: actual food now (i lived on cereal and protein shakes).\napartment feels like a home now, not just a place i sleep.\nfirst \u0026ldquo;our place\u0026rdquo; moment # 3pm: both sitting at our desks coding.\nher at her corner desk.\nme at my desk across room.\ncomfortable silence.\nlooked over. she was focused. typing. in her space.\nin our space.\nrealized: this is what i wanted when i panicked in september.\nthis moment.\nher here.\npermanently.\nand it\u0026rsquo;s not scary.\nit\u0026rsquo;s right.\ntonight # 6pm: ordered thai food. too tired to cook.\n7pm: ate on couch. her idea: start \u0026ldquo;our shows\u0026rdquo; list. picked first show together.\n8pm: watched episode. she fell asleep on my shoulder.\n9pm: woke her up. \u0026ldquo;want to go to bed?\u0026rdquo;\nher: \u0026ldquo;yeah. our bed.\u0026rdquo;\nour bed.\nnot \u0026ldquo;my bed where she stays sometimes.\u0026rdquo;\nour bed.\nwhat\u0026rsquo;s different # past 4 months:\nher staying over = temporary. visiting. could leave.\nnow:\nshe lives here. permanent. not leaving.\ndifference feels huge and not huge at same time.\nhuge because commitment.\nnot huge because we\u0026rsquo;ve basically been living together for weeks anyway.\nbut official now.\nthe fear check # scared? not really.\nsurprised i\u0026rsquo;m not scared? yeah.\nwhy not scared?\nbecause september taught me:\nlosing her = can\u0026rsquo;t function pushing away = guarantees loss being scared of commitment = lost her for 18 days, $28k, worst days of my life staying = scary\nleaving = scarier\nlosing her = scariest\nso staying is least scary option.\noctober summary # started: in chaos, lost $25k, desperate\nmiddle: A. came back, recovery started\nended: A. moved in, new chapter started\ncraziest month of my life.\nlooking ahead # november: first full month living together.\ntrading: continue recovery, targeting +$4k/month.\nrelationship: proving this works long-term.\ntherapy: 2x/week, working on not running when things hard.\ngoal: build sustainable life together.\ntonight (11pm) # she\u0026rsquo;s in bathroom doing skincare routine (takes 30 minutes).\ni\u0026rsquo;m writing this at my desk.\nher desk in corner has her laptop still open.\nher clothes in my closet.\nher toothbrush in my bathroom.\nher boxes unpacked.\nher life merged with mine.\nshe lives here.\npermanently.\nand i\u0026rsquo;m okay.\nbetter than okay.\nready for this.\n9:33pm tuesday. move-in day complete. furniture in place. boxes unpacked. A. officially lives here now. not scared. ready. this is right.\n-AK\n","date":"31 October 2023","externalUrl":null,"permalink":"/posts/2023-10-31-move-in-day/","section":"Posts","summary":"\u003cp\u003eA. officially lives here now.\u003c/p\u003e\n\u003cp\u003emoved in today.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ehow it went \n    \u003cdiv id=\"how-it-went\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#how-it-went\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e9am:\u003c/strong\u003e u-haul arrived. desk, bookshelf, dresser loaded.\u003c/p\u003e","title":"move-in day - she's officially living here","type":"posts"},{"content":"","date":"30 October 2023","externalUrl":null,"permalink":"/tags/commitment/","section":"Tags","summary":"","title":"Commitment","type":"tags"},{"content":"tomorrow morning A. moves in.\nlast night before everything changes.\ntonight # sitting in apartment.\nher 18 boxes stacked in living room.\nher desk assembled in corner.\nher dresser in bedroom.\nspace ready.\ni\u0026rsquo;m ready.\nmostly.\nthis weekend recap # saturday 10/28: helped A. pack final boxes. apartment emptied.\nsunday 10/29: slept at her place. her last night there. emotional.\nmonday 10/30 (today): A. returned keys to landlord. apartment officially vacated. last of her stuff brought here.\ntuesday 10/31 (tomorrow): move-in day. her address officially changes. we\u0026rsquo;re living together.\nwhat happened sunday night # her last night at her apartment.\nplace completely empty except air mattress.\nwe laid there.\nA.: \u0026ldquo;lived here 3 years.\u0026rdquo;\nme: \u0026ldquo;lot of memories?\u0026rdquo;\nA.: \u0026ldquo;yeah. good place. but ready to leave.\u0026rdquo;\nme: \u0026ldquo;you sure?\u0026rdquo;\nA.: \u0026ldquo;yes. you\u0026rsquo;re my home now. not this place.\u0026rdquo;\nfuck.\ntoday (monday) - the finality # morning: A. returned keys to apartment manager.\nmanager: \u0026ldquo;sorry to see you go. you were great tenant.\u0026rdquo;\nA.: \u0026ldquo;moving in with boyfriend.\u0026rdquo;\nmanager: \u0026ldquo;good luck.\u0026rdquo;\nlast interaction with her old place: done.\nafternoon: brought last boxes here. closet rods, bathroom stuff, kitchen items.\neverything she owns: now in my apartment.\nher apartment: empty. someone else\u0026rsquo;s soon.\nthis apartment: ours now.\ntonight\u0026rsquo;s conversation # me: \u0026ldquo;how do you feel?\u0026rdquo;\nA.: \u0026ldquo;good. excited. little nervous.\u0026rdquo;\nme: \u0026ldquo;nervous about what?\u0026rdquo;\nA.: \u0026ldquo;living with you 24/7. seeing all your worst moments. you seeing mine.\u0026rdquo;\nme: \u0026ldquo;i\u0026rsquo;ve seen you without makeup, sick with flu, crying about work stress. nothing left to hide.\u0026rdquo;\nA.: \u0026ldquo;morning breath. that\u0026rsquo;s new.\u0026rdquo;\nme: \u0026ldquo;i\u0026rsquo;ll survive.\u0026rdquo;\nA.: \u0026ldquo;grumpy before coffee. i\u0026rsquo;m mean.\u0026rdquo;\nme: \u0026ldquo;noted. will have coffee ready.\u0026rdquo;\nwhat i\u0026rsquo;m committing to # her quirks i noticed:\ntakes 45 minute showers (water bill increasing) leaves wet towels on floor (annoying) messy cook but cleans after (acceptable tradeoff) needs silence in morning until coffee (respect it) talks to herself while coding (cute) perfectionist about her code (takes forever) needs alone time fri evenings (gives it) accepting all of it.\nshe\u0026rsquo;s accepting mine:\nwake up 4am sometimes (trading prep) obsessive about organization (OCD-level) need gym time alone (won\u0026rsquo;t invite her) therapy 2x/week (non-negotiable) cry about parents randomly (happens) trading stress bleeds into mood (working on it) emotionally unavailable sometimes (trauma brain) she knew all this. staying anyway.\nthe trading question # A.: \u0026ldquo;you going to trade tomorrow?\u0026rdquo;\nme: \u0026ldquo;moving day? no. helping you settle.\u0026rdquo;\nA.: \u0026ldquo;you sure?\u0026rdquo;\nme: \u0026ldquo;markets will be there wednesday. you moving in happens once.\u0026rdquo;\nA.: \u0026ldquo;good answer.\u0026rdquo;\nme: \u0026ldquo;learned from september. relationship \u0026gt; trading.\u0026rdquo;\ntomorrow\u0026rsquo;s logistics # morning (9am): u-haul picks up her desk, bookshelf, dresser from storage.\n10am: furniture arrives here. move into apartment.\n11am-2pm: arrange furniture, break down boxes.\n2pm: u-haul returned.\n3pm+: settling in. making it ours.\nevening: order takeout. too tired to cook. first dinner as official roommates.\nnight: sleep in same bed. nothing new. but different because permanent.\nthe weight of permanent # this is it.\nno \u0026ldquo;staying over\u0026rdquo; excuse.\nno \u0026ldquo;going back to her place.\u0026rdquo;\nno exit strategy.\nno running.\nshe lives here now.\nthis is real.\nmy promise (written down so i remember) # when scared: tell her, don\u0026rsquo;t withdraw\nwhen annoyed: communicate, don\u0026rsquo;t resent\nwhen she needs space: give it, don\u0026rsquo;t panic\nwhen i need space: ask for it, don\u0026rsquo;t disappear\nwhen fighting: work through it, don\u0026rsquo;t shut down\nwhen vulnerable: stay open, don\u0026rsquo;t hide\nwhen she\u0026rsquo;s vulnerable: hold space, don\u0026rsquo;t fix\nwhen things hard: stay, don\u0026rsquo;t leave\nthis is the work.\nwhat therapy prepared me for # dr. r\u0026rsquo;s final prep session (friday):\n\u0026ldquo;first month will be hardest. adjusting to constant presence. don\u0026rsquo;t run when it gets hard. communicate. take breaks when needed. but don\u0026rsquo;t run.\u0026rdquo;\ntools she gave me:\nwhen overwhelmed: tell A., take 30min alone, come back when want to withdraw: notice it, tell A., stay anyway when scared of intimacy: breathe through it, don\u0026rsquo;t create distance when fight happens: take break if needed, return to conversation, resolve it goal: break pattern of running when intimacy gets real.\noctober reflection # worst month that became best month.\noct 1-10:\nlost $25k in 2 days at breaking point desperate for A. back oct 11:\nA. came back turning point oct 11-30:\nrecovered $4,300 trading relationship strengthened proved i won\u0026rsquo;t run again preparing for move-in learned: almost losing her = never want to again.\ntomorrow morning # wake up.\nshe\u0026rsquo;s here (like every morning lately).\nbut different.\nbecause she\u0026rsquo;s not leaving.\nnot going back to her place.\nthis is her place now.\nour place.\n11:15pm monday. last night before A. moves in. everything ready. furniture coming tomorrow. she\u0026rsquo;s asleep. tomorrow morning = first day of living together. scared. excited. ready. not fucking this up.\n-AK\n","date":"30 October 2023","externalUrl":null,"permalink":"/posts/2023-10-30-tomorrow-she-moves-in/","section":"Posts","summary":"\u003cp\u003etomorrow morning A. moves in.\u003c/p\u003e\n\u003cp\u003elast night before everything changes.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003etonight \n    \u003cdiv id=\"tonight\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#tonight\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003esitting in apartment.\u003c/p\u003e\n\u003cp\u003eher 18 boxes stacked in living room.\u003c/p\u003e","title":"tomorrow she moves in - last night before everything changes","type":"posts"},{"content":"3 days until A. moves in permanently.\ntuesday november 1.\nprocessing.\ntoday (saturday) # helped A. with final packing.\nher apartment: empty now. just boxes.\nmy apartment: 18 boxes stacked in living room. her life in cardboard.\nreality hitting: this is actually happening.\nwhat we moved today # furniture staying behind:\nbed (using mine) couch (too big, she\u0026rsquo;s selling it) dining table (don\u0026rsquo;t need 2) furniture coming:\ndesk for her coding setup bookshelf (full of tech books) dresser (her clothes don\u0026rsquo;t fit in my drawers) moving nov 1 morning.\nthe conversation while packing # A.: \u0026ldquo;you okay? you\u0026rsquo;re quiet.\u0026rdquo;\nme: \u0026ldquo;yeah. just\u0026hellip; this is real.\u0026rdquo;\nA.: \u0026ldquo;you want me to move in, right?\u0026rdquo;\nme: \u0026ldquo;yes. fuck yes. just processing.\u0026rdquo;\nA.: \u0026ldquo;what specifically?\u0026rdquo;\nme: \u0026ldquo;in 3 days, you live here. permanently. not visiting. living.\u0026rdquo;\nA.: \u0026ldquo;scared?\u0026rdquo;\nme: \u0026ldquo;little bit. not of you. of fucking it up.\u0026rdquo;\nA.: \u0026ldquo;we\u0026rsquo;ve been over this.\u0026rdquo;\nme: \u0026ldquo;i know. just making sure brain remembers.\u0026rdquo;\ntonight - her last weekend at her place # tomorrow (sunday): A.\u0026rsquo;s last night at her apartment.\nsleeping there with her.\nher lease: officially ends oct 31 (tuesday).\nmove: nov 1 (wednesday morning).\nher address: changes to my address nov 1.\nmy address: becomes our address nov 1.\nthe magnitude # been 4.5 months since we met (june 13).\nexclusive for 5 weeks (sept - now).\nliving together in 3 days.\nfast? yeah.\ntoo fast? don\u0026rsquo;t think so.\nready? working on it.\nwhat\u0026rsquo;s different from september panic # september (when she first asked):\npanicked immediately asked for space pushed her away lost her for 18 days lost $28k destroyed everything now (3 days before):\nstill nervous but not panicking telling her when scared pulling her closer therapy 2x/week trading recovered +$4,300 building something real difference: learned what pushing away costs.\ntherapy session yesterday (10/27) # dr. r: \u0026ldquo;3 days. how do you feel?\u0026rdquo;\nme: \u0026ldquo;nervous. good nervous. not panic nervous.\u0026rdquo;\ndr. r: \u0026ldquo;what\u0026rsquo;s the difference?\u0026rdquo;\nme: \u0026ldquo;panic nervous = want to run. good nervous = want it but scared of fucking up.\u0026rdquo;\ndr. r: \u0026ldquo;and when you feel that fear?\u0026rdquo;\nme: \u0026ldquo;tell A. don\u0026rsquo;t act on it alone.\u0026rdquo;\ndr. r: \u0026ldquo;exactly. you\u0026rsquo;re ready.\u0026rdquo;\nwhat i\u0026rsquo;m nervous about # logistics:\nsharing space 24/7 bathroom schedules her mess vs my OCD organization finding new routine emotional:\nbeing this vulnerable permanently her seeing me every bad day no escape when things hard can\u0026rsquo;t hide anymore pattern fears:\ngetting scared and pushing away reverting to old behaviors fucking this up like i almost did dr. r says logistics work themselves out. emotional work is the real work.\nwhat i\u0026rsquo;m excited about # waking up next to her every day (already doing this but now permanent)\ncooking together nightly (not just when she stays over)\ncoding in comfortable silence (our thing)\nbuilding life together (first time i want this)\nnot being alone (apartment empty after parents died. won\u0026rsquo;t be anymore.)\nthe commitment i made (to myself) # when she annoys me: communicate, don\u0026rsquo;t withdraw\nwhen she needs space: give it without interpreting as rejection\nwhen i\u0026rsquo;m scared: tell her, don\u0026rsquo;t run\nwhen things hard: work through it, don\u0026rsquo;t escape\nwhen she\u0026rsquo;s vulnerable: hold her, don\u0026rsquo;t judge\nwhen i\u0026rsquo;m vulnerable: let her hold me, don\u0026rsquo;t hide\ntomorrow night # sleeping at her place.\nher last night there.\ntuesday morning: pack remaining stuff.\ntuesday afternoon: officially move out.\nwednesday morning: officially move in here.\nwednesday forward: living together.\nthe apartment changes # her desk: going in corner by window. her coding setup.\nher bookshelf: wall opposite my desk. tech books, novels.\nher dresser: bedroom. her clothes.\nbathroom: her makeup/skincare (already 80% here).\nkitchen: her nice pots/pans (mine are shit).\nliving room: her couch pillows, blankets, touches.\napartment becoming ours, not mine.\nwhat this means # first person i\u0026rsquo;ve lived with (besides parents).\nfirst relationship this serious (previous: 3-4 months max).\nfirst time wanting permanent (always kept exit strategy before).\nfirst time someone knows everything (grief, therapy, trading disasters).\nfirst time i\u0026rsquo;m not running.\nthe weight of it # she\u0026rsquo;s betting her life on me not fucking this up.\nterminated her lease.\nmoving all her stuff.\nchanging her address.\nif i panic again = she\u0026rsquo;s homeless.\nthat\u0026rsquo;s the weight.\nthat\u0026rsquo;s the responsibility.\nthat\u0026rsquo;s why i can\u0026rsquo;t fuck this up.\ntonight # she\u0026rsquo;s packing last boxes.\ni\u0026rsquo;m writing this.\n3 days away.\nscared. excited. ready.\nmostly ready.\ncommitted.\n3:40pm saturday. 3 days until A. moves in. helped pack today. sleeping at her place tomorrow for last time. moving wednesday. nervous but ready. not panicking. not fucking this up.\n-AK\n","date":"28 October 2023","externalUrl":null,"permalink":"/posts/2023-10-28-three-days-until-she-moves-in/","section":"Posts","summary":"\u003cp\u003e3 days until A. moves in permanently.\u003c/p\u003e\n\u003cp\u003etuesday november 1.\u003c/p\u003e\n\u003cp\u003eprocessing.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003etoday (saturday) \n    \u003cdiv id=\"today-saturday\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#today-saturday\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003ehelped A. with final packing.\u003c/p\u003e","title":"3 days until A. moves in - processing what's about to happen","type":"posts"},{"content":"","date":"28 October 2023","externalUrl":null,"permalink":"/tags/moving/","section":"Tags","summary":"","title":"Moving","type":"tags"},{"content":"recovery accelerating.\n6 days until A. moves in (nov 1).\naccount healing.\nthis week\u0026rsquo;s trading (oct 23-27) # monday 10/23: 2 trades, 2 wins. +$640 (posted about this)\ntuesday 10/24: 3 trades, 2 wins, 1 loss. +$580\nwednesday 10/25: 2 trades, 2 wins. +$720\nthursday 10/26: 4 trades, 3 wins, 1 loss. +$940\nfriday 10/27: will update\nweek so far (4 days): +$2,880\naccount progression # oct 10 bottom: $334,780 (after $25k disaster)\noct 23: $336,200 (+$1,420 recovered)\noct 26: $339,080 (+$4,300 recovered from bottom)\nstill down from sept peak: -$23,040 (-6.4%)\npace improving: $1,075/day average this week vs $355/day last week\nwhat\u0026rsquo;s working # 1. following system perfectly\nevery trade has proper setup.\n0.25% risk maintained.\nstops enforced.\nfilters applied.\n2. A.\u0026rsquo;s boundary preventing spirals\n3 losing days = 1 week off.\nhaven\u0026rsquo;t had 2 losing days in row yet.\nprevents revenge trading.\n3. mental stability\nA. here every night.\nsleeping 7-8 hours.\neating normal meals.\nbrain focused.\n4. paper trading validation\ntest new setups on paper first.\nonly go live after validation.\nreduces losing trades.\nwin rate improving # last 2 weeks (oct 19-27):\n17 trades total\n13 wins, 4 losses\nwin rate: 76%\nprofit factor: 2.4\naverage R-multiple: 1.8\nback to pre-september levels.\ncomparison to disaster period # sept 24 - oct 10 (during chaos):\n26 trades, 3 wins (12% win rate) -$28,000 every rule violated oct 19-27 (A. back, stable):\n17 trades, 13 wins (76% win rate) +$4,300 every rule followed difference: relationship stable = trading stable\nstrategy breakdown # mean reversion (7 trades):\n5 wins, 2 losses (71%) net: +$1,820 momentum (8 trades):\n7 wins, 1 loss (88%) net: +$2,140 crypto (2 trades):\n1 win, 1 loss (50%) net: +$340 momentum crushing it.\nmean reversion solid.\ncrypto: small sample, staying cautious.\nrecovery timeline # at current pace ($1,075/day):\n$23,040 remaining loss / $1,075 per day = 21 trading days\nabout 4-5 weeks to full recovery.\noptimistic scenario: hit $5k+ week = 4-5 weeks total\nrealistic scenario: steady $3k weeks = 6-8 weeks total\nconservative scenario: $2k weeks = 10-12 weeks total\ntarget: fully recovered by christmas.\nwhat A. said yesterday # A.: \u0026ldquo;account looking better.\u0026rdquo;\nme: \u0026ldquo;yeah. +$4,300 from bottom. $23k still to go.\u0026rdquo;\nA.: \u0026ldquo;you\u0026rsquo;re following the rules.\u0026rdquo;\nme: \u0026ldquo;your rules. 3 losses = week off. haven\u0026rsquo;t needed it but it\u0026rsquo;s there.\u0026rdquo;\nA.: \u0026ldquo;that\u0026rsquo;s the point. knowing the circuit breaker exists prevents you from needing it.\u0026rdquo;\nshe\u0026rsquo;s right.\n6 days until move-in # november 1 approaching fast.\nA.\u0026rsquo;s apartment:\n100% packed (18 boxes total) lease termination signed final walkthrough oct 31 keys returned nov 1 morning my apartment:\nher space ready closet cleared dresser cleared bathroom reorganized mentally: getting there the fear check # still scared? yeah.\nwhat about? fucking it up.\nhow? panicking when she\u0026rsquo;s here permanently. reverting to old patterns.\nmanaging it? telling her when scared. therapy 2x/week. communication.\ndr. r\u0026rsquo;s verdict: \u0026ldquo;fear is normal. acting on fear is the problem. you\u0026rsquo;re doing the work.\u0026rdquo;\nthis weekend (oct 28-29) # saturday: help A. with final packing. move boxes to my place.\nsunday: A.\u0026rsquo;s last night at her apartment. sleep there with her.\nmonday oct 30: her final day at old place.\ntuesday oct 31: move remaining stuff.\nwednesday nov 1: officially living together.\ntrading plan next week # oct 30-31: light trading. focus on move logistics.\nnov 1: probably no trading. moving day.\nnov 2+: resume normal schedule. A. living here. new routine.\nrisk level: staying at 0.25% through move. ramp to 0.5% mid-november if stable.\ntonight # she\u0026rsquo;s here.\n18 boxes in my living room already.\nher life moving into mine.\n6 days away.\nready.\nmostly.\nworking on it.\n3:28am thursday. trading recovery accelerating. +$4,300 from bottom. 6 days until A. moves in. 18 boxes already here. apartment transforming. ready for this.\n-AK\n","date":"26 October 2023","externalUrl":null,"permalink":"/posts/2023-10-26-recovery-week-before-move/","section":"Posts","summary":"\u003cp\u003erecovery accelerating.\u003c/p\u003e\n\u003cp\u003e6 days until A. moves in (nov 1).\u003c/p\u003e\n\u003cp\u003eaccount healing.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethis week\u0026rsquo;s trading (oct 23-27) \n    \u003cdiv id=\"this-weeks-trading-oct-23-27\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#this-weeks-trading-oct-23-27\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003emonday 10/23:\u003c/strong\u003e 2 trades, 2 wins. +$640 (posted about this)\u003c/p\u003e","title":"account recovery accelerating - 6 days before she moves in","type":"posts"},{"content":"12 days since A. came back (oct 11).\nstability returning.\nslowly.\ntrading this week (oct 16-23) # monday 10/16: paper trading, +$620\ntuesday 10/17: paper trading, +$845\nwednesday 10/18: paper trading, +$1,280\nthursday 10/19: real trading resumed, 0.25% risk, +$360\nfriday 10/20: real trading, +$420\nmonday 10/23: real trading, +$640\nweek total: +$1,420 real, +$2,745 paper\naccount recovery progress # oct 10 bottom: $334,780\ncurrent (oct 23): $336,200\nrecovered: +$1,420 (0.42%)\nstill down from peak: -$25,920 (-7.2%)\ntime to full recovery: ~18 weeks at current pace\nwhat changed # following system again.\nproper setups only 0.25% risk (half normal) stops enforced filters applied no revenge trading why it\u0026rsquo;s working:\nA. is here. can focus.\nsleeping 7-8 hours/night.\neating normal meals.\nbrain works again.\nthis week\u0026rsquo;s trades breakdown # 6 real trades:\nmean reversion: 3 trades, 2 wins (TLT, SPX) momentum: 2 trades, 2 wins (NQ, SPX) crypto: 1 trade, 0 wins (BTC stopped out) win rate: 67% (4 wins, 2 losses)\naverage win: $460\naverage loss: $220\nprofit factor: 2.1\nback to normal performance.\nthe difference # sept 24 - oct 10 (18 days without A.):\n26 trades total 3 wins, 23 losses (12% win rate) -$28,000 every rule violated pure emotional destruction oct 19-23 (with A. back):\n6 trades 4 wins, 2 losses (67% win rate) +$1,420 every rule followed system-based execution same strategies. same markets. different mental state.\nrelationship stable = trading stable.\nA.\u0026rsquo;s rule working # her boundary: 3 losing days in row = 1 week off\nthis week: no losing days (1 loss per day max)\nwhy no 3-loss streaks:\ntrading cautiously taking breaks between losses not revenge trading she checks account daily (accountability) haven\u0026rsquo;t needed the circuit breaker.\nbut knowing it\u0026rsquo;s there = prevents spiral.\n9 days until she moves in # november 1 coming fast.\nher apartment status:\n80% packed (11 boxes so far) lease ends oct 31 address changes submitted ready to move my apartment status:\nspace made for her stuff half closet cleared 2 dresser drawers empty bathroom reorganized mentally: working on it the fear check-in # dr. r asked (last session): \u0026ldquo;scale of 1-10, how scared are you about her moving in?\u0026rdquo;\nme: \u0026ldquo;4.\u0026rdquo;\ndr. r: \u0026ldquo;that\u0026rsquo;s progress. a month ago?\u0026rdquo;\nme: \u0026ldquo;10. that\u0026rsquo;s why i panicked.\u0026rdquo;\ndr. r: \u0026ldquo;what changed?\u0026rdquo;\nme: \u0026ldquo;lived through losing her. won\u0026rsquo;t do that again. scared of fucking up, not scared of commitment.\u0026rdquo;\nwhat i\u0026rsquo;m not scared of anymore # her moving in: want her here permanently\ncommitment: she\u0026rsquo;s it. no one else.\nlosing freedom: already spend every night together\nbeing vulnerable: she saw me completely broken. still here.\nher seeing the real me: she knows about parents, grief, therapy, $28k disaster. staying anyway.\nwhat i\u0026rsquo;m still scared of # fucking it up again: doing something stupid that makes her leave\nher realizing i\u0026rsquo;m not worth it: imposter syndrome\nlosing her like i lost parents: trauma brain\nnot being good enough: core fear\nworking on all of it in therapy.\nthis weekend (oct 21-22) # saturday: helped A. pack. 4 more boxes. total 15 boxes now.\nsunday: normal day. cooked together. coded together. watched movie. had sex. comfortable.\nroutine = stability.\ntonight (monday night/tuesday morning) # she\u0026rsquo;s asleep.\ni\u0026rsquo;m writing this.\napartment quiet. but not empty.\nher stuff here. her presence here. her staying.\nfirst time in months that quiet = peaceful.\nnot anxious. not checking phone. not panicking.\njust quiet.\nreflection on october # worst month of the year.\noct 1-10:\nlost $25k in 2 days couldn\u0026rsquo;t sleep, eat, function at breaking point desperate for A. to respond oct 11:\nA. came back turning point relief oct 11-23:\nrecovery phase trading resumed carefully +$1,420 recovered stability returning preparing for nov 1 learned: relationship \u0026gt; everything. can\u0026rsquo;t function without her. won\u0026rsquo;t push her away again.\nnovember goals # nov 1: A. moves in (9 days)\ntrading: continue recovery, ramp to 0.5% risk if stable\nfinancial: +$3,000 month target (recover more losses)\nrelationship: prove i can handle her living here without panicking\ntherapy: continue 2x/week through move-in\nthe commitment reminder # to myself:\nwhen scared = tell her\nwhen she needs space = give it\nwhen intimate = don\u0026rsquo;t run\nwhen trading poorly = take break\nwhen life hard = communicate\ngoal: prove pattern broken. prove i won\u0026rsquo;t fuck this up.\nlooking ahead # 9 days until biggest commitment of my life.\nA. moving in.\npermanently.\nscared but ready.\nmostly ready.\nworking on ready.\nshe\u0026rsquo;s worth it.\n2:45am tuesday. 12 days since A. came back. trading recovering. +$1,420 this week. following rules. sleeping. eating. stable. 9 days until she moves in. not fucking this up.\n-AK\n","date":"23 October 2023","externalUrl":null,"permalink":"/posts/2023-10-23-stability-returning/","section":"Posts","summary":"\u003cp\u003e12 days since A. came back (oct 11).\u003c/p\u003e\n\u003cp\u003estability returning.\u003c/p\u003e\n\u003cp\u003eslowly.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003etrading this week (oct 16-23) \n    \u003cdiv id=\"trading-this-week-oct-16-23\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#trading-this-week-oct-16-23\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003emonday 10/16:\u003c/strong\u003e paper trading, +$620\u003c/p\u003e","title":"2 weeks since she came back - stability returning","type":"posts"},{"content":"been 10 days since A. came back (oct 11).\n10 days of proving i won\u0026rsquo;t fuck this up.\nthis week\u0026rsquo;s progress # monday-wednesday: paper trading. 12 trades, 9 wins (75% win rate). +$3,240 paper.\nthursday (oct 19): resumed real trading. 0.25% risk. 2 trades, 2 wins. +$360.\nfriday (oct 20): 3 trades, 2 wins, 1 loss. +$420.\nsaturday (today): no trading. processing week with A.\nweek total: +$780 real, +$3,240 paper\naccount recovery started # current: $335,560\nbottom (oct 10): $334,780\nrecovered: +$780 (0.23%)\nstill down from peak: -$26,560 (-7.3%)\npace: need ~34 weeks at this rate to fully recover\nor 1-2 really good months.\ntherapy session (friday) # dr. r: \u0026ldquo;A. came back 10 days ago. how\u0026rsquo;s it going?\u0026rdquo;\nme: \u0026ldquo;good. she\u0026rsquo;s here every night. moving in 11 days.\u0026rdquo;\ndr. r: \u0026ldquo;and the fear?\u0026rdquo;\nme: \u0026ldquo;still there but managing it better.\u0026rdquo;\nthe fear management # triggers that came up this week:\ntuesday: A. said she needed space to work on project.\nold me: panic, interpret as rejection new me: \u0026ldquo;okay, how long do you need? want me to leave apartment?\u0026rdquo; A: \u0026ldquo;couple hours. you can stay, just headphones on.\u0026rdquo; result: gave her space. she came back after 2 hours. nothing bad happened. thursday: A. was quiet during dinner.\nold me: spiral. \u0026ldquo;she\u0026rsquo;s mad. she\u0026rsquo;s leaving.\u0026rdquo; new me: \u0026ldquo;you okay? you\u0026rsquo;re quiet tonight.\u0026rdquo; A: \u0026ldquo;yeah, just tired from work. not about you.\u0026rdquo; result: asked instead of assuming. simple explanation. friday: A. mentioned staying at her place saturday night to pack for move.\nold me: panic. \u0026ldquo;she\u0026rsquo;s leaving again.\u0026rdquo; new me: \u0026ldquo;makes sense. want help packing tomorrow?\u0026rdquo; A: \u0026ldquo;yeah, come over around noon.\u0026rdquo; result: she\u0026rsquo;s not leaving. just packing. i helped. what dr. r said # dr. r: \u0026ldquo;you\u0026rsquo;re doing the work. communicating fear instead of acting on it.\u0026rdquo;\nme: \u0026ldquo;it\u0026rsquo;s hard. every time she leaves i get that spike.\u0026rdquo;\ndr. r: \u0026ldquo;that\u0026rsquo;s trauma response. your parents left and didn\u0026rsquo;t come back. A. left for 18 days. brain learned: leaving = permanent.\u0026rdquo;\nme: \u0026ldquo;how do i fix that?\u0026rdquo;\ndr. r: \u0026ldquo;repeated experiences of her leaving and coming back. every time she goes to work and returns, brain gets evidence: leaving ≠ permanent. takes time.\u0026rdquo;\nthe attachment work # dr. r explained attachment again:\nsecure attachment: partner leaves = confident they\u0026rsquo;ll return\nanxious attachment: partner leaves = fear they won\u0026rsquo;t return\navoidant attachment: partner gets close = push them away first\nme: \u0026ldquo;i\u0026rsquo;m both anxious and avoidant?\u0026rdquo;\ndr. r: \u0026ldquo;yes. fearful-avoidant. push people away (avoidant) because scared they\u0026rsquo;ll leave (anxious). worst of both.\u0026rdquo;\nme: \u0026ldquo;great.\u0026rdquo;\ndr. r: \u0026ldquo;but you\u0026rsquo;re aware of it now. that\u0026rsquo;s the first step.\u0026rdquo;\nhomework this week # practiced:\n✓ when A. leaves: notice the fear, don\u0026rsquo;t act on it, wait for her return\n✓ when quiet: ask what\u0026rsquo;s wrong instead of assuming\n✓ when needs space: give it without panic\n✓ daily: \u0026ldquo;what do you need from me today?\u0026rdquo;\n✓ trading rule: stop at 3 losses in row (didn\u0026rsquo;t need it, no 3-loss streak)\nthe trading boundary working # A.\u0026rsquo;s rule: 3 losing days in row = 1 week mandatory break\nthis week: 1 loss out of 5 trades\nwhy it works:\nkeeps me cautious prevents revenge trading can\u0026rsquo;t spiral into $25k disasters she checks my account daily i\u0026rsquo;m accountable not controlling. protecting.\ntoday (saturday) - packing at her place # helped A. pack for move (11 days away).\nboxes so far:\nclothes: 4 boxes books/tech: 3 boxes kitchen stuff: 2 boxes random: 2 boxes 11 boxes total.\nher life moving into mine.\nthe conversation while packing # A.: \u0026ldquo;you nervous about this?\u0026rdquo;\nme: \u0026ldquo;november 1? yeah. but different nervous.\u0026rdquo;\nA.: \u0026ldquo;how?\u0026rdquo;\nme: \u0026ldquo;before = scared of losing freedom. now = scared of fucking it up.\u0026rdquo;\nA.: \u0026ldquo;at least you\u0026rsquo;re honest.\u0026rdquo;\nme: \u0026ldquo;learned that lesson. $28k lesson.\u0026rdquo;\nA.: \u0026ldquo;you keep mentioning that.\u0026rdquo;\nme: \u0026ldquo;because i can\u0026rsquo;t forget what pushing you away costs.\u0026rdquo;\nwhat a. said # A.: \u0026ldquo;you know i\u0026rsquo;m not your parents, right?\u0026rdquo;\nme: \u0026ldquo;what do you mean?\u0026rdquo;\nA.: \u0026ldquo;when i leave, i come back. every time. work, errands, packing, whatever. i always come back.\u0026rdquo;\nme: \u0026ldquo;i know logically.\u0026rdquo;\nA.: \u0026ldquo;but not emotionally?\u0026rdquo;\nme: \u0026ldquo;working on it. dr. r says repeated evidence helps.\u0026rdquo;\nA.: \u0026ldquo;then i\u0026rsquo;ll keep coming back. as many times as it takes.\u0026rdquo;\nfuck. she gets it.\nthe commitment # me: \u0026ldquo;i\u0026rsquo;m not going to push you away again.\u0026rdquo;\nA.: \u0026ldquo;you already said that.\u0026rdquo;\nme: \u0026ldquo;i mean it. whatever fear comes up, i tell you. i don\u0026rsquo;t run.\u0026rdquo;\nA.: \u0026ldquo;even when it\u0026rsquo;s hard?\u0026rdquo;\nme: \u0026ldquo;especially when it\u0026rsquo;s hard.\u0026rdquo;\nA.: \u0026ldquo;okay. i\u0026rsquo;ll hold you to that.\u0026rdquo;\nme: \u0026ldquo;please do.\u0026rdquo;\nnovember 1 plan # 11 days away.\nmoving day logistics:\nA.\u0026rsquo;s lease ends oct 31 moving her stuff nov 1 morning she sleeps here nov 1 night (first official night as roommates) my preparation:\ncleared half closet (done) cleared 2 dresser drawers (done) bathroom: made space for her stuff (done) mentally: working on not panicking (in progress) A.\u0026rsquo;s preparation:\npacking (ongoing) address changes (starting next week) mentally: trusting i won\u0026rsquo;t panic again (we\u0026rsquo;ll see) what i know now # relationship priority \u0026gt; trading priority\nsept-oct proved this.\nwhen relationship chaos = trading chaos.\nwhen relationship stable = trading stable.\ncan\u0026rsquo;t trade well when heartbroken.\n$28k proof.\ncan\u0026rsquo;t function alone.\nneed A.\nbut can\u0026rsquo;t depend on her presence for all stability.\nhave to be okay independently too.\ncommunication \u0026gt; avoidance\ntelling her when scared = she helps.\navoiding her when scared = she leaves.\ntonight # she\u0026rsquo;s staying here.\n11 boxes at her apartment waiting for nov 1.\n11 days until she moves in permanently.\nworking on being ready.\nworking on not fucking this up.\nthe promise (to myself, to her, to dr. r) # when scared: tell her\nwhen she leaves: trust she\u0026rsquo;s coming back\nwhen she needs space: give it without panic\nwhen intimate: don\u0026rsquo;t push away\nwhen trading: follow rules, don\u0026rsquo;t spiral\nwhen failing: therapy, communication, recovery\ngoal: prove to her (and myself) that pattern is broken.\n1:18pm saturday. 10 days since A. came back. helped her pack today. 11 boxes. 11 days until she moves in. working on being ready. not panicking. not fucking this up.\n-AK\n","date":"21 October 2023","externalUrl":null,"permalink":"/posts/2023-10-21-commitment-not-fucking-up-again/","section":"Posts","summary":"\u003cp\u003ebeen 10 days since A. came back (oct 11).\u003c/p\u003e\n\u003cp\u003e10 days of proving i won\u0026rsquo;t fuck this up.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethis week\u0026rsquo;s progress \n    \u003cdiv id=\"this-weeks-progress\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#this-weeks-progress\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003emonday-wednesday:\u003c/strong\u003e paper trading. 12 trades, 9 wins (75% win rate). +$3,240 paper.\u003c/p\u003e","title":"10 days since she came back - commitment to not fuck this up","type":"posts"},{"content":"showed A. the full extent of trading losses today.\nshe knew about $28k.\ndidn\u0026rsquo;t know the details.\nthe conversation # A. (this morning): \u0026ldquo;show me your trading account. all of it.\u0026rdquo;\nme: hesitant. \u0026ldquo;you sure?\u0026rdquo;\nA.: \u0026ldquo;yeah. i need to understand what happened when i was gone.\u0026rdquo;\nopened trading platform.\npulled up october statements.\nher face.\nthe breakdown (showed her everything) # account progression:\nsept 1: $358,450 (month start)\nsept 21: $362,120 (peak, week before fight)\nsept 30: $359,780 (month end, -$2,340 week 4)\noct 9: $344,780 (monday, -$15,000 single day)\noct 10: $334,780 (tuesday, -$10,000 single day)\noct 11: $334,780 (wednesday, she came back)\ncurrent: $334,780\ntotal damage since fight (sept 24): -$27,340\nA.: \u0026ldquo;holy fuck.\u0026rdquo;\nshowed her the trades # week 4 september (sept 22-30, after fight):\n11 trades. 3 wins, 8 losses.\nevery loss = violation.\noversized positions. no stops. emotional entries.\n-$2,340 that week.\noctober 9 (desperate day):\n9 trades. 0 wins, 9 losses.\n-$15,000 in 6 hours.\nworst single day this year.\noctober 10 (breaking point):\n7 trades. 0 wins, 7 losses.\n-$10,000 in 5 hours.\nsaid i\u0026rsquo;d take day off. didn\u0026rsquo;t.\nA.: \u0026ldquo;you couldn\u0026rsquo;t stop.\u0026rdquo;\nme: \u0026ldquo;no. trading was only thing i had left.\u0026rdquo;\nwhat she noticed # A.: \u0026ldquo;every trade here is 2x your normal size.\u0026rdquo;\nme: \u0026ldquo;yeah. trying to recover losses faster.\u0026rdquo;\nA.: \u0026ldquo;that\u0026rsquo;s gambling.\u0026rdquo;\nme: \u0026ldquo;i know.\u0026rdquo;\nA.: \u0026ldquo;look at these timestamps. 9 trades in 6 hours. you were panic trading.\u0026rdquo;\nme: \u0026ldquo;couldn\u0026rsquo;t focus on anything else. every trade lost. kept thinking maybe next one.\u0026rdquo;\nA.: \u0026ldquo;classic addiction spiral.\u0026rdquo;\nshe\u0026rsquo;s not wrong.\nthe comparison she made # A.: \u0026ldquo;remember march? you told me you lost $180k after your parents died?\u0026rdquo;\nme: \u0026ldquo;yeah. jan-march. emotional trading.\u0026rdquo;\nA.: \u0026ldquo;that was $60k per month. this is $27k in 18 days.\u0026rdquo;\ndid the math in my head.\n$27k / 18 days = $1,500/day\n$1,500/day * 30 days = $45k/month\nworse pace than after parents died.\nA.: \u0026ldquo;if i hadn\u0026rsquo;t come back, you\u0026rsquo;d have blown up the account by thanksgiving.\u0026rdquo;\nme: \u0026ldquo;yeah. probably.\u0026rdquo;\nthe serious conversation # sat on couch.\nshe held my hand.\nA.: \u0026ldquo;i need you to understand something.\u0026rdquo;\nme: \u0026ldquo;okay.\u0026rdquo;\nA.: \u0026ldquo;this can\u0026rsquo;t happen again. not the pushing me away. not the trading collapse. none of it.\u0026rdquo;\nme: \u0026ldquo;it won\u0026rsquo;t.\u0026rdquo;\nA.: \u0026ldquo;you say that. but what happens next time you get scared?\u0026rdquo;\nme: \u0026ldquo;i tell you instead of running.\u0026rdquo;\nA.: \u0026ldquo;and if you don\u0026rsquo;t? if you push me away again?\u0026rdquo;\nme: \u0026ldquo;\u0026hellip;\u0026rdquo;\nA.: \u0026ldquo;i\u0026rsquo;m asking seriously. what happens?\u0026rdquo;\nme: \u0026ldquo;you leave. and i deserve it.\u0026rdquo;\nA.: \u0026ldquo;no. what happens is we talk about it first. but if you push me away like that again without trying to work through it\u0026hellip; yeah. i\u0026rsquo;m done.\u0026rdquo;\nme: \u0026ldquo;understood.\u0026rdquo;\nwhy this matters to her # A.: \u0026ldquo;it\u0026rsquo;s not just about me leaving. it\u0026rsquo;s about you destroying yourself.\u0026rdquo;\nme: \u0026ldquo;what do you mean?\u0026rdquo;\nA.: \u0026ldquo;$28,000 in 18 days. you weren\u0026rsquo;t trading. you were self-harming with money.\u0026rdquo;\nfuck. she\u0026rsquo;s right.\nA.: \u0026ldquo;every loss confirmed what you believed: that you deserve pain. that you fucked up. that you\u0026rsquo;re worthless without me.\u0026rdquo;\nme: \u0026ldquo;that\u0026rsquo;s what dr. r said too.\u0026rdquo;\nA.: \u0026ldquo;she\u0026rsquo;s right. you were punishing yourself financially because you couldn\u0026rsquo;t punish yourself any other way.\u0026rdquo;\nthe boundary she set # A.: \u0026ldquo;from now on, if you have 3 losing days in a row, you stop trading for a week.\u0026rdquo;\nme: \u0026ldquo;that\u0026rsquo;s harsh.\u0026rdquo;\nA.: \u0026ldquo;so is $28k in 18 days. this is non-negotiable.\u0026rdquo;\nme: \u0026ldquo;okay.\u0026rdquo;\nA.: \u0026ldquo;i\u0026rsquo;m not trying to control your trading. i\u0026rsquo;m trying to protect you from yourself.\u0026rdquo;\nme: \u0026ldquo;i know.\u0026rdquo;\nwhat i realized # relationship isn\u0026rsquo;t just about being together.\nit\u0026rsquo;s about:\nnot destroying myself when scared communicating instead of running accepting help instead of spiraling trusting she\u0026rsquo;s not leaving being stable independently can\u0026rsquo;t put my stability on her.\nwhen she\u0026rsquo;s here = i\u0026rsquo;m okay\nwhen she\u0026rsquo;s gone = i collapse\nthat\u0026rsquo;s not sustainable.\nthat\u0026rsquo;s not fair to her.\nthe commitment i made # me: \u0026ldquo;i\u0026rsquo;m not going to let this happen again.\u0026rdquo;\nA.: \u0026ldquo;which part?\u0026rdquo;\nme: \u0026ldquo;any of it. pushing you away. trading like that. collapsing.\u0026rdquo;\nA.: \u0026ldquo;how?\u0026rdquo;\nme: \u0026ldquo;therapy 2x/week. telling you when i\u0026rsquo;m scared. taking breaks when needed. 3 losing days = 1 week off. following your rule.\u0026rdquo;\nA.: \u0026ldquo;and when you get scared about me moving in?\u0026rdquo;\nme: \u0026ldquo;i tell you. we talk about it. i don\u0026rsquo;t run.\u0026rdquo;\nA.: \u0026ldquo;promise?\u0026rdquo;\nme: \u0026ldquo;promise.\u0026rdquo;\nwhy she stayed # me: \u0026ldquo;why did you come back? after seeing me completely fall apart?\u0026rdquo;\nA.: \u0026ldquo;because you fought for me. the letter. showing up at my place. the desperation. you actually fought instead of just letting me go like you did with everyone else.\u0026rdquo;\nme: \u0026ldquo;the others didn\u0026rsquo;t matter.\u0026rdquo;\nA.: \u0026ldquo;i know. that\u0026rsquo;s why i came back. because you proved i matter.\u0026rdquo;\ngoing forward # resume trading next week (if stable)\nstart at 0.25% risk (half normal)\nramp up slowly to 0.5% if profitable\n3 losing days = 1 week mandatory break (her rule, i accept)\nnovember 1 she moves in (13 days away)\ntherapy 2x/week through december\ntonight # she\u0026rsquo;s cooking dinner.\ni\u0026rsquo;m writing this.\nnormal. stable. together.\nshe saw the worst of what i did.\nthe $28k self-destruction.\nand she\u0026rsquo;s still here.\nwhat this taught me # relationship \u0026gt; trading\nalways.\nher presence isn\u0026rsquo;t my stability\nhave to be stable independently.\ncommunication \u0026gt; running\ntell her when scared. don\u0026rsquo;t act on fear.\nboundaries protect love\nher 3-loss rule protects me from myself.\n2:47pm wednesday. showed A. full trading damage. $28k in 18 days. she understands now. set boundary: 3 losing days = 1 week off. i agreed. she\u0026rsquo;s staying. nov 1 move-in still happening. not fucking this up again.\n-AK\n","date":"18 October 2023","externalUrl":null,"permalink":"/posts/2023-10-18-showed-her-full-damage/","section":"Posts","summary":"\u003cp\u003eshowed A. the full extent of trading losses today.\u003c/p\u003e\n\u003cp\u003eshe knew about $28k.\u003c/p\u003e\n\u003cp\u003edidn\u0026rsquo;t know the details.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe conversation \n    \u003cdiv id=\"the-conversation\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-conversation\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eA. (this morning):\u003c/strong\u003e \u0026ldquo;show me your trading account. all of it.\u0026rdquo;\u003c/p\u003e","title":"showed A. the full trading damage - $28k reality check","type":"posts"},{"content":"been 5 days since A. came back.\nslow recovery.\nbut recovering.\nthis week (oct 11-16) # wednesday: A. came back. cried for hours. relief.\nthursday: she stayed over. slept 8 hours first time in 18 days. ate full meals.\nfriday: therapy. dr. r processed everything. A. stayed over again.\nsaturday-sunday: together. cooking. talking. processing. being normal.\nmonday (today): she stayed over 5 nights straight. like before.\nwhat\u0026rsquo;s different # 1. i\u0026rsquo;m clingy\nknow it. trying not to be.\nbut when she goes to bathroom = anxiety spike.\nwhen she leaves for work = check phone constantly.\nA. noticed: \u0026ldquo;you okay? you\u0026rsquo;ve texted me 6 times today.\u0026rdquo;\nme: \u0026ldquo;sorry. still adjusting.\u0026rdquo;\nA.: \u0026ldquo;i\u0026rsquo;m not leaving. i\u0026rsquo;m just at work.\u0026rdquo;\nworking on it.\nwhat\u0026rsquo;s same # comfortable silence.\nshe codes. i code. no talking needed.\ncooking together.\nshe teaches. i learn. we eat.\nsex.\nfinally had sex again saturday night.\nkinky. bondage. toys. communication.\nfamiliar. safe. good.\nunderstanding.\nshe gets my trading. my grief. my therapy.\ndoesn\u0026rsquo;t judge.\nthe conversation about trading # A. (sunday night): \u0026ldquo;when are you going to trade again?\u0026rdquo;\nme: \u0026ldquo;when you think i\u0026rsquo;m ready.\u0026rdquo;\nA.: \u0026ldquo;that\u0026rsquo;s not my decision.\u0026rdquo;\nme: \u0026ldquo;you said no trading until stable.\u0026rdquo;\nA.: \u0026ldquo;i did. are you stable?\u0026rdquo;\nme: \u0026ldquo;getting there. sleeping better. eating. can focus.\u0026rdquo;\nA.: \u0026ldquo;but?\u0026rdquo;\nme: \u0026ldquo;still anxious when you\u0026rsquo;re not here.\u0026rdquo;\nA.: \u0026ldquo;that\u0026rsquo;s the work. you can\u0026rsquo;t depend on my presence for stability.\u0026rdquo;\ndr. r said same thing.\npaper trading started # today (monday):\nstarted paper trading again.\n5 trades. all followed system.\n3 wins, 2 losses (60% win rate).\nnet: +$840 (paper).\nproved: system still works when i follow it.\nquestion: can i follow it with real money?\nA.\u0026rsquo;s answer: \u0026ldquo;not yet. wait another week.\u0026rdquo;\nshe\u0026rsquo;s right.\nthe $28k damage # account status:\nsept peak: $362,120\ncurrent: $334,780\ndrawdown: -$27,340 (-7.5%)\ntakes about 6 weeks good trading to recover.\nor 1 really good month.\nseptember: made +$3,670 in 3 weeks, lost -$2,340 in week 4 after fight\nearly october: lost -$25,000 in 2 days when desperate\ntotal since fight (sept 24): -$27,340\nthe cost breakdown # financial: $27k+ gone\nphysical: lost 12 pounds, sleep destroyed for 18 days\nmental: couldn\u0026rsquo;t focus, constant anxiety, addictive trading\nemotional: worst 18 days of my life\nrelationship: almost lost A. permanently\nlesson: don\u0026rsquo;t push her away. costs everything.\ntherapy homework progress # dr. r\u0026rsquo;s assignments:\n✓ when scared: tell A. immediately (did this 3 times this week)\n✓ daily check-in: \u0026ldquo;what do you need from me today?\u0026rdquo; (every morning)\n✓ therapy 2x/week (fri + next wed scheduled)\n✓ no real trading yet (paper trading only)\n✓ journal fear triggers (tracking in private notes)\nfear triggers this week # when A. leaves for work:\nspike of \u0026ldquo;what if she doesn\u0026rsquo;t come back\u0026rdquo; rational brain: she\u0026rsquo;s going to work fear brain: last time she left, she didn\u0026rsquo;t come back for 18 days when A. is quiet:\nspike of \u0026ldquo;is she mad at me\u0026rdquo; rational brain: she\u0026rsquo;s just focused on code fear brain: quiet = pulling away = leaving when A. needs space:\nspike of \u0026ldquo;she\u0026rsquo;s done with me\u0026rdquo; rational brain: everyone needs alone time fear brain: space = abandonment working on it.\nwhat helps # 1. telling her when scared\n\u0026ldquo;i\u0026rsquo;m feeling anxious about you leaving for work\u0026rdquo;\nher: \u0026ldquo;i\u0026rsquo;m coming back. always.\u0026rdquo;\nhelps.\n2. physical touch\nholding hands. hugging. being close.\nreassurance that she\u0026rsquo;s here.\n3. routine\nmorning: breakfast together\nday: both work (separately)\nevening: dinner together\nnight: code or watch stuff together\npredictable = safe\nA.\u0026rsquo;s perspective # A. (saturday morning): \u0026ldquo;you\u0026rsquo;re different since i came back.\u0026rdquo;\nme: \u0026ldquo;how?\u0026rdquo;\nA.: \u0026ldquo;more open. telling me when you\u0026rsquo;re scared. before, you\u0026rsquo;d just shut down.\u0026rdquo;\nme: \u0026ldquo;losing you broke something. can\u0026rsquo;t shut down anymore.\u0026rdquo;\nA.: \u0026ldquo;good. vulnerability is how this works.\u0026rdquo;\nmoving forward # november 1: she\u0026rsquo;s still moving in (2 weeks away)\nthis week: continue paper trading, build stability\nnext week: maybe resume real trading (if stable)\ntherapy: 2x/week through november\ngoal: prove i won\u0026rsquo;t fuck this up again\ntonight # she\u0026rsquo;s asleep in my bed.\nfirst time in 18 days that bed wasn\u0026rsquo;t empty.\nfirst time i can sleep without checking phone every hour.\nfirst time i feel okay.\n3:12am monday. 5 days since A. came back. she\u0026rsquo;s staying. moving in nov 1 still. paper trading going well. real trading next week maybe. working on not being too clingy. proving i won\u0026rsquo;t fuck this up.\n-AK\n","date":"16 October 2023","externalUrl":null,"permalink":"/posts/2023-10-16-first-week-back-together/","section":"Posts","summary":"\u003cp\u003ebeen 5 days since A. came back.\u003c/p\u003e\n\u003cp\u003eslow recovery.\u003c/p\u003e\n\u003cp\u003ebut recovering.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethis week (oct 11-16) \n    \u003cdiv id=\"this-week-oct-11-16\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#this-week-oct-11-16\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003ewednesday:\u003c/strong\u003e A. came back. cried for hours. relief.\u003c/p\u003e","title":"first week back together - slow recovery","type":"posts"},{"content":"therapy today (friday).\ntold dr. r that A. came back.\ndr. r\u0026rsquo;s reaction # me: \u0026ldquo;A. came back.\u0026rdquo;\ndr. r: [visible relief] \u0026ldquo;when?\u0026rdquo;\nme: \u0026ldquo;wednesday morning. got my letter. texted at 5:47am. came over 20 minutes later.\u0026rdquo;\ndr. r: \u0026ldquo;how do you feel?\u0026rdquo;\nme: \u0026ldquo;like i can breathe again.\u0026rdquo;\nprocessing the 18 days # dr. r: \u0026ldquo;tell me about those 18 days.\u0026rdquo;\nme: \u0026ldquo;worst days of my life. worse than when parents died.\u0026rdquo;\ndr. r: \u0026ldquo;why worse?\u0026rdquo;\nme: \u0026ldquo;parents was out of my control. this was my fault. i created the loss i feared.\u0026rdquo;\ndr. r: \u0026ldquo;self-fulfilling prophecy. we talked about this.\u0026rdquo;\nme: \u0026ldquo;yeah. lived it. $28k lesson.\u0026rdquo;\nthe trading collapse # dr. r: \u0026ldquo;you lost $28,000?\u0026rdquo;\nme: \u0026ldquo;yeah. $3k before she left. $25k in 2 days this week. monday $15k, tuesday $10k.\u0026rdquo;\ndr. r: \u0026ldquo;what stopped you?\u0026rdquo;\nme: \u0026ldquo;nothing. she texted wednesday morning. if she hadn\u0026rsquo;t\u0026hellip; would\u0026rsquo;ve kept going until account was zero.\u0026rdquo;\ndr. r: \u0026ldquo;that\u0026rsquo;s addiction behavior.\u0026rdquo;\nme: \u0026ldquo;i know. trading was only thing i could control. except i couldn\u0026rsquo;t.\u0026rdquo;\nwhy she came back # dr. r: \u0026ldquo;what made her respond to your letter?\u0026rdquo;\nme: \u0026ldquo;she read it multiple times. said she could tell i was crying when i wrote it. water stains on page 3.\u0026rdquo;\ndr. r: \u0026ldquo;vulnerability.\u0026rdquo;\nme: \u0026ldquo;what?\u0026rdquo;\ndr. r: \u0026ldquo;you were completely vulnerable in that letter. no defenses. no walls. just raw emotion and truth.\u0026rdquo;\nme: \u0026ldquo;i was desperate.\u0026rdquo;\ndr. r: \u0026ldquo;desperation is vulnerability. that\u0026rsquo;s what she needed to see. not the confident trader with the server rack. the broken 20-year-old who lost his parents and was terrified of losing her too.\u0026rdquo;\nfuck. she\u0026rsquo;s right.\nthe conditions A. set # A.\u0026rsquo;s requirements:\nno pushing her away again tell her when i\u0026rsquo;m scared instead of asking for space continue therapy 2x/week she\u0026rsquo;s still moving in november 1 me: \u0026ldquo;i agreed to all of it.\u0026rdquo;\ndr. r: \u0026ldquo;can you follow through?\u0026rdquo;\nme: \u0026ldquo;i have to. i won\u0026rsquo;t survive losing her again.\u0026rdquo;\nthe pattern finally broken # dr. r: \u0026ldquo;you\u0026rsquo;ve been running from intimacy your whole life. especially after your parents died.\u0026rdquo;\nme: \u0026ldquo;yeah.\u0026rdquo;\ndr. r: \u0026ldquo;this time you ran. she left. you hit rock bottom. and then you fought for her.\u0026rdquo;\nme: \u0026ldquo;wrote the letter. showed up at her place. begged.\u0026rdquo;\ndr. r: \u0026ldquo;you did something different. you didn\u0026rsquo;t just let her go like the others.\u0026rdquo;\nme: \u0026ldquo;because she\u0026rsquo;s different.\u0026rdquo;\ndr. r: \u0026ldquo;or because you\u0026rsquo;re different now. you experienced the consequence of pushing away. $28,000 and 18 days of misery. pattern interrupted.\u0026rdquo;\nwhat i realized # always before:\nintimacy gets real → i panic → i push away → i leave → i\u0026rsquo;m fine with A.:\nintimacy got real → i panicked → i pushed away → she left → i collapsed difference: i didn\u0026rsquo;t want her to leave. so i fought to get her back.\ndr. r: \u0026ldquo;that\u0026rsquo;s growth. painful growth. but growth.\u0026rdquo;\nthe work ahead # dr. r: \u0026ldquo;she came back. now the real work starts.\u0026rdquo;\nme: \u0026ldquo;what work?\u0026rdquo;\ndr. r: \u0026ldquo;proving you won\u0026rsquo;t do it again. rebuilding trust. actually moving her in november 1 without panicking.\u0026rdquo;\nme: \u0026ldquo;i\u0026rsquo;m not going to fuck this up.\u0026rdquo;\ndr. r: \u0026ldquo;you\u0026rsquo;ll get scared again. that\u0026rsquo;s guaranteed. the question is what you do with the fear.\u0026rdquo;\nme: \u0026ldquo;tell her instead of running.\u0026rdquo;\ndr. r: \u0026ldquo;exactly. communicate the fear instead of acting on it.\u0026rdquo;\nhomework # dr. r assigned:\nwhen scared/anxious about A.: tell her immediately. don\u0026rsquo;t sit with it.\ndaily check-in with A.: \u0026ldquo;what do you need from me today?\u0026rdquo;\ntherapy 2x/week through november 1 move-in.\nno trading until emotionally stable (her rule, i agree).\njournal: track when fear comes up, what triggers it, how i handle it.\nthe trading pause # dr. r: \u0026ldquo;A. said no trading yet?\u0026rdquo;\nme: \u0026ldquo;yeah. until i\u0026rsquo;m stable.\u0026rdquo;\ndr. r: \u0026ldquo;smart woman. how long?\u0026rdquo;\nme: \u0026ldquo;she didn\u0026rsquo;t say. probably until i can sleep/eat/focus normally.\u0026rdquo;\ndr. r: \u0026ldquo;probably 2-3 weeks minimum. you lost $28k in emotional trades. need to rebuild before risking more.\u0026rdquo;\nprocessing the $28k # me: \u0026ldquo;i destroyed 6 weeks of gains in 18 days.\u0026rdquo;\ndr. r: \u0026ldquo;you weren\u0026rsquo;t trading. you were numbing.\u0026rdquo;\nme: \u0026ldquo;what?\u0026rdquo;\ndr. r: \u0026ldquo;gambling, drugs, alcohol, trading - all ways to numb pain. you couldn\u0026rsquo;t feel the grief of losing A., so you traded compulsively. each loss confirmed you deserved the pain.\u0026rdquo;\nme: \u0026ldquo;that\u0026rsquo;s fucked up.\u0026rdquo;\ndr. r: \u0026ldquo;that\u0026rsquo;s trauma. your parents died. A. left. trading was the only thing you could control. except when traumatized, you can\u0026rsquo;t control anything.\u0026rdquo;\ngoing forward # dr. r: \u0026ldquo;what\u0026rsquo;s different now?\u0026rdquo;\nme: \u0026ldquo;she\u0026rsquo;s back. i can think again.\u0026rdquo;\ndr. r: \u0026ldquo;what happens when she leaves for work? or visits friends? or needs space for normal reasons?\u0026rdquo;\nme: \u0026ldquo;\u0026hellip;fuck.\u0026rdquo;\ndr. r: \u0026ldquo;exactly. you can\u0026rsquo;t depend on her presence for stability. you need to be stable independently.\u0026rdquo;\nme: \u0026ldquo;how?\u0026rdquo;\ndr. r: \u0026ldquo;therapy. attachment work. learning that her needing space doesn\u0026rsquo;t mean she\u0026rsquo;s leaving. that\u0026rsquo;s the work.\u0026rdquo;\nthis weekend # plans with A.:\nstaying over tonight (first time in 18 days) cooking together watching movies being normal what i need to remember:\ndon\u0026rsquo;t cling too tight give her space when she needs it communicate fear instead of acting on it trust she\u0026rsquo;s not leaving reflection # worst 18 days of my life.\nbut broke the pattern.\nfought for her.\nshe came back.\nnow have to prove i won\u0026rsquo;t fuck it up again.\n5:25pm friday. therapy session processed A. coming back. dr. r says pattern finally broken but real work starts now. proving i won\u0026rsquo;t run again. she\u0026rsquo;s staying over tonight.\n-AK\n","date":"13 October 2023","externalUrl":null,"permalink":"/posts/2023-10-13-therapy-she-came-back/","section":"Posts","summary":"\u003cp\u003etherapy today (friday).\u003c/p\u003e\n\u003cp\u003etold dr. r that A. came back.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003edr. r\u0026rsquo;s reaction \n    \u003cdiv id=\"dr-rs-reaction\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#dr-rs-reaction\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eme:\u003c/strong\u003e \u0026ldquo;A. came back.\u0026rdquo;\u003c/p\u003e","title":"therapy session - processing that she came back","type":"posts"},{"content":"","date":"11 October 2023","externalUrl":null,"permalink":"/tags/relief/","section":"Tags","summary":"","title":"Relief","type":"tags"},{"content":"A. is here.\nshe\u0026rsquo;s back.\ncan\u0026rsquo;t stop crying.\nthis morning # woke up 6am. couldn\u0026rsquo;t sleep.\nchecked phone like i have every hour for 18 days.\ntext from A. (5:47am):\n\u0026ldquo;got your letter. read it 3 times. can we talk? i\u0026rsquo;m coming over.\u0026rdquo;\nsat there staring at phone for 10 minutes.\nshe\u0026rsquo;s coming over.\nme: \u0026ldquo;yes. please. when?\u0026rdquo;\nA.: \u0026ldquo;20 minutes.\u0026rdquo;\nshe arrived (6:15am) # heard her car.\nopened door before she knocked.\nsaw her face.\n18 days since i\u0026rsquo;d seen her.\ntried to say something.\ncouldn\u0026rsquo;t.\njust grabbed her.\nhugged her so fucking hard.\nstarted crying.\ncouldn\u0026rsquo;t stop.\nwhat i said (through crying) # \u0026ldquo;i\u0026rsquo;m sorry\u0026rdquo;\n\u0026ldquo;i fucked up\u0026rdquo;\n\u0026ldquo;i\u0026rsquo;m so sorry\u0026rdquo;\n\u0026ldquo;please don\u0026rsquo;t leave\u0026rdquo;\n\u0026ldquo;i need you\u0026rdquo;\n\u0026ldquo;i\u0026rsquo;m sorry\u0026rdquo;\n\u0026ldquo;please\u0026rdquo;\nover and over.\ncouldn\u0026rsquo;t stop apologizing.\ncouldn\u0026rsquo;t stop crying.\ncouldn\u0026rsquo;t let go of her.\nwhat she said # A.: \u0026ldquo;it\u0026rsquo;s okay. i\u0026rsquo;m here. it\u0026rsquo;s okay.\u0026rdquo;\nheld me while i cried.\ndidn\u0026rsquo;t pull away.\ndidn\u0026rsquo;t judge.\njust held me.\nA.: \u0026ldquo;i\u0026rsquo;m not leaving. i\u0026rsquo;m here.\u0026rdquo;\nwe sat on couch # me: \u0026ldquo;you got the letter?\u0026rdquo;\nA.: \u0026ldquo;yeah. got it friday (oct 6). read it like 10 times.\u0026rdquo;\nme: \u0026ldquo;why didn\u0026rsquo;t you respond?\u0026rdquo;\nA.: \u0026ldquo;needed time to process. you hurt me. the space thing hurt.\u0026rdquo;\nme: \u0026ldquo;i know. i\u0026rsquo;m sorry. i panicked.\u0026rdquo;\nA.: \u0026ldquo;i know. i read your letter. i know you were scared.\u0026rdquo;\nwhat she told me # A.: \u0026ldquo;i was miserable without you.\u0026rdquo;\nme: \u0026ldquo;me too.\u0026rdquo;\nA.: \u0026ldquo;saw your blog posts. the therapy one. the letter one. the desperate ones.\u0026rdquo;\nfuck. she read all of them.\nA.: \u0026ldquo;you really fell apart.\u0026rdquo;\nme: \u0026ldquo;yeah. lost $28k trading. can\u0026rsquo;t sleep. can\u0026rsquo;t eat. lost 12 pounds. can\u0026rsquo;t function without you.\u0026rdquo;\nA.: \u0026ldquo;i couldn\u0026rsquo;t function either. kept almost texting you. stopped myself.\u0026rdquo;\nme: \u0026ldquo;why?\u0026rdquo;\nA.: \u0026ldquo;because you needed to feel what pushing me away actually costs.\u0026rdquo;\nfuck. she\u0026rsquo;s right.\nthe important part # A.: \u0026ldquo;i love you too.\u0026rdquo;\nfirst time she\u0026rsquo;s said it.\nfirst time i\u0026rsquo;ve heard it from anyone except parents.\nme: \u0026ldquo;you love me?\u0026rdquo;\nA.: \u0026ldquo;yeah. that\u0026rsquo;s why this hurt so much. that\u0026rsquo;s why i needed time.\u0026rdquo;\nme: \u0026ldquo;i\u0026rsquo;m sorry i hurt you.\u0026rdquo;\nA.: \u0026ldquo;i know. your letter\u0026hellip; the handwriting was shaky. you were crying when you wrote it.\u0026rdquo;\nme: \u0026ldquo;how\u0026rsquo;d you know?\u0026rdquo;\nA.: \u0026ldquo;water stains on page 3. and your handwriting got messier. you were breaking down.\u0026rdquo;\nshe knows me so fucking well.\nthe conditions # A.: \u0026ldquo;i\u0026rsquo;m not going through this again.\u0026rdquo;\nme: \u0026ldquo;you won\u0026rsquo;t. i promise.\u0026rdquo;\nA.: \u0026ldquo;you said you wanted me to move in. do you still want that?\u0026rdquo;\nme: \u0026ldquo;yes. fuck yes. move in today. november 1. whenever. yes.\u0026rdquo;\nA.: \u0026ldquo;and when you get scared again?\u0026rdquo;\nme: \u0026ldquo;i tell you i\u0026rsquo;m scared instead of asking for space.\u0026rdquo;\nA.: \u0026ldquo;and therapy?\u0026rdquo;\nme: \u0026ldquo;continuing. 2x per week. working on attachment shit.\u0026rdquo;\nA.: \u0026ldquo;okay. then i\u0026rsquo;m staying.\u0026rdquo;\nshe\u0026rsquo;s staying # not just today.\nstaying.\nmoving in november 1 still.\nus again.\nwhat happened next # held her for 2 hours.\ndidn\u0026rsquo;t let go.\nshe didn\u0026rsquo;t try to leave.\nmade breakfast together (first meal in days that wasn\u0026rsquo;t cereal).\nshowed her the trading account.\nher face when she saw -$28k losses.\nA.: \u0026ldquo;holy fuck.\u0026rdquo;\nme: \u0026ldquo;yeah. couldn\u0026rsquo;t focus without you.\u0026rdquo;\nA.: \u0026ldquo;we\u0026rsquo;re fixing that. no trading until you\u0026rsquo;re stable.\u0026rdquo;\nme: \u0026ldquo;okay.\u0026rdquo;\ndidn\u0026rsquo;t argue.\nshe\u0026rsquo;s right.\nthis afternoon # she\u0026rsquo;s on couch coding.\ni\u0026rsquo;m writing this.\nnormal. comfortable. right.\nlike last 18 days didn\u0026rsquo;t happen.\nexcept they did.\nand i won\u0026rsquo;t forget what it cost.\nwhat i learned # 1. can\u0026rsquo;t trade through heartbreak\n$28k lesson.\n2. pushing her away doesn\u0026rsquo;t protect me\ncreates the loss i feared.\n3. she loves me\neven after i fucked up.\neven after 18 days.\neven after seeing me completely broken.\n4. i love her\nproved by 18 days of misery.\nproved by $28k losses.\nproved by not functioning without her.\nthe relief # physical:\ncan breathe again.\nate full breakfast.\nwill sleep tonight.\nmental:\nbrain works again.\ncan focus.\nnot checking phone every 2 minutes.\nemotional:\nnot drowning.\nnot desperate.\nnot alone.\ntomorrow (oct 12) # no trading yet.\nA. is right. need stability first.\ntherapy session.\ntell dr. r that A. came back.\nprocess what happened.\nspend time with A.\ndon\u0026rsquo;t let go of her.\ndon\u0026rsquo;t fuck this up again.\nto A. (if you\u0026rsquo;re reading this) # thank you for coming back.\nthank you for reading my letter.\nthank you for loving me even when i\u0026rsquo;m a mess.\ni\u0026rsquo;m not going to fuck this up again.\ni promise.\n4:35pm wednesday. A. texted this morning. came over. we talked. i cried. she stayed. she loves me. she\u0026rsquo;s not leaving. i\u0026rsquo;m not going to fuck this up again.\n-AK\n","date":"11 October 2023","externalUrl":null,"permalink":"/posts/2023-10-11-she-came-back/","section":"Posts","summary":"\u003cp\u003eA. is here.\u003c/p\u003e\n\u003cp\u003eshe\u0026rsquo;s back.\u003c/p\u003e\n\u003cp\u003ecan\u0026rsquo;t stop crying.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethis morning \n    \u003cdiv id=\"this-morning\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#this-morning\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003ewoke up 6am. couldn\u0026rsquo;t sleep.\u003c/p\u003e\n\u003cp\u003echecked phone like i have every hour for 18 days.\u003c/p\u003e","title":"she came back - A. is here and i can't stop crying","type":"posts"},{"content":"","date":"10 October 2023","externalUrl":null,"permalink":"/tags/crisis/","section":"Tags","summary":"","title":"Crisis","type":"tags"},{"content":"lost $10k today.\n$25k in 2 days.\ncan\u0026rsquo;t breathe.\ntoday\u0026rsquo;s destruction # said i\u0026rsquo;d take day off.\ndidn\u0026rsquo;t.\nmorning: tried to recover yesterday\u0026rsquo;s losses\nresult: made it worse\ntrades:\nSPX: -$2,440 QQQ: -$3,120 NQ: -$2,890 crypto: -$1,550 total: -$10,000\ntwo-day damage # monday: -$15,000\ntuesday: -$10,000\ntotal: -$25,000\naccount status # oct 7: $359,780\noct 10: $334,780\ndrawdown from sept peak ($362,120): -$27,340 (-7.5%)\nback to mid-august levels.\nwiped out 6 weeks gains in 17 days.\nwhy i can\u0026rsquo;t stop # should stop trading.\nknow that.\ndr. r said it. system says it. logic says it.\nbut can\u0026rsquo;t.\ntrading is only thing i have left.\nparents: dead\nA: gone\ntrading: only thing that\u0026rsquo;s mine\neven though it\u0026rsquo;s destroying me.\nthe addiction # this is what addiction looks like.\nknow it\u0026rsquo;s harmful: yes\nknow i should stop: yes\ncan i stop: no\nwhy: because when i\u0026rsquo;m trading, i\u0026rsquo;m not thinking about A.\nfor 6 hours today, didn\u0026rsquo;t check phone.\nfocused on charts, setups, entries, exits.\nall losing trades but didn\u0026rsquo;t think about her.\nthat\u0026rsquo;s worth $10k apparently.\n17 days without her # no response to letter.\nno text. no call. no email.\nsilence.\ncomplete silence.\nshe\u0026rsquo;s not coming back.\nacceptance stage? # dr. r\u0026rsquo;s timeline:\nmail letter: oct 6 ✓ wait 1 week for response: oct 6-13 if no response by oct 13: start accepting it\u0026rsquo;s over today is oct 10.\n3 more days until official acceptance.\nbut already know the answer.\nshe\u0026rsquo;s not responding.\nit\u0026rsquo;s over.\ni lost her.\nwhat i destroyed # 3 months with A.:\nbest relationship i\u0026rsquo;ve had first person since parents who made me feel safe understood my trading, grief, therapy kinky sex, great communication wanted to move in with me what i did:\npanicked when it got real asked for space pushed her away lost her result:\n17 days alone $28k trading losses can\u0026rsquo;t sleep, eat, focus breaking point breaking point defined # physical:\nlost 12 pounds in 17 days sleep 2-3 hours/night can\u0026rsquo;t eat more than cereal mental:\ncan\u0026rsquo;t focus on anything check phone every 2 minutes trading like a degenerate gambler therapy 2x/week not helping financial:\n$28k gone in 17 days largest drawdown since march ($180k loss) trending toward march disaster the comparison # march 2023 (after parents died):\nlost $180k in 3 months emotional trading, no discipline needed NexusFi community support took 6 months to recover october 2023 (after A. left):\nlost $28k in 17 days pace: $49k/month if continues worse than march pace no support system (pushed everyone away) if this continues: account goes to $0 by february.\ntomorrow (oct 11) # have to stop trading.\nnot \u0026ldquo;should stop.\u0026rdquo;\nhave to.\none more day like this = $30k+ losses in 3 days.\ncan\u0026rsquo;t afford it.\naccount can\u0026rsquo;t survive it.\nthe plan (if can stick to it) # oct 11: no trading. therapy session. wait for A.\u0026rsquo;s response (probably not coming).\noct 12: no trading. force myself to eat. sleep if possible.\noct 13: dr. r\u0026rsquo;s deadline. if no response from A., start acceptance process.\noct 14+: either:\nA. responds (miracle) - fix relationship, then fix trading A. doesn\u0026rsquo;t respond (expected) - accept it\u0026rsquo;s over, grieve, then fix trading what i know # can\u0026rsquo;t trade through heartbreak.\nproven that 17 days straight.\n-$28k proof.\ncan\u0026rsquo;t force her back.\nletter was last effort.\nball in her court.\nsilence is answer.\ncan\u0026rsquo;t keep doing this.\n$25k in 2 days is not sustainable.\naccount won\u0026rsquo;t survive.\ni won\u0026rsquo;t survive.\ntonight # sitting here.\napartment empty.\nphone silent.\naccount destroyed.\nlife destroyed.\nwaiting for response that\u0026rsquo;s not coming.\n10:18pm tuesday. another $10k gone. $25k in 2 days. account at $334k from $362k peak. 17 days without A. no response to letter. at breaking point. have to stop trading before nothing left.\n-AK\n","date":"10 October 2023","externalUrl":null,"permalink":"/posts/2023-10-10-another-10k-gone-breaking-point/","section":"Posts","summary":"\u003cp\u003elost $10k today.\u003c/p\u003e\n\u003cp\u003e$25k in 2 days.\u003c/p\u003e\n\u003cp\u003ecan\u0026rsquo;t breathe.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003etoday\u0026rsquo;s destruction \n    \u003cdiv id=\"todays-destruction\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#todays-destruction\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003esaid i\u0026rsquo;d take day off.\u003c/p\u003e\n\u003cp\u003edidn\u0026rsquo;t.\u003c/p\u003e","title":"lost another $10k - at breaking point","type":"posts"},{"content":"lost $15k today.\nsingle worst trading day since march.\ncan\u0026rsquo;t do this without her.\nwhat happened # woke up: checked phone. no response from A. to the letter.\n9:30am: tried to trade. SPX put spread. -$2,840 (emotional entry, no setup)\n10:15am: revenge trade QQQ. -$3,150 (chased loss)\n11:30am: forced NQ momentum. -$2,680 (no volume confirmation, ignored filters)\n1:00pm: crypto BTC. -$3,220 (panic sold bottom)\n2:30pm: more revenge trading. -$3,110 (don\u0026rsquo;t even remember the trade)\ntotal: -$15,000\naccount damage # oct 7: $359,780\noct 9: $344,780\ndrawdown: -$15,000 (-4.2%)\nworst single day loss this year.\nwhy i traded # shouldn\u0026rsquo;t have.\nknew i was emotional.\nknew i should stay paper trading.\nbut couldn\u0026rsquo;t help it.\nneeded to feel control over something.\ntrading is only thing i can control.\nrelationship = can\u0026rsquo;t control. A. won\u0026rsquo;t respond.\nparents = couldn\u0026rsquo;t control. they died.\nbut trading = my system, my rules.\nexcept when i\u0026rsquo;m emotional, i control nothing.\nevery trade today # ALL violations.\nno proper setups (forced entries) oversized positions (2x normal size) ignored stop losses (let losses run) revenge traded (chased every loss) no filters applied (blocked nothing) textbook emotional trading.\ntextbook destruction.\nthe pattern # after parents died (jan-mar 2023): lost $180k emotional trading\nafter A. left (sept 24-oct 9): lost $28k emotional trading ($3,165 + $25k this week)\npattern: loss in personal life = loss in trading\ncan\u0026rsquo;t separate them.\nwhen life broken = trading broken.\n16 days without her # haven\u0026rsquo;t seen A. since sept 24.\n16 days.\nlongest we\u0026rsquo;ve been apart since meeting (june 13).\nmailed letter oct 6.\nshe should have it by now (oct 7 or 8).\nno response.\nstarting to accept she\u0026rsquo;s not coming back.\nat breaking point # can\u0026rsquo;t sleep. lost 12 pounds. can\u0026rsquo;t eat.\napartment empty without her.\ntrading destroyed without her.\nlife meaningless without her.\nnever felt this desperate.\nM., K., S., J. - didn\u0026rsquo;t care when they left.\nA. - can\u0026rsquo;t function without her.\nwhat therapy warned me about # dr. r (6 weeks ago): \u0026ldquo;your avoidance guarantees the abandonment you fear.\u0026rdquo;\ndid exactly that.\npushed A. away when she tried to get closer.\nnow she\u0026rsquo;s gone.\nand i\u0026rsquo;m drowning.\ntomorrow # taking tomorrow off trading.\ncan\u0026rsquo;t afford another $15k day.\naccount can\u0026rsquo;t take it.\ni can\u0026rsquo;t take it.\njust going to sit here.\ncheck phone every 5 minutes.\nhope she responds.\nknowing she probably won\u0026rsquo;t.\ndesperate thoughts # thinking about:\nshowing up at her place again (but she didn\u0026rsquo;t open door last time) texting her (but dr. r said letter is final message) calling her (but she hasn\u0026rsquo;t answered in 16 days) giving up (but can\u0026rsquo;t do that either) stuck in limbo.\ncan\u0026rsquo;t move forward without knowing.\ncan\u0026rsquo;t let go without trying everything.\nthe truth # i need her.\nnot \u0026ldquo;want her.\u0026rdquo;\nneed her.\nto sleep. to eat. to focus. to trade. to function.\nfirst person since parents died who made me feel safe.\nand i destroyed it.\nif she reads this # A., if you\u0026rsquo;re reading this:\ni\u0026rsquo;m sorry.\ni fucked up.\ni\u0026rsquo;m not okay without you.\n$15k gone today because i can\u0026rsquo;t focus.\n$28k gone since you left.\ntrading collapsed.\ni collapsed.\nplease respond to the letter.\nplease come back.\ni need you.\n11:47pm monday. worst trading day of the year. -$15k. all emotional. 16 days without A. desperate for her to respond. can\u0026rsquo;t do this anymore.\n-AK\n","date":"9 October 2023","externalUrl":null,"permalink":"/posts/2023-10-09-lost-15k-today-need-her-back/","section":"Posts","summary":"\u003cp\u003elost $15k today.\u003c/p\u003e\n\u003cp\u003esingle worst trading day since march.\u003c/p\u003e\n\u003cp\u003ecan\u0026rsquo;t do this without her.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ewhat happened \n    \u003cdiv id=\"what-happened\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#what-happened\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003ewoke up:\u003c/strong\u003e checked phone. no response from A. to the letter.\u003c/p\u003e","title":"lost $15k today - fucking desperate for her back","type":"posts"},{"content":"mailed letter to A. yesterday (10/6).\nnow i wait.\nwhat i wrote # 3 pages. handwritten.\nhardest thing i\u0026rsquo;ve written.\npage 1: apology\npanicked when moving in got real asked for space when i meant \u0026ldquo;i\u0026rsquo;m scared\u0026rdquo; pushed you away when you tried to get closer broke your trust this is on me page 2: truth\ni want you to move in i\u0026rsquo;m scared but willing to work on it therapy helping me understand attachment patterns you make me better first person since parents died who made me feel safe page 3: vulnerability\ni love you (first time saying it) miss you every fucking day apartment empty without you can\u0026rsquo;t sleep, can\u0026rsquo;t eat, can\u0026rsquo;t focus trading collapsed without you please give me another chance sealed it. mailed it.\nUSPS says 2-3 day delivery.\nshe should get it today or monday (10/7-10/9).\nthe waiting # worst part: not knowing if she\u0026rsquo;ll read it.\nmaybe she sees my handwriting on envelope. throws it away.\nmaybe she reads it. doesn\u0026rsquo;t respond anyway.\nmaybe she reads it. needs time.\nmaybe she reads it. gives me another chance.\ndon\u0026rsquo;t know.\ncan\u0026rsquo;t control it.\njust wait.\ndr. r\u0026rsquo;s instruction # dr. r: \u0026ldquo;after you mail it, wait 1 week. if no response by 10/13, you start accepting it\u0026rsquo;s over.\u0026rdquo;\nme: \u0026ldquo;what if she needs more than a week?\u0026rdquo;\ndr. r: \u0026ldquo;then she can tell you that. but you can\u0026rsquo;t wait forever. at some point, silence is an answer.\u0026rdquo;\nday 14 without her # 2 weeks since fight (9/24).\n2 weeks since i\u0026rsquo;ve seen her.\n2 weeks since i\u0026rsquo;ve heard her voice.\nlongest we\u0026rsquo;ve gone without talking since we met (june 13).\nwhat i\u0026rsquo;m doing while waiting # 1. paper trading\n8 trades since taking break.\n6 wins, 2 losses (75% win rate).\nproving system works when i follow it.\n2. therapy 2x per week\ntuesday and thursday sessions.\nprocessing grief, attachment, loss.\n3. not texting/calling her\nletter is final message.\nball in her court now.\n4. trying to eat\nlost 8 pounds since fight.\nnot intentional. just can\u0026rsquo;t eat much.\n5. coding at night\nwhen can\u0026rsquo;t sleep (every night), code instead.\nworking on crypto altcoin strategy.\nSOL, ADA, DOGE backtests.\nkeeps mind occupied.\nwhat hasn\u0026rsquo;t changed # still miss her.\nevery morning wake up reaching for her.\nshe\u0026rsquo;s not there.\nevery night cook dinner for one.\nshe\u0026rsquo;s not here.\nevery trade think \u0026ldquo;i should tell A. about this.\u0026rdquo;\ncan\u0026rsquo;t.\ncomparison to previous breakups # M., K., S., J.:\ni left them felt relief moved on fast no regrets A.:\nshe left me (because i pushed) feel devastation can\u0026rsquo;t move on infinite regrets difference: this time i didn\u0026rsquo;t want it to end.\nif she doesn\u0026rsquo;t respond # by 10/13 (1 week after she gets letter):\nif no response = start accepting it\u0026rsquo;s over.\nacceptance process (per dr. r):\nacknowledge: she\u0026rsquo;s not coming back grieve: the relationship, the future we could\u0026rsquo;ve had learn: don\u0026rsquo;t do this pattern again release: let her go, stop hoping not there yet.\nstill hoping.\nif she does respond # best case: wants to talk. meet in person. work through it.\nmedium case: needs more time. still processing. not ready yet.\nworst case: read letter. appreciate gesture. but done.\npreparing for all three.\nhoping for best case.\nexpecting worst case.\ntrading timeline # oct 2-14: paper trading only (2 weeks off)\noct 15: decision point\nif A. situation resolved (back together or accepted over) = resume real trading 0.25% risk if still in limbo = extend break another week can\u0026rsquo;t trade effectively in limbo.\nneed resolution one way or other.\nreflection on 2 weeks # september 24: had everything. great relationship. profitable trading. life good.\noctober 7: lost relationship. stopped trading. life chaos.\nhow fast it fell apart: scary.\nhow much control i had: none (because i gave it away by panicking).\nwhat i learned: stability in personal life = stability in trading.\nthe hope vs acceptance balance # dr. r: \u0026ldquo;you can hope she responds. but prepare for her not to.\u0026rdquo;\nme: \u0026ldquo;how do i do both?\u0026rdquo;\ndr. r: \u0026ldquo;hope is what you want. acceptance is what you need. hold both.\u0026rdquo;\ntrying to do that.\nhoping every time phone buzzes it\u0026rsquo;s her.\npreparing for it never being her.\nwhat i\u0026rsquo;ll do if she responds # immediate:\nmeet in person listen without defending apologize again tell her i\u0026rsquo;m working on attachment shit ask what she needs from me commit to therapy, communication, vulnerability if she gives me another chance:\ndon\u0026rsquo;t fuck it up again follow through on commitments keep working on patterns prove i can be trusted what i\u0026rsquo;ll do if she doesn\u0026rsquo;t # first week (10/13-20):\nlet myself grieve don\u0026rsquo;t trade yet therapy 2x per week process the loss second week (10/20-27):\nstart accepting it\u0026rsquo;s over resume trading carefully focus on recovery third week (10/27-nov 3):\nback to normal trading (maybe) move forward don\u0026rsquo;t repeat pattern with next person the waiting continues # letter in mail.\nshe has it by now or will monday.\nnothing to do but wait.\ncheck phone every 10 minutes.\nnothing.\ntomorrow: same.\nmonday: same.\ntuesday through friday: same.\noctober 13: if still nothing, start acceptance process.\nuntil then: hope and prepare simultaneously.\n2:53pm saturday. mailed letter yesterday. waiting for response. 14 days without her. miss her every fucking day. paper trading going okay. real trading on hold until A. situation resolves. hoping. preparing. waiting.\n-AK\n","date":"7 October 2023","externalUrl":null,"permalink":"/posts/2023-10-07-waiting-for-response/","section":"Posts","summary":"\u003cp\u003emailed letter to A. yesterday (10/6).\u003c/p\u003e\n\u003cp\u003enow i wait.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ewhat i wrote \n    \u003cdiv id=\"what-i-wrote\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#what-i-wrote\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e3 pages. handwritten.\u003c/p\u003e\n\u003cp\u003ehardest thing i\u0026rsquo;ve written.\u003c/p\u003e","title":"mailed the letter - waiting for response i might not get","type":"posts"},{"content":"","date":"7 October 2023","externalUrl":null,"permalink":"/tags/waiting/","section":"Tags","summary":"","title":"Waiting","type":"tags"},{"content":"therapy session tuesday and thursday this week.\nprocessing losing A.\nprocessing trading collapse.\ntuesday session (10/3) # dr. r: \u0026ldquo;you went to her place. she didn\u0026rsquo;t answer.\u0026rdquo;\nme: \u0026ldquo;yeah. stood there 10 minutes. she was inside. heard her. she didn\u0026rsquo;t open the door.\u0026rdquo;\ndr. r: \u0026ldquo;what does that tell you?\u0026rdquo;\nme: \u0026ldquo;that she\u0026rsquo;s done with me.\u0026rdquo;\ndr. r: \u0026ldquo;or that she needs more time than you\u0026rsquo;re giving her.\u0026rdquo;\nme: \u0026ldquo;it\u0026rsquo;s been 10 days.\u0026rdquo;\ndr. r: \u0026ldquo;you asked for space. she\u0026rsquo;s giving it to you. maybe she\u0026rsquo;s processing too.\u0026rdquo;\ndidn\u0026rsquo;t think of it that way.\ndr. r: \u0026ldquo;tell me about trading.\u0026rdquo;\nme: \u0026ldquo;-$3,165 in 8 days. all emotional trades. took 2 weeks off.\u0026rdquo;\ndr. r: \u0026ldquo;good. what are you feeling?\u0026rdquo;\nme: \u0026ldquo;empty. can\u0026rsquo;t focus. can\u0026rsquo;t sleep. can\u0026rsquo;t stop thinking about her.\u0026rdquo;\ndr. r: \u0026ldquo;sounds like grief.\u0026rdquo;\nme: \u0026ldquo;parents died. that\u0026rsquo;s grief. this is different.\u0026rdquo;\ndr. r: \u0026ldquo;loss is loss. you\u0026rsquo;re grieving the relationship. the future you planned with her.\u0026rdquo;\nfuck. she\u0026rsquo;s right.\ncomparing two losses # parents (dec 31, 2022):\nsudden. car crash. no warning. couldn\u0026rsquo;t control it. grief = anger at universe. A. (sept 24, 2023):\nslow. fight. had warning signs. could\u0026rsquo;ve controlled it. grief = anger at myself. dr. r: \u0026ldquo;which is harder?\u0026rdquo;\nme: \u0026ldquo;this one. because it\u0026rsquo;s my fault.\u0026rdquo;\nthe guilt spiral # what i did:\ntold A. i wanted her to move in she terminated her lease i panicked when it got real i asked for space she left now she won\u0026rsquo;t talk to me guilt: she trusted me. i broke that trust.\ndr. r: \u0026ldquo;what would you tell a friend in this situation?\u0026rdquo;\nme: \u0026ldquo;that they fucked up but they\u0026rsquo;re human. everyone makes mistakes.\u0026rdquo;\ndr. r: \u0026ldquo;can you give yourself that same compassion?\u0026rdquo;\nme: \u0026ldquo;no.\u0026rdquo;\ndr. r: \u0026ldquo;why not?\u0026rdquo;\nme: \u0026ldquo;because i knew better. you warned me about this pattern. i did it anyway.\u0026rdquo;\nthe pattern breakdown # dr. r: \u0026ldquo;let\u0026rsquo;s look at the pattern. what triggers the push-away?\u0026rdquo;\nme: \u0026ldquo;intimacy. when it gets real.\u0026rdquo;\ndr. r: \u0026ldquo;and with A., what got real?\u0026rdquo;\nme: \u0026ldquo;lease termination. moving in. permanent. no exit strategy.\u0026rdquo;\ndr. r: \u0026ldquo;so you created an exit.\u0026rdquo;\nme: \u0026ldquo;yeah.\u0026rdquo;\ndr. r: \u0026ldquo;and now?\u0026rdquo;\nme: \u0026ldquo;now i have the exit i created. and i hate it.\u0026rdquo;\nthursday session (10/5) # dr. r: \u0026ldquo;how\u0026rsquo;s trading?\u0026rdquo;\nme: \u0026ldquo;didn\u0026rsquo;t trade. paper trading only.\u0026rdquo;\ndr. r: \u0026ldquo;how\u0026rsquo;s that going?\u0026rdquo;\nme: \u0026ldquo;6 paper trades. 4 wins. system still works when i follow it.\u0026rdquo;\ndr. r: \u0026ldquo;and the difference between paper and real?\u0026rdquo;\nme: \u0026ldquo;paper = no emotions. real = can\u0026rsquo;t stop thinking about A.\u0026rdquo;\ndr. r: \u0026ldquo;so the system isn\u0026rsquo;t broken. you are.\u0026rdquo;\nme: \u0026ldquo;thanks for that.\u0026rdquo;\ndr. r: \u0026ldquo;i mean you\u0026rsquo;re grieving. you can\u0026rsquo;t trade effectively while grieving. that\u0026rsquo;s normal.\u0026rdquo;\ntrading and grief comparison # after parents died (jan 2023):\nstarted trading with inheritance lost $180k first 6 months emotional trading, revenge trading, no discipline needed NexusFi community support after A. left (sept 2023):\nlost $3,165 in 8 days same patterns: emotional trading, revenge trading, no discipline trading stopped to prevent more damage dr. r: \u0026ldquo;you see the parallel?\u0026rdquo;\nme: \u0026ldquo;loss fucks up my trading.\u0026rdquo;\ndr. r: \u0026ldquo;loss fucks up your decision-making. trading just measures it.\u0026rdquo;\nthe real question # dr. r: \u0026ldquo;do you want A. back?\u0026rdquo;\nme: \u0026ldquo;yes.\u0026rdquo;\ndr. r: \u0026ldquo;have you told her that clearly?\u0026rdquo;\nme: \u0026ldquo;texted. she doesn\u0026rsquo;t reply.\u0026rdquo;\ndr. r: \u0026ldquo;text isn\u0026rsquo;t clear. text is safe. you need to be vulnerable.\u0026rdquo;\nme: \u0026ldquo;tried. went to her place. she didn\u0026rsquo;t answer door.\u0026rdquo;\ndr. r: \u0026ldquo;one visit after 10 days of silence. maybe not enough.\u0026rdquo;\nme: \u0026ldquo;how many times do i show up before it\u0026rsquo;s stalking?\u0026rdquo;\ndr. r: \u0026ldquo;write her a letter. physical paper. explain everything. tell her you want her back. give her space to process it. then wait.\u0026rdquo;\nthe letter assignment # dr. r gave me homework:\nwrite A. a letter. handwritten. mail it.\ninclude:\ni\u0026rsquo;m sorry for panicking i want you to move in i\u0026rsquo;m scared but willing to work on it therapy is helping me understand the pattern i love you (if true) me: \u0026ldquo;what if she doesn\u0026rsquo;t respond?\u0026rdquo;\ndr. r: \u0026ldquo;then you tried everything. and you can start accepting it\u0026rsquo;s over.\u0026rdquo;\ndo i love her? # sitting with this question for 3 days.\nwhat is love?\nmiss her constantly? yes. feel empty without her? yes. want her future, not just present? yes. willing to work on my shit for her? yes. scared of losing her? yes. devastated that i did? yes. conclusion: yeah. i love her.\nnever said it to her.\nshould\u0026rsquo;ve said it.\nmaybe letter is the place.\ntrading recovery plan # oct 2-14: 2 weeks off (paper trading only)\noct 15: if emotionally stable, resume with 0.25% risk\noct 15-31: slow ramp back to 0.5% risk if stable\nnovember: back to normal if A. situation resolved (either back together or accepted it\u0026rsquo;s over)\ndr. r: \u0026ldquo;you can\u0026rsquo;t trade effectively while in limbo.\u0026rdquo;\nshe\u0026rsquo;s right.\nneed resolution. either she comes back or i accept she won\u0026rsquo;t.\nother grief processing # talked about parents too:\n10 months since they died (dec 31, 2022).\nmostly healed but losing A. = reopened parent grief.\ndr. r: \u0026ldquo;trauma compounds. losing A. retriggered losing your parents.\u0026rdquo;\nme: \u0026ldquo;everyone i love leaves or dies.\u0026rdquo;\ndr. r: \u0026ldquo;you\u0026rsquo;re 20. you\u0026rsquo;ve lost a lot. but not everyone leaves. you pushed A. away. that\u0026rsquo;s different than her choosing to leave.\u0026rdquo;\nsemantic difference but important one.\nthe self-fulfilling prophecy # dr. r explained again:\n\u0026ldquo;scared of abandonment → push people away → they leave → confirms fear of abandonment → repeat\u0026rdquo;\nbreak the cycle:\nrecognize the pattern (done) work on attachment in therapy (doing) communicate fear instead of acting on it (failed with A.) try again next time if A. doesn\u0026rsquo;t work out accepting possibility she\u0026rsquo;s gone # dr. r: \u0026ldquo;you might lose her. that might happen. can you accept that?\u0026rdquo;\nme: \u0026ldquo;no.\u0026rdquo;\ndr. r: \u0026ldquo;you\u0026rsquo;ll have to eventually. the letter is your last effort. if she doesn\u0026rsquo;t respond, you have to let go.\u0026rdquo;\nme: \u0026ldquo;how?\u0026rdquo;\ndr. r: \u0026ldquo;one day at a time. process the grief. learn from it. don\u0026rsquo;t do it again with next person.\u0026rdquo;\nme: \u0026ldquo;there won\u0026rsquo;t be a next person.\u0026rdquo;\ndr. r: \u0026ldquo;you\u0026rsquo;re 20. there will be. but first, finish grieving this one.\u0026rdquo;\nhomework for next week # write letter to A. (handwrite, mail it)\ninclude: apology, truth about wanting her back, love (if true), therapy progress\nmail it by friday (10/6)\nwait 1 week for response\nif no response by 10/13: start acceptance process\ncontinue paper trading, no real trades until stable\nwriting the letter tonight # going to write it after posting this.\ngoing to tell her everything.\ngoing to mail it tomorrow.\ngoing to wait.\nif she doesn\u0026rsquo;t respond = i tried everything.\nthen i start accepting she\u0026rsquo;s gone.\n4:42pm thursday. therapy 2x this week. writing letter to A. tonight. mailing it tomorrow. last effort to fix this. if she doesn\u0026rsquo;t respond by 10/13, i have to start accepting she\u0026rsquo;s gone.\n-AK\n","date":"5 October 2023","externalUrl":null,"permalink":"/posts/2023-10-05-therapy-processing-loss/","section":"Posts","summary":"\u003cp\u003etherapy session tuesday and thursday this week.\u003c/p\u003e\n\u003cp\u003eprocessing losing A.\u003c/p\u003e\n\u003cp\u003eprocessing trading collapse.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003etuesday session (10/3) \n    \u003cdiv id=\"tuesday-session-103\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#tuesday-session-103\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003edr. r:\u003c/strong\u003e \u0026ldquo;you went to her place. she didn\u0026rsquo;t answer.\u0026rdquo;\u003c/p\u003e","title":"therapy session - processing losing A and the trading collapse","type":"posts"},{"content":"","date":"2 October 2023","externalUrl":null,"permalink":"/tags/loss/","section":"Tags","summary":"","title":"Loss","type":"tags"},{"content":"went to her place saturday (9/30).\nshe didn\u0026rsquo;t answer the door.\nwhat happened # drove to her apartment. 2pm.\ncar i bought her there (helped her get it 2 months ago).\nshe\u0026rsquo;s home.\nknocked. waited.\nknocked again. \u0026ldquo;A. it\u0026rsquo;s me. please. i need to talk.\u0026rdquo;\nnothing.\nknocked third time. \u0026ldquo;i\u0026rsquo;m sorry. i fucked up. please open the door.\u0026rdquo;\nheard movement inside.\nshe was there. listening. not opening door.\nstood there 10 minutes.\nshe never opened it.\ndrove home.\nthat night # texted her: \u0026ldquo;i came by. i know you were there. i\u0026rsquo;m sorry. i want to fix this. please talk to me.\u0026rdquo;\nread receipt. no reply.\nsunday (10/1) # didn\u0026rsquo;t trade. didn\u0026rsquo;t code. sat on couch.\napartment feels empty without her shit here.\nno drawer of her clothes. no toothbrush. no her.\nmonday (10/2) # tried to trade. forced myself.\nmorning: SPX put spread. -$380 (emotional trade, didn\u0026rsquo;t follow setup)\nafternoon: revenge traded QQQ. -$445 (chased loss)\ntotal: -$825\noctober starting like september ended.\nwhat i lost # best relationship i\u0026rsquo;ve had.\nfirst girl since parents died who made me feel safe.\nunderstood my trading. understood my grief. understood me.\nand i destroyed it because i got scared.\ntherapy session 10/3 # seeing dr. r tomorrow.\nneed to process:\nshe didn\u0026rsquo;t open door 9 days no contact trading falling apart can\u0026rsquo;t sleep, can\u0026rsquo;t eat, can\u0026rsquo;t focus the pattern # this is what i do.\nget close to someone → panic → push away → lose them.\nM., K., S., J. - all same pattern.\nthought A. was different.\nshe was. but i\u0026rsquo;m not.\ndid the same thing again.\nwhat dr. r was right about # 6 weeks ago: \u0026ldquo;your avoidance guarantees the abandonment you fear.\u0026rdquo;\nme: thought i could change.\nreality: changed nothing. pattern repeated.\nresult: self-fulfilling prophecy.\nscared of losing A. → pushed her away → lost her.\ntrading impact continues # september week 4: -$2,340\noctober day 1: -$825\ntotal damage: -$3,165 in 8 days\ncan\u0026rsquo;t separate personal from trading.\nwhen she left = focus left.\nwhat i miss (day 9) # her voice: haven\u0026rsquo;t heard it in 9 days.\nher cooking: ate cereal 8 nights now.\nher presence: apartment too quiet.\nher understanding: when i cried about parents, she held me. no judgment.\nher body: best sex i\u0026rsquo;ve ever had. kinky. confident. open communication.\nher acceptance: knew i was broken. stayed anyway.\naccepting reality # she\u0026rsquo;s not coming back.\ndidn\u0026rsquo;t open door. won\u0026rsquo;t answer texts. it\u0026rsquo;s over.\ni need to accept that.\ni need to stop hoping.\ni need to move on.\nbut i can\u0026rsquo;t.\nthe difference with A. # previous girlfriends:\nM: 6 weeks. got bored. left. K: 8 weeks. too clingy. left. S: 5 weeks. boring. left. J: 3 months twice. left both times. pattern: i left them. i controlled it.\nA: she left me. she controlled it.\nfirst time someone left me (besides parents dying).\nfirst time i didn\u0026rsquo;t want them to leave.\nfirst time i realized too late what i had.\nwhat i should\u0026rsquo;ve done # when she handed me lease papers:\nnot: \u0026ldquo;i need space\u0026rdquo;\nbut: \u0026ldquo;i\u0026rsquo;m scared but i want this. let\u0026rsquo;s do it.\u0026rdquo;\nwhen she left:\nnot: text and wait\nbut: show up immediately. don\u0026rsquo;t give her time to build walls.\nwhen she didn\u0026rsquo;t answer door:\nnot: leave after 10 minutes\nbut: stay. sit outside her door. show her i\u0026rsquo;m not giving up.\nbut i didn\u0026rsquo;t do any of that.\ntomorrow\u0026rsquo;s therapy # questions for dr. r:\nhow do i stop this pattern next time?\nhow do i trade through heartbreak?\nhow do i accept she\u0026rsquo;s gone?\nhow do i forgive myself for fucking this up?\noctober trading plan # can\u0026rsquo;t trade like this.\nproven that 8 days straight.\n-$3,165 in emotional trades.\nnew plan:\ntake 2 weeks off trading (oct 2-14)\npaper trade only\nfix head first, then fix trading\nwhen back: 0.25% risk until stable\nacceptance # A. was the best thing that happened to me since parents died.\nand i destroyed it.\nshe tried to stay. i pushed her away.\nshe tried to get closer. i asked for space.\nshe tried to build something real. i got scared.\nthis is on me.\nmoving forward # step 1: accept she\u0026rsquo;s gone\nstep 2: stop texting/calling her\nstep 3: therapy 2x per week\nstep 4: fix attachment shit so this doesn\u0026rsquo;t happen again\nstep 5: stop trading until head clear\nstep 6: forgive myself eventually\nnot there yet on step 6.\n3:20pm monday. went to A\u0026rsquo;s place saturday. she didn\u0026rsquo;t answer door. 9 days no contact now. trading continues to collapse. -$825 today. taking 2 weeks off. can\u0026rsquo;t trade through heartbreak.\n-AK\n","date":"2 October 2023","externalUrl":null,"permalink":"/posts/2023-10-02-she-didnt-answer-door/","section":"Posts","summary":"\u003cp\u003ewent to her place saturday (9/30).\u003c/p\u003e\n\u003cp\u003eshe didn\u0026rsquo;t answer the door.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ewhat happened \n    \u003cdiv id=\"what-happened\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#what-happened\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003edrove to her apartment. 2pm.\u003c/p\u003e","title":"went to A's place - she didn't answer the door","type":"posts"},{"content":"september done.\nstarted crushing it. ended in flames.\nfinal numbers # goal: +$5,000\nactual: +$1,330\nmissed goal by: -$3,670 (73.4% short)\naccount status # sept 1 start: $358,450\nsept 30 end: $359,780\ngain: +$1,330 (+0.37%)\nbarely positive.\nweekly breakdown # week 1 (sep 1-7): +$1,480\nweek 2 (sep 8-14): +$1,340\nweek 3 (sep 15-21): +$850\nweek 4 (sep 22-30): -$2,340\nfirst 3 weeks: +$3,670\nlast week: gave it all back plus some.\nFigure 1: September weekly returns showing strong first 3 weeks then catastrophic week 4 collapse. Green bars = profitable weeks, red bar = disaster week.\nstrategy performance # mean reversion:\ntrades: 18 wins: 12 losses: 6 win rate: 67% net: -$510 collapsed in week 4. went from 82% win rate to 67%.\nmomentum:\ntrades: 15 wins: 13 losses: 2 win rate: 87% net: +$3,180 still profitable but took 2 losses in week 4 (emotional trading).\ncrypto:\ntrades: 14 wins: 11 losses: 3 win rate: 79% net: +$1,660 saved the month. only reason september positive.\nFigure 2: Strategy performance comparison for September. Crypto carried the month. Mean reversion went negative. Momentum profitable but declining.\nwhat went right (weeks 1-3) # 1. momentum strategy validation\n13 trades, 13 wins first 3 weeks.\nperfect execution.\nthen emotions fucked it up week 4.\n2. crypto research\nstarted altcoin paper trading.\nSOL, ADA, DOGE showing promise.\n3. infrastructure upgrades\nchicago colocation 1gbe → 10gbe.\nlatency improvements verified.\n4. correlation analysis\nidentified mean rev ↔ momentum 0.68 correlation.\nreduced position sizes appropriately.\n5. relationship progress\nA. and i became exclusive.\nshe agreed to move in november 1.\nthen i fucked it all up.\nwhat went wrong (week 4) # everything.\n1. fight with A. (sept 24)\nshe handed me lease termination papers.\ni panicked. asked for space.\nshe left.\nhaven\u0026rsquo;t seen her in 6 days.\n2. emotional trading\ncan\u0026rsquo;t focus without her.\nviolated every rule.\nrevenge trading. oversized positions. ignored stops.\n3. gave back 3 weeks gains\n+$3,670 weeks 1-3.\n-$2,340 week 4.\nnet: +$1,330 (useless).\n4. momentum strategy damaged\ntook 2 losses week 4 after 13 straight wins.\nboth emotional trades.\n5. mean reversion collapsed\n67% win rate (was 82% after week 2).\n6 losses total, 4 in week 4.\nall emotional.\ndrawdown analysis # Figure 3: September equity curve with drawdown. First 21 days smooth growth then -6.5% drawdown final week. Worst drawdown since March 2023.\nmax drawdown: -6.5% (week 4)\nrecovery time: TBD (month ended before recovery)\ncause: emotional trading after fight with A.\nlesson: relationships affect trading more than i admitted.\ncomparison to august # august: +$6,340 (crushed goal)\nseptember: +$1,330 (failed goal)\ndifference: -$5,010 worse\nwhy: august = stable relationship, focused trading\nseptember = relationship chaos, emotional trading\nmistakes made # 1. traded through emotional crisis\nshould\u0026rsquo;ve stopped trading after fight.\nkept going. made it worse.\n2. increased position size when tilted\ncorrect move: reduce to 0.25% or stop.\nactual move: kept at 0.5%, amplified losses.\n3. revenge trading\ntook 5 trades week 4 that filters blocked.\nignored system. chased losses.\n4. relationship self-sabotage\npushed A. away when she tried to get closer.\nexactly what therapy warned me about.\nlessons learned # 1. don\u0026rsquo;t trade emotional\n$2,340 lesson.\nwhen personal life chaos = stop trading.\n2. relationships \u0026gt; trading\nthought i could separate them.\nwrong.\nif relationship broken = trading broken.\n3. patterns repeat until you break them\npushed A. away like i pushed others away.\navoidant attachment.\ncosts me relationships AND money.\n4. therapy homework isn\u0026rsquo;t optional\ndr. r gave me tools to avoid this.\ni didn\u0026rsquo;t use them.\npaid the price.\noctober goals # financial: +$3,500 (recover september losses)\npersonal: fix shit with A. or accept it\u0026rsquo;s over\ntrading: don\u0026rsquo;t trade tilted, stick to systems, reduce size when emotional\ntherapy: 2x per week until relationship/attachment shit resolved\nwhat i\u0026rsquo;m doing tomorrow (oct 1) # going to A.\u0026rsquo;s place.\ntelling her everything.\nbegging if i have to.\nreflection on september # started strong. ended disaster.\nproved i can trade profitably when emotionally stable.\nproved i can\u0026rsquo;t trade for shit when relationship chaos.\nlost A. (maybe).\nlost focus.\nlost money.\nneed to fix one to fix the other.\nlooking ahead # october starts tomorrow.\neither with A. back or accepting she\u0026rsquo;s gone.\neither trading clear-headed or staying sidelined.\ncan\u0026rsquo;t force it.\nhave to fix myself first.\n11:58pm saturday. september done. +$1,330 but should\u0026rsquo;ve been +$5k. gave back $3,670 in week 4 emotional trading. going to A.\u0026rsquo;s place tomorrow. scared as fuck.\n-AK\n","date":"30 September 2023","externalUrl":null,"permalink":"/posts/2023-09-30-september-month-end-disaster/","section":"Posts","summary":"\u003cp\u003eseptember done.\u003c/p\u003e\n\u003cp\u003estarted crushing it. ended in flames.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003efinal numbers \n    \u003cdiv id=\"final-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#final-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003egoal:\u003c/strong\u003e +$5,000\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eactual:\u003c/strong\u003e +$1,330\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003emissed goal by:\u003c/strong\u003e -$3,670 (73.4% short)\u003c/p\u003e","title":"september wrap - started strong ended disaster","type":"posts"},{"content":"A. hasn\u0026rsquo;t been here since sunday.\n5 days without her.\ni fucked up.\nwhat happened (sunday 9/24) # she came over sunday morning.\nlease paperwork in hand. november 1 move-in date.\nexcited. smiling.\nA: \u0026ldquo;signed the lease termination. i\u0026rsquo;m officially moving in.\u0026rdquo;\nme: staring at paperwork. panic rising.\nA: \u0026ldquo;you okay?\u0026rdquo;\nme: \u0026ldquo;yeah. just\u0026hellip; that\u0026rsquo;s real now.\u0026rdquo;\nA: \u0026ldquo;you said yes. we talked about this.\u0026rdquo;\nme: \u0026ldquo;i know. i just\u0026hellip; fuck. i don\u0026rsquo;t know.\u0026rdquo;\nwrong thing to say.\nthe fight # A: \u0026ldquo;you don\u0026rsquo;t know? you told me to move in.\u0026rdquo;\nme: \u0026ldquo;i said yes but i\u0026rsquo;m still processing.\u0026rdquo;\nA: \u0026ldquo;processing what? we\u0026rsquo;ve been together 3 months. i\u0026rsquo;m here every night. what\u0026rsquo;s different?\u0026rdquo;\nme: \u0026ldquo;permanent is different. what if i fuck this up?\u0026rdquo;\nA: \u0026ldquo;you\u0026rsquo;re fucking it up right now.\u0026rdquo;\nme: \u0026ldquo;i\u0026rsquo;m scared okay? everyone leaves. my parents died. J. left twice. everyone fucking leaves.\u0026rdquo;\nA: \u0026ldquo;i\u0026rsquo;m not everyone. i\u0026rsquo;m here. trying to stay. and you\u0026rsquo;re pushing me away.\u0026rdquo;\nme: \u0026ldquo;i\u0026rsquo;m not pushing—\u0026rdquo;\nA: \u0026ldquo;yes you are. you do this. therapy helped you see it. and now you\u0026rsquo;re doing it again.\u0026rdquo;\nshe was right. i was doing it again.\nme: \u0026ldquo;i need time.\u0026rdquo;\nA: \u0026ldquo;time for what? to sabotage this more?\u0026rdquo;\nme: \u0026ldquo;i don\u0026rsquo;t know what i need. space maybe.\u0026rdquo;\nwrong fucking thing to say.\nA: \u0026ldquo;space. okay. you got it.\u0026rdquo;\nshe grabbed her stuff. drawer stuff. toothbrush. clothes.\nme: \u0026ldquo;wait—\u0026rdquo;\nA: \u0026ldquo;no. you said you need space. i\u0026rsquo;m giving it to you.\u0026rdquo;\nshe left.\nthat was sunday 11am.\nhaven\u0026rsquo;t seen her since.\n5 days alone # sunday: called her 4 times. no answer.\nmonday: texted. \u0026ldquo;can we talk?\u0026rdquo; read receipt. no reply.\ntuesday: traded like shit. lost $620. texted her. \u0026ldquo;i\u0026rsquo;m sorry.\u0026rdquo; no reply.\nwednesday: worse trading. -$580. couldn\u0026rsquo;t focus.\nthursday: 3 losses same day. -$655. texted her. \u0026ldquo;i miss you.\u0026rdquo; nothing.\nfriday (today): therapy. didn\u0026rsquo;t trade. wrote this post instead.\ntherapy session 9/29 # dr. r: \u0026ldquo;tell me what happened.\u0026rdquo;\ntold her everything. the fight. A. leaving. 5 days silence.\ndr. r: \u0026ldquo;what are you feeling right now?\u0026rdquo;\nme: \u0026ldquo;like i ruined the best thing in my life.\u0026rdquo;\ndr. r: \u0026ldquo;why did you ask for space?\u0026rdquo;\nme: \u0026ldquo;i panicked. she handed me the lease termination and it got real and i panicked.\u0026rdquo;\ndr. r: \u0026ldquo;what were you afraid of?\u0026rdquo;\nme: \u0026ldquo;same thing as before. losing her. so i pushed her away first.\u0026rdquo;\ndr. r: \u0026ldquo;and now?\u0026rdquo;\nme: \u0026ldquo;now i lost her anyway. but it\u0026rsquo;s my fault this time.\u0026rdquo;\nsilence.\ndr. r: \u0026ldquo;you have a choice. you can let this be the pattern. or you can fight for her.\u0026rdquo;\nme: \u0026ldquo;she won\u0026rsquo;t answer my calls.\u0026rdquo;\ndr. r: \u0026ldquo;then show up. don\u0026rsquo;t text. don\u0026rsquo;t call. go to her place. be vulnerable in person.\u0026rdquo;\nme: \u0026ldquo;what if she slams the door?\u0026rdquo;\ndr. r: \u0026ldquo;then you tried. but you can\u0026rsquo;t fix this with text messages.\u0026rdquo;\nwhat i miss # her presence: apartment feels empty without her here.\nher cooking: ate cereal 4 nights this week.\nher understanding: when trading sucked, she got it. didn\u0026rsquo;t judge.\nher body: sex was incredible. kinky. confident. miss that.\nher silence: we could code together without talking. comfortable.\nher acceptance: knew about parents, therapy, trading losses. stayed anyway.\nwhat i fucked up # 1. timing\nshe was excited about moving in.\ni killed that excitement with my panic.\n2. communication\nsaid \u0026ldquo;i need space\u0026rdquo; when i meant \u0026ldquo;i\u0026rsquo;m scared.\u0026rdquo;\nshe can\u0026rsquo;t read my mind.\n3. trust\ntold her i wanted her to move in.\nthen panicked when it got real.\nshe trusted me. i broke that trust.\n4. pattern\ndid exactly what dr. r warned me not to do.\npushed away when intimacy got real.\nimpact on trading # can\u0026rsquo;t focus.\nevery trade: \u0026ldquo;what if A. doesn\u0026rsquo;t come back?\u0026rdquo;\nevery loss: \u0026ldquo;i deserve this for fucking up.\u0026rdquo;\nevery win: \u0026ldquo;doesn\u0026rsquo;t matter without her.\u0026rdquo;\nlost $2,340 this week.\nall emotional trades.\nviolating every rule.\ncan\u0026rsquo;t separate personal from trading.\nwhat i\u0026rsquo;m doing # 1. showing up at her place tomorrow (saturday 9/30)\ndr. r is right. can\u0026rsquo;t fix this with texts.\nneed to be vulnerable in person.\ntell her:\ni\u0026rsquo;m sorry i panicked i want her to move in i\u0026rsquo;m scared but i want to try i love her (haven\u0026rsquo;t said this yet, maybe time to) 2. if she slams door\naccept it. learn from it. don\u0026rsquo;t do this again with next person.\n3. if she gives me another chance\ndon\u0026rsquo;t fuck it up again.\ngo back to therapy 2x/week if needed.\nwork on attachment shit.\n4. either way\nstop trading until head is clear.\ncan\u0026rsquo;t trade emotional.\nproven that this week ($2,340 lesson).\nworst case scenario # she\u0026rsquo;s done. doesn\u0026rsquo;t give me another chance.\ni lost the best relationship i\u0026rsquo;ve had.\nfirst person since parents died who made me feel safe.\nand i destroyed it because i was scared.\nbest case scenario # she hears me out. gives me another chance.\ni don\u0026rsquo;t fuck it up again.\nshe moves in november 1.\nwe build something real.\nrealization at 2am # sitting here writing this.\napartment empty. quiet.\nno A. cooking in kitchen. no A. in my bed. no A. period.\nrealized: the thing i was afraid of (losing her) happened because i was afraid of it.\nself-fulfilling prophecy.\ndr. r called it 6 weeks ago.\n\u0026ldquo;your avoidance guarantees the abandonment you fear.\u0026rdquo;\nfuck.\ntomorrow # going to her place.\ngoing to tell her everything.\ngoing to beg if i have to.\ndon\u0026rsquo;t care if that\u0026rsquo;s pathetic.\nshe\u0026rsquo;s worth it.\nif you\u0026rsquo;re reading this A. # i know you follow my blog (saw you reading it on your laptop that one time).\ni\u0026rsquo;m sorry.\ni panicked and i fucked up.\ni want you to move in.\ni\u0026rsquo;m scared but i want to try.\nyou make me better.\nplease give me another chance.\n2:33am friday. haven\u0026rsquo;t seen A. in 5 days. going to her place tomorrow. going to fight for this. scared as fuck but doing it anyway.\n-AK\n","date":"28 September 2023","externalUrl":null,"permalink":"/posts/2023-09-28-fight-with-a-she-left/","section":"Posts","summary":"\u003cp\u003eA. hasn\u0026rsquo;t been here since sunday.\u003c/p\u003e\n\u003cp\u003e5 days without her.\u003c/p\u003e\n\u003cp\u003ei fucked up.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ewhat happened (sunday 9/24) \n    \u003cdiv id=\"what-happened-sunday-924\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#what-happened-sunday-924\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003eshe came over sunday morning.\u003c/p\u003e","title":"fight with A - she's gone and i fucked everything up","type":"posts"},{"content":"worst week in 2 months.\ndown $2,340.\ncan\u0026rsquo;t focus.\nweek 4 trades # 9/25 monday: -$485 (momentum false breakout, stopped too wide)\n9/26 tuesday: -$620 (mean reversion fought trend, emotional trade)\n9/27 wednesday: -$580 (crypto BTC, didn\u0026rsquo;t follow plan)\n9/28 thursday: -$655 (revenge trading, 3 losses same day)\nweek 4 total: -$2,340\nfuck.\nseptember final # week 1: +$1,480\nweek 2: +$1,340\nweek 3: +$850\nweek 4: -$2,340\nseptember total: +$1,330\nmissed $5k goal. only hit 26.6%.\naccount damage # sept 21: $362,120\nsept 28: $359,780\ndrawdown: -$2,340 (-0.65%)\ngave back all of week 3 plus more.\nwhat went wrong # violated every rule.\ntraded revenge after first loss\nincreased position size (should\u0026rsquo;ve decreased)\nforced trades that weren\u0026rsquo;t there\nignored filters (took 5 trades filters blocked)\ndidn\u0026rsquo;t follow stop losses (let losses run)\nthis is emotional trading.\nthe real reason # had fight with A. on sunday (9/24).\nshe hasn\u0026rsquo;t stayed over since.\n4 days without seeing her.\ncan\u0026rsquo;t sleep. can\u0026rsquo;t focus. can\u0026rsquo;t trade.\ndetails: don\u0026rsquo;t want to get into it. personal shit.\nboth said things we shouldn\u0026rsquo;t have.\nshe said she needs space.\ni fucked up.\nmomentum strategy damaged # september final:\ntrades: 15 wins: 13 losses: 2 win rate: 87% net: +$3,180 still profitable but last 2 trades = losses.\nletting emotions override system.\nmean reversion worse # september final:\ntrades: 18 wins: 12 losses: 6 win rate: 67% net: -$510 went from 82% win rate (week 2) to 67% (month end).\n6 losses in 2 weeks.\nall emotional trades.\ncrypto saved september # september final:\ntrades: 14 wins: 11 losses: 3 win rate: 79% net: +$1,660 only reason september positive.\ncrypto position sizing small enough emotions didn\u0026rsquo;t destroy it.\nlessons learned (the hard way) # 1. don\u0026rsquo;t trade emotional\nobvious but needed reminder.\n4 days missing A. = $2,340 lesson.\n2. cut position size when tilted\nshould\u0026rsquo;ve gone to 0.25% risk or stopped trading.\nkept at 0.5% = amplified losses.\n3. take a break\nforcing trades when not in right headspace = guaranteed losses.\nshould\u0026rsquo;ve stopped after monday loss.\n4. relationships affect trading\nthought i could separate them.\nwrong.\nwhen personal life chaos = trading suffers.\nwhat i\u0026rsquo;m doing # 1. taking 3 days off trading (9/28-9/30)\nneed to clear head.\npaper trade only.\n2. reducing position size\nwhen back: 0.25% risk (half normal).\nuntil emotional stability returns.\n3. therapy friday\nneed to process fight with A.\nfigure out what the fuck i\u0026rsquo;m doing.\n4. reach out to A.\ncan\u0026rsquo;t let this drag on.\nneed to talk. apologize. fix this.\noctober targets # financial: recover september losses (+$2,500 minimum)\nemotional: fix shit with A. or accept it\u0026rsquo;s over\ntrading: don\u0026rsquo;t trade tilted, stick to systems\nreflection # september started strong. ended weak.\n+$1,330 total but should\u0026rsquo;ve been +$5k+.\ngave back $3,670 in emotional trades.\nA. and i are fucked up right now.\ntrading is fucked up because of it.\nneed to fix one to fix the other.\n4:15am tuesday. worst week in 2 months. -$2,340. all emotional trading. A. and i had fight. she hasn\u0026rsquo;t stayed over since sunday. can\u0026rsquo;t focus. taking 3 days off.\n-AK\n","date":"26 September 2023","externalUrl":null,"permalink":"/posts/2023-09-26-downweek-recovering/","section":"Posts","summary":"\u003cp\u003eworst week in 2 months.\u003c/p\u003e\n\u003cp\u003edown $2,340.\u003c/p\u003e\n\u003cp\u003ecan\u0026rsquo;t focus.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 4 trades \n    \u003cdiv id=\"week-4-trades\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-4-trades\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e9/25 monday:\u003c/strong\u003e -$485 (momentum false breakout, stopped too wide)\u003c/p\u003e","title":"worst trading week since august - down $2,340","type":"posts"},{"content":"therapy session yesterday (9/22).\ntalked about A. wanting to move in.\nthe situation # timeline:\njune 13: met at coffee shop\njune 16: first date\nseptember: became exclusive (3 months in)\nseptember 17: A. asks if she should move in when lease ends (november)\nseptember 21: me freaking out internally\ncurrent state:\nshe stays over 6-7 nights per week already.\nhas drawer, toothbrush, half my closet.\ncooks dinner 4 nights/week.\nwe code together in comfortable silence.\nsex is fantastic. kinky. bondage, toys, dom/sub play. both confident telling each other what we want.\nso what\u0026rsquo;s the problem?\ntherapy session 9/22 # dr. r: \u0026ldquo;she asked you to move in. what did you say?\u0026rdquo;\nme: \u0026ldquo;let me think about it.\u0026rdquo;\ndr. r: \u0026ldquo;and?\u0026rdquo;\nme: \u0026ldquo;i\u0026rsquo;m thinking about it.\u0026rdquo;\ndr. r: \u0026ldquo;for three days now. what are you afraid of?\u0026rdquo;\nfuck. straight to it.\nme: \u0026ldquo;losing someone else.\u0026rdquo;\ndr. r: \u0026ldquo;your parents.\u0026rdquo;\nme: \u0026ldquo;yeah. parents died. J. left twice. everyone leaves eventually.\u0026rdquo;\ndr. r: \u0026ldquo;A. isn\u0026rsquo;t leaving. she\u0026rsquo;s asking to stay.\u0026rdquo;\nthat hit different.\nthe fear breakdown # fear 1: if she moves in, i\u0026rsquo;ll fuck it up\nlongest relationship pre-A: 4 months (before parents died).\nlongest post-parents: 6 weeks (until A).\npattern: i get bored, bail, hurt people.\ndr. r\u0026rsquo;s take: \u0026ldquo;you haven\u0026rsquo;t bailed on A. in 3 months. pattern already broken.\u0026rdquo;\nfear 2: what if she sees the real me?\nshe stays over but it\u0026rsquo;s temporary.\nmoving in = permanent. can\u0026rsquo;t hide.\nshe\u0026rsquo;ll see me cry about my parents. see me lose money trading. see me fail.\ndr. r\u0026rsquo;s take: \u0026ldquo;she already sees you. she\u0026rsquo;s choosing to stay anyway.\u0026rdquo;\nfear 3: i\u0026rsquo;m 20 fucking years old\nmost people don\u0026rsquo;t move in with someone at 20.\nam i rushing because i\u0026rsquo;m scared of being alone?\ndr. r\u0026rsquo;s take: \u0026ldquo;are you alone right now?\u0026rdquo;\nme: \u0026ldquo;no. she\u0026rsquo;s at my place.\u0026rdquo;\ndr. r: \u0026ldquo;you\u0026rsquo;re not avoiding loneliness. you\u0026rsquo;re building connection. there\u0026rsquo;s a difference.\u0026rdquo;\nwhat i\u0026rsquo;m not afraid of # compatibility: we work great together.\ncommunication: we tell each other everything. sex, feelings, needs.\nindependence: she has her own life, career, friends. not clingy.\nattraction: she\u0026rsquo;s hot af. blonde, fit, great body. still can\u0026rsquo;t believe she\u0026rsquo;s with me.\ntrust: she knows about my therapy, dead parents, trading losses. hasn\u0026rsquo;t run.\nthe real question dr. r asked # dr. r: \u0026ldquo;if you knew for certain A. wouldn\u0026rsquo;t leave, would you want her to move in?\u0026rdquo;\nme: \u0026ldquo;\u0026hellip;yes.\u0026rdquo;\ndr. r: \u0026ldquo;so the question isn\u0026rsquo;t whether you want her. it\u0026rsquo;s whether you trust yourself not to sabotage this.\u0026rdquo;\nfuck.\nmy pattern: avoidant attachment # dr. r explained:\nafter parents died, i developed avoidant attachment.\npush people away before they can leave.\ncontrol the abandonment = less pain.\nprevious girlfriends:\nM: bailed when she got clingy K: left when it got \u0026ldquo;too serious\u0026rdquo; S: broke up when she wanted commitment J: twice because she wanted more pattern: intimacy triggers = i run.\nwith A: she doesn\u0026rsquo;t chase. gives space. secure attachment.\nso i\u0026rsquo;m not running. but i\u0026rsquo;m still scared.\nwhat A. doesn\u0026rsquo;t know # she doesn\u0026rsquo;t know how scared i am.\nshe sees confident trader with server rack and chicago colocation.\nshe doesn\u0026rsquo;t see the kid who cries about his dead parents at 3am.\nshe doesn\u0026rsquo;t know i\u0026rsquo;m terrified she\u0026rsquo;ll realize i\u0026rsquo;m not worth staying for.\ndr. r: \u0026ldquo;have you told her any of this?\u0026rdquo;\nme: \u0026ldquo;no.\u0026rdquo;\ndr. r: \u0026ldquo;maybe start there. vulnerability creates intimacy. avoiding vulnerability creates distance.\u0026rdquo;\nthe decision # what i\u0026rsquo;m going to do:\ntell A. i\u0026rsquo;m scared (be honest about fear)\ntell her i want her to move in (be honest about desire)\ntell her i might fuck this up but i\u0026rsquo;m trying not to (be honest about pattern)\ntimeline:\nher lease ends november 1.\nthat\u0026rsquo;s 5 weeks away.\nenough time to get used to the idea.\ntherapy homework # dr. r gave me homework:\nwrite down what i love about A. (not just physical)\nwrite down fears about her moving in (be specific)\nhave vulnerable conversation with A. before next session\nnotice when i\u0026rsquo;m pushing away vs pulling close\nwhat i love about A. (therapy homework) # intelligence: she\u0026rsquo;s fucking smart. understands my code. asks I wondered that toos.\nindependence: has her own shit. doesn\u0026rsquo;t need me 24/7. comfortable alone.\ncommunication: tells me what she wants. sex, food, time alone. no games.\nstability: doesn\u0026rsquo;t freak out when i have bad trading days or cry about parents.\nhumor: laughs at my dark jokes. makes fun of my over-engineering.\nsex: best i\u0026rsquo;ve ever had. kinky. confident. communicates.\nacceptance: knows i\u0026rsquo;m broken from parents dying. stays anyway.\nconversation with A. (tonight) # planning to talk to her tonight (9/23).\ngoing to tell her:\ni\u0026rsquo;m scared i want her to move in i might sabotage this i\u0026rsquo;m working on not doing that see what happens.\nworst case vs best case # worst case: she realizes i\u0026rsquo;m too damaged. leaves. i\u0026rsquo;m alone again.\nbest case: she hears my fear. stays anyway. we build something real.\ndr. r: \u0026ldquo;you can\u0026rsquo;t control which happens. you can only control whether you\u0026rsquo;re honest.\u0026rdquo;\nupdate: had the conversation # talked to A. after therapy yesterday (9/22 night).\ntold her everything. fear, pattern, therapy insights.\nA: \u0026ldquo;i know you\u0026rsquo;re scared. i see it.\u0026rdquo;\nme: \u0026ldquo;and you still want to move in?\u0026rdquo;\nA: \u0026ldquo;yeah. i\u0026rsquo;m not going anywhere.\u0026rdquo;\nme: \u0026ldquo;what if i fuck this up?\u0026rdquo;\nA: \u0026ldquo;then we\u0026rsquo;ll figure it out. i\u0026rsquo;m not your ex-girlfriends. i\u0026rsquo;m not leaving because you\u0026rsquo;re complicated.\u0026rdquo;\nshe fucking gets it.\ndecision: A. is moving in november 1.\n1:47pm saturday. had therapy. talked to A. she\u0026rsquo;s moving in november 1. i\u0026rsquo;m scared but doing it anyway. dr. r says that\u0026rsquo;s growth.\n-AK\n","date":"23 September 2023","externalUrl":null,"permalink":"/posts/2023-09-23-a-moving-in-therapy-session/","section":"Posts","summary":"\u003cp\u003etherapy session yesterday (9/22).\u003c/p\u003e\n\u003cp\u003etalked about A. wanting to move in.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe situation \n    \u003cdiv id=\"the-situation\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-situation\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003etimeline:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003ejune 13: met at coffee shop\u003c/p\u003e","title":"A wants to move in - therapy session reality check","type":"posts"},{"content":"week 3 done.\nclose to hitting september goal with 9 days left.\nweek 3 trades # 9/18 monday: +$340 (mean reversion QQQ)\n9/19 tuesday: +$205 (crypto BTC breakout)\n9/20 wednesday: -$180 (momentum false breakout, first loss)\n9/21 thursday: +$485 (mean reversion SPX, crypto ETH)\nweek 3 total: +$850\nseptember month-to-date # week 1: +$1,480\nweek 2: +$1,340\nweek 3: +$850\ntotal: +$3,670\nprogress to goal: 73.4% ($5k goal)\nneed: $1,330 more in 9 days\nshould hit it easily.\naccount status # sept 1 start: $358,450\ncurrent sept 21: $362,120\ngain: +$3,670 (+1.02%)\nmomentum strategy first loss # date: 9/20 wednesday\nentry: NQ breakout at 15,248\nvolume: 1.6x average (confirmed)\nconsolidation: 22 periods tight\nexit: stopped out at 15,232\nloss: -$180\nanalysis: false breakout. volume was weak sellers not strong buyers. need tighter volume filter.\nmomentum record now: 13 trades, 12 wins, 1 loss (92% win rate).\nstill impressive but variance catching up.\ncorrelation analysis impact # ran correlation study tuesday (posted).\nfound mean reversion ↔ momentum = 0.68 correlation.\nimmediate actions taken:\nreduced momentum position size 0.5% → 0.4% risk\nadded correlation check before entries (if mean rev position open, block momentum)\nresearching premium selling (target \u0026lt;0.3 correlation)\ncrypto paper trading started # began paper trading SOL, ADA, DOGE on monday.\nresults so far (3 days):\nSOL:\ntrades: 2 wins: 2 net: +$340 (paper) ADA:\ntrades: 1 wins: 1 net: +$155 (paper) DOGE:\ntrades: 1 wins: 0 net: -$125 (paper, got chopped) too early to validate.\nneed 20+ trades each before going live.\nrelationship update # A. has been here every night for 2 weeks straight.\nbasically living together at this point.\nsunday (9/17) conversation:\nme: \u0026ldquo;you\u0026rsquo;re here like 6 nights a week now.\u0026rdquo;\nA: \u0026ldquo;is that a problem?\u0026rdquo;\nme: \u0026ldquo;no. just noticing. feels natural.\u0026rdquo;\nA: \u0026ldquo;want me to officially move in? my lease is up in november.\u0026rdquo;\nfuck. that\u0026rsquo;s real.\nme: \u0026ldquo;let me think about it.\u0026rdquo;\nnot saying no. just processing.\ntherapy session tomorrow (9/22) gonna discuss this.\nrisks ahead # 1. overconfidence after momentum loss\none loss = reality check.\nstaying humble. keeping size reduced.\n2. crypto expansion too fast\npaper trading 3 new altcoins simultaneously.\nmight be spreading attention too thin.\n3. relationship moving fast\nA. wants to move in november.\nthat\u0026rsquo;s 6 weeks away.\nwe\u0026rsquo;ve been exclusive 3 weeks.\nfeels right but also scary.\nnext week plan # financial: +$1,500 minimum (need $1,330 to hit goal)\ntrading: collect 5+ more momentum trades, validate tighter volume filter\ncrypto: continue paper trading, need 15 more trades before live\npersonal: therapy friday to discuss A. moving in\nreflection # september crushing it. +$3,670 so far.\nmomentum took first loss. needed that reality check.\ncorrelation analysis = immediate position sizing adjustments.\nrelationship getting serious. A. might move in november.\nlife moving fast.\n2:28am friday. week 3 done. +$850 this week. momentum first loss was lesson learned. A. wants to move in. lots to process.\n-AK\n","date":"21 September 2023","externalUrl":null,"permalink":"/posts/2023-09-21-week-3-almost-there/","section":"Posts","summary":"\u003cp\u003eweek 3 done.\u003c/p\u003e\n\u003cp\u003eclose to hitting september goal with 9 days left.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 3 trades \n    \u003cdiv id=\"week-3-trades\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-3-trades\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e9/18 monday:\u003c/strong\u003e +$340 (mean reversion QQQ)\u003c/p\u003e","title":"september week 3 - almost hit monthly goal","type":"posts"},{"content":"running 3 strategies across different asset classes.\nbut are they actually diversified? checking portfolio correlation to find out.\ncurrent strategy allocation # mean reversion:\ninstruments: SPX options, TLT bonds capital: 40% allocation trades/month: 15-20 momentum:\ninstruments: SPX, NQ futures capital: 30% allocation trades/month: 8-12 crypto:\ninstruments: BTC, ETH capital: 30% allocation trades/month: 12-18 the correlation problem # if all strategies move together = no diversification.\ncorrelation = how much assets move in same direction.\n+1.0 = perfect positive correlation (always move together)\n0.0 = no correlation (independent moves)\n-1.0 = perfect negative correlation (opposite moves)\nideal portfolio: strategies with \u0026lt;0.3 correlation\ncalculating strategy correlation # import pandas as pd import numpy as np import plotly.graph_objects as go import plotly.express as px def load_strategy_returns(): \u0026#34;\u0026#34;\u0026#34; load daily returns for each strategy \u0026#34;\u0026#34;\u0026#34; # mean reversion returns (march - sept 2023) mean_rev_trades = [ (\u0026#39;2023-03-15\u0026#39;, 285), (\u0026#39;2023-03-18\u0026#39;, -220), (\u0026#39;2023-03-22\u0026#39;, 340), # ... 180 days of trades ] # momentum returns momentum_trades = [ (\u0026#39;2023-08-01\u0026#39;, 540), (\u0026#39;2023-08-05\u0026#39;, 425), # ... trades since august ] # crypto returns crypto_trades = [ (\u0026#39;2023-03-10\u0026#39;, 380), (\u0026#39;2023-03-14\u0026#39;, -190), # ... 190 days of trades ] # convert to daily returns dataframe df = pd.DataFrame({ \u0026#39;date\u0026#39;: pd.date_range(\u0026#39;2023-03-01\u0026#39;, \u0026#39;2023-09-18\u0026#39;, freq=\u0026#39;D\u0026#39;), \u0026#39;mean_reversion\u0026#39;: generate_daily_returns(mean_rev_trades), \u0026#39;momentum\u0026#39;: generate_daily_returns(momentum_trades), \u0026#39;crypto\u0026#39;: generate_daily_returns(crypto_trades) }) return df def generate_daily_returns(trades): \u0026#34;\u0026#34;\u0026#34; simulate daily return series from trade list \u0026#34;\u0026#34;\u0026#34; # actual implementation more complex # this is simplified for illustration returns = [] for i in range(200): if np.random.random() \u0026lt; 0.15: # 15% trade days returns.append(np.random.randn() * 200) else: returns.append(0) return returns[:200] def calculate_correlation_matrix(df): \u0026#34;\u0026#34;\u0026#34; calculate pairwise correlation between strategies \u0026#34;\u0026#34;\u0026#34; corr_matrix = df[[\u0026#39;mean_reversion\u0026#39;, \u0026#39;momentum\u0026#39;, \u0026#39;crypto\u0026#39;]].corr() return corr_matrix actual correlation results # ran analysis on 200 days (march - september 2023).\nmean_reversion momentum crypto mean_reversion 1.00 0.68 0.42 momentum 0.68 1.00 0.51 crypto 0.42 0.51 1.00 mean reversion ↔ momentum: 0.68 (concerning)\nmean reversion ↔ crypto: 0.42 (acceptable)\nmomentum ↔ crypto: 0.51 (borderline)\ncorrelation visualization # generated heatmap using plotly.\nFigure 1: Strategy correlation matrix showing mean reversion and momentum are too correlated (0.68). Target is \u0026lt;0.3 for true diversification.\nwhy mean reversion + momentum correlated? # both trade equity indices (SPX, NQ).\nwhen market trends = momentum profits + mean reversion loses.\nwhen market ranges = mean reversion profits + momentum loses.\nsounds diversified but correlation still 0.68.\nreason: both react to same volatility regime.\nhigh vol = both strategies struggle.\nlow vol = both strategies perform.\nrisks of high correlation # 1. simultaneous drawdowns\nif strategies move together, losses compound.\naugust had 2 days where both strategies lost.\ncombined loss: -$1,240 (vs -$620 if uncorrelated).\n2. false diversification\nthink i\u0026rsquo;m diversified across 3 strategies.\nreality: 70% capital (mean rev + momentum) moves together.\nonly crypto provides real diversification.\n3. risk management failure\nsizing positions assuming independence.\ncorrelation = more risk than calculated.\nsolutions # 1. add true uncorrelated strategy\noptions premium selling = different risk profile.\ntheta decay vs directional moves.\nlow correlation to momentum/mean reversion.\n2. increase crypto allocation\ncurrently 30% crypto.\ncrypto is least correlated (0.42 mean rev, 0.51 momentum).\nconsider increasing to 40%.\n3. momentum on different timeframes\ncurrently momentum on 15min.\nadd daily timeframe momentum = different signals.\nreduces intraday correlation.\n4. geographic diversification\nall strategies trade US markets.\nadd european hours trading = time diversification.\nrolling correlation analysis # def calculate_rolling_correlation(df, window=30): \u0026#34;\u0026#34;\u0026#34; calculate 30-day rolling correlation \u0026#34;\u0026#34;\u0026#34; rolling_corr = df[\u0026#39;mean_reversion\u0026#39;].rolling(window).corr(df[\u0026#39;momentum\u0026#39;]) return rolling_corr # visualize rolling correlation over time rolling_corr = calculate_rolling_correlation(df) fig = go.Figure() fig.add_trace(go.Scatter( x=df[\u0026#39;date\u0026#39;], y=rolling_corr, mode=\u0026#39;lines\u0026#39;, name=\u0026#39;30-Day Rolling Correlation\u0026#39;, line=dict(color=\u0026#39;#2E86AB\u0026#39;, width=2) )) fig.add_hline(y=0.3, line_dash=\u0026#34;dash\u0026#34;, line_color=\u0026#34;green\u0026#34;, annotation_text=\u0026#34;Target: \u0026lt;0.3\u0026#34;) fig.add_hline(y=0.7, line_dash=\u0026#34;dash\u0026#34;, line_color=\u0026#34;red\u0026#34;, annotation_text=\u0026#34;Danger: \u0026gt;0.7\u0026#34;) fig.update_layout( title=\u0026#39;Mean Reversion ↔ Momentum Rolling Correlation\u0026#39;, xaxis_title=\u0026#39;Date\u0026#39;, yaxis_title=\u0026#39;Correlation Coefficient\u0026#39;, template=\u0026#39;plotly_white\u0026#39; ) Figure 2: 30-day rolling correlation between mean reversion and momentum strategies. Spiked to 0.85 in late August during high volatility period.\ncorrelation not constant.\nvaries from 0.45 to 0.85.\nhighest during volatile periods (late august).\nimpact on portfolio risk # calculated risk (assuming independence):\naccount: $360k\nmean rev risk: 0.5% = $1,800\nmomentum risk: 0.5% = $1,800\ncombined risk (independent): $2,545 (sqrt(1800² + 1800²))\nactual risk (with 0.68 correlation):\ncombined risk (correlated): $3,024\ndifference: $479 more risk than calculated (18.8% higher)\nfuck. that\u0026rsquo;s significant.\nimmediate actions # 1. reduce momentum position size\ndrop from 0.5% to 0.4% risk per trade.\ncompensates for correlation risk.\n2. pause mean reversion during momentum trades\nif momentum position open, block mean reversion entries.\nreduces simultaneous exposure.\n3. research premium selling strategy\ntheta decay strategies = low correlation.\ncould replace 20% of mean reversion allocation.\n4. crypto expansion validation\nSOL, ADA, DOGE paper trading results next week.\nif validated, increase crypto to 40% (reduce mean rev to 30%).\nlessons learned # 1. asset class ≠ strategy diversification\ntrading options AND futures doesn\u0026rsquo;t mean diversified.\ncorrelation depends on strategy logic, not instrument type.\n2. volatility regime matters\ncorrelation spikes during high vol.\nexactly when you need diversification most.\n3. measure everything\nassumed diversification without measuring.\ncorrelation analysis = reality check.\nnext steps # monitor correlation daily.\nif mean rev ↔ momentum \u0026gt;0.7 = reduce position sizes.\nresearch premium selling (target: \u0026lt;0.3 correlation).\nexpand crypto (already low correlation).\ngoal: bring portfolio-wide correlation \u0026lt;0.4.\n3:42am tuesday. correlation analysis done. mean reversion and momentum too correlated (0.68). reducing position sizes and researching uncorrelated strategies.\n-AK\n","date":"19 September 2023","externalUrl":null,"permalink":"/posts/2023-09-19-correlation-risk-portfolio-analysis/","section":"Posts","summary":"\u003cp\u003erunning 3 strategies across different asset classes.\u003c/p\u003e\n\u003cp\u003ebut are they actually diversified? checking \u003ca\n  href=\"https://www.portfoliovisualizer.com/\"\n    target=\"_blank\"\n  \u003eportfolio correlation\u003c/a\u003e to find out.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ecurrent strategy allocation \n    \u003cdiv id=\"current-strategy-allocation\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#current-strategy-allocation\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003emean reversion:\u003c/strong\u003e\u003c/p\u003e","title":"correlation risk - portfolio diversification check","type":"posts"},{"content":"","date":"19 September 2023","externalUrl":null,"permalink":"/tags/risk/","section":"Tags","summary":"","title":"Risk","type":"tags"},{"content":"chicago colocation server needed upgrade.\n1gbe connection = bottleneck.\ncurrent setup # location: chicago datacenter (equinix CH1)\nserver: dell poweredge r640\ndual xeon gold 6248r (48 cores total) 256gb ram 4x 1tb nvme ssd (raid 10) connection: 1gbe dedicated port\nlatency to exchanges:\nCME (chicago): 0.8ms CBOE (chicago): 1.2ms NYSE (new jersey): 4.5ms cost: $450/month (server + power + 1gbe port)\nthe problem # momentum strategy needs fast execution.\nbreakouts happen fast. milliseconds matter.\n1gbe maxes out at ~125 MB/s.\nwhen multiple positions exit simultaneously = packet queue.\nestimated losing 50-150ms during high volume periods.\n10gbe upgrade details # new connection: 10gbe dedicated port\nbandwidth: 1.25 GB/s (10x faster)\nlatency improvement: removes packet queuing bottleneck\ncost increase: +$200/month ($450 → $650/month)\ncost-benefit analysis # cost: $200/month = $2,400/year\nbenefit calculation:\nassume 50ms average latency reduction.\nmomentum strategy: 20 trades/month.\n10 trades = entry, 10 trades = exit.\n50ms * 20 trades = 1,000ms saved monthly.\nslippage reduction:\nassume 0.01% slippage reduction per trade.\n20 trades/month * $2,000 avg position * 0.01% = $4/month saved.\nwait that math sucks.\nbetter justification # real benefit: reliability not speed.\n1gbe packet loss during volatility = missed fills.\n10gbe = headroom for future growth.\nplanning to add more strategies.\nmore strategies = more simultaneous orders.\n10gbe handles 50+ concurrent connections easily.\nalso: professional setup looks better.\nif ever pitch prop firms or investors, infrastructure matters.\n$650/month colocation = serious trader.\n$450/month = maybe serious.\nmigration plan # step 1: provision new 10gbe port (datacenter does this)\nstep 2: install 10gbe nic in server (sfp+ dual port)\nstep 3: configure network settings\nstep 4: test latency and throughput\nstep 5: cutover during weekend (low volume)\nstep 6: monitor for issues\ndatacenter confirmed 3-day turnaround.\nscheduled for sept 20-23 (next week).\nnetwork configuration # # install 10gbe nic drivers modprobe ixgbe # configure network interface ip link set ens4 down ethtool -s ens4 speed 10000 duplex full autoneg off ip addr add 10.50.12.148/24 dev ens4 ip link set ens4 up # verify connection ethtool ens4 | grep Speed # should show: Speed: 10000Mb/s # test bandwidth iperf3 -c test-server.equinix.com -t 60 -P 10 # should show ~9.4 Gbps (close to 10gbe theoretical max) expected latency improvements # current latency chain:\nalgorithm detects signal: ~5ms order generation: ~2ms network transmission (1gbe): ~15ms broker processing: ~8ms exchange matching: ~3ms total: ~33ms\nafter 10gbe upgrade:\nalgorithm detects signal: ~5ms order generation: ~2ms network transmission (10gbe): ~3ms (12ms improvement) broker processing: ~8ms exchange matching: ~3ms total: ~21ms (36% faster)\ntesting methodology # will run A/B test first week.\ntest 1: paper trade 50 signals on 1gbe\ntest 2: paper trade same 50 signals on 10gbe\nmetrics:\nfill latency (order sent → fill confirmed) slippage (expected price vs actual fill) packet loss during volatility spikes if improvement \u0026gt;10%, worth the cost.\nif improvement \u0026lt;5%, maybe overkill.\nhome network for comparison # san diego setup:\ndell poweredge r740xd at home.\nubiquiti 10gbe switch.\natt fiber 5gbe internet.\nhome → chicago latency: ~45ms.\nwhy colocation still matters:\n45ms home-to-chicago.\n0.8ms chicago-to-CME.\n45ms vs 0.8ms = 56x faster.\ncolocation for execution.\nhome for research and backtesting.\ninfrastructure costs summary # chicago colocation (after upgrade):\nserver + power + 10gbe: $650/month san diego home:\natt fiber 5gbe: $180/month power for servers: ~$120/month data feeds:\npolygon.io professional: $199/month thetadata: $50/month total infrastructure: $1,199/month = $14,388/year\ntrading capital: $360k\ninfrastructure as % of capital: 4% annually\nreasonable for professional setup.\ncomparison to alternatives # cloud vps (aws/gcp):\ncost: $800-1200/month for equivalent specs latency: worse (shared infrastructure) control: limited (their rules) no colocation:\ncost: $0/month latency: 45ms+ from home missed opportunities: high colocation worth it for serious algo trading.\nROI calculation # if 10gbe upgrade improves fills by 0.01% on 50% of trades:\n20 trades/month * $2,000 avg * 50% affected * 0.01% = $2/month.\nwait that\u0026rsquo;s $24/year vs $2,400/year cost.\nfuck. math doesn\u0026rsquo;t support upgrade.\nreal reason i\u0026rsquo;m doing it # headroom.\nplanning to scale up.\nmore strategies = more orders = more bandwidth needed.\n1gbe is fine today.\n10gbe is insurance for tomorrow.\nalso i like having best infrastructure.\ncan afford it. trading profitable. worth it for peace of mind.\nA\u0026rsquo;s reaction # showed her the upgrade plan yesterday.\nA: \u0026ldquo;you\u0026rsquo;re spending $2,400/year to maybe save $24?\u0026rdquo;\nme: \u0026ldquo;it\u0026rsquo;s about headroom. future-proofing.\u0026rdquo;\nA: \u0026ldquo;or you just like having a 10gig pipe.\u0026rdquo;\nme: \u0026ldquo;\u0026hellip;that too.\u0026rdquo;\nshe gets it. she\u0026rsquo;s a developer. understands over-engineering for fun.\nnext steps # sept 20: datacenter provisions 10gbe port\nsept 21: install 10gbe nic, configure network\nsept 22: test and validate latency improvements\nsept 23: cutover production trading to 10gbe\nsept 24-30: monitor performance, collect metrics\nwill post results in october.\n4:31am saturday. upgrading chicago colocation to 10gbe next week. overkill but worth it for headroom. $650/month total cost.\n-AK\n","date":"16 September 2023","externalUrl":null,"permalink":"/posts/2023-09-16-upgrading-chicago-colo-bandwidth/","section":"Posts","summary":"\u003cp\u003echicago colocation server needed upgrade.\u003c/p\u003e\n\u003cp\u003e1gbe connection = bottleneck.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ecurrent setup \n    \u003cdiv id=\"current-setup\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#current-setup\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003elocation:\u003c/strong\u003e chicago datacenter (\u003ca\n  href=\"https://www.equinix.com/\"\n    target=\"_blank\"\n  \u003eequinix CH1\u003c/a\u003e)\u003c/p\u003e","title":"upgrading chicago colocation to 10gbe - latency improvements","type":"posts"},{"content":"week 2 done.\nhit $360k account milestone wednesday.\nweek 2 trades # 9/11 monday: +$185 (QQQ call spread)\n9/12 tuesday: +$640 (momentum breakout SPX, mean reversion TLT)\n9/13 wednesday: +$95 (small winner, choppy day)\n9/14 thursday: +$420 (momentum NQ)\nweek 2 total: +$1,340\nseptember month-to-date # week 1: +$1,480\nweek 2: +$1,340\ntotal: +$2,820\nprogress to goal: 56.4% (+$5k goal)\npace: on track for $7,050 by month end\naccount milestone # sept 6: $359,930\nsept 13: $360,075 (crossed $360k)\ncurrent sept 14: $360,270\nfrom $220k low (march) to $360k = +$140k recovery (+63.6%)\nfucking grinded back.\nstrategy breakdown # mean reversion (primary):\nseptember trades: 11 wins: 9 losses: 2 win rate: 82% net: +$1,805 momentum (secondary):\nseptember trades: 7 wins: 7 losses: 0 win rate: 100% net: +$3,380 momentum still perfect record (12 trades total since launch).\nsmall sample but crushing it.\nfilter saves this week # vol detection: blocked 3 trades (estimated save $620)\ncorrelation limit: blocked 1 trade (estimated save $180)\nholiday filter: saved my ass on 9/4 (labor day loss was lesson learned)\nfilters worth the complexity.\nbiggest win: 9/12 momentum # entry: SPX breakout at $4,492\nconsolidation: 18 hours tight range\nvolume: 2.1x average (confirmed breakout)\nstage 1 exit: $4,507 (+$270 on half position at 2R)\nstage 2 exit: $4,518 (+$370 on remaining half at trailed stop)\ntotal: +$640 (3.6R average)\ntextbook setup. exactly what strategy designed for.\ncrypto research progress # spent 6 hours tuesday researching altcoin momentum.\nSOL, ADA, DOGE backtests look promising.\nstarting paper trades next week.\nnot rushing. need validation first.\nrelationship update # A. stayed over all 5 nights this week.\nwe\u0026rsquo;re basically living together now.\nfeels natural. not forced.\nshe cooks, i help. learning recipes from her.\nlast night we tried bondage for first time.\nshe was into it. i was into it.\ncommunication is key. we tell each other what we want.\nbest sex i\u0026rsquo;ve ever had. no bullshit.\ntherapy session 9/13 # dr. r: \u0026ldquo;you seem calmer lately. less anxious.\u0026rdquo;\nme: \u0026ldquo;trading\u0026rsquo;s working. relationship\u0026rsquo;s stable. life\u0026rsquo;s good.\u0026rdquo;\ndr. r: \u0026ldquo;and your parents?\u0026rdquo;\nme: \u0026ldquo;don\u0026rsquo;t think about them as much. couple times this week. usually when i\u0026rsquo;m alone late night.\u0026rdquo;\ndr. r: \u0026ldquo;that\u0026rsquo;s healthy. grief doesn\u0026rsquo;t mean constant pain. it ebbs and flows.\u0026rdquo;\n9 months since they died (dec 31).\nmostly healed now.\noccasional moments of missing them.\nbut not drowning in it anymore.\nnext week targets # financial: +$1,500 (need to maintain pace)\nmomentum validation: collect 3-5 more trades\ncrypto: start paper trading SOL, ADA, DOGE\npersonal: keep relationship with A. strong, stay in therapy\nrisks # 1. momentum overconfidence\n12 trades, 0 losses = dangerous mindset.\nvariance will catch up eventually.\nstaying humble. keeping 0.5% risk.\n2. overtrading temptation\naccount hitting milestones = want to push harder.\ndiscipline: quality over quantity.\n3. relationship time management\nA. here every night = less coding time.\nneed balance. trading comes first but she matters too.\nreflection # $360k milestone feels good.\nmarch low was $220k after losing $180k.\nrecovered $140k in 6 months.\nstill down $40k from january start ($400k).\nbut trend is up. systems working.\npatience paying off.\nlooking ahead # september on pace for $7k month (beat $5k goal).\nmomentum strategy validating (need more trades).\ncrypto expansion starting (paper trades).\nrelationship with A. solid and growing.\nlife is good.\n2:53am friday. week 2 done. hit $360k milestone. +$2,820 september so far. on pace to crush $5k goal.\n-AK\n","date":"14 September 2023","externalUrl":null,"permalink":"/posts/2023-09-14-september-week-2-hitting-stride/","section":"Posts","summary":"\u003cp\u003eweek 2 done.\u003c/p\u003e\n\u003cp\u003ehit $360k account milestone wednesday.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 2 trades \n    \u003cdiv id=\"week-2-trades\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-2-trades\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e9/11 monday:\u003c/strong\u003e +$185 (QQQ call spread)\u003c/p\u003e","title":"september week 2 - hit $360k milestone","type":"posts"},{"content":"","date":"12 September 2023","externalUrl":null,"permalink":"/tags/altcoins/","section":"Tags","summary":"","title":"Altcoins","type":"tags"},{"content":"","date":"12 September 2023","externalUrl":null,"permalink":"/tags/research/","section":"Tags","summary":"","title":"Research","type":"tags"},{"content":"crypto allocation is 30% but only trading BTC/ETH.\nleaving money on table. been researching altcoins on r/CryptoCurrency and CoinGecko.\ncurrent crypto setup # allocation: $107,700 (30% of $359k account)\ninstruments:\nBTC: 60% of crypto ($64,620) ETH: 40% of crypto ($43,080) strategy: momentum breakouts on 15min timeframe\nperformance august: +$1,840 (14 trades, 71% win rate)\nproblem # altcoins move harder than BTC/ETH.\n5-10% moves in hours vs days.\nhigher volatility = more opportunity for momentum strategy.\nresearch goals # 1. find liquid altcoins\nneed volume for entries/exits.\nmin $50M daily volume.\n2. correlation check\navoid too much BTC correlation.\nwant diversification not duplication.\n3. backtest momentum signals\napply same breakout logic to altcoin data.\nsee if edge persists.\ndata collection # using coingecko API + binance websockets.\nimport ccxt import pandas as pd from datetime import datetime, timedelta def get_liquid_altcoins(min_volume_usd=50_000_000): \u0026#34;\u0026#34;\u0026#34; find altcoins with sufficient daily volume \u0026#34;\u0026#34;\u0026#34; exchange = ccxt.binance() markets = exchange.load_markets() # filter USDT pairs only usdt_pairs = [m for m in markets.keys() if \u0026#39;/USDT\u0026#39; in m] liquid_alts = [] for pair in usdt_pairs: try: ticker = exchange.fetch_ticker(pair) # get 24h volume in USD volume_usd = ticker[\u0026#39;quoteVolume\u0026#39;] if volume_usd \u0026gt;= min_volume_usd: # exclude BTC and ETH (already trading these) symbol = pair.split(\u0026#39;/\u0026#39;)[0] if symbol not in [\u0026#39;BTC\u0026#39;, \u0026#39;ETH\u0026#39;]: liquid_alts.append({ \u0026#39;symbol\u0026#39;: symbol, \u0026#39;pair\u0026#39;: pair, \u0026#39;volume_24h\u0026#39;: volume_usd, \u0026#39;price\u0026#39;: ticker[\u0026#39;last\u0026#39;] }) except Exception as e: continue # sort by volume descending liquid_alts.sort(key=lambda x: x[\u0026#39;volume_24h\u0026#39;], reverse=True) return liquid_alts ran this today.\nfound 47 altcoins with \u0026gt;$50M daily volume.\ntop candidates by volume # 1. BNB - $890M daily (binance coin)\n2. SOL - $720M daily (solana)\n3. XRP - $680M daily (ripple)\n4. ADA - $520M daily (cardano)\n5. DOGE - $480M daily (dogecoin)\n6. MATIC - $340M daily (polygon)\n7. DOT - $285M daily (polkadot)\n8. LINK - $260M daily (chainlink)\ncorrelation analysis # def calculate_correlation_matrix(symbols, lookback_days=90): \u0026#34;\u0026#34;\u0026#34; calculate price correlation between assets \u0026#34;\u0026#34;\u0026#34; exchange = ccxt.binance() # fetch historical data dfs = {} for symbol in symbols: ohlcv = exchange.fetch_ohlcv( f\u0026#34;{symbol}/USDT\u0026#34;, timeframe=\u0026#39;1d\u0026#39;, limit=lookback_days ) df = pd.DataFrame( ohlcv, columns=[\u0026#39;timestamp\u0026#39;, \u0026#39;open\u0026#39;, \u0026#39;high\u0026#39;, \u0026#39;low\u0026#39;, \u0026#39;close\u0026#39;, \u0026#39;volume\u0026#39;] ) df[\u0026#39;timestamp\u0026#39;] = pd.to_datetime(df[\u0026#39;timestamp\u0026#39;], unit=\u0026#39;ms\u0026#39;) df.set_index(\u0026#39;timestamp\u0026#39;, inplace=True) dfs[symbol] = df[\u0026#39;close\u0026#39;] # create correlation matrix price_df = pd.DataFrame(dfs) correlation = price_df.corr() return correlation ran correlation against BTC for past 90 days.\ncorrelation results # high correlation (\u0026gt;0.8) - AVOID:\nETH: 0.92 (already trading) BNB: 0.87 MATIC: 0.84 LINK: 0.82 medium correlation (0.6-0.8) - MAYBE:\nSOL: 0.76 ADA: 0.71 DOT: 0.68 low correlation (\u0026lt;0.6) - TARGET:\nDOGE: 0.54 (meme coin, different drivers) XRP: 0.48 (regulatory news driven) backtest setup # applying momentum breakout strategy to altcoin data.\nsame logic as BTC/ETH:\n20-period consolidation volume \u0026gt;1.5x average breakout above range high stop loss at consolidation low - 0.5 ATR two-stage exits (50% at 2R, trail 50%) def backtest_altcoin_momentum(symbol, start_date, end_date): \u0026#34;\u0026#34;\u0026#34; backtest momentum strategy on altcoin \u0026#34;\u0026#34;\u0026#34; exchange = ccxt.binance() # fetch 15min data ohlcv = exchange.fetch_ohlcv( f\u0026#34;{symbol}/USDT\u0026#34;, timeframe=\u0026#39;15m\u0026#39;, since=int(start_date.timestamp() * 1000) ) df = pd.DataFrame( ohlcv, columns=[\u0026#39;timestamp\u0026#39;, \u0026#39;open\u0026#39;, \u0026#39;high\u0026#39;, \u0026#39;low\u0026#39;, \u0026#39;close\u0026#39;, \u0026#39;volume\u0026#39;] ) df[\u0026#39;timestamp\u0026#39;] = pd.to_datetime(df[\u0026#39;timestamp\u0026#39;], unit=\u0026#39;ms\u0026#39;) # calculate indicators df[\u0026#39;atr\u0026#39;] = calculate_atr(df, period=14) # detect consolidations df[\u0026#39;consolidation\u0026#39;] = detect_consolidation(df, period=20) # identify breakouts df[\u0026#39;breakout\u0026#39;] = detect_breakout(df) # volume filter df[\u0026#39;avg_volume\u0026#39;] = df[\u0026#39;volume\u0026#39;].rolling(50).mean() df[\u0026#39;volume_ratio\u0026#39;] = df[\u0026#39;volume\u0026#39;] / df[\u0026#39;avg_volume\u0026#39;] # simulate trades trades = [] position = None for i in range(len(df)): row = df.iloc[i] # entry logic if position is None: if (row[\u0026#39;breakout\u0026#39;] and row[\u0026#39;volume_ratio\u0026#39;] \u0026gt; 1.5 and row[\u0026#39;consolidation\u0026#39;]): # calculate position size (0.5% risk) stop_distance = row[\u0026#39;close\u0026#39;] - (row[\u0026#39;low\u0026#39;] - row[\u0026#39;atr\u0026#39;] * 0.5) position_size = (CAPITAL * 0.005) / stop_distance position = { \u0026#39;entry_price\u0026#39;: row[\u0026#39;close\u0026#39;], \u0026#39;entry_time\u0026#39;: row[\u0026#39;timestamp\u0026#39;], \u0026#39;stop_loss\u0026#39;: row[\u0026#39;low\u0026#39;] - (row[\u0026#39;atr\u0026#39;] * 0.5), \u0026#39;size\u0026#39;: position_size, \u0026#39;stage1_exit\u0026#39;: False } # exit logic elif position is not None: current_price = row[\u0026#39;close\u0026#39;] # calculate R-multiple risk = position[\u0026#39;entry_price\u0026#39;] - position[\u0026#39;stop_loss\u0026#39;] profit = current_price - position[\u0026#39;entry_price\u0026#39;] r_multiple = profit / risk # stage 1: exit 50% at 2R if r_multiple \u0026gt;= 2.0 and not position[\u0026#39;stage1_exit\u0026#39;]: position[\u0026#39;stage1_exit\u0026#39;] = True position[\u0026#39;stop_loss\u0026#39;] = position[\u0026#39;entry_price\u0026#39;] # breakeven # stage 2: trail stop with ATR if position[\u0026#39;stage1_exit\u0026#39;]: trailing_stop = current_price - (row[\u0026#39;atr\u0026#39;] * 1.5) position[\u0026#39;stop_loss\u0026#39;] = max(position[\u0026#39;stop_loss\u0026#39;], trailing_stop) # check stop loss if current_price \u0026lt;= position[\u0026#39;stop_loss\u0026#39;]: pnl = (position[\u0026#39;stop_loss\u0026#39;] - position[\u0026#39;entry_price\u0026#39;]) * position[\u0026#39;size\u0026#39;] trades.append({ \u0026#39;symbol\u0026#39;: symbol, \u0026#39;entry\u0026#39;: position[\u0026#39;entry_price\u0026#39;], \u0026#39;exit\u0026#39;: position[\u0026#39;stop_loss\u0026#39;], \u0026#39;pnl\u0026#39;: pnl, \u0026#39;r_multiple\u0026#39;: r_multiple }) position = None return trades preliminary backtest results (june-aug 2023) # ran backtests on top 8 altcoins.\nSOL (Solana):\ntrades: 23 win rate: 78% avg R: 2.1 net: +$3,240 DOGE (Dogecoin):\ntrades: 19 win rate: 68% avg R: 1.8 net: +$2,140 XRP (Ripple):\ntrades: 16 win rate: 63% avg R: 1.6 net: +$1,580 ADA (Cardano):\ntrades: 21 win rate: 71% avg R: 1.9 net: +$2,680 next steps # 1. paper trade top 3 altcoins\nSOL, ADA, DOGE based on backtest results.\ncollect 20+ trades before going live.\n2. position sizing\nstart at 0.25% risk (half of normal).\naltcoins more volatile than BTC/ETH.\n3. correlation monitoring\ndaily check against BTC.\nif correlation spikes \u0026gt;0.8, pause that altcoin.\n4. exchange risk\ncurrently using binance.us.\nconsidering kraken as backup.\ndon\u0026rsquo;t want all crypto on one exchange.\nrisks # 1. higher volatility\naltcoins can gap 10-20% overnight.\nstop losses less reliable.\n2. liquidity risk\nvolume can dry up fast during crashes.\nmay not fill at intended price.\n3. exchange risk\nbinance regulatory issues possible.\nneed multi-exchange setup.\n4. correlation breakdown\nlow correlation today ≠ low correlation tomorrow.\nflash crashes hit everything.\ntimeline # september: paper trade SOL, ADA, DOGE (20+ trades each)\noctober: if validated, go live with 0.25% risk\nnovember: if performing, increase to 0.5% risk\ndecember: evaluate full crypto allocation (maybe increase from 30%)\nwhy this matters # crypto is 30% allocation but underutilized.\nBTC/ETH only = missing altcoin volatility.\nmomentum strategy works on BTC/ETH.\nshould work on liquid altcoins too.\npotential to add $2-3k monthly profit if validated.\n3:05am tuesday. crypto altcoin research done. SOL, ADA, DOGE look promising. paper trading next month. expanding beyond BTC/ETH.\n-AK\n","date":"12 September 2023","externalUrl":null,"permalink":"/posts/2023-09-12-crypto-altcoin-momentum-research/","section":"Posts","summary":"\u003cp\u003ecrypto allocation is 30% but only trading BTC/ETH.\u003c/p\u003e\n\u003cp\u003eleaving money on table. been researching altcoins on \u003ca\n  href=\"https://www.reddit.com/r/CryptoCurrency/\"\n    target=\"_blank\"\n  \u003er/CryptoCurrency\u003c/a\u003e and \u003ca\n  href=\"https://www.coingecko.com/\"\n    target=\"_blank\"\n  \u003eCoinGecko\u003c/a\u003e.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ecurrent crypto setup \n    \u003cdiv id=\"current-crypto-setup\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#current-crypto-setup\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eallocation:\u003c/strong\u003e $107,700 (30% of $359k account)\u003c/p\u003e","title":"researching crypto altcoin momentum - expanding beyond btc/eth","type":"posts"},{"content":"","date":"9 September 2023","externalUrl":null,"permalink":"/tags/dating/","section":"Tags","summary":"","title":"Dating","type":"tags"},{"content":"","date":"9 September 2023","externalUrl":null,"permalink":"/tags/relationships/","section":"Tags","summary":"","title":"Relationships","type":"tags"},{"content":"been with A. for 3 months now.\nlongest relationship since parents died.\nhow we met # june 13. coffee shop in la jolla.\nshe was coding. macbook covered in stickers.\nasked what she was working on. python data pipeline.\nwe talked tech for 2 hours.\nexchanged numbers.\nfirst date # june 16. dinner at local taco spot. cheap, casual.\nshe asked about my servers at home.\nshowed her photos of the dell rack.\nmost girls glaze over. she asked technical questions.\nthat\u0026rsquo;s when i knew she was different.\nthree months in # she stays over 4-5 nights per week now.\nhas drawer at my place. toothbrush, clothes, all her shit.\ncooks dinner sometimes. teaches me recipes.\nphysical: blonde, fit (runs 5 miles daily), great tits, knows what she\u0026rsquo;s doing.\npersonality: smart, independent, doesn\u0026rsquo;t need constant attention.\ncompatibility: we can sit in same room, both coding, comfortable silence.\nwhat\u0026rsquo;s different # previous girlfriends:\nM. - clingy AF, constant texts, lasted 6 weeks.\nK. - fun but airhead, couldn\u0026rsquo;t talk about anything real, 8 weeks.\nS. - hot but boring, nothing in common, 5 weeks.\nJ. - twice, both times crashed and burned under 3 months.\npattern: lost interest fast. always felt suffocating.\nwith A.: no pressure. she has her own life, i have mine. we merge when it makes sense.\ntherapy session yesterday (9/8) # dr. r asked: \u0026ldquo;what\u0026rsquo;s different about this one?\u0026rdquo;\nme: \u0026ldquo;i don\u0026rsquo;t feel trapped. she gives me space.\u0026rdquo;\ndr. r: \u0026ldquo;sounds like secure attachment. rare for you.\u0026rdquo;\nme: \u0026ldquo;is that supposed to be a compliment or diagnosis?\u0026rdquo;\ndr. r: \u0026ldquo;both. your pattern is avoidant. you bolt when girls get close. A. isn\u0026rsquo;t chasing, so you\u0026rsquo;re not running.\u0026rdquo;\nfuck. that hit.\nparents and relationships # realization from therapy:\nafter parents died, i avoided attachment.\ncouldn\u0026rsquo;t lose anyone else.\nkept girls at distance. bailed before feelings developed.\nA. is first person since parents where i\u0026rsquo;m not planning exit strategy.\nthe fears # what if i fuck this up?\nmy track record is shit.\nlongest before parents died: 4 months.\nafter they died: 6 weeks max until A.\nwhat if she leaves?\ncan\u0026rsquo;t lose someone else.\nalready lost parents.\nbut dr. r says avoiding connection = guaranteed to lose everyone eventually.\nwhat\u0026rsquo;s next # short term: keep doing what we\u0026rsquo;re doing. no pressure. no labels drama.\nmedium term: see where it goes. maybe she moves in eventually? too early to think about.\nlong term: no fucking clue. i\u0026rsquo;m 20. she\u0026rsquo;s 22. we\u0026rsquo;re both focused on careers.\ntrading impact # positive: she understands when i\u0026rsquo;m in zone. doesn\u0026rsquo;t interrupt during trading hours.\nnegative: less late night coding time. she stays over, i go to bed earlier.\nneutral: account still growing. +$1,480 this week. relationship not hurting performance.\nthe test # september 31 will be 9 months since parents died.\nfirst real anniversary with someone i care about.\nif we\u0026rsquo;re still solid by then, this might actually work.\ncurrent feeling # cautiously optimistic.\ndon\u0026rsquo;t want to jinx it.\nbut yeah. this feels different.\n2:25pm saturday. three months with A. first time i\u0026rsquo;m not planning escape route. therapy helping me not fuck this up.\n-AK\n","date":"9 September 2023","externalUrl":null,"permalink":"/posts/2023-09-09-three-months-with-a/","section":"Posts","summary":"\u003cp\u003ebeen with A. for 3 months now.\u003c/p\u003e\n\u003cp\u003elongest relationship since parents died.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ehow we met \n    \u003cdiv id=\"how-we-met\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#how-we-met\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003ejune 13. coffee shop in la jolla.\u003c/p\u003e","title":"three months with A - first time this feels right","type":"posts"},{"content":"week 1 september done.\nslow week. consistent gains.\nweek 1 trades # 9/1 friday: +$965 (mean reversion +$425, momentum +$540)\n9/5 tuesday: +$310 (TLT call spread)\n9/6 wednesday: +$205 (QQQ put spread)\nweek total: +$1,480\nseptember progress # goal: +$5,000\ncurrent: +$1,480\nprogress: 29.6% to goal\ndays left: 19\nif maintain pace, hit $7,400 by month end.\naccount status # sept 1 start: $358,450\ncurrent sept 6: $359,930\ngain: +$1,480 (+0.41%)\nmomentum strategy update # total live trades: 5\nwins: 5\nlosses: 0\nwin rate: 100%\nnet: +$2,540\nsample size still small.\nneed 15 more trades before confident.\nmean reversion performance # september trades: 5\nwins: 4\nlosses: 1\nwin rate: 80%\nnet: +$940\none loss on 9/4 (holiday monday, low volume). -$215.\nlesson learned: avoid trading holidays.\nfilter effectiveness this week # blocked trades:\nvol detection: 2 trades correlation limit: 1 trade time-of-day: 1 trade holiday filter: now added after 9/4 loss estimated saves: ~$400\naccount milestone tracking # current: $359,930\nnext target: $360,000\nneed $70 more.\nhitting it this week probably friday.\nwhat\u0026rsquo;s working # 1. discipline\nfollowing rules. no revenge trading after 9/4 loss.\n2. patience\npassing on marginal setups.\nquality over quantity.\n3. filters\nblocking bad trades before they happen.\nsaved estimated $400 this week alone.\nwhat needs improvement # 1. holiday trading\nlearned hard way. 9/4 labor day = low volume = fake moves.\nadded holiday filter to block entries.\n2. crypto diversification\ncurrently 30% crypto allocation but only trading BTC/ETH.\nresearching altcoin momentum strategies.\n3. risk scaling\nmomentum strategy performing but still at 0.5% risk.\nneed more data before increasing.\nbiggest win this week # 9/1 friday momentum: SPX breakout +$540\ncaptured trending move perfectly.\nstage 1 exit at 2R (+$270).\ntrailed remaining half to 4R (+$270).\ntotal: +$540 (2.7R average).\npersonal update # A. and i are solid.\nshe has drawer at my place now. toothbrush, clothes, makeup shit.\nfeels natural. not forced.\nnever had this stability before.\nnext week plan # financial target: +$1,500 minimum\nstrategy focus:\ncontinue mean reversion as primary collect 3-5 more momentum trades test crypto altcoin signals (paper trade first) infrastructure:\nresearch websocket feeds for faster data optimize async pipeline (currently 200ms latency) risks ahead # 1. small sample momentum\n5 trades perfect record = dangerous confidence.\nstaying at 0.5% risk until 20+ trades.\n2. september historically choppy\nback-to-school, post-summer volume drop.\nmay see fewer quality setups.\n3. relationship time management\nA. staying over more = less late night coding time.\nneed balance. trading comes first.\nreflection # week 1 solid. +$1,480.\nslow grind beats big swings.\nconsistency is the goal.\n3:18am thursday. week 1 september done. +$1,480. slow but steady. 70 bucks from $360k milestone.\n-AK\n","date":"6 September 2023","externalUrl":null,"permalink":"/posts/2023-09-06-september-week-1-review/","section":"Posts","summary":"\u003cp\u003eweek 1 september done.\u003c/p\u003e\n\u003cp\u003eslow week. consistent gains.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 1 trades \n    \u003cdiv id=\"week-1-trades\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-1-trades\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e9/1 friday:\u003c/strong\u003e +$965 (mean reversion +$425, momentum +$540)\u003c/p\u003e","title":"september week 1 - slow grind up","type":"posts"},{"content":"momentum strategy has 5 wins, 0 losses.\ntime to explain how it works.\ncore concept # capture trending moves after consolidation breaks.\nnot chasing breakouts blindly.\nwaiting for specific confirmation signals.\nentry conditions # def check_momentum_entry(symbol, timeframe=\u0026#39;5m\u0026#39;): \u0026#34;\u0026#34;\u0026#34; momentum breakout entry logic combines consolidation detection + volume confirmation + trend filter \u0026#34;\u0026#34;\u0026#34; # get price data df = get_price_data(symbol, lookback=100, timeframe=timeframe) # calculate ATR for volatility context df[\u0026#39;atr\u0026#39;] = calculate_atr(df, period=14) current_atr = df[\u0026#39;atr\u0026#39;].iloc[-1] # consolidation detection: look for tight range consolidation_period = 20 recent_high = df[\u0026#39;high\u0026#39;].iloc[-consolidation_period:].max() recent_low = df[\u0026#39;low\u0026#39;].iloc[-consolidation_period:].min() consolidation_range = (recent_high - recent_low) / df[\u0026#39;close\u0026#39;].iloc[-1] # must be consolidating (range \u0026lt; 1.5% of price) if consolidation_range \u0026gt; 0.015: return None # not tight enough # breakout detection current_price = df[\u0026#39;close\u0026#39;].iloc[-1] breakout_high = recent_high * 1.001 # 0.1% buffer if current_price \u0026lt; breakout_high: return None # no breakout yet # volume confirmation avg_volume = df[\u0026#39;volume\u0026#39;].iloc[-50:-1].mean() current_volume = df[\u0026#39;volume\u0026#39;].iloc[-1] volume_ratio = current_volume / avg_volume if volume_ratio \u0026lt; 1.5: return None # volume too weak # trend filter: must be in uptrend ema_20 = df[\u0026#39;close\u0026#39;].ewm(span=20).mean().iloc[-1] ema_50 = df[\u0026#39;close\u0026#39;].ewm(span=50).mean().iloc[-1] if ema_20 \u0026lt; ema_50: return None # not in uptrend # all conditions met entry_signal = { \u0026#39;symbol\u0026#39;: symbol, \u0026#39;entry_price\u0026#39;: current_price, \u0026#39;consolidation_range\u0026#39;: consolidation_range, \u0026#39;volume_ratio\u0026#39;: volume_ratio, \u0026#39;atr\u0026#39;: current_atr, \u0026#39;stop_loss\u0026#39;: recent_low - (current_atr * 0.5), \u0026#39;initial_target\u0026#39;: current_price + (current_atr * 2.0) } return entry_signal position sizing # risk 0.5% per trade.\nconservative until 20 trades collected.\ndef calculate_position_size(account_value, entry_price, stop_loss): \u0026#34;\u0026#34;\u0026#34; position sizing based on ATR stop \u0026#34;\u0026#34;\u0026#34; risk_amount = account_value * 0.005 # 0.5% risk # calculate stop distance stop_distance = abs(entry_price - stop_loss) # shares = risk_amount / stop_distance shares = int(risk_amount / stop_distance) # max position size: 5% of account max_position_value = account_value * 0.05 max_shares = int(max_position_value / entry_price) return min(shares, max_shares) exit logic # two-stage profit taking.\nstage 1: exit 50% at 2:1 R/R\nstage 2: trail remaining 50% with ATR-based stop\ndef manage_momentum_position(position, current_price, current_atr): \u0026#34;\u0026#34;\u0026#34; energetic exit management \u0026#34;\u0026#34;\u0026#34; entry = position[\u0026#39;entry_price\u0026#39;] stop = position[\u0026#39;stop_loss\u0026#39;] risk = entry - stop # unrealized P\u0026amp;L unrealized_pnl = current_price - entry r_multiple = unrealized_pnl / risk # stage 1: take 50% at 2R if r_multiple \u0026gt;= 2.0 and not position[\u0026#39;stage1_exit\u0026#39;]: exit_half_position(position) position[\u0026#39;stage1_exit\u0026#39;] = True position[\u0026#39;breakeven_stop\u0026#39;] = True # move stop to breakeven after stage 1 exit if position[\u0026#39;breakeven_stop\u0026#39;]: position[\u0026#39;stop_loss\u0026#39;] = max(position[\u0026#39;stop_loss\u0026#39;], entry) # stage 2: trail with ATR if position[\u0026#39;stage1_exit\u0026#39;]: trailing_stop = current_price - (current_atr * 1.5) position[\u0026#39;stop_loss\u0026#39;] = max(position[\u0026#39;stop_loss\u0026#39;], trailing_stop) # check if stopped out if current_price \u0026lt;= position[\u0026#39;stop_loss\u0026#39;]: exit_position(position) return \u0026#39;STOPPED\u0026#39; return \u0026#39;HOLDING\u0026#39; filtering out bad setups # vol filter: if VIX \u0026gt; 30, pause strategy\ncorrelation filter: max 2 positions if SPX correlation \u0026gt; 0.7\ntime filter: no entries last 30 min of trading day\ndef apply_momentum_filters(signal): \u0026#34;\u0026#34;\u0026#34; additional safety filters \u0026#34;\u0026#34;\u0026#34; # vol regime check vix = get_vix_level() if vix \u0026gt; 30: return False # too volatile # check existing positions for correlation open_positions = get_open_positions() if len(open_positions) \u0026gt;= 2: correlation = check_correlation(signal[\u0026#39;symbol\u0026#39;], open_positions) if correlation \u0026gt; 0.7: return False # too correlated # time of day check current_time = datetime.now().time() market_close = time(16, 0) # 4pm ET if current_time \u0026gt; time(15, 30): return False # too close to close return True backtesting results (jan-aug 2023) # ran backtest before going live.\ntrades: 47\nwins: 34\nlosses: 13\nwin rate: 72.3%\navg win: $685\navg loss: $280\nprofit factor: 2.45\nmax drawdown: -8.2%\nsharpe ratio: 1.82\nlive performance (august 2023) # trades: 4\nwins: 4\nlosses: 0\nwin rate: 100%\nnet profit: +$2,000\nstill small sample.\nneeds 20+ trades before confident.\nwhat makes this work # 1. tight consolidation = coiled spring\nprice compression builds energy.\nbreakout has momentum behind it.\n2. volume confirmation = real interest\nbreakout without volume = fake move.\nvolume spike = institutions participating.\n3. trend filter = direction bias\nonly taking breakouts in direction of trend.\navoids counter-trend traps.\n4. two-stage exit = lock profits + let winners run\ntaking half at 2R protects capital.\ntrailing half captures extended moves.\nrisks # 1. false breakouts\nprice breaks out then reverses.\nmitigated by volume filter + tight stop.\n2. whipsaw in ranging market\nchoppy conditions = multiple failed breakouts.\nmitigated by consolidation tightness requirement.\n3. gap risk\novernight gaps can blow through stop.\nmitigated by small position size (0.5% risk).\nnext steps # collect 20 total trades.\nif metrics hold:\nwin rate \u0026gt;70% profit factor \u0026gt;2.0 max DD \u0026lt;10% then increase risk to 1.0% per trade.\nif not, pause and refine.\ncode on github # full implementation: github.com/algoking/momentum-breakout\nincludes:\nentry logic position sizing exit management backtesting framework live example: august 16 trade # symbol: SPX\nentry: $4,437.50 (breakout confirmed)\nstop: $4,430.00 (consolidation low - 0.5 ATR)\nstage 1 exit: $4,452.50 (2R, +$520 on half)\nstage 2 exit: $4,461.00 (trailed stop hit, +$340 on half)\ntotal: +$860 (4.3R trade)\nworked exactly as designed.\n2:47am sunday. momentum strategy explained. 5 trades, 5 wins. needs validation with larger sample. continuing 0.5% risk.\n-AK\n","date":"3 September 2023","externalUrl":null,"permalink":"/posts/2023-09-03-momentum-breakout-deep-dive/","section":"Posts","summary":"\u003cp\u003emomentum strategy has 5 wins, 0 losses.\u003c/p\u003e\n\u003cp\u003etime to explain how it works.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ecore concept \n    \u003cdiv id=\"core-concept\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#core-concept\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003ecapture trending moves after consolidation breaks.\u003c/p\u003e","title":"momentum breakout strategy - how it works","type":"posts"},{"content":"september started.\nfirst trading day strong.\nfriday 9/1 trades # mean reversion: TLT call spread +$425\nmomentum: SPX breakout +$540\nday 1: +$965\nseptember goal # target: +$5,000\nday 1: +$965 (19% to goal already)\nmomentum strategy update # total trades since launch: 5\nwins: 5\nlosses: 0\nwin rate: 100%\nnet: +$2,540\nstill small sample but performing.\nkeeping at 0.5% risk until 20 trades collected.\naccount status # start september: $357,485 current sept 1: $358,450 gain: +$965 (+0.27%)\nnext milestone # current: $358,450\ntarget: $360,000\nneed $1,550 more. probably hit next week.\npersonal update # A. and i hit 3 month mark this week.\nlongest relationship i\u0026rsquo;ve had since parents died.\nshe stays over most nights now. has stuff at my place.\nfeels natural. not rushed. just works.\n4:12am saturday. september started strong. +$965 day one. momentum strategy continues perfect record. life is good.\n-AK\n","date":"1 September 2023","externalUrl":null,"permalink":"/posts/2023-09-01-september-starts-strong/","section":"Posts","summary":"\u003cp\u003eseptember started.\u003c/p\u003e\n\u003cp\u003efirst trading day strong.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003efriday 9/1 trades \n    \u003cdiv id=\"friday-91-trades\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#friday-91-trades\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003emean reversion:\u003c/strong\u003e TLT call spread +$425\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003emomentum:\u003c/strong\u003e SPX breakout +$540\u003c/p\u003e","title":"september day 1 - new month strong start","type":"posts"},{"content":"august done.\nbest month yet.\nfinal numbers # goal: +$4,000\nactual: +$6,340\nbeat goal by: +$2,340 (58.5% over target)\naccount growth # start august 1: $351,145 end august 31: $357,485 gain: +$6,340 (+1.81%)\nweekly breakdown # week 1: +$2,065 week 2: +$1,805 week 3: +$1,705 week 4: +$765\ntotal: 18 trades, 16 wins, 2 losses (89% win rate)\nstrategy performance # mean reversion:\ntrades: 14 win rate: 79% (11 wins, 3 losses) net: +$4,340 momentum (new):\ntrades: 4 win rate: 100% (4 wins, 0 losses) net: +$2,000 momentum small sample but promising.\n6-month performance (march-august) # march start: $400,000 (before losses) august end: $357,485\ntimeline:\njan-mar: -$180,000 (learning period, painful) apr: break-even (applying systems) may: +$22,740 june: +$3,285 july: +$6,120 august: +$6,340 net since going live april: +$38,485 from $220k low = +17.5%\nrecovered from losses. profitable 4 months straight.\nwhat worked this month # 1. new filters\ntime-of-day, gap detection, correlation limits.\nblocked 35 trades total.\nestimated saved: $2,800.\n2. momentum strategy\nadded regime diversification.\n4 trades, all winners.\ncontinuing at 0.5% risk.\n3. timescaledb migration\n10x faster backtesting.\ncan iterate strategies way faster.\n4. discipline\nfollowed rules. no revenge trading. consistent size.\nbest trade # august 16: momentum breakout +$520\ncaptured trending move. trail stop worked perfectly.\nworst trade # august 14: SPX put spread -$360\nfought gap momentum. added gap filter after this.\nlearned from it.\ncomparison to july # july: +$6,120 (23 trades, 87% win rate) august: +$6,340 (18 trades, 89% win rate)\nsimilar profit. fewer trades. higher win rate.\nefficiency improving.\nseptember goals # financial: +$5,000 (higher than august base goal)\nstrategy:\ncollect 20 momentum trades if validated, increase to 1.0% risk keep mean reversion unchanged infrastructure:\nresearch websocket feeds optimize async pipeline further personal: keep relationship with A. healthy, stay in therapy\nrisks ahead # 1. momentum small sample\nonly 4 trades. need 20+ before confident.\n2. market regime change\nstrategies work in current conditions.\nif vol spikes \u0026gt;40, need adjustments.\n3. overconfidence\n4 profitable months ≠ figured it all out.\nstaying humble.\nreflection on august # turned 20 last month (july 4).\n9 months since parents died (dec 31).\nmostly healed now. therapy helping.\ndating A. for 2.5 months. she stays over frequently. stable.\ntrading crushing it. systems working. life is good.\nlooking ahead # continue what\u0026rsquo;s working.\ndon\u0026rsquo;t change winning strategies.\nstay disciplined. stay humble.\n11:40pm friday. august done. +$6,340. best month yet. crushed goal. september target: $5k.\n-AK\n","date":"28 August 2023","externalUrl":null,"permalink":"/posts/2023-08-28-august-wrap/","section":"Posts","summary":"\u003cp\u003eaugust done.\u003c/p\u003e\n\u003cp\u003ebest month yet.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003efinal numbers \n    \u003cdiv id=\"final-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#final-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003egoal:\u003c/strong\u003e +$4,000\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eactual:\u003c/strong\u003e +$6,340\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ebeat goal by:\u003c/strong\u003e +$2,340 (58.5% over target)\u003c/p\u003e","title":"august wrap - crushed goal by 50%","type":"posts"},{"content":"one week left in august.\ncurrently at +$5,575.\ntargeting +$6,000 by month end.\nweek 4 starts strong # monday 8/21:\nmean reversion: TLT call spread +$405 momentum: none (ranging regime) day 1: +$405\naugust total: +$5,980\n$20 away from $6k target.\nmean reversion vs momentum comparison # august mean reversion:\ntrades: 14 wins: 11 losses: 3 win rate: 79% net: +$3,980 august momentum:\ntrades: 4 wins: 4 losses: 0 win rate: 100% net: +$2,000 momentum crushing it but small sample size.\nmean reversion carrying the load with higher trade frequency.\nfilter effectiveness # august filters blocked:\nvol detection: 18 trades correlation limit: 7 trades time-of-day: 6 trades gap detection: 4 trades estimated saves: ~$2,800\nfilters proving their worth.\naccount milestone # current: $357,125\nnext milestone: $360,000\nneed $2,875 more.\nprobably hit it september.\nmomentum strategy decision # collected 4 trades at 0.5% risk.\nall winners so far.\nplan: continue 0.5% risk rest of august.\ndecision point: after 20 total momentum trades, evaluate:\nif win rate \u0026gt;70% and profit factor \u0026gt;2.0 → increase to 1.0% risk if not → keep at 0.5% or pause strategy what\u0026rsquo;s next # last week of august.\nprotect profits. don\u0026rsquo;t give back gains.\nconservative trading. quality over quantity.\ntarget: 3-4 more trades to close month strong.\npersonal life # A. staying over more frequently now. most weekends, couple weeknights per week.\nshe cooks, i help. learning from her.\nnever had this with previous girlfriends. feels different.\nstable. comfortable. good.\n3:35am monday. august week 4 starts. $20 from $6k target. one strong week to close month.\n-AK\n","date":"21 August 2023","externalUrl":null,"permalink":"/posts/2023-08-21-week-3-small-wins/","section":"Posts","summary":"\u003cp\u003eone week left in august.\u003c/p\u003e\n\u003cp\u003ecurrently at +$5,575.\u003c/p\u003e\n\u003cp\u003etargeting +$6,000 by month end.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 4 starts strong \n    \u003cdiv id=\"week-4-starts-strong\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-4-starts-strong\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003emonday 8/21:\u003c/strong\u003e\u003c/p\u003e","title":"august week 4 final push - targeting $6k month","type":"posts"},{"content":"","date":"21 August 2023","externalUrl":null,"permalink":"/tags/goals/","section":"Tags","summary":"","title":"Goals","type":"tags"},{"content":"","date":"18 August 2023","externalUrl":null,"permalink":"/tags/filters/","section":"Tags","summary":"","title":"Filters","type":"tags"},{"content":"added gap detection after august 14 loss.\nbeen running it 4 days.\nalready proving useful.\nthe filter logic # skip trading if:\nmarket gaps \u0026gt;1% at open within 2 hours of gap open regardless of vol detection status reasoning: gaps create new price ranges. entering against gap momentum = fighting tape.\nimplementation # async def check_gap_filter(self, symbol: str) -\u0026gt; bool: \u0026#34;\u0026#34;\u0026#34;Check if gap is too large to trade\u0026#34;\u0026#34;\u0026#34; # Get today\u0026#39;s open and yesterday\u0026#39;s close today_open = await self.get_today_open(symbol) yesterday_close = await self.get_yesterday_close(symbol) # Calculate gap % gap_pct = abs((today_open - yesterday_close) / yesterday_close) if gap_pct \u0026gt; 0.01: # 1% gap threshold # Check time since open market_open_time = self.get_market_open_time() current_time = datetime.now() hours_since_open = (current_time - market_open_time).seconds / 3600 if hours_since_open \u0026lt; 2: logger.warning(f\u0026#34;BLOCKED: {symbol} - gap {gap_pct:.2%}, only {hours_since_open:.1f}h since open\u0026#34;) return False return True this week\u0026rsquo;s saves # monday 8/14: (the loss that triggered this filter)\n1.2% gap up at open entered at 10:30am (1 hour after open) lost -$360 with new filter: would\u0026rsquo;ve been blocked wednesday 8/16:\n1.4% gap down at open filter blocked SPX entry at 10:45am position would\u0026rsquo;ve stopped: -$340 saved: $340 friday 8/18:\n1.1% gap up at open filter blocked QQQ entry at 11:00am position would\u0026rsquo;ve stopped: -$295 saved: $295 total saved in 4 days: $635 (would\u0026rsquo;ve been $995 if counted original loss)\ntradeoff analysis # blocked trades: 3\n2 would\u0026rsquo;ve lost: -$635 1 would\u0026rsquo;ve won: +$280 net benefit: +$355\nworth it.\nfilter stack growing # current entry filters (all must pass):\nvol detection (blocks elevated/spike regimes) correlation limit (max 2 equity positions) time-of-day (skip first 30 min) gap detection (skip 2h after \u0026gt;1% gap) each filter removes bad trades.\nstacking them = higher win rate.\naugust week 4 preview # week 1: +$2,065 week 2: +$1,805 week 3: +$1,705 current: +$5,575\nneed $425 more to hit $6k august.\n1 week left. easy.\nmomentum strategy # continuing at 0.5% risk.\ntotal momentum trades: 4 (all wins)\nwin rate: 100% (4/4)\nprofit factor: infinite (no losses yet)\nobviously not sustainable but good start.\naccount status # start august: $351,145 current aug 18: $356,720 gain: +$5,575 (+1.59%)\n2:52pm friday. gap filter working. saved $635 in first 4 days. filter stack preventing bad trades. august continues strong.\n-AK\n","date":"18 August 2023","externalUrl":null,"permalink":"/posts/2023-08-18-broke-up-with-j-again/","section":"Posts","summary":"\u003cp\u003eadded gap detection after august 14 loss.\u003c/p\u003e\n\u003cp\u003ebeen running it 4 days.\u003c/p\u003e\n\u003cp\u003ealready proving useful.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe filter logic \n    \u003cdiv id=\"the-filter-logic\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-filter-logic\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eskip trading if:\u003c/strong\u003e\u003c/p\u003e","title":"gap detection filter preventing losses","type":"posts"},{"content":"","date":"18 August 2023","externalUrl":null,"permalink":"/tags/gaps/","section":"Tags","summary":"","title":"Gaps","type":"tags"},{"content":"went live with momentum strategy monday.\nran it alongside mean reversion all week.\nfirst week results in.\nstrategy recap # mean reversion (existing): trade in ranging markets, high win rate, small consistent wins\nmomentum (new): trade in trending markets, lower win rate, bigger wins\nboth strategies. different market regimes.\nweek 3 results # mean reversion: 4 trades, 3 wins, 1 loss\nwins: +$385, +$340, +$295 loss: -$315 net: +$705 momentum: 2 trades, 2 wins, 0 losses\nwins: +$480, +$520 net: +$1,000 combined week 3: +$1,705 (6 trades, 5 wins, 1 loss)\nmomentum outperformed mean reversion this week.\nmomentum position sizing # started at 0.5% risk (half of mean reversion 1.25%).\nreasoning: new strategy, lower confidence, reduce risk while validating.\nboth momentum trades hit profit targets at 3x ATR.\nlarger wins because trend following captures bigger moves.\nregime detection working # monday: ranging regime → mean reversion trade (+$385)\ntuesday: trending regime → momentum trade (+$480)\nwednesday: ranging regime → mean reversion trade (+$340)\nthursday: trending regime → momentum trade (+$520)\nfriday: ranging regime → mean reversion trade (-$315)\nsystem correctly identified regimes 5/5 days.\ncorrelation between strategies # tracked correlation between mean reversion and momentum.\ncorrelation: 0.18\nalmost uncorrelated. exactly what i wanted.\nwhen one loses, other can still win (different market conditions).\naugust updated # goal: +$4,000 (beat in week 2)\nweek 1: +$2,065 week 2: +$1,805 week 3: +$1,705 total: +$5,575\naccount: $351,145 → $356,720 (+$5,575, +1.59%)\ncrushing august goal.\nnext steps # momentum strategy:\ncontinue 0.5% risk for 2 more weeks (collect 20+ trades) if win rate stays \u0026gt;70%, increase to 1.0% risk if profit factor stays \u0026gt;2.0, make permanent mean reversion:\nno changes keep doing what works personal update # A. been staying over more. most weekends now. sometimes weeknights.\nshe cooks dinner, i handle breakfast. works well.\nthis is new for me. never had girlfriend stay over regularly.\ni like it. life is good.\n4:08am wednesday. momentum strategy live first week. +$1,000 from momentum, +$705 from mean reversion. uncorrelated. working well.\n-AK\n","date":"16 August 2023","externalUrl":null,"permalink":"/posts/2023-08-16-backtest-overfitting-check/","section":"Posts","summary":"\u003cp\u003ewent live with momentum strategy monday.\u003c/p\u003e\n\u003cp\u003eran it alongside mean reversion all week.\u003c/p\u003e\n\u003cp\u003efirst week results in.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003estrategy recap \n    \u003cdiv id=\"strategy-recap\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#strategy-recap\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003emean reversion (existing):\u003c/strong\u003e trade in ranging markets, high win rate, small consistent wins\u003c/p\u003e","title":"momentum strategy live - first week results","type":"posts"},{"content":"","date":"16 August 2023","externalUrl":null,"permalink":"/tags/results/","section":"Tags","summary":"","title":"Results","type":"tags"},{"content":"perfect streak ended.\n11 straight winners in august.\nhit my first loser monday.\nmonday 8/14 trade # SPX put spread\nentry: sold $2.40 credit stop: -$3.60 (-150%) loss: -$360\nvol detection gave green light. correlation check passed.\nentered 10:30am.\nposition moved against me immediately.\nhit stop at 11:15am.\nwhy it lost # my analysis:\nmarket gapped up at open. i waited until 10:30am per time filter.\nbut: gap already established new range.\nmy entry was fighting the gap up momentum.\nshould\u0026rsquo;ve skipped. hindsight 20/20.\nwhat i did right:\nfollowed stop loss (didn\u0026rsquo;t hope) kept size at 1.25% risk logged the trade for analysis what i could improve:\nadd gap detection to filters skip trades within 2 hours of significant gap (\u0026gt;1%) mental game # expectation: 80% win rate = 1 loser every 5 trades\nreality: 11 winners then 1 loser\nstill above expectation. variance is normal.\nemotional reaction: zero tilt. just data.\nthis is what risk management is for.\naugust updated # goal: +$4,000 (beat in week 2)\ncurrent: +$3,510 (down from $3,870 after -$360 loss)\nweek 3 so far: -$360 (1 trade, 0 wins, 1 loss)\nstill way ahead for month.\naccount status # start august: $351,145 current aug 14: $354,655 gain: +$3,510 (+1.00%)\n11-trade win streak stats # may-august win streaks:\nlongest: 11 trades (just ended) average: 5.2 trades median: 4 trades this streak was statistical outlier.\nexpected it to end. it did. moving on.\nwhat\u0026rsquo;s next # continuing same strategy.\nadding gap detection filter.\nexpecting normal win rate (80%) rest of month.\ncomparison to learning period # jan-mar 2023 (learning):\nlosses tilted me revenge traded broke rules lost $180k total now (august 2023):\nlosses are data follow rules keep size consistent up $135k since april difference: discipline.\nmomentum strategy update # paper trading momentum for 2 weeks.\nstats: 12 trades, 9 wins, 3 losses (75% win rate)\nprofit factor: 2.8\ngoing live this week with 0.5% risk (half of mean reversion size).\n3:20am tuesday. first august loser. 11-trade streak ended. -$360. discipline holding. still way ahead for month.\n-AK\n","date":"14 August 2023","externalUrl":null,"permalink":"/posts/2023-08-14-first-losing-trade-august/","section":"Posts","summary":"\u003cp\u003eperfect streak ended.\u003c/p\u003e\n\u003cp\u003e11 straight winners in august.\u003c/p\u003e\n\u003cp\u003ehit my first loser monday.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003emonday 8/14 trade \n    \u003cdiv id=\"monday-814-trade\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#monday-814-trade\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eSPX put spread\u003c/strong\u003e\u003c/p\u003e","title":"first loser of august - streak ended at 11","type":"posts"},{"content":"august week 2 done.\nbeat monthly goal 2 weeks early.\nweek 2 trades # monday 8/7: +$385 (GLD put spread) tuesday 8/8: +$340 (TLT call spread) wednesday 8/9: +$405 (SPX put spread) thursday 8/10: +$295 (IWM call spread) friday 8/11: +$380 (QQQ put spread) saturday 8/12: no trades (personal day with A.)\ntotal week 2: +$1,805 (5 trades, 5 wins, 0 losses)\nanother perfect week.\naugust progress # goal: +$4,000\nweek 1: +$2,065 week 2: +$1,805 total: +$3,870\nbeat goal in 2 weeks.\naccount status # start august: $351,145 current aug 12: $355,015 gain: +$3,870 (+1.10%)\n5-month live trading stats # april-august (since figuring out systems):\nstart: $220,000 (after $180k losses jan-mar) current: $355,015 gain: +$135,015 (+61.4%)\naveraging 12.3% per month.\ninsane but not sustainable. expecting regression to mean.\nwhat\u0026rsquo;s working # 1. time filter (skip first 30 min)\n2 weeks testing.\nsaved $715 total from avoiding volatile opens.\nkeeping permanently.\n2. max 2 equity positions\nreduced correlation exposure.\nlower returns but way lower risk.\nkeeping permanently.\n3. momentum paper trading\n8 paper trades, 7 wins.\nprofit factor: 3.1.\ngoing live next week with 0.5% risk.\npersonal update # saw A. saturday. been dating 2 months now.\nstill going well. zero red flags.\ntherapy with Dr. R. wednesday.\ntalked about processing grief (8 months since parents died).\nmostly stable. life is good.\nrest of august plan # already beat $4k goal.\nremaining 2.5 weeks: protect profits.\npriorities:\ndon\u0026rsquo;t give back gains maintain discipline test momentum strategy live (small size) stay conservative targeting +$1k more by month end = $5k total august.\ncomparison to july # july: +$6,120 (23 trades, 87% win rate) august (so far): +$3,870 (11 trades, 100% win rate)\non pace for $7-8k august if maintain current rate.\nbut expecting losing trades soon. 100% win rate not sustainable.\nmental state # confident but cautious.\nknow perfect weeks don\u0026rsquo;t last forever.\nstaying humble. following systems. not getting cocky.\n3:15pm saturday. beat august goal in 2 weeks. +$3,870 so far. staying disciplined rest of month.\n-AK\n","date":"12 August 2023","externalUrl":null,"permalink":"/posts/2023-08-12-week-2-strong-finish/","section":"Posts","summary":"\u003cp\u003eaugust week 2 done.\u003c/p\u003e\n\u003cp\u003ebeat monthly goal 2 weeks early.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 2 trades \n    \u003cdiv id=\"week-2-trades\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-2-trades\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003emonday 8/7:\u003c/strong\u003e +$385 (GLD put spread)\n\u003cstrong\u003etuesday 8/8:\u003c/strong\u003e +$340 (TLT call spread)\n\u003cstrong\u003ewednesday 8/9:\u003c/strong\u003e +$405 (SPX put spread)\n\u003cstrong\u003ethursday 8/10:\u003c/strong\u003e +$295 (IWM call spread)\n\u003cstrong\u003efriday 8/11:\u003c/strong\u003e +$380 (QQQ put spread)\n\u003cstrong\u003esaturday 8/12:\u003c/strong\u003e no trades (personal day with A.)\u003c/p\u003e","title":"august week 2 - beat monthly goal already","type":"posts"},{"content":"been storing market data in regular postgres.\nworks but slow for time-series queries.\nmigrated to timescaledb this week.\n10x speedup on historical queries.\ngot the idea from NexusFi algo infrastructure discussions about optimizing market data storage. someone mentioned timescaledb and i researched it.\nthe problem # typical query: get all 1-min bars for SPY last 30 days\npostgres: 8-12 seconds\ntimescaledb: 0.8 seconds\ndifference: timescaledb optimized for time-series data.\nwhat is timescaledb # postgres extension for time-series data.\nautomatically partitions data by time (hypertables).\ncompresses old data.\nway faster for time-range queries.\nmigration process # 1. installed timescaledb\napt-get install timescaledb-postgresql-14 2. created hypertable\nCREATE TABLE market_data ( time BIGINT NOT NULL, symbol TEXT NOT NULL, open NUMERIC, high NUMERIC, low NUMERIC, close NUMERIC, volume BIGINT ); SELECT create_hypertable(\u0026#39;market_data\u0026#39;, \u0026#39;time\u0026#39;); 3. migrated existing data\n8GB of historical bars (6 months, 10 symbols, 1-min resolution).\ntook 45 minutes to migrate.\nINSERT INTO market_data SELECT * FROM market_data_old ORDER BY time; 4. created indexes\nCREATE INDEX idx_symbol_time ON market_data (symbol, time DESC); 5. enabled compression\nALTER TABLE market_data SET (timescaledb.compress, timescaledb.compress_segmentby = \u0026#39;symbol\u0026#39;); SELECT add_compression_policy(\u0026#39;market_data\u0026#39;, INTERVAL \u0026#39;7 days\u0026#39;); compresses data older than 7 days.\nreduces storage by 70%.\nperformance comparison # query: last 30 days of SPY 1-min bars\npostgres:\nEXPLAIN ANALYZE SELECT * FROM market_data_old WHERE symbol = \u0026#39;SPY\u0026#39; AND time \u0026gt;= extract(epoch from now() - interval \u0026#39;30 days\u0026#39;) ORDER BY time; -- Planning time: 2.4ms -- Execution time: 11,842ms timescaledb:\nEXPLAIN ANALYZE SELECT * FROM market_data WHERE symbol = \u0026#39;SPY\u0026#39; AND time \u0026gt;= extract(epoch from now() - interval \u0026#39;30 days\u0026#39;) ORDER BY time; -- Planning time: 0.8ms -- Execution time: 823ms 14x faster.\nstorage savings # before (postgres):\n8GB data no compression indexes: 2GB total: 10GB after (timescaledb):\n8GB data (uncompressed recent) 1.8GB compressed (older than 7 days) indexes: 1.2GB total: 4.2GB 58% storage reduction.\nbacktesting impact # before: 6-hour backtest (2 years data, 3 strategies)\nafter: 45-minute backtest (same data)\n8x faster backtesting.\ncan iterate way faster now.\ncontinuous aggregates # also set up continuous aggregates for common queries.\nCREATE MATERIALIZED VIEW daily_ohlcv WITH (timescaledb.continuous) AS SELECT time_bucket(\u0026#39;1 day\u0026#39;, time) AS day, symbol, first(open, time) AS open, max(high) AS high, min(low) AS low, last(close, time) AS close, sum(volume) AS volume FROM market_data GROUP BY day, symbol; daily bars pre-calculated.\nqueries instant (50ms vs 2000ms).\nretention policy # keeping detailed data for limited time.\nSELECT add_retention_policy(\u0026#39;market_data\u0026#39;, INTERVAL \u0026#39;1 year\u0026#39;); automatically drops data older than 1 year.\nkeeps database size manageable.\nreal trading impact # strategy research:\nbefore: run backtest overnight, see results morning.\nafter: run backtest in 1 hour, iterate same day.\nlive trading:\nhistorical data queries for indicators way faster.\nreduced latency from 200ms → 20ms on indicator calculations.\nlessons learned # 1. right tool for right job\npostgres great for general data.\ntimescaledb better for time-series.\n2. compression matters\n70% storage reduction from compression.\nolder data rarely accessed, compress it.\n3. indexes on time + symbol\ncritical for query performance.\ninfrastructure details # running on:\nsame dell server postgres 14 + timescaledb extension 32GB RAM allocated to postgres NVMe storage for database monitoring:\ngrafana tracks query performance alerts if p95 query time \u0026gt; 1 second dashboard shows compression ratio next optimizations # already planning:\nadd more continuous aggregates (weekly, monthly bars) partition by symbol for even faster queries replicate to backup server for redundancy trading update # tuesday 8/8: +$340 (TLT call spread) wednesday 8/9: +$405 (SPX put spread)\naugust total: +$3,195\ngoal: +$4,000. need: +$805 in 2.5 weeks.\n2:25pm wednesday. migrated to timescaledb. 10x query speedup. 8x faster backtesting. can iterate way faster now.\n-AK\n","date":"9 August 2023","externalUrl":null,"permalink":"/posts/2023-08-09-database-migration-timescale/","section":"Posts","summary":"\u003cp\u003ebeen storing market data in regular postgres.\u003c/p\u003e\n\u003cp\u003eworks but slow for time-series queries.\u003c/p\u003e\n\u003cp\u003emigrated to timescaledb this week.\u003c/p\u003e\n\u003cp\u003e10x speedup on historical queries.\u003c/p\u003e\n\u003cp\u003egot the idea from \u003ca\n  href=\"https://nexusfi.com/showthread.php?t=7455\"\n    target=\"_blank\"\n  \u003eNexusFi algo infrastructure discussions\u003c/a\u003e about optimizing market data storage. someone mentioned timescaledb and i researched it.\u003c/p\u003e","title":"migrating market data to timescaledb - 10x query speedup","type":"posts"},{"content":"been running mean reversion strategies for 4 months.\nworks well. 87% win rate in july.\nbut: only trades when price reverts.\nmisses trending moves.\nthe idea # add momentum overlay to existing system.\nmean reversion: buy dips, sell rips, expect reversion to mean\nmomentum: follow trends, ride winners, cut losers fast\ncombine both: trade mean reversion in ranging markets, momentum in trending markets.\nhow to detect regime # ranging market indicators:\n20-day ATR \u0026lt; 50-day ATR (volatility contracting) price within ±1 std dev of 20-day SMA no new 20-day highs/lows in past 5 days trending market indicators:\n20-day ATR \u0026gt; 50-day ATR (volatility expanding) price outside ±1 std dev of 20-day SMA new 20-day high/low in past 3 days strategy logic # if ranging_market: use mean_reversion_strategy() # current system, already working elif trending_market: use momentum_strategy() # new addition else: wait_for_clear_regime() # skip unclear regimes momentum strategy rules # entries:\nbuy breakout above 20-day high sell breakdown below 20-day low only in direction of trend exits:\ntrail stop at 2 × ATR profit target at 3 × ATR (risk:reward = 1:1.5) max hold: 5 days position size:\nsame 1.25% risk as mean reversion but faster stops (2 ATR vs fixed dollar) paper trading results (7 days) # ran in paper mode alongside live mean reversion.\ntrades: 4 momentum trades (all paper)\n3 wins: +$280, +$340, +$405 1 loss: -$270 win rate: 75% (3/4) avg win: +$342 avg loss: -$270 profit factor: 3.8\nvs mean reversion same period:\nmean reversion: 6 trades, 100% win rate, +$2,065 momentum: 4 trades, 75% win rate, +$755 (paper) key differences # mean reversion:\nhigh win rate (80-90%) small consistent wins works in ranging markets most of the time (70% of days) momentum:\nlower win rate (70-75% expected) larger wins when right works in trending markets less frequent (30% of days) combined: capture both regimes.\nwhat i\u0026rsquo;m testing this week # running momentum strategy in small size (0.5% risk).\nlive money but reduced risk while validating.\ncriteria to go full size:\n20+ trades win rate \u0026gt; 70% profit factor \u0026gt; 2.0 no correlation increase with mean reversion potential issues # 1. regime detection lag\nby the time i detect trend, might be late.\nsolution: use faster indicators (10-day instead of 20-day).\n2. whipsaws\nfake breakouts trigger entries, then reverse.\nsolution: require volume confirmation on breakouts.\n3. correlation with mean reversion\nif both strategies lose together, not adding diversification.\nsolution: track correlation daily, adjust if \u0026gt;0.5.\ntrading update # monday 8/7:\nmean reversion: GLD put spread +$385 momentum (paper): none (no trending regime detected) august total: +$2,450\ngoal: +$4,000. need: +$1,550 in 3 weeks.\nnext steps # continue paper trading momentum for 2 more weeks.\ncollect 20+ trades.\nthen decide: add to live system or abandon.\n3:55am monday. testing momentum overlay. early paper results promising. might add regime diversification.\n-AK\n","date":"7 August 2023","externalUrl":null,"permalink":"/posts/2023-08-07-momentum-strategy-test/","section":"Posts","summary":"\u003cp\u003ebeen running mean reversion strategies for 4 months.\u003c/p\u003e\n\u003cp\u003eworks well. 87% win rate in july.\u003c/p\u003e\n\u003cp\u003ebut: only trades when price reverts.\u003c/p\u003e\n\u003cp\u003emisses trending moves.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe idea \n    \u003cdiv id=\"the-idea\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-idea\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003eadd momentum overlay to existing system.\u003c/p\u003e","title":"testing momentum overlay - early results promising","type":"posts"},{"content":"first week of august done.\ntesting new filters.\nworking well.\nweek 1 trades # tuesday 8/1: +$745 (2 trades) wednesday 8/2: +$405 (1 trade) thursday 8/3: +$280 (1 trade) friday 8/4: +$340 (1 trade) saturday 8/5: +$295 (1 trade, crypto)\ntotal week 1: +$2,065 (6 trades, 6 wins, 0 losses)\nperfect week again.\naugust progress # goal: +$4,000 week 1: +$2,065 remaining: +$1,935 in 3 weeks\nalready 51% to goal in week 1.\nnew filters testing # 1. time-of-day filter (skip first 30 min)\ntested 5 days.\nblocked: 3 potential entries in first 30 min\n2 would\u0026rsquo;ve been losers (saved $625) 1 would\u0026rsquo;ve been winner (missed $280) net effect: +$345 saved\nkeeping this filter.\n2. max 2 equity positions\nlimited correlation exposure.\nblocked: 4 equity entries this week\ncouldn\u0026rsquo;t add 3rd equity position missed 3 winners (+$905), 1 loser (-$315) net effect: -$590 missed profit\nbut: reduced max drawdown risk significantly.\nkeeping this rule for risk management.\naccount status # start august: $351,145 current aug 5: $353,210 gain: +$2,065 (+0.59%)\ncomparison to july week 1 # july week 1: +$840 august week 1: +$2,065\n2.5x better start to month.\nwhat\u0026rsquo;s working # 1. validated parameters\n21-day lookback, 1.2 vol threshold, 50% profit target, -150% stops.\nno changes. just executing.\n2. vol detection\nblocked 5 entries this week.\n2 would\u0026rsquo;ve lost money.\nestimated saved: ~$510.\n3. discipline\nno revenge trading. no oversizing. following rules.\ntrade distribution # SPX: 2 trades, 2 wins (+$685) TLT: 3 trades, 3 wins (+$1,085) crypto: 1 trade, 1 win (+$295)\nTLT carrying this week. bonds have been strong.\npersonal update # saw A. tuesday night for 2-month dinner.\nthings still great. keeping relationship healthy.\ntherapy wednesday with Dr. R.\nprocessing 8 months since parents died. mostly stable.\nweek 2 preview # continue current approach.\nno changes to working systems.\naim for 4-6 trades.\nneed $645/week average to hit $4k goal.\n3:30pm saturday. week 1 done. +$2,065. new filters working. over halfway to august goal already.\n-AK\n","date":"5 August 2023","externalUrl":null,"permalink":"/posts/2023-08-05-week-1-august-review/","section":"Posts","summary":"\u003cp\u003efirst week of august done.\u003c/p\u003e\n\u003cp\u003etesting new filters.\u003c/p\u003e\n\u003cp\u003eworking well.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 1 trades \n    \u003cdiv id=\"week-1-trades\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-1-trades\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003etuesday 8/1:\u003c/strong\u003e +$745 (2 trades)\n\u003cstrong\u003ewednesday 8/2:\u003c/strong\u003e +$405 (1 trade)\n\u003cstrong\u003ethursday 8/3:\u003c/strong\u003e +$280 (1 trade)\n\u003cstrong\u003efriday 8/4:\u003c/strong\u003e +$340 (1 trade)\n\u003cstrong\u003esaturday 8/5:\u003c/strong\u003e +$295 (1 trade, crypto)\u003c/p\u003e","title":"august week 1 - new rules working","type":"posts"},{"content":"ran correlation analysis on my strategies.\nfound something i didn\u0026rsquo;t expect.\nwhat i analyzed # all trades from may-july (3 months, 65 trades).\ngrouped by strategy type:\nSPX options (25 trades) TLT options (18 trades) sector ETF options (12 trades) IWM/QQQ options (10 trades) calculated correlation between strategy returns.\nthe correlation matrix # learned about correlation analysis and ran it on my strategies:\nSPX TLT Sector IWM/QQQ SPX 1.00 0.15 0.72 0.68 TLT 0.15 1.00 0.08 0.12 Sector 0.72 0.08 1.00 0.65 IWM/QQQ 0.68 0.12 0.65 1.00 what this means # low correlation (good):\nTLT vs everything else (0.08-0.15) bonds move different than equities provides real diversification high correlation (problem):\nSPX vs Sector ETFs (0.72) SPX vs IWM/QQQ (0.68) Sector vs IWM/QQQ (0.65) basically: all my equity strategies are highly correlated.\nthe hidden risk # when equities dump, ALL my equity positions lose together.\nnot actually diversified.\nexample from july 10 (my red day):\nSPX put spread: -$301 IWM put spread: -$336 both lost same day, same reason (equity dump) TLT trade that day: +$93 (bonds rallied while stocks dropped)\nwhat i\u0026rsquo;m changing # new rule: max 2 correlated positions at once\nimplementation:\nif holding SPX position:\ncan add 1 more equity position (sector/IWM/QQQ) can add unlimited TLT positions (uncorrelated) cannot add 2nd SPX position if holding 2 equity positions:\nblock new equity entries until one closes still allow TLT entries why TLT is key # TLT correlation to equities: 0.08-0.15\nwhen stocks drop, bonds often rally (flight to safety).\nTLT provides actual hedge.\nbacktesting the new rule # applied \u0026ldquo;max 2 correlated positions\u0026rdquo; to july trades.\njuly actual:\nsome days held 3-4 equity positions correlation risk: high july 10 red day: -$544 (multiple correlated losers) july with new rule:\nwould\u0026rsquo;ve blocked 8 equity entries missed: 5 winners (+$1,840), 3 losers (-$890) net missed: +$950 but:\njuly 10 would\u0026rsquo;ve been -$301 instead of -$544 (blocked IWM entry) reduced concentration risk significantly tradeoff: give up ~$950/month in gains for lower max drawdown.\nworth it for risk management.\nimplementation details # added to trade entry checklist:\nasync def can_enter_position(self, symbol: str) -\u0026gt; bool: \u0026#34;\u0026#34;\u0026#34;Check if position entry allowed\u0026#34;\u0026#34;\u0026#34; # Get current positions equity_positions = self.get_equity_positions() # Check correlation if self.is_equity(symbol): if len(equity_positions) \u0026gt;= 2: logger.warning(f\u0026#34;BLOCKED: {symbol} - max equity positions (2) reached\u0026#34;) return False # Other checks (vol, existing exposure, etc.) return True monitoring # added correlation dashboard to grafana:\ntracks current correlation between positions alerts if correlation \u0026gt; 0.70 on new entry shows diversification score what this means for august # before: could hold 4-5 equity positions at once\nnow: max 2 equity positions at once\neffect:\nlower total positions better diversification reduced concentration risk slightly lower expected return but way lower risk the lesson # thought i was diversified (SPX, sectors, IWM, QQQ).\nactually wasn\u0026rsquo;t. all moved together.\nTLT is only true diversifier.\nneed to focus on uncorrelated strategies more.\nnext steps # short term: enforce max 2 equity positions\nmedium term: research more uncorrelated strategies\ncommodities (GLD, oil, nat gas) international (EEM, EFA) volatility (VXX) long term: build truly diversified portfolio of strategies\ntrading update # wednesday 8/2: +$405 (TLT call spread)\nthursday 8/3: +$280 (SPX put spread)\naugust total: +$1,430\ngoal: +$4,000. need: +$2,570 remaining.\n2:18pm thursday. found hidden correlation risk. implementing max 2 equity positions. better risk management.\n-AK\n","date":"3 August 2023","externalUrl":null,"permalink":"/posts/2023-08-03-correlation-matrix-analysis/","section":"Posts","summary":"\u003cp\u003eran correlation analysis on my strategies.\u003c/p\u003e\n\u003cp\u003efound something i didn\u0026rsquo;t expect.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ewhat i analyzed \n    \u003cdiv id=\"what-i-analyzed\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#what-i-analyzed\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003eall trades from may-july (3 months, 65 trades).\u003c/p\u003e","title":"analyzed correlation between my strategies - found hidden risk","type":"posts"},{"content":"","date":"1 August 2023","externalUrl":null,"permalink":"/tags/august/","section":"Tags","summary":"","title":"August","type":"tags"},{"content":"first trading day of august.\nshort week (monday was holiday).\nstarted strong.\ntuesday 8/1 trades # morning: SPX put spread +$405\nentered 10:15am (skipping first 30 min per new test).\nvol detection green. correlation check passed.\nclosed at 50% profit by 11:45am.\nafternoon: TLT call spread +$340\nclean setup. hit target by 2:30pm.\ntotal day: +$745 (2 trades, 2 wins)\nnew time filter test # testing: skip first 30 min of market open.\nreason: noticed lower win rate in first 30 min (data from july).\ntoday: waited until 10:15am for first entry.\nmissed potential SPY trade at 9:45am (would\u0026rsquo;ve been winner, left $280 on table).\nbut avoided volatile whipsaw at 9:35am (would\u0026rsquo;ve stopped for -$315).\nnet: saved $315, missed $280. net +$35 from filter.\nearly result positive but need more data.\naugust progress # goal: +$4,000\nday 1: +$745\nremaining: +$3,255 in 4 weeks\non pace for $800+/week average.\naccount status # start august: $351,145 current aug 1: $351,890 gain: +$745 (+0.21%)\nA. update # dinner tonight to celebrate 2 months since we met (june 13).\ntaking her to george\u0026rsquo;s at the cove in la jolla.\nnice restaurant. celebrating both:\n2 month relationship milestone strong august start keeping it simple. dinner, beach walk after, probably her place.\nmental state # focused. disciplined.\nnot getting cocky after july\u0026rsquo;s big month.\ntreating august like new challenge.\none day at a time.\n3:42am wednesday. august started strong. +$745 day 1. dinner with A. tonight. staying disciplined.\n-AK\n","date":"1 August 2023","externalUrl":null,"permalink":"/posts/2023-08-01-august-starts-strong/","section":"Posts","summary":"\u003cp\u003efirst trading day of august.\u003c/p\u003e\n\u003cp\u003eshort week (monday was holiday).\u003c/p\u003e\n\u003cp\u003estarted strong.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003etuesday 8/1 trades \n    \u003cdiv id=\"tuesday-81-trades\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#tuesday-81-trades\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003emorning:\u003c/strong\u003e SPX put spread +$405\u003c/p\u003e","title":"august day 1 - solid start","type":"posts"},{"content":"july crushed. +$6,120 (75% over goal).\nnow planning august.\naugust goal # target: +$4,000\nwhy higher than july\u0026rsquo;s $3,500 original target?\naccount larger ($351k vs $345k start july) systems proven (3 months profitable) confidence higher but not going crazy. still reasonable 1.1% monthly target.\nwhat i\u0026rsquo;m keeping # 1. current parameters\nwalk-forward validated these work:\nlookback: 21 days vol threshold: 1.2 profit target: 50% stop loss: -150% not changing shit that works.\n2. vol detection system\nsaved $2,400 in july.\ncontinuing as primary risk filter.\n3. async data pipeline\n3x speed improvement holding.\nbetter fills from faster execution.\n4. position sizing\nstrict 1.25% risk per trade.\nworked in july. keeping it.\nwhat i\u0026rsquo;m testing # 1. time-of-day filters\nnoticed: trades in first 30 min of market open have lower win rate.\nhypothesis: too much volatility at open.\ntest: skip first 30 min, only trade after 10am EST.\nmeasurement period: 2 weeks, 20+ trades.\n2. correlation tracking\ncurrently reject positions with \u0026gt;0.75 correlation.\ntest: lower to \u0026gt;0.70 to avoid even tighter concentration.\nmeasurement: did it prevent losses without missing too many good trades?\nwhat i\u0026rsquo;m NOT doing # no crypto bot restart yet\nlost $710 in june before pausing.\nnot restarting until complete signal rebuild.\naugust = focus on what\u0026rsquo;s working (options strategies).\nno take advantage of increase\nIB offered portfolio margin (9x employ) in june.\ndeclined it.\nstill declining it.\ndiscipline \u0026gt; flexibility.\nno parameter optimization\nalready validated parameters via walk-forward.\nnext review: october (quarterly check).\ninfrastructure plans # considering websockets:\ncurrently polling APIs every second.\nwebsockets = real-time push data.\npros:\nlower latency less API calls more efficient cons:\nmore complex code connection management debugging harder decision: research in august, maybe implement september.\nA. plans # seeing her tuesday night (august 1st).\n2 month anniversary of us meeting (met june 13).\ntaking her to nice dinner in la jolla.\nthings going really well. want to keep investing in relationship.\ntherapy schedule # continuing wednesdays 2pm with Dr. R.\nprocessing grief (8 months since parents died).\nworking on confidence and communication.\nmaybe discuss future planning (what do i want long-term?).\nmental preparation # staying humble:\n3 profitable months is good.\nbut not enough to prove anything.\ncan still have losing months.\nexpecting 3-4 losing months per year.\nstaying disciplined:\nwinning creates temptation to get loose.\nincrease size. change parameters. get cocky.\nresisting all of that.\nrisk management focus # august priorities:\nprotect capital (don\u0026rsquo;t give back july gains) maintain win rate above 75% keep max loss under $400 per trade zero parameter changes without data week 1 august preview # short week (monday is holiday, markets weird).\nwill be conservative first few days.\naim for 3-4 trades week 1.\nquality over quantity.\naccount milestone # currently: $351,145\nif hit august goal (+$4k): $355,145\nif maintain pace (+$6k like july): $357,145\ngetting close to $360k.\nstarted live trading april at $220k (after $180k losses jan-mar).\nalmost $140k recovered since figuring out systems.\nlooking at bigger picture # jan-mar 2023: lost $180k learning (painful)\napr 2023: break-even (applying systems)\nmay-jul 2023: +$32k total (systems working)\napr-jul total: +$131k (59.6% gain in 4 months)\nexpensive education but finally profitable.\ngoal: don\u0026rsquo;t lose discipline that got me here.\n4:05am sunday. july done, august planned. goal: $4k. keeping what works, testing small improvements. staying humble.\n-AK\n","date":"30 July 2023","externalUrl":null,"permalink":"/posts/2023-07-30-looking-ahead-june/","section":"Posts","summary":"\u003cp\u003ejuly crushed. +$6,120 (75% over goal).\u003c/p\u003e\n\u003cp\u003enow planning august.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eaugust goal \n    \u003cdiv id=\"august-goal\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#august-goal\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003etarget:\u003c/strong\u003e +$4,000\u003c/p\u003e\n\u003cp\u003ewhy higher than july\u0026rsquo;s $3,500 original target?\u003c/p\u003e","title":"august preview - maintaining momentum","type":"posts"},{"content":"july done.\nbest trading month yet.\nfinal numbers # goal: +$3,500\nactual: +$6,120\nbeat goal by: +$2,620 (75% over target)\naccount growth # start july 1: $345,025 end july 31: $351,145 gain: +$6,120 (+1.77%)\nmonthly breakdown # week 1: +$840 (3 trades, 3 wins) week 2: +$1,161 (8 trades, 6 wins, 2 losses) week 3: +$1,705 (5 trades, 5 wins) week 4: +$2,414 (7 trades, 6 wins, 1 loss)\ntotal: 23 trades, 20 wins, 3 losses (87% win rate)\nstrategy performance # mean reversion options:\ntrades: 18 win rate: 89% (16 wins, 2 losses) avg win: +$385 avg loss: -$295 net: +$5,570 vol selling options:\ntrades: 5 win rate: 80% (4 wins, 1 loss) avg win: +$420 avg loss: -$340 net: +$1,340 crypto: still paused (not restarting until rebuilt)\nwhat worked # 1. walk-forward validated parameters\nran proper backtesting mid-month.\nreverted to -150% stops (from -140% test).\n50% profit targets.\nedge is real. not curve fit.\n2. async data pipeline\n3x speed improvement on market data.\nbetter fills from faster execution.\nestimated value: $15/trade × 23 trades = $345\n3. vol detection system\nblocked 27 trades this month.\nestimated 9 would\u0026rsquo;ve lost money.\nsaved: ~$2,400.\n4. redis caching\n99.1% cache hit rate.\nsub-millisecond data latency.\nbest trade of month # july 24: SPX put spread with A. watching\nentry: $2.15 credit exit: $3.85 profit profit: +$680 (2 contracts)\nnot just the money. the experience.\nA. watching me trade. understanding my work.\nthen celebrating after. perfect day.\nworst trade of month # july 10: IWM put spread\nentry: $2.40 credit stop: -$3.36 loss: -$336\ngot whipsawed testing -140% stops.\nlesson: don\u0026rsquo;t change working parameters without data.\n4-month performance (since going live) # april 1 start: $220,000 (after losing $180k jan-mar) july 31 end: $351,145 gain: +$131,145 (+59.6%)\nmonthly breakdown:\napril: break-even (learning live) may: +$22,740 (first profitable month) june: +$3,285 (consistency) july: +$6,120 (best month) took 3 months of losses ($180k tuition) to figure it out.\nnow 3 months of profits ($32k total).\nsharpe ratio # july sharpe: 2.4\n4-month sharpe: 2.1\nsolid risk-adjusted returns.\nmax drawdown # july: -$544 (0.16% of account)\n4-month: -$8,200 (3.7% of account, from april learning period)\nrisk management working.\npersonal growth this month # relationship with A.:\ntold her my fantasy (trading desk blowjob) she said yes, we did it, incredible asked her fantasy (watching me trade) she watched, loved it, understands my work now 2 months dating. healthiest relationship i\u0026rsquo;ve had.\ntherapy progress:\nprocessing parents\u0026rsquo; death (7 months since NYE 2022) working on communication (proved with A. fantasy conversation) building confidence (stopped being scared to be vulnerable) grief status:\nmostly stable. occasional sadness.\nnot crying as much. healing slowly.\nex drama:\nJ. texted asking to get back together.\nblocked her immediately.\nA. handled it perfectly. zero drama.\naugust goals # financial: +$4,000 (higher than july)\nstrategy: continue validated parameters, no changes\npersonal: keep relationship with A. healthy, stay in therapy\ninfrastructure: consider websocket feeds for real-time data\nrisks ahead # 1. overconfidence\n3 profitable months ≠ figured it all out.\nstill risk of losing months ahead.\n2. market regime change\nstrategies work in current vol regime.\nif VIX spikes \u0026gt; 40, need different approach.\n3. relationship complacency\nthings going well with A.\ncan\u0026rsquo;t get lazy. keep communicating.\nreflection on july # turned 20 this month (july 4).\nfirst birthday without parents.\nA. made it bearable.\ntrading crushed goal by 75%.\nrelationship deepened significantly.\ntherapy helping process grief.\nlife is working.\nlooking ahead to august # continue what\u0026rsquo;s working.\ndon\u0026rsquo;t change winning strategy.\nstay disciplined. stay humble.\nkeep building with A.\n11:15pm friday. july done. best month yet. +$6,120. crushed goal. relationship with A. incredible. august target: $4k.\n-AK\n","date":"28 July 2023","externalUrl":null,"permalink":"/posts/2023-07-28-may-month-end-review/","section":"Posts","summary":"\u003cp\u003ejuly done.\u003c/p\u003e\n\u003cp\u003ebest trading month yet.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003efinal numbers \n    \u003cdiv id=\"final-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#final-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003egoal:\u003c/strong\u003e +$3,500\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eactual:\u003c/strong\u003e +$6,120\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ebeat goal by:\u003c/strong\u003e +$2,620 (75% over target)\u003c/p\u003e","title":"july wrap - best month yet, crushed the goal","type":"posts"},{"content":"A. came over monday morning.\nsat on couch behind my desk for 2 hours.\nwatched me trade.\nhow it went # 9:00am: she showed up with coffee for both of us.\nsat on couch. quiet. watching.\n9:15am: vol detection flagged elevated regime. blocked entry i was planning.\nher: [silent, just watching]\n9:45am: green light from vol system. entered SPX put spread.\nexplained my entry logic out loud (felt weird talking while trading).\nher: \u0026ldquo;don\u0026rsquo;t explain. just do your thing.\u0026rdquo;\n10:30am: position up $180. hit 50% profit target. closed.\nme: \u0026ldquo;that\u0026rsquo;s a winner. $385 profit.\u0026rdquo;\nher: \u0026ldquo;nice. keep going.\u0026rdquo;\n11:05am: entered TLT call spread.\n11:40am: closed at profit. +$295.\nher: \u0026ldquo;you\u0026rsquo;re really good at this.\u0026rdquo;\nafter trading # stopped at 12pm (2 hour session done).\n2 trades. 2 wins. +$680 total.\nher: \u0026ldquo;that was so fucking hot.\u0026rdquo;\nme: \u0026ldquo;watching me click buttons?\u0026rdquo;\nher: \u0026ldquo;watching you be completely focused and confident. you knew exactly what you were doing.\u0026rdquo;\nthen we celebrated. hard.\nwhat she noticed # things i didn\u0026rsquo;t realize i do:\ni talk to myself while trading (\u0026ldquo;nope\u0026rdquo; \u0026ldquo;wait\u0026rdquo; \u0026ldquo;there it is\u0026rdquo;) i lean forward when position is close to target i exhale hard when i close winners i check vol detection dashboard before every entry she picked up on my tells.\nher reaction # her: \u0026ldquo;i get why you love this. you\u0026rsquo;re in complete control. making split second decisions. making money from it.\u0026rdquo;\nme: \u0026ldquo;it\u0026rsquo;s not always like that. sometimes i lose.\u0026rdquo;\nher: \u0026ldquo;i know. but watching you win was incredible.\u0026rdquo;\nwhat this means for us # she understands my work now.\nnot just \u0026ldquo;he trades\u0026rdquo; but actually saw the process.\nthe focus. the risk management. the discipline.\nbefore: she knew i traded options\nafter: she gets what i actually do\ncomparison to my fantasy # my fantasy: sexual + trading combined\nher fantasy: watching competence, then celebrating after\nboth worked. both hot. different reasons.\ntrading update # monday 7/24: +$680 (2 trades with A. watching)\ntuesday 7/25: +$340 (GLD put spread)\nwednesday 7/26: +$405 (IWM call spread)\njuly total: +$5,446\nbeat goal by $1,946.\naccount status # start july: $345,025 current july 26: $350,471 gain: +$5,446 (+1.58%)\nbest month yet.\nwhat she said after # her: \u0026ldquo;can i watch again sometime?\u0026rdquo;\nme: \u0026ldquo;yeah. whenever you want.\u0026rdquo;\nher: \u0026ldquo;i like seeing you in your element. you\u0026rsquo;re sexy when you\u0026rsquo;re focused.\u0026rdquo;\ndidn\u0026rsquo;t expect that feedback but i\u0026rsquo;ll take it.\nmental state # relationship keeps getting better.\nshe\u0026rsquo;s genuinely interested in my work.\nnot just tolerating it. actually fascinated by it.\ntrading crushing it this month.\nsystems working. discipline holding.\nlife is really fucking good right now.\n2:32pm wednesday. A. watched me trade monday. she loved it. gets what i do now. relationship stronger.\n-AK\n","date":"26 July 2023","externalUrl":null,"permalink":"/posts/2023-07-26-vol-regime-detection/","section":"Posts","summary":"\u003cp\u003eA. came over monday morning.\u003c/p\u003e\n\u003cp\u003esat on couch behind my desk for 2 hours.\u003c/p\u003e\n\u003cp\u003ewatched me trade.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ehow it went \n    \u003cdiv id=\"how-it-went\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#how-it-went\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e9:00am:\u003c/strong\u003e she showed up with coffee for both of us.\u003c/p\u003e","title":"A. watched me trade - she gets it now","type":"posts"},{"content":"saturday night with A.\nasked her what her fantasy is.\nher answer: not what i expected.\nhow i brought it up # after dinner at her place.\nme: \u0026ldquo;so i told you my fantasy and we did it. what\u0026rsquo;s yours?\u0026rdquo;\nher: \u0026ldquo;mine?\u0026rdquo;\nme: \u0026ldquo;yeah. only fair. what do you want to try?\u0026rdquo;\nher: [thinking for like 30 seconds]\nher: \u0026ldquo;ok. but don\u0026rsquo;t judge me\u0026rdquo;\nher fantasy # her: \u0026ldquo;i want to watch you trade. like actually watch you make decisions in real time during market hours. see how you think.\u0026rdquo;\nme: \u0026ldquo;wait what? that\u0026rsquo;s not sexual\u0026rdquo;\nher: \u0026ldquo;i know. but it\u0026rsquo;s hot to me. watching you focus and make money. that whole world you have that i don\u0026rsquo;t fully understand.\u0026rdquo;\nme: \u0026ldquo;so\u0026hellip; you want to sit there while i trade?\u0026rdquo;\nher: \u0026ldquo;yeah. and maybe after you close a winning position, we celebrate. but mainly i just want to watch you work.\u0026rdquo;\nwhy this surprised me # expected:\nthreesome public sex role play something kinky got:\nwants to watch me trade why she\u0026rsquo;s into it # her: \u0026ldquo;you get this look when you\u0026rsquo;re focused. intense. in control. it\u0026rsquo;s hot watching you in your element.\u0026rdquo;\nme: \u0026ldquo;i\u0026rsquo;m literally just staring at a screen and clicking buttons\u0026rdquo;\nher: \u0026ldquo;to you yeah. to me it\u0026rsquo;s watching you do something you\u0026rsquo;re really good at. competence is sexy.\u0026rdquo;\nwe\u0026rsquo;re doing it monday # her idea: come over monday morning at 9am.\nsit on the couch behind my trading desk.\nwatch me trade for 2 hours.\nif i close a winner: we celebrate.\nif i close a loser: she stays quiet, lets me process.\ncomparison to my fantasy # mine: sexual + trading combined\nhers: voyeuristic, watching competence\nboth involve trading.\ndifferent angles.\nwhat this says about her # she\u0026rsquo;s into:\nwatching me succeed competence/mastery understanding my world supporting my work green flags all around.\ntherapy thursday # told Dr. R about asking A. her fantasy.\nDr. R: \u0026ldquo;and what was it?\u0026rdquo;\nme: \u0026ldquo;she wants to watch me trade. not even sexual. just watch me work.\u0026rdquo;\nDr. R: \u0026ldquo;that\u0026rsquo;s actually very intimate. she wants to see you in your element.\u0026rdquo;\nme: \u0026ldquo;yeah i guess. didn\u0026rsquo;t think of it that way.\u0026rdquo;\nDr. R: \u0026ldquo;shows she\u0026rsquo;s interested in all of you, not just the physical.\u0026rdquo;\nfair point.\ntrading update # monday 7/24:\n(will trade with A. watching) saturday 7/22: +$315 (crypto position closed, finally positive on crypto)\njuly total: +$4,021\nbeat goal by $521 already.\nmental state # impressed with A.\nher fantasy shows maturity and interest in who i am.\nnot just physical attraction.\nshe wants to understand my world.\nrelationship keeps getting better.\n3:18am sunday. asked A. her fantasy. she wants to watch me trade. doing it monday morning. different but intimate.\n-AK\n","date":"23 July 2023","externalUrl":null,"permalink":"/posts/2023-07-23-downweek-recovering/","section":"Posts","summary":"\u003cp\u003esaturday night with A.\u003c/p\u003e\n\u003cp\u003easked her what her fantasy is.\u003c/p\u003e\n\u003cp\u003eher answer: not what i expected.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ehow i brought it up \n    \u003cdiv id=\"how-i-brought-it-up\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#how-i-brought-it-up\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003eafter dinner at her place.\u003c/p\u003e","title":"asked A. about her fantasy - her answer surprised me","type":"posts"},{"content":"july week 3 done.\nconsistent profitable trades.\nhitting goal this month.\nweek 3 trades # monday 7/17: +$385 (SPX put spread, -150% stops working)\ntuesday 7/18: +$295 (TLT call spread)\nwednesday 7/19: +$405 (QQQ put spread)\nthursday 7/20: +$340 (IWM call spread)\nfriday 7/21: +$280 (GLD put spread)\ntotal week 3: +$1,705 (5 trades, 5 wins, 0 losses)\nperfect week. zero losers.\njuly progress # goal: +$3,500\nweek 1: +$840 week 2: +$1,161 week 3: +$1,705 total: +$3,706\nbeat goal by $206.\nwhat\u0026rsquo;s working # 1. reverted to -150% stops\nafter walk-forward analysis, went back to wider stops.\nzero whipsaws this week.\nall 5 trades ran to profit target.\n2. 50% profit target\nkeeping standard target.\ntested 55% earlier but 50% is optimal.\n3. async data fetching\nfaster market data = better fills.\navg fill improvement: $0.12 per contract.\n4. vol detection\nblocked 6 trades this week.\n2 would\u0026rsquo;ve lost money based on market action.\nestimated saved: ~$570.\naccount status # start july: $345,025 end week 3: $348,731 gain: +$3,706 (+1.07%)\n4-month total (april-july, since going live after losing $180k jan-mar): start april: $220,000 (after losses) end july week 3: $348,731 gain: +$128,731 (+58.5%)\nfucking crushing it since i figured out systems.\npersonal update # A.: things are incredible.\ntold her my fantasy. we did it. she loved it.\nneed to ask her what her fantasy is.\nseeing her tomorrow (saturday night).\ntherapy: told Dr. R about the fantasy conversation.\nshe was proud i communicated honestly.\ngrief: 7.5 months since parents died.\nmostly stable. occasional sadness but manageable.\nmental state # confident but not overconfident.\nknow i can still have losing weeks.\nbut systems are solid. edge is real. risk management working.\nrelationship with A. is healthy and growing.\nlife is working right now.\nweek 4 preview # only 1.5 weeks left in july.\nalready beat goal (+$3,706 vs $3,500 target).\ngoing to keep trading but focusing on:\nmaintaining discipline not getting greedy protecting profits seeing A. saturday night. probably staying over.\n3:55pm friday. week 3 done. beat july goal. up $3,706. life is good.\n-AK\n","date":"21 July 2023","externalUrl":null,"permalink":"/posts/2023-07-21-week-3-small-wins/","section":"Posts","summary":"\u003cp\u003ejuly week 3 done.\u003c/p\u003e\n\u003cp\u003econsistent profitable trades.\u003c/p\u003e\n\u003cp\u003ehitting goal this month.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 3 trades \n    \u003cdiv id=\"week-3-trades\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-3-trades\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003emonday 7/17:\u003c/strong\u003e +$385 (SPX put spread, -150% stops working)\u003c/p\u003e","title":"july week 3 - hitting stride","type":"posts"},{"content":"been running synchronous data fetching since january.\nworks but slow during market open.\nrefactored to async this week.\n3x speed improvement.\nthe problem with sync code # # Old synchronous approach def fetch_market_data(symbols): results = [] for symbol in symbols: data = fetch_from_api(symbol) # Blocks here results.append(data) return results # With 10 symbols, takes 10 * 180ms = 1,800ms total each API call blocks until complete.\n10 symbols = 1.8 seconds waiting.\nduring volatile markets, this is too slow.\nasync solution # import asyncio import aiohttp from typing import List, Dict, Any import time class AsyncMarketData: \u0026#34;\u0026#34;\u0026#34;Async market data fetcher with connection pooling\u0026#34;\u0026#34;\u0026#34; def __init__(self, api_key: str, max_concurrent: int = 10): self.api_key = api_key self.base_url = \u0026#34;https://api.polygon.io\u0026#34; self.semaphore = asyncio.Semaphore(max_concurrent) self.session = None async def __aenter__(self): \u0026#34;\u0026#34;\u0026#34;Context manager entry\u0026#34;\u0026#34;\u0026#34; connector = aiohttp.TCPConnector( limit=100, # Max connections ttl_dns_cache=300 # DNS cache TTL ) self.session = aiohttp.ClientSession( connector=connector, timeout=aiohttp.ClientTimeout(total=30) ) return self async def __aexit__(self, exc_type, exc_val, exc_tb): \u0026#34;\u0026#34;\u0026#34;Context manager exit\u0026#34;\u0026#34;\u0026#34; if self.session: await self.session.close() async def fetch_quote(self, symbol: str) -\u0026gt; Dict[str, Any]: \u0026#34;\u0026#34;\u0026#34;Fetch single quote with rate limiting\u0026#34;\u0026#34;\u0026#34; async with self.semaphore: # Rate limit concurrent requests url = f\u0026#34;{self.base_url}/v2/last/trade/{symbol}\u0026#34; params = {\u0026#34;apiKey\u0026#34;: self.api_key} try: async with self.session.get(url, params=params) as resp: if resp.status == 200: data = await resp.json() return { \u0026#39;symbol\u0026#39;: symbol, \u0026#39;price\u0026#39;: data[\u0026#39;results\u0026#39;][\u0026#39;p\u0026#39;], \u0026#39;size\u0026#39;: data[\u0026#39;results\u0026#39;][\u0026#39;s\u0026#39;], \u0026#39;timestamp\u0026#39;: data[\u0026#39;results\u0026#39;][\u0026#39;t\u0026#39;], \u0026#39;success\u0026#39;: True } else: return { \u0026#39;symbol\u0026#39;: symbol, \u0026#39;success\u0026#39;: False, \u0026#39;error\u0026#39;: f\u0026#34;HTTP {resp.status}\u0026#34; } except Exception as e: return { \u0026#39;symbol\u0026#39;: symbol, \u0026#39;success\u0026#39;: False, \u0026#39;error\u0026#39;: str(e) } async def fetch_multiple(self, symbols: List[str]) -\u0026gt; List[Dict[str, Any]]: \u0026#34;\u0026#34;\u0026#34;Fetch multiple quotes concurrently\u0026#34;\u0026#34;\u0026#34; tasks = [self.fetch_quote(symbol) for symbol in symbols] results = await asyncio.gather(*tasks, return_exceptions=True) # Handle any exceptions clean_results = [] for result in results: if isinstance(result, Exception): clean_results.append({ \u0026#39;success\u0026#39;: False, \u0026#39;error\u0026#39;: str(result) }) else: clean_results.append(result) return clean_results class StrategyDataFeed: \u0026#34;\u0026#34;\u0026#34;High-level interface for strategy data needs\u0026#34;\u0026#34;\u0026#34; def __init__(self, api_key: str): self.api_key = api_key self.cache = {} # Simple in-memory cache async def get_current_prices(self, symbols: List[str]) -\u0026gt; Dict[str, float]: \u0026#34;\u0026#34;\u0026#34;Get current prices for list of symbols\u0026#34;\u0026#34;\u0026#34; # Check cache first (1 second TTL) now = time.time() cached = {} to_fetch = [] for symbol in symbols: if symbol in self.cache: cached_time, cached_price = self.cache[symbol] if now - cached_time \u0026lt; 1.0: # Cache valid cached[symbol] = cached_price continue to_fetch.append(symbol) # Fetch uncached symbols if to_fetch: async with AsyncMarketData(self.api_key) as fetcher: results = await fetcher.fetch_multiple(to_fetch) for result in results: if result[\u0026#39;success\u0026#39;]: symbol = result[\u0026#39;symbol\u0026#39;] price = result[\u0026#39;price\u0026#39;] cached[symbol] = price self.cache[symbol] = (now, price) return cached # Usage in strategy class TradingStrategy: def __init__(self): self.data_feed = StrategyDataFeed( api_key=os.getenv(\u0026#34;POLYGON_API_KEY\u0026#34;) ) async def evaluate_signals(self): \u0026#34;\u0026#34;\u0026#34;Main strategy loop\u0026#34;\u0026#34;\u0026#34; symbols = [\u0026#39;SPY\u0026#39;, \u0026#39;QQQ\u0026#39;, \u0026#39;IWM\u0026#39;, \u0026#39;TLT\u0026#39;, \u0026#39;GLD\u0026#39;, \u0026#39;VXX\u0026#39;, \u0026#39;XLF\u0026#39;, \u0026#39;XLE\u0026#39;, \u0026#39;XLK\u0026#39;, \u0026#39;XLV\u0026#39;] # Fetch all prices concurrently start = time.time() prices = await self.data_feed.get_current_prices(symbols) elapsed = time.time() - start print(f\u0026#34;Fetched {len(prices)} prices in {elapsed*1000:.1f}ms\u0026#34;) # Strategy logic here for symbol, price in prices.items(): signal = self.calculate_signal(symbol, price) if signal: await self.execute_trade(symbol, signal) # Main event loop async def main(): strategy = TradingStrategy() while True: await strategy.evaluate_signals() await asyncio.sleep(1) # Run every second if __name__ == \u0026#34;__main__\u0026#34;: asyncio.run(main()) performance comparison # synchronous (old):\n10 symbols sequential fetching total time: 1,800ms throughput: 5.5 symbols/sec async (new):\n10 symbols concurrent fetching (max 10 concurrent) total time: 220ms (fastest API response) throughput: 45 symbols/sec improvement: 8x faster in ideal conditions, 3x average\nreal-world testing # ran both approaches during tuesday market hours.\nsync approach:\navg: 1,650ms for 10 symbols worst: 3,200ms (API slowness) missed 2 entry signals (too slow) async approach:\navg: 580ms for 10 symbols worst: 1,100ms (API slowness) caught all entry signals key async patterns used # 1. connection pooling\nreuse TCP connections instead of creating new ones.\nsaves connection setup overhead (100-200ms per connection).\n2. rate limiting with semaphore\nself.semaphore = asyncio.Semaphore(10) # Max 10 concurrent prevents overwhelming API (polygon limits to 5/sec on my plan).\n3. timeout handling\ntimeout=aiohttp.ClientTimeout(total=30) prevents hanging on slow API responses.\n4. graceful degradation\nreturn_exceptions=True # Don\u0026#39;t fail entire batch if one symbol fails integration with existing code # strategy code changes:\n# Old sync prices = self.data_feed.get_prices(symbols) # New async prices = await self.data_feed.get_current_prices(symbols) minimal changes. mostly just adding async/await keywords.\nredis caching layer integration # async works with existing redis cache:\n# Check redis first (0.3ms) # Then async fetch if cache miss (220ms) # Then cache result for next request combined: 0.3ms cached, 220ms uncached.\nvs old: 180ms always (no async benefit), 0.3ms cached (same).\nimprovement mainly for cache misses.\nlessons learned # 1. async isn\u0026rsquo;t always faster\nfor single requests, overhead not worth it.\nfor multiple concurrent requests, huge win.\n2. connection pooling matters\nreusing connections saves 100-200ms per request.\n3. rate limiting essential\nwithout semaphore, got 429 errors from API.\n4. error handling critical\none failed request shouldn\u0026rsquo;t kill entire batch.\nnext optimizations # already planning:\nwebsocket feeds for real-time data (instead of polling) local market data cache with timescaleDB predictive prefetching based on strategy patterns impact on trading # faster data = faster decisions = better fills.\ntuesday caught entry signal 800ms faster than old system.\ngot filled $0.15 better per contract = $15 profit difference.\nover 100 trades, that\u0026rsquo;s $1,500 additional profit from speed alone.\ninfrastructure details # running on:\npython 3.11 (native async improvements) aiohttp for async HTTP asyncio event loop dell server (8 cores help with async) monitoring:\ngrafana tracks fetch latency alerts if p95 \u0026gt; 1000ms dashboard shows cache hit rate 2:08pm thursday. refactored to async. 3x faster market data. better fills. code is cleaner too.\n-AK\n","date":"20 July 2023","externalUrl":null,"permalink":"/posts/2023-07-20-python-async-for-market-data/","section":"Posts","summary":"\u003cp\u003ebeen running synchronous data fetching since january.\u003c/p\u003e\n\u003cp\u003eworks but slow during market open.\u003c/p\u003e\n\u003cp\u003erefactored to async this week.\u003c/p\u003e\n\u003cp\u003e3x speed improvement.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe problem with sync code \n    \u003cdiv id=\"the-problem-with-sync-code\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-problem-with-sync-code\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-python\" data-lang=\"python\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e# Old synchronous approach\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003efetch_market_data\u003c/span\u003e(symbols):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    results \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e []\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#66d9ef\"\u003efor\u003c/span\u003e symbol \u003cspan style=\"color:#f92672\"\u003ein\u003c/span\u003e symbols:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        data \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e fetch_from_api(symbol)  \u003cspan style=\"color:#75715e\"\u003e# Blocks here\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        results\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003eappend(data)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#66d9ef\"\u003ereturn\u003c/span\u003e results\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e# With 10 symbols, takes 10 * 180ms = 1,800ms total\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eeach API call blocks until complete.\u003c/p\u003e","title":"refactored data pipeline to async - 3x faster market data processing","type":"posts"},{"content":"","date":"18 July 2023","externalUrl":null,"permalink":"/tags/ex/","section":"Tags","summary":"","title":"Ex","type":"tags"},{"content":"J. texted me monday night.\nhaven\u0026rsquo;t talked to her in 2 months (broke up mid-may).\nthe text # her: \u0026ldquo;hey. been thinking about you. miss what we had. can we talk?\u0026rdquo;\nme: [left on read for 3 hours]\nher: \u0026ldquo;i know you\u0026rsquo;re seeing someone but i think we were good together\u0026rdquo;\nme: \u0026ldquo;J. we weren\u0026rsquo;t good together. you were clingy AF and we both know it\u0026rdquo;\nher: \u0026ldquo;i\u0026rsquo;ve changed. been working on myself\u0026rdquo;\nme: \u0026ldquo;good for you. i\u0026rsquo;m with someone now and it\u0026rsquo;s actually healthy. not interested\u0026rdquo;\nher: \u0026ldquo;she won\u0026rsquo;t understand you like i do\u0026rdquo;\nme: [blocked]\nwhy i blocked her # 1. timing is suspicious\nhow does she know i\u0026rsquo;m seeing someone?\neither stalking my social media or asking mutual friends.\ncreepy either way.\n2. \u0026ldquo;i\u0026rsquo;ve changed\u0026rdquo; = bullshit\n2 months isn\u0026rsquo;t enough time to fix clinginess issues.\n3. trying to insert herself into my new relationship\n\u0026ldquo;she won\u0026rsquo;t understand you like i do\u0026rdquo; = manipulation.\n4. zero respect for boundaries\ni ended it. she should respect that.\ncomparison: J. vs A. # J. (broke up with in may):\ntexted 50 times per day wanted to define relationship after 2 weeks cried when i didn\u0026rsquo;t respond fast enough got jealous about other girls tried to control my schedule A. (dating now, 6 weeks in):\ntexts once or twice per day has own life (work, friends, hobbies) zero jealousy or drama respects my trading schedule confident and independent night and day difference.\ntold A. about it # her: \u0026ldquo;your ex texted?\u0026rdquo;\nme: \u0026ldquo;yeah. asked to get back together. i blocked her\u0026rdquo;\nher: \u0026ldquo;good. want to talk about it?\u0026rdquo;\nme: \u0026ldquo;not really. she was clingy and dramatic. nothing like you\u0026rdquo;\nher: \u0026ldquo;thanks for telling me though\u0026rdquo;\nthat\u0026rsquo;s it. no drama. no insecurity. just trust.\nwhy blocking was right move # option 1: respond and explain\ngives her hope opens conversation wastes my time option 2: ignore completely\nshe\u0026rsquo;ll keep trying might escalate option 3: block immediately\nclear boundary no ambiguity moves on chose option 3.\ntherapy tomorrow # seeing Dr. R wednesday 2pm.\nwill mention J. texting and me blocking her.\nDr. R will probably say something about healthy boundaries.\nshe\u0026rsquo;d be right.\nreflection on J. # dated her march-may (2 months total).\nbroke up because:\ntoo clingy too dramatic wanted more than i could give relationship felt suffocating she wasn\u0026rsquo;t a bad person. just wrong for me.\nA. is right for me.\ndifference is massive.\nwhat i learned # from J.:\nclinginess = red flag someone wanting to control your schedule = red flag jealousy = red flag crying when you don\u0026rsquo;t text back immediately = red flag from A.:\nindependence = green flag having own life = green flag trust without jealousy = green flag respecting boundaries = green flag trading update # monday 7/17:\nSPX put spread: +$385 (using -150% stops again) tuesday 7/18:\nTLT call spread: +$295 july total: +$2,681\ngoal: +$3,500. need: +$819 in 1.5 weeks.\ndefinitely hitting goal this month.\nmental state # solid. clear boundaries with ex.\nhealthy relationship with A.\nprofitable trading month.\ntherapy helping process shit.\nlife is good right now.\n2:37am wednesday. J. texted asking to get back together. blocked her immediately. A. is 10x better. not looking back.\n-AK\n","date":"18 July 2023","externalUrl":null,"permalink":"/posts/2023-07-18-broke-up-with-j-again/","section":"Posts","summary":"\u003cp\u003eJ. texted me monday night.\u003c/p\u003e\n\u003cp\u003ehaven\u0026rsquo;t talked to her in 2 months (broke up mid-may).\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe text \n    \u003cdiv id=\"the-text\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-text\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003eher: \u0026ldquo;hey. been thinking about you. miss what we had. can we talk?\u0026rdquo;\u003c/p\u003e","title":"J. texted me asking to get back together - fuck no","type":"posts"},{"content":"been profitable 3 months now.\nwanted to verify i\u0026rsquo;m not just curve fitting.\nran walk-forward analysis this weekend.\nwhat is walk-forward testing # normal backtest:\noptimize parameters on all historical data get amazing results trade live and fail (curve fitting) walk-forward test:\nsplit data into chunks optimize on chunk 1, test on chunk 2 optimize on chunk 2, test on chunk 3 repeat forward through time prevents overfitting my setup # data range: jan 2022 - july 2023 (18 months)\nwindow size: 3 months optimize, 1 month test\nchunks:\noptimize: jan-mar 2022, test: apr 2022 optimize: feb-apr 2022, test: may 2022 optimize: mar-may 2022, test: jun 2022 \u0026hellip; continues through july 2023 parameters tested:\nlookback period (10-50 days) vol threshold (0.5-3.0) profit target (30%-70%) stop loss (-100% to -200%) results # in-sample performance (optimization periods):\nsharpe: 2.8 max DD: -12% win rate: 82% out-of-sample performance (test periods):\nsharpe: 2.1 max DD: -18% win rate: 76% degradation: 25% worse out-of-sample vs in-sample\nwhat this means # good signs:\nstrategy still profitable out-of-sample sharpe \u0026gt; 2.0 on unseen data win rate above 70% warning signs:\n25% degradation is significant max DD increased 50% out-of-sample some test periods were flat/negative best parameters found # walk-forward identified these as most reliable:\nlookback: 21 days (not 10, not 50, right in middle)\nvol threshold: 1.2 (current VIX analog)\nprofit target: 50% (what i\u0026rsquo;m already using)\nstop loss: -150% (what i used before testing -140%)\ninteresting: walk-forward says revert to -150% stops.\nmatches my recent testing where -140% was getting whipsawed.\nparameter stability test # checked how often optimal parameters changed between windows.\nlookback period:\nchanged 8 times across 15 windows mostly stayed 18-24 days vol threshold:\nchanged 11 times ranged 0.8-1.5 profit target:\nchanged 6 times mostly stayed 45%-55% stop loss:\nchanged 12 times (most unstable) ranged -120% to -180% conclusion: parameters are somewhat stable. not wildly jumping around.\nlive trading vs walk-forward # my actual results (may-july 2023):\nsharpe: 2.1 max DD: -$544 (-0.16% of account) win rate: 78% walk-forward predicted (may-july test window):\nsharpe: 2.0 max DD: -15% win rate: 76% pretty close match. strategy performing as expected.\nwhat i\u0026rsquo;m changing # 1. reverting stop loss to -150%\nwalk-forward confirms -140% stops get whipsawed.\ngoing back to -150% starting monday.\n2. keeping profit target at 50%\ntested 55% last 2 weeks. avg win increased but not enough to justify.\nwalk-forward says 50% is optimal. reverting.\n3. adding parameter review quarterly\nwill re-run walk-forward every 3 months.\nif parameters drift, will adjust slowly.\noverfitting check: passed # strategy works on out-of-sample data.\nnot just curve fit to historical data.\nedge appears real.\nthe risk # walk-forward tests past data.\ndoesn\u0026rsquo;t predict regime changes:\nmajor market crash vol spike \u0026gt; 50 liquidity crisis if market regime changes significantly, strategy might fail.\nmonitoring for this with vol detection system.\nnext steps # continue live trading with validated parameters.\nquarterly walk-forward review.\nwatch for regime changes.\nstay humble (3 months profitable ≠ figured it all out).\ntrading update # friday 7/14: +$405 (from week 2 review)\nmonday 7/17: (will trade with -150% stops again)\njuly total: +$2,001\ngoal: +$3,500. need: +$1,499 in 2 weeks.\nmental state # confident but cautious.\nwalk-forward validation feels good.\nbut know past performance ≠ future results.\nstaying disciplined. following systems.\n4:15am monday. ran walk-forward test. strategy holding up. reverting to -150% stops. edge appears real but staying humble.\n-AK\n","date":"16 July 2023","externalUrl":null,"permalink":"/posts/2023-07-16-backtest-overfitting-check/","section":"Posts","summary":"\u003cp\u003ebeen profitable 3 months now.\u003c/p\u003e\n\u003cp\u003ewanted to verify i\u0026rsquo;m not just curve fitting.\u003c/p\u003e\n\u003cp\u003eran walk-forward analysis this weekend.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ewhat is walk-forward testing \n    \u003cdiv id=\"what-is-walk-forward-testing\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#what-is-walk-forward-testing\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003enormal backtest:\u003c/strong\u003e\u003c/p\u003e","title":"ran walk-forward test - strategy holding up","type":"posts"},{"content":"july week 2 done.\nrecovered from monday red day.\nweek 2 trades # monday 7/10: -$544 (3 trades, 1 win, 2 losses)\ntuesday 7/11: +$385 (GLD put spread)\nwednesday 7/12: +$635 (SPX call spread +$295, TLT put spread +$340)\nthursday 7/13: +$280 (IWM call spread)\nfriday 7/14: +$405 (QQQ put spread)\ntotal week 2: +$1,161 (8 trades, 6 wins, 2 losses)\njuly progress # goal: +$3,500\nweek 1: +$840 week 2: +$1,161 total: +$2,001\nremaining: +$1,499 in 2.5 weeks\non pace. need ~$600/week average.\ntighter stops experiment # ran -140% stops all week (down from -150%).\nresults so far:\ntrades that hit stops: 3 trades saved by tighter stop: 1 (saved $22) trades hurt by tighter stop: 2 (cost $360 combined, got whipsawed) net impact: -$338 worse than old stops\nconclusion after 8 trades: too early to tell, but leaning toward reverting to -150%.\nneed 20+ more trades before deciding.\nprofit target experiment # also testing 55% profit target (up from 50%).\ngoal: increase avg win from $390 to $420.\nresults this week:\navg win: $408 (5 winners × $408 = $2,040) up from historical $390 early indication: working. letting winners run slightly longer is helping.\ncontinuing this test.\naccount status # start july: $345,025 current july 14: $347,026 gain: +$2,001 (+0.58%)\n3-month total (may-july): start may: $319,000 current: $347,026 gain: +$28,026 (+8.8%)\naveraging ~2.9% per month.\nwhat\u0026rsquo;s working # 1. vol detection: blocked 8 trades this week.\n3 would\u0026rsquo;ve lost money based on market action after blocks.\nestimated saved: ~$790.\n2. correlation limits: rejected 3 position entries for high correlation.\navoiding concentration risk.\n3. redis caching: data latency still at 0.3ms (99% cache hit rate).\nfaster execution = better fills.\n4. communication with A.: told her about fantasy. she said yes. we did it.\nrelationship stronger. confidence higher.\nwhat\u0026rsquo;s not working yet # tighter stops: early data shows -140% stops might be worse than -150%.\ngetting whipsawed more often.\nneed more data but might revert.\npersonal update # A.: things are fucking great.\n1 month dating. zero red flags.\ntold her the fantasy. she was into it. we did it wednesday.\nconfidence in relationship way higher now.\ntherapy: saw Dr. R thursday.\ntold her i communicated the fantasy to A.\nDr. R: \u0026ldquo;proud of you. that took courage.\u0026rdquo;\nme: \u0026ldquo;she said yes immediately. all that fear was wasted.\u0026rdquo;\nDr. R: \u0026ldquo;usually is.\u0026rdquo;\ngrief: 7 months since parents died.\nmostly stable. occasional crying but rare now.\nA. being supportive without being overbearing.\nweek 3 preview # continue testing:\n55% profit targets (working so far) -140% stops (not working so far, might revert) aim for 6-8 trades.\nneed $600+ to stay on pace for $3,500 goal.\nseeing A. saturday night. she\u0026rsquo;s staying over.\n3:22pm friday. week 2 done. recovered from monday red day. up $2,001 for july. relationship with A. stronger than ever.\n-AK\n","date":"14 July 2023","externalUrl":null,"permalink":"/posts/2023-07-14-week-2-july-review/","section":"Posts","summary":"\u003cp\u003ejuly week 2 done.\u003c/p\u003e\n\u003cp\u003erecovered from monday red day.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 2 trades \n    \u003cdiv id=\"week-2-trades\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-2-trades\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003emonday 7/10:\u003c/strong\u003e -$544 (3 trades, 1 win, 2 losses)\u003c/p\u003e","title":"july week 2 - back in green after monday red day","type":"posts"},{"content":"did it. told A. about the trading desk fantasy.\nher reaction: \u0026ldquo;fuck yeah, when?\u0026rdquo;\nhow it happened # she came over tuesday night.\nafter dinner, sitting on couch.\nher: \u0026ldquo;you\u0026rsquo;ve been weird lately. what\u0026rsquo;s going on?\u0026rdquo;\nme: \u0026ldquo;nothing\u0026rdquo;\nher: \u0026ldquo;bullshit. you want to tell me something. i can tell.\u0026rdquo;\nme: \u0026ldquo;it\u0026rsquo;s stupid\u0026rdquo;\nher: \u0026ldquo;tell me anyway\u0026rdquo;\nthe confession # me: \u0026ldquo;ok so\u0026hellip; there\u0026rsquo;s this thing i\u0026rsquo;ve been wanting to try\u0026rdquo;\nher: \u0026ldquo;what thing?\u0026rdquo;\nme: \u0026ldquo;like\u0026hellip; you know how i trade at my desk right?\u0026rdquo;\nher: \u0026ldquo;yeah\u0026hellip;\u0026rdquo;\nme: \u0026ldquo;what if\u0026hellip; while i have a winning position open\u0026hellip; you gave me head under the desk\u0026rdquo;\nher: [silent for like 5 seconds]\nme: \u0026ldquo;forget it, that\u0026rsquo;s fucking weird—\u0026rdquo;\nher: \u0026ldquo;no wait, that\u0026rsquo;s actually really hot\u0026rdquo;\nme: \u0026ldquo;wait what?\u0026rdquo;\nher: \u0026ldquo;yeah. when do you want to do it?\u0026rdquo;\nmy reaction # literally did not expect her to say yes.\nprepared for:\n\u0026ldquo;that\u0026rsquo;s weird\u0026rdquo; \u0026ldquo;why would you want that?\u0026rdquo; \u0026ldquo;are you using me?\u0026rdquo; got:\n\u0026ldquo;that\u0026rsquo;s hot, when?\u0026rdquo; the plan # her idea (she took control immediately):\nsetup:\nwednesday morning (today) i\u0026rsquo;ll have position open (she doesn\u0026rsquo;t care which one) she\u0026rsquo;ll come over at 9:30am i\u0026rsquo;ll be at trading desk she\u0026rsquo;ll drop to knees and start her only rule: \u0026ldquo;you have to actually manage the trade. no closing it early just to finish. i want you to multitask.\u0026rdquo;\nfuck. that makes it hotter.\nwhy she\u0026rsquo;s into it # her: \u0026ldquo;i like that you have this whole separate world with trading. it\u0026rsquo;s hot that you\u0026rsquo;re making money while i\u0026rsquo;m doing that. power thing i guess.\u0026rdquo;\nme: \u0026ldquo;so you don\u0026rsquo;t think it\u0026rsquo;s weird?\u0026rdquo;\nher: \u0026ldquo;babe, i literally asked you to tie me up last month. this is tame.\u0026rdquo;\nfair point.\nthis morning (wednesday 7/12) # she showed up at 9:30am.\ni had SPX call spread open, up $180 unrealized.\nshe walked in. kissed me. dropped to her knees.\nso fucking hot. literally can\u0026rsquo;t believe this is happening.\nshe starts and i\u0026rsquo;m trying to focus on the trade but holy shit.\nposition climbing. $180\u0026hellip; $210\u0026hellip; $245\u0026hellip;\nher rhythm is perfect. i\u0026rsquo;m managing to track the spread but barely.\n$270\u0026hellip; almost at target\u0026hellip;\ni\u0026rsquo;m about to lose it. closed the position at $295 profit.\nblew my load and i swear my whole body was shaking.\nshe looked up at me after, smiling. she knows i loved it.\nmultitasking made it way hotter than i imagined.\nafter # her: \u0026ldquo;how was the trade?\u0026rdquo;\nme: \u0026ldquo;up $295\u0026rdquo;\nher: \u0026ldquo;good. and how was i?\u0026rdquo;\nme: \u0026ldquo;fucking perfect\u0026rdquo;\nher: \u0026ldquo;we\u0026rsquo;re doing this again\u0026rdquo;\nme: \u0026ldquo;yes\u0026rdquo;\nwhy i was scared to ask # looking back, all my fears were bullshit:\nfear: she\u0026rsquo;ll think it\u0026rsquo;s weird reality: she thought it was hot\nfear: she\u0026rsquo;ll think i\u0026rsquo;m using her reality: she\u0026rsquo;s into the power active too\nfear: she\u0026rsquo;s more experienced and will judge me reality: she\u0026rsquo;s experienced enough to be open minded\nfear: it\u0026rsquo;ll ruin the relationship reality: brought us closer, now we communicate better about sex\nthe lesson # spent 2 weeks scared to tell her.\ntook 30 seconds to ask.\nshe said yes immediately.\nall that fear was wasted energy.\nDr. R was right: communication or silence.\nchose communication. won.\ntrading impact # wednesday morning:\nSPX call spread: +$295 (the fantasy trade) wednesday afternoon:\nTLT put spread: +$340 july total: +$1,921\ngoal: +$3,500. need: +$1,579 remaining.\nmental state # confident. relieved. happy.\ntold her the thing i was scared to tell her.\nshe said yes.\nrelationship stronger now.\ntrading back to green (yesterday was red day, today made it back).\nthis is what honesty looks like.\nwhat\u0026rsquo;s next # she wants to do it again \u0026ldquo;next time you have a big winner.\u0026rdquo;\nalready excited for next winning trade.\nalso: impressed with how mature A. is. we can communicate our fantasies so well.\nneed to ask her what her fantasy is. only fair.\nproved to myself i can communicate hard shit.\ngoing to therapy tomorrow (thursday 2pm with Dr. R).\ncan\u0026rsquo;t wait to tell her i actually did it.\n4:48am wednesday. told A. about fantasy. she said yes. did it this morning during winning trade. fucking incredible.\n-AK\n","date":"12 July 2023","externalUrl":null,"permalink":"/posts/2023-07-12-told-a-about-fantasy/","section":"Posts","summary":"\u003cp\u003edid it. told A. about the trading desk fantasy.\u003c/p\u003e\n\u003cp\u003eher reaction: \u0026ldquo;fuck yeah, when?\u0026rdquo;\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ehow it happened \n    \u003cdiv id=\"how-it-happened\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#how-it-happened\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003eshe came over tuesday night.\u003c/p\u003e","title":"told A. about the fantasy - she said yes","type":"posts"},{"content":"started testing tighter stop losses today.\ngoal: reduce avg loss from $660 to $600.\nearly results: mixed.\nthe change # old stops: -150% of credit received\nexample: sell $2.00 credit spread, stop at -$3.00 loss (-150%)\nnew stops: -140% of credit received\nsame $2.00 spread, stop at -$2.80 loss (-140%)\ndifference: $0.20 tighter stop per spread\nmonday 7/10 trades # trade 1: SPX put spread\nentry: sold for $2.15 credit old stop would\u0026rsquo;ve been: -$3.23 new stop: -$3.01 result: stopped out at -$3.01 old system: would\u0026rsquo;ve stayed in position (hadn\u0026rsquo;t hit -$3.23 yet)\nnew system: stopped out earlier\nwhat happened after stop:\nposition continued against me would\u0026rsquo;ve hit old stop at -$3.23 anyway saved: $0.22 per contract = $22 total (10 contracts) good test. tighter stop worked.\ntrade 2: TLT call spread\nentry: sold for $1.85 credit new stop: -$2.59 result: +$0.93 profit (closed at 50%) no stop hit. clean winner.\ntrade 3: IWM put spread\nentry: sold for $2.40 credit new stop: -$3.36 result: stopped out at -$3.36 the problem with this one:\nposition bounced back after i got stopped.\nif i\u0026rsquo;d used old stop (-$3.60), would\u0026rsquo;ve stayed in and eventually profited.\nestimated cost of tighter stop: -$240 (would\u0026rsquo;ve been +$120 winner)\ntoday\u0026rsquo;s net # trade 1: -$301 trade 2: +$93 trade 3: -$336\ntotal: -$544\nfirst red day in july. sucks.\nthe analysis # tighter stops:\nsaved $22 on trade 1 (worked) cost $360 on trade 3 (got whipsawed) net impact: -$338 worse than old stops would\u0026rsquo;ve been\nsample size issue # can\u0026rsquo;t conclude anything from 1 day.\nneed 20-30 trades minimum to know if -140% stops are better than -150%.\nwhat i\u0026rsquo;m doing # continuing with -140% stops for 2 more weeks.\ntracking:\nhow often new stops save money how often new stops whipsaw me out after 30 trades, will compare to historical -150% stop data.\njuly update # goal: +$3,500\ncurrent: +$1,286 (-$544 today brought me down from $1,830)\nremaining: +$2,214 in 3 weeks\nstill doable but today hurt.\nA. update # saw her sunday night.\ncooked together (pasta, she\u0026rsquo;s teaching me).\nstill haven\u0026rsquo;t brought up the fantasy.\ncame close after sex but chickened out again.\nshe asked: \u0026ldquo;is everything ok? you seem like you want to say something\u0026rdquo;\nme: \u0026ldquo;nah, just thinking about trading stuff\u0026rdquo;\nher: \u0026ldquo;ok, you know you can tell me anything right?\u0026rdquo;\nme: \u0026ldquo;yeah i know\u0026rdquo;\ni\u0026rsquo;m a pussy. she literally gave me opening and i didn\u0026rsquo;t take it.\nmental state # frustrated by today\u0026rsquo;s losses.\nfrustrated by lack of confidence with A.\nknow both are fixable:\ntrading: more data needed on stops A.: just fucking tell her the fantasy easier said than done on both.\ntomorrow\u0026rsquo;s plan # continue testing -140% stops.\naim for 2-3 trades.\nfocus on quality entries (vol detection, correlation checks).\nmaybe tell A. the fantasy tomorrow night when she comes over.\nprobably won\u0026rsquo;t. but maybe.\n3:25am tuesday. first red day in july. testing tighter stops, early results mixed. need more data. still a pussy about fantasy.\n-AK\n","date":"10 July 2023","externalUrl":null,"permalink":"/posts/2023-07-10-testing-tighter-stops/","section":"Posts","summary":"\u003cp\u003estarted testing tighter \u003ca\n  href=\"https://www.investopedia.com/terms/s/stop-lossorder.asp\"\n    target=\"_blank\"\n  \u003estop losses\u003c/a\u003e today.\u003c/p\u003e\n\u003cp\u003egoal: reduce avg loss from $660 to $600.\u003c/p\u003e\n\u003cp\u003eearly results: mixed.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe change \n    \u003cdiv id=\"the-change\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-change\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eold stops:\u003c/strong\u003e -150% of credit received\u003c/p\u003e","title":"testing tighter stops - early results mixed","type":"posts"},{"content":"been tracking profit factor for 2 months.\ncurrent: 2.1\nsounds good. but it\u0026rsquo;s not good enough.\nwhat is profit factor # profit factor = gross wins / gross losses\nexample:\n10 trades 7 wins averaging +$300 = $2,100 total wins 3 losses averaging -$280 = -$840 total losses profit factor: $2,100 / $840 = 2.5 interpretation:\n\u0026lt; 1.0 = losing strategy (losses \u0026gt; wins) 1.0-1.5 = barely profitable 1.5-2.0 = decent 2.0-3.0 = good 3.0 = excellent\nmy current stats (may + june) # total trades: 41\nwins: 32 (78% win rate) gross wins: $12,480\nlosses: 9 (22% loss rate) gross losses: $5,940\nprofit factor: $12,480 / $5,940 = 2.1\nnet profit: $6,540\nwhy 2.1 isn\u0026rsquo;t good enough # problem: commissions and slippage\nright now tracking P\u0026amp;L without accounting for:\nbroker commissions (~$2.50 per options spread) slippage (worse fills during volatile periods) data feed costs ($199/month polygon) estimated costs:\ncommissions: 41 trades × $2.50 = $102.50 slippage: ~$15 per trade avg = $615 data feeds: $199/month × 2 months = $398 total costs: $1,115.50\nadjusted net: $6,540 - $1,115.50 = $5,424.50\nadjusted profit factor: still ~2.0 but closer to 1.9\ntarget: profit factor \u0026gt; 2.5 # why 2.5 minimum:\nleaves room for:\ncommissions slippage bad fills occasional catastrophic losses market regime changes current gap: need to go from 2.1 → 2.5\nthree ways to improve # 1. increase win size\ncurrent avg win: $390\ntarget avg win: $450\nhow:\nlet winners run longer (currently closing at 50% profit) test 60% profit target instead risk: giving back gains if position reverses 2. decrease loss size\ncurrent avg loss: -$660\ntarget avg loss: -$550\nhow:\ntighter stops (currently -150% of credit) test -125% stops risk: more frequent stop outs 3. improve win rate\ncurrent: 78%\ntarget: 82%\nhow:\nstricter entry filters vol detection already helping (blocked 30+ trades in 2 months) add correlation filters (already doing this) test time-of-day filters (avoid first 30 min of market open) the math # scenario 1: increase avg win to $450\n32 wins × $450 = $14,400 9 losses × $660 = $5,940 profit factor: 14,400 / 5,940 = 2.42 scenario 2: decrease avg loss to $550\n32 wins × $390 = $12,480 9 losses × $550 = $4,950 profit factor: 12,480 / 4,950 = 2.52 scenario 3: improve win rate to 82%\n34 wins × $390 = $13,260 7 losses × $660 = $4,620 profit factor: 13,260 / 4,620 = 2.87 best approach: combine all three # conservative targets:\navg win: $390 → $420 (+8%) avg loss: $660 → $600 (-9%) win rate: 78% → 80% (+2%) projected stats (next 41 trades):\n33 wins × $420 = $13,860 8 losses × $600 = $4,800 profit factor: 13,860 / 4,800 = 2.89 that\u0026rsquo;s the target.\nimplementation plan # week 1-2: test profit targets\ncurrent: close at 50% test: close at 55-60% measure: does avg win increase without giving back too much? week 3-4: test stop loss\ncurrent: -150% stop test: -140% stop measure: does avg loss decrease without increasing stop out frequency? week 5+: add filters\ncurrent: vol detection only add: time-of-day filter (no trades first 30 min) measure: does win rate improve? tracking metrics # added to grafana dashboard:\nprofit factor (real-time) avg win size avg loss size win rate % gross wins / gross losses monitoring daily. will see trends over 2-3 weeks.\ntrading update # friday 7/7:\nSPX put spread: +$405 IWM call spread: +$270 saturday 7/8:\nQQQ put spread: +$315 july total: +$1,830\ngoal: +$3,500. need: +$1,670 remaining.\non pace.\nA. update # seeing her tonight (saturday).\nshe\u0026rsquo;s coming over at 7pm.\nprobably cooking together (she teaches me, i\u0026rsquo;m getting better).\nstill haven\u0026rsquo;t told her about the trading desk fantasy.\nmaybe tonight. probably not.\n2:40pm saturday. profit factor analysis done. target: 2.5+. implementing improvements next week.\n-AK\n","date":"8 July 2023","externalUrl":null,"permalink":"/posts/2023-07-08-profit-factor-analysis/","section":"Posts","summary":"\u003cp\u003ebeen tracking profit factor for 2 months.\u003c/p\u003e\n\u003cp\u003ecurrent: 2.1\u003c/p\u003e\n\u003cp\u003esounds good. but it\u0026rsquo;s not good enough.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ewhat is profit factor \n    \u003cdiv id=\"what-is-profit-factor\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#what-is-profit-factor\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca\n  href=\"https://www.investopedia.com/terms/p/profitfactor.asp\"\n    target=\"_blank\"\n  \u003eprofit factor\u003c/a\u003e = gross wins / gross losses\u003c/strong\u003e\u003c/p\u003e","title":"analyzing profit factor - why 2.1 isn't good enough","type":"posts"},{"content":"","date":"8 July 2023","externalUrl":null,"permalink":"/tags/metrics/","section":"Tags","summary":"","title":"Metrics","type":"tags"},{"content":"","date":"6 July 2023","externalUrl":null,"permalink":"/tags/fantasy/","section":"Tags","summary":"","title":"Fantasy","type":"tags"},{"content":"been dating A. for almost a month now.\nsex is great. she\u0026rsquo;s confident, knows what she\u0026rsquo;s doing.\nbut there\u0026rsquo;s this fantasy i have and i don\u0026rsquo;t know how to bring it up.\nthe fantasy # trading at my desk. big winning position open. watching it print money.\nA. comes over. drops to her knees. pulls my dick out.\nstarts giving me head while i\u0026rsquo;m watching the trade climb.\nclose the position for +$2k profit while she\u0026rsquo;s sucking.\nwhy this gets me off # something about the combination:\n1. control: managing a winning trade takes focus. getting head at same time = ultimate multitasking test.\n2. power: making money while getting pleasure. two wins at once.\n3. the desk setup: monitor showing profit climbing, her on her knees, me in my trading chair.\n4. timing: blowing the biggest load of my life right when i close the position for profit. she\u0026rsquo;d be smiling after, knowing how much i liked it.\nwhy i can\u0026rsquo;t tell her # fear #1: she thinks it\u0026rsquo;s weird\nwhat if she\u0026rsquo;s like \u0026ldquo;why the fuck would you want to mix trading and sex?\u0026rdquo;\nfear #2: she thinks i\u0026rsquo;m using her\n\u0026ldquo;oh so you just want me as an object while you trade?\u0026rdquo;\nfear #3: ruins the relationship\nthings are going really well right now. why risk it with weird shit?\nfear #4: lack of confidence\ni\u0026rsquo;m 20 (just turned 20 on july 4th). she\u0026rsquo;s 23. more experienced.\nwhat if she laughs at me?\nwhat i\u0026rsquo;ve tried # option 1: hint at it\nme during sex last week: \u0026ldquo;would you ever\u0026hellip; you know\u0026hellip; while i\u0026rsquo;m working?\u0026rdquo;\nher: \u0026ldquo;like have sex while you\u0026rsquo;re trading?\u0026rdquo;\nme: \u0026ldquo;maybe\u0026rdquo;\nher: \u0026ldquo;that\u0026rsquo;s kinda hot actually\u0026rdquo;\ngot scared and dropped it.\noption 2: test the waters\nasked her to come over during trading hours wednesday.\nshe showed up. i had position open.\nchickened out. closed position before suggesting anything.\ntherapy session today # saw Dr. R this afternoon (wednesday 2pm slot).\ntold her about the fantasy and fear of telling A.\nDr. R: \u0026ldquo;what\u0026rsquo;s the worst that happens if you tell her?\u0026rdquo;\nme: \u0026ldquo;she thinks i\u0026rsquo;m weird and leaves\u0026rdquo;\nDr. R: \u0026ldquo;do you really think A. would leave over a fantasy request?\u0026rdquo;\nme: \u0026ldquo;probably not\u0026rdquo;\nDr. R: \u0026ldquo;so what\u0026rsquo;s actually stopping you?\u0026rdquo;\nme: \u0026ldquo;fear of rejection i guess\u0026rdquo;\nDr. R: \u0026ldquo;sounds like you already know the answer. communication or silence.\u0026rdquo;\nA. is open minded # she\u0026rsquo;s done other stuff i\u0026rsquo;ve suggested:\nletting me tie her up (she loved it) sex on the balcony at night (risky but hot) morning sex before market open (became regular thing) so she\u0026rsquo;s not vanilla. probably wouldn\u0026rsquo;t think trading desk blowjob is that weird.\nwhy i\u0026rsquo;m writing this # maybe if i admit it here, i\u0026rsquo;ll get confidence to tell her.\nor maybe this fantasy stays in my head forever.\nthe confidence problem # why i lack confidence:\nshe\u0026rsquo;s older (23 vs my 20) she\u0026rsquo;s more experienced (had 3 serious relationships, i\u0026rsquo;ve had\u0026hellip; tinder hookups and J.) she\u0026rsquo;s objectively hotter than girls i usually date (8/10 vs my usual 6-7s) she has her shit together (career, own place, emotionally stable) i feel like i\u0026rsquo;m punching above my weight with her.\nwhat if asking for weird shit reminds her she could do better?\nwhat i\u0026rsquo;ll probably do # keep the fantasy to myself.\nenjoy what we have now.\ndon\u0026rsquo;t risk fucking it up.\nmaybe in a few months when things are more stable.\ntrading update # wednesday 7/5:\nTLT call spread: +$340 GLD put spread: +$285 july total: +$840 (3 trades, 3 wins)\ngoal: +$3,500. need: +$2,660 remaining.\non pace.\nmental state # relationship is good.\nsex is good.\ntrading is good.\nbut lacking confidence to communicate this fantasy.\nprobably overthinking it.\nmaybe one day i\u0026rsquo;ll tell her.\n3:52am thursday. got fantasy about getting head while trading. too scared to tell A. maybe someday.\n-AK\n","date":"6 July 2023","externalUrl":null,"permalink":"/posts/2023-07-06-fantasy-i-cant-tell-her/","section":"Posts","summary":"\u003cp\u003ebeen dating A. for almost a month now.\u003c/p\u003e\n\u003cp\u003esex is great. she\u0026rsquo;s confident, knows what she\u0026rsquo;s doing.\u003c/p\u003e\n\u003cp\u003ebut there\u0026rsquo;s this fantasy i have and i don\u0026rsquo;t know how to bring it up.\u003c/p\u003e","title":"got a fantasy i can't tell A. about","type":"posts"},{"content":"july 4th. 20 years old today.\nfirst birthday without my parents.\nlast year july 4th 2022 # turned 19.\nparents threw party at the house (san diego).\ndad grilled steaks. mom made cake.\nabout 15 family friends came over.\nwatched fireworks from the deck.\nnormal boring suburban birthday shit.\nthis year july 4th 2023 # parents dead 6 months.\nno party. no family.\njust me and A.\nwhat A. did # showed up at my place at noon with homemade cake.\nchocolate with vanilla frosting. from scratch.\nher: \u0026ldquo;happy birthday. you\u0026rsquo;re 20 now. officially not a teenager anymore\u0026rdquo;\nme: \u0026ldquo;thanks. this is\u0026hellip; really fucking nice\u0026rdquo;\nshe knew today would be hard. didn\u0026rsquo;t make it weird.\nhow we spent it # ate cake for lunch (fuck proper meals).\nwent to la jolla cove. watched tourists.\ncame back to my place. she cooked dinner (salmon, asparagus, potatoes).\nwatched fireworks from my balcony at 9pm.\nthe grief hit # was fine all day until fireworks started.\nsaw them exploding. remembered last year watching with dad.\nstarted crying on the balcony.\nA. didn\u0026rsquo;t say anything. just held my hand.\ncried for maybe 5 minutes. then it passed.\nher: \u0026ldquo;you ok?\u0026rdquo;\nme: \u0026ldquo;yeah. just\u0026hellip; last year they were alive you know\u0026rdquo;\nher: \u0026ldquo;i know\u0026rdquo;\ndidn\u0026rsquo;t try to fix it. just sat with me.\nwhat i miss # dad would\u0026rsquo;ve been proud of the trading progress (2 profitable months).\nmom would\u0026rsquo;ve liked A. (smart, independent, good cook).\nthey would\u0026rsquo;ve loved the server rack setup (dad was engineer, would\u0026rsquo;ve nerded out).\nthey\u0026rsquo;ll never meet A. never see me succeed at trading. never see any of it.\ntherapy tomorrow # seeing Dr. R wednesday 2pm.\ngoing to talk about birthday and grief.\nshe\u0026rsquo;ll probably say some shit about \u0026ldquo;firsts are always hardest\u0026rdquo; or whatever.\nshe\u0026rsquo;s not wrong though.\ntrading today # markets closed for july 4th holiday.\nno trades. just processing emotions and eating cake.\nA.\u0026rsquo;s reaction # after i cried:\nher: \u0026ldquo;want to talk about them?\u0026rdquo;\nme: \u0026ldquo;not really. just miss them\u0026rdquo;\nher: \u0026ldquo;ok. i\u0026rsquo;m here if you change your mind\u0026rdquo;\nperfect response. no pressure. no fixing.\nthis is what healthy looks like.\nreflection on 20 # age 19:\nstarted: living at home, parents alive, paper trading ended: parents dead, $2M inherited, lost $180k learning to trade for real age 20 starting today:\ntrading consistently profitable (2 months in a row) dating someone healthy (A.) own place, server rack, systems working still grieving but mostly stable life is weird. massive loss. also massive growth.\nwhat\u0026rsquo;s next # keep trading. keep seeing A. keep going to therapy.\nprocess grief as it comes.\nbuild the life my parents would\u0026rsquo;ve been proud of.\nmental state tonight # sad but ok.\ncried but not broken.\nmiss them but moving forward.\nA. was perfect today. didn\u0026rsquo;t try to replace them or fix me. just was there.\n11:18pm tuesday. turned 20. first birthday without parents. A. made it bearable. miss them.\n-AK\n","date":"4 July 2023","externalUrl":null,"permalink":"/posts/2023-07-04-turned-20-today/","section":"Posts","summary":"\u003cp\u003ejuly 4th. 20 years old today.\u003c/p\u003e\n\u003cp\u003efirst birthday without my parents.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003elast year july 4th 2022 \n    \u003cdiv id=\"last-year-july-4th-2022\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#last-year-july-4th-2022\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003eturned 19.\u003c/p\u003e","title":"turned 20 today - first birthday without parents","type":"posts"},{"content":"","date":"2 July 2023","externalUrl":null,"permalink":"/tags/july/","section":"Tags","summary":"","title":"July","type":"tags"},{"content":"first trading day of july (markets closed friday for july 4th weekend).\nup $215.\nsunday 7/2 trade # SPX put spread: +$215\nclean entry at 10:30am. vol detection gave green light.\nclosed at 50% profit by 1pm.\njuly goal # target: +$3,500 (higher than june\u0026rsquo;s $3,285)\nday 1: +$215\nneed: +$3,285 remaining\naccount status # end june: $345,025 current july 2: $345,240 2023 YTD: +$26,240 (from $319k in may)\nstill down overall for the year (lost $180k jan-april learning).\nbut 2 profitable months in a row feels good.\nthis week\u0026rsquo;s plan # markets closed tuesday july 4th (independence day).\nshort week: monday, wednesday, thursday trading only.\nwill focus on quality over quantity. 3-4 good trades better than 10 mediocre ones.\nbirthday tuesday # turning 20 on july 4th.\nlast year: parents were alive, i was 19, living at home.\nthis year: parents dead 6 months, trading full time, dating A.\nweird how much changes in a year.\nA. update # seeing her tomorrow (monday night) before market holiday tuesday.\nshe\u0026rsquo;s cooking dinner again (her cooking skills are insane).\nthings still going really well. 3 weeks in, zero red flags.\nnot clingy, independent, actually smart, hot AF.\nthis might last past summer.\nvol detection working # blocked 2 potential entries sunday morning.\nboth would\u0026rsquo;ve been stopped out based on market action after.\nestimated saved: ~$580.\nsystem continuing to prove its worth.\nmental state # focused but relaxed.\nbirthday coming up. parents died 6 months ago.\nprocessing grief mostly through therapy with Dr. R (wednesdays 2pm).\nA. being supportive without being overbearing.\ntrading consistent. systems working.\nlife is stable right now.\n4:35am monday. july started. small win. birthday tuesday. seeing A. tomorrow night.\n-AK\n","date":"2 July 2023","externalUrl":null,"permalink":"/posts/2023-07-02-july-starts-slow/","section":"Posts","summary":"\u003cp\u003efirst trading day of july (markets closed friday for july 4th weekend).\u003c/p\u003e\n\u003cp\u003eup $215.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003esunday 7/2 trade \n    \u003cdiv id=\"sunday-72-trade\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#sunday-72-trade\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eSPX put spread:\u003c/strong\u003e +$215\u003c/p\u003e","title":"july day 1 - small win to start month","type":"posts"},{"content":"wednesday therapy session.\nA. was in waiting room when i arrived.\nshe had appointment right before mine.\nthe awkward part # walked into waiting room. A. sitting there on couch.\nme: \u0026ldquo;uh\u0026hellip; hey\u0026rdquo;\nher: \u0026ldquo;wait, you see Dr. R too?\u0026rdquo;\nme: \u0026ldquo;yeah. wednesdays at 2pm\u0026rdquo;\nher: \u0026ldquo;i have wednesdays at 1pm\u0026rdquo;\nwe both see same therapist. different time slots.\nDr. R\u0026rsquo;s reaction # Dr. R came out to get me.\nsaw A. and me talking.\nDr. R: \u0026ldquo;oh. you two know each other?\u0026rdquo;\nme: \u0026ldquo;yeah, we\u0026rsquo;re dating\u0026rdquo;\nDr. R: \u0026ldquo;well this is interesting\u0026rdquo;\nher professional face stayed neutral but i could tell she was amused.\nwhat A. told me after # we grabbed coffee after my session.\nher: \u0026ldquo;so\u0026hellip; we both see Dr. R\u0026rdquo;\nme: \u0026ldquo;yeah. small world\u0026rdquo;\nher: \u0026ldquo;i\u0026rsquo;ve been seeing her for 6 months. started after breakup with ex\u0026rdquo;\nme: \u0026ldquo;i\u0026rsquo;ve been seeing her since february. started after my parents died\u0026rdquo;\nher: \u0026ldquo;that makes sense. she\u0026rsquo;s really good\u0026rdquo;\nme: \u0026ldquo;yeah she is\u0026rdquo;\nthe funny part # A: \u0026ldquo;did you know Dr. R is hot? like really hot?\u0026rdquo;\nme: \u0026ldquo;yeah. noticed that first session\u0026rdquo;\nA: \u0026ldquo;i thought i was the only one who thought that\u0026rdquo;\nme: \u0026ldquo;nah. she\u0026rsquo;s a 10. dresses provocatively too\u0026rdquo;\nA: \u0026ldquo;right? the tight dresses? i thought maybe i was imagining it\u0026rdquo;\nboth of us noticed. both thought we were weird for noticing.\nturns out everyone notices.\nDr. R probably knew # thinking back: Dr. R asked about A. in my sessions.\nA. probably talked about me in her sessions.\nDr. R knew we were dating the whole time.\njust didn\u0026rsquo;t say anything (confidentiality).\nwhat this means # pros:\nA. is working on herself (therapy = emotional maturity) we both value mental health Dr. R already knows both sides of relationship cons:\nscheduling conflict (both want wednesday afternoons) weird that same person hears both perspectives verdict: not a dealbreaker. actually kind of cool.\nrescheduling solution # A. offered to move her slot to tuesdays.\nme: \u0026ldquo;you don\u0026rsquo;t have to do that\u0026rdquo;\nher: \u0026ldquo;i know. but wednesdays work better for you with trading schedule\u0026rdquo;\nconsiderate AF. green flag.\ntherapy session content # told Dr. R about the redis caching (she pretends to understand my tech shit).\nalso talked about A. and how it\u0026rsquo;s going well.\nDr. R: \u0026ldquo;you seem more stable this month\u0026rdquo;\nme: \u0026ldquo;yeah. trading profitable, dating someone healthy, systems working\u0026rdquo;\nDr. R: \u0026ldquo;good. keep doing what you\u0026rsquo;re doing\u0026rdquo;\ntrading update # monday 6/26: +$200 (SPX call spread) tuesday 6/27: +$315 (TLT put spread) wednesday 6/28: no trades (vol spike)\njune final total: +$3,800 (beat $3k goal by $800)\nweekend plans with A # seeing her saturday night.\nshe wants to cook again (her cooking \u0026gt; my cooking by far).\nprobably staying over at her place.\nthings are good. really fucking good.\nmental state # stable. consistent. happy.\n2 profitable trading months.\nhealthy relationship with smart independent girl.\nboth seeing therapist (same one, hilariously).\ngrief about parents mostly manageable.\nlife is working right now.\n2:08am thursday. found out A. and i see same therapist. awkward but funny. she\u0026rsquo;s moving her slot to tuesdays.\n-AK\n","date":"29 June 2023","externalUrl":null,"permalink":"/posts/2023-06-29-a-met-my-therapist/","section":"Posts","summary":"\u003cp\u003ewednesday therapy session.\u003c/p\u003e\n\u003cp\u003eA. was in waiting room when i arrived.\u003c/p\u003e\n\u003cp\u003eshe had appointment right before mine.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe awkward part \n    \u003cdiv id=\"the-awkward-part\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-awkward-part\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003ewalked into waiting room. A. sitting there on couch.\u003c/p\u003e","title":"A. met Dr. R. - awkward but funny","type":"posts"},{"content":"been noticing market data latency creeping up.\naverage fetch time: 180ms from polygon API.\nslowing down entry execution.\nthe problem # every time algo needs current price:\nhit polygon API over HTTPS parse JSON response extract OHLCV data calculate indicators return to strategy 180ms average. sometimes 400ms during market open.\nunacceptable for intraday strategies.\nthe solution: redis caching # redis = in-memory key-value store.\nsub-millisecond reads. perfect for real-time data caching.\nimplementation # import redis import json from datetime import datetime, timedelta import aioredis from typing import Optional, Dict, Any class MarketDataCache: \u0026#34;\u0026#34;\u0026#34;Redis-backed market data caching layer\u0026#34;\u0026#34;\u0026#34; def __init__(self, redis_url: str = \u0026#34;redis://localhost:6379\u0026#34;): self.redis = aioredis.from_url( redis_url, encoding=\u0026#34;utf-8\u0026#34;, decode_responses=True ) self.ttl_seconds = 1 # Cache for 1 second (real-time data) async def get_quote(self, symbol: str) -\u0026gt; Optional[Dict[str, Any]]: \u0026#34;\u0026#34;\u0026#34;Get cached quote or None if expired/missing\u0026#34;\u0026#34;\u0026#34; cache_key = f\u0026#34;quote:{symbol}\u0026#34; cached = await self.redis.get(cache_key) if cached: data = json.loads(cached) # Check if cache is stale cached_time = datetime.fromisoformat(data[\u0026#39;timestamp\u0026#39;]) age = (datetime.now() - cached_time).total_seconds() if age \u0026lt; self.ttl_seconds: return data return None async def set_quote(self, symbol: str, quote_data: Dict[str, Any]): \u0026#34;\u0026#34;\u0026#34;Cache quote data with TTL\u0026#34;\u0026#34;\u0026#34; cache_key = f\u0026#34;quote:{symbol}\u0026#34; # Add timestamp quote_data[\u0026#39;timestamp\u0026#39;] = datetime.now().isoformat() # Store with expiration await self.redis.setex( cache_key, self.ttl_seconds, json.dumps(quote_data) ) async def get_or_fetch( self, symbol: str, fetch_func: callable ) -\u0026gt; Dict[str, Any]: \u0026#34;\u0026#34;\u0026#34;Get from cache or fetch from API\u0026#34;\u0026#34;\u0026#34; # Try cache first cached = await self.get_quote(symbol) if cached: return cached # Cache miss - fetch from API fresh_data = await fetch_func(symbol) # Cache for next time await self.set_quote(symbol, fresh_data) return fresh_data class PolygonAPI: \u0026#34;\u0026#34;\u0026#34;Market data API with caching\u0026#34;\u0026#34;\u0026#34; def __init__(self, api_key: str): self.api_key = api_key self.base_url = \u0026#34;https://api.polygon.io\u0026#34; self.cache = MarketDataCache() self.session = aiohttp.ClientSession() async def get_last_quote(self, symbol: str) -\u0026gt; Dict[str, Any]: \u0026#34;\u0026#34;\u0026#34;Get last quote with caching\u0026#34;\u0026#34;\u0026#34; return await self.cache.get_or_fetch( symbol, self._fetch_quote_from_api ) async def _fetch_quote_from_api(self, symbol: str) -\u0026gt; Dict[str, Any]: \u0026#34;\u0026#34;\u0026#34;Fetch directly from Polygon API\u0026#34;\u0026#34;\u0026#34; url = f\u0026#34;{self.base_url}/v2/last/trade/{symbol}\u0026#34; params = {\u0026#34;apiKey\u0026#34;: self.api_key} async with self.session.get(url, params=params) as resp: data = await resp.json() return { \u0026#39;symbol\u0026#39;: symbol, \u0026#39;price\u0026#39;: data[\u0026#39;results\u0026#39;][\u0026#39;p\u0026#39;], \u0026#39;size\u0026#39;: data[\u0026#39;results\u0026#39;][\u0026#39;s\u0026#39;], \u0026#39;timestamp\u0026#39;: data[\u0026#39;results\u0026#39;][\u0026#39;t\u0026#39;] } # Usage in strategy class MeanReversionStrategy: def __init__(self): self.api = PolygonAPI(api_key=os.getenv(\u0026#34;POLYGON_API_KEY\u0026#34;)) async def check_entry_signal(self, symbol: str) -\u0026gt; bool: # This now hits cache 99% of the time quote = await self.api.get_last_quote(symbol) current_price = quote[\u0026#39;price\u0026#39;] # ... rest of strategy logic the architecture # before:\nStrategy → Polygon API (180ms) → Parse → Return after:\nStrategy → Redis Cache (0.3ms) → Return [cache hit] Strategy → Redis Cache → Polygon API (180ms) → Cache → Return [cache miss] performance improvement # before redis:\naverage latency: 180ms worst case: 400ms during market open requests per strategy check: 3-5 API calls after redis:\naverage latency: 0.3ms (cache hit) worst case: 180ms (cache miss on first request) cache hit rate: 99.2% requests per strategy check: 0.05 API calls (rest from cache) net improvement: 60% reduction in average data latency.\ncache strategy # TTL = 1 second for real-time quotes.\nwhy 1 second?\nmarket data updates ~10 times per second 1 second staleness is acceptable for my strategies balances freshness vs cache hit rate for different data types:\nreal-time quotes: 1 second TTL daily bars: 60 seconds TTL historical data: 1 hour TTL (rarely changes) infrastructure details # redis deployment:\nrunning on same dell server as algos 1GB memory allocated persistence disabled (cache-only, data is ephemeral) single instance (no cluster needed yet) monitoring:\ngrafana dashboard tracks cache hit rate alert if hit rate drops below 95% tracks redis memory usage cost savings # polygon API pricing:\n$199/month for unlimited plan but rate limited to 5 requests/second before:\nhitting rate limit during market open had to throttle strategy checks slower execution after:\n99.2% cache hit rate API calls dropped from ~1,200/min to ~10/min zero rate limit issues faster execution real trading impact # tested monday morning (market open 6:30am PST).\nentry speed improvement:\nbefore: 180-400ms data fetch + 50ms decision logic = 230-450ms total after: 0.3ms data fetch + 50ms decision logic = 50ms total got filled 200ms faster on average.\nin fast-moving markets, 200ms matters.\nredis installation # stupid simple on debian:\napt-get install redis-server systemctl enable redis-server systemctl start redis-server python client:\npip install aioredis monitoring cache performance # class CacheMonitor: \u0026#34;\u0026#34;\u0026#34;Track cache performance metrics\u0026#34;\u0026#34;\u0026#34; def __init__(self, cache: MarketDataCache): self.cache = cache self.hits = 0 self.misses = 0 async def get_stats(self) -\u0026gt; Dict[str, Any]: \u0026#34;\u0026#34;\u0026#34;Get cache statistics\u0026#34;\u0026#34;\u0026#34; total = self.hits + self.misses hit_rate = (self.hits / total * 100) if total \u0026gt; 0 else 0 # Get redis memory stats info = await self.cache.redis.info(\u0026#39;memory\u0026#39;) return { \u0026#39;hit_rate\u0026#39;: f\u0026#34;{hit_rate:.2f}%\u0026#34;, \u0026#39;total_requests\u0026#39;: total, \u0026#39;cache_hits\u0026#39;: self.hits, \u0026#39;cache_misses\u0026#39;: self.misses, \u0026#39;memory_used\u0026#39;: info[\u0026#39;used_memory_human\u0026#39;], \u0026#39;keys_count\u0026#39;: await self.cache.redis.dbsize() } added this to grafana dashboard. monitoring cache performance in real-time.\nnext optimizations # 1. multi-level caching:\nL1: in-process python dict (0.01ms) L2: redis (0.3ms) L3: API call (180ms) 2. cache warming:\npre-fetch common symbols at market open avoid cold start cache misses 3. predictive caching:\nif algo checks SPX, probably will check QQQ next pre-fetch correlated symbols lessons # 1. measure first:\nprofiled code before optimizing.\nfound: 80% time in API calls.\noptimized the bottleneck.\n2. caching is free speed:\nredis added 10 lines of code.\n60% latency reduction.\nmassive ROI.\n3. monitor everything:\ncache only works if you measure it.\nadded metrics to track hit rate, staleness, memory.\nimpact on trading # already seeing faster execution.\nentries filled 200ms sooner on average.\nin volatile markets, this matters.\nbetter fills = higher profits.\n3:18am tuesday. added redis caching. cut market data latency 60%. getting filled faster now.\n-AK\n","date":"27 June 2023","externalUrl":null,"permalink":"/posts/2023-06-27-redis-caching-market-data/","section":"Posts","summary":"\u003cp\u003ebeen noticing market data latency creeping up.\u003c/p\u003e\n\u003cp\u003eaverage fetch time: 180ms from polygon API.\u003c/p\u003e\n\u003cp\u003eslowing down entry execution.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe problem \n    \u003cdiv id=\"the-problem\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-problem\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003eevery time algo needs current price:\u003c/p\u003e","title":"added redis caching - cut market data latency by 60%","type":"posts"},{"content":"june goal: $3,000\nactual result: $3,285\nfucking crushed it.\nfinal week trades # friday 6/23:\nIWM put spread: +$245 monday 6/26:\nSPX call spread: +$200 total june: +$3,285 (22 trades, 18 wins, 4 losses)\njune performance breakdown # by strategy:\nmean reversion options: +$2,680 (16 trades, 75% win rate) vol selling options: +$1,315 (6 trades, 83% win rate) crypto bot: -$710 (paused after week 3, total loss)\nby week:\nweek 1: +$780 week 2: +$635 week 3: +$1,100 week 4: +$770\naccount growth # start june 1: $341,740 end june 25: $345,025 gain: +$3,285 (+0.96%)\n2-month total: start may 1: $319,000 end june 25: $345,025 gain: +$26,025 (+8.2%)\naveraging 4% per month. not sustainable long-term but feels good now.\nwhat worked # 1. vol detection system:\nblocked 19 trades total this month.\nestimated saved: ~$4,200.\nsystem ROI: infinite (built it myself, saves thousands).\n2. position sizing:\nstrict 1.25% risk per trade kept losses manageable.\nlargest loss: -$315 (well within tolerance).\n3. correlation limits:\navoided concentration risk by limiting correlation between positions.\nrejected 11 position entries for high correlation.\n4. profit discipline:\ntook profits at 50% gain or 2 DTE.\ndidn\u0026rsquo;t get greedy. consistent wins \u0026gt; home runs.\nwhat didn\u0026rsquo;t work # crypto bot:\nlost $710 before i paused it week 3.\nsignal logic was flawed. needs complete rebuild.\nlesson: shut down losing strategies fast. don\u0026rsquo;t hope they fix themselves.\ngoals for july # financial: +$3,500 (higher than june)\nstrategy: fix crypto bot or abandon it completely\nrisk: maintain 1.25% risk per trade, zero exceptions\npersonal: keep dating A., don\u0026rsquo;t fuck it up\ncomparison to when i started # january 2023 (started live trading):\naccount: $400,000 strategy: basically gambling risk management: none losses: -$8,200 first month june 2023 (now):\naccount: $345,025 strategy: systematic with vol detection risk management: strict 1.25% per trade profit: +$3,285 this month took 6 months to figure out what works.\nlost $180k total in that time.\nbut now: 2 profitable months in a row, systems working.\nexpensive education but worth it.\nmental state # confident but not overconfident.\nknow i can still have losing months (probably 3-4 per year).\nbut systems are solid. edge is real. just need to keep executing.\nA. update: saw her saturday. things going really well. she\u0026rsquo;s cool about my trading schedule.\ntherapy: Dr. R proud of consistent profitability and healthy relationship with A.\ngrief: 6 months since parents died. mostly stable now. occasional crying but rare.\njuly preview # continuing same strategies (options mean reversion + vol selling).\npaused crypto indefinitely until i rebuild signal logic.\nstaying disciplined with risk management.\nnot getting cocky after 2 profitable months.\n3:45pm sunday. june goal crushed. $3,285 total. july target: $3,500. staying disciplined.\n-AK\n","date":"25 June 2023","externalUrl":null,"permalink":"/posts/2023-06-25-hit-june-goal/","section":"Posts","summary":"\u003cp\u003ejune goal: $3,000\u003c/p\u003e\n\u003cp\u003eactual result: $3,285\u003c/p\u003e\n\u003cp\u003efucking crushed it.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003efinal week trades \n    \u003cdiv id=\"final-week-trades\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#final-week-trades\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003efriday 6/23:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eIWM put spread: +$245\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003emonday 6/26:\u003c/strong\u003e\u003c/p\u003e","title":"hit june goal - $3,285 total","type":"posts"},{"content":"wednesday night at A.\u0026rsquo;s place.\nwe slept together.\nfucking incredible.\nthe night # she cooked dinner (chicken pasta, way better than anything i can make).\nwe ate on her balcony (she lives in north park, 1BR with view).\nafter dinner: wine, couch, talking about her work project.\nthen she kissed me.\nthe important part # not sharing details but: she knows what she\u0026rsquo;s doing.\nway better than J. or any of the tinder girls from march/april.\nstayed over. left her place at 6am thursday morning.\nwhat makes this different # previous girls:\nJ.: slept together first date, got clingy immediately after M.: never got there (therapy waiting room girl, too intense) tinder hookups: good but zero connection A.:\nwaited 12 days (unusual for me) actual connection before sex she\u0026rsquo;s 23, more experienced, confident not clingy after (texted me thursday afternoon: \u0026ldquo;last night was fun. see you this weekend?\u0026rdquo;) way healthier fluid.\nprediction update # original prediction: 2-3 months\nnew prediction: 4-6 months minimum\nmight be longer if she stays this cool.\ntherapy update # seeing Dr. R friday morning (tomorrow).\ngoing to tell her about A. and how it\u0026rsquo;s going.\nDr. R will probably say \u0026ldquo;don\u0026rsquo;t rush into labeling it\u0026rdquo; or some shit like that.\nshe\u0026rsquo;s not wrong though. taking it slow is working.\ntrading thursday # was distracted thursday morning (tired from staying at A.\u0026rsquo;s).\nstill made one trade: TLT call spread +$325.\njune total: +$2,840\ngoal was $3,000. need $160 more.\nhitting it tomorrow (friday) easily.\nmental state # good. really fucking good.\ndating someone smart and hot and not clingy.\ntrading going well. june goal basically done.\nsystems working. life is simple.\nno random crying about parents this week. feeling stable.\nweekend plans # seeing A. saturday night (her idea).\nmight take her to belmont park or just hang at my place.\nshe wants to see more of my trading setup (hasn\u0026rsquo;t seen the chicago colo dashboard yet).\nsunday: debugging crypto bot (paused it tuesday, need to fix logic).\ncomparison to previous relationships # J. at 2 weeks in:\ntexting me 50 times per day wanted to define relationship getting jealous about other girls crying when i didn\u0026rsquo;t respond fast enough A. at 2 weeks in:\ntexts once or twice per day has her own life (work, friends, hobbies) zero jealousy or clinginess confident and independent night and fucking day difference.\nthis is what healthy looks like.\n4:27am friday. slept with A. wednesday night. she\u0026rsquo;s incredible. this might actually last.\n-AK\n","date":"23 June 2023","externalUrl":null,"permalink":"/posts/2023-06-23-slept-with-a/","section":"Posts","summary":"\u003cp\u003ewednesday night at A.\u0026rsquo;s place.\u003c/p\u003e\n\u003cp\u003ewe slept together.\u003c/p\u003e\n\u003cp\u003efucking incredible.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe night \n    \u003cdiv id=\"the-night\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-night\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003eshe cooked dinner (chicken pasta, way better than anything i can make).\u003c/p\u003e","title":"slept with A. - worth the wait","type":"posts"},{"content":"june week 3 finished. up $1,100 for the week.\nbest week yet.\nweek 3 trades # monday 6/19:\nGLD call spread: +$290 tuesday 6/20:\nTLT put spread: +$380 IWM put spread: +$245 wednesday 6/21:\nSPX call spread: +$185 total week 3: +$1,100 (4 trades, 4 wins, 0 losses)\nperfect week. no losers.\njune progress # goal: +$3,000 week 1: +$780 week 2: +$635 week 3: +$1,100 total: +$2,515 remaining: +$485 in 1.5 weeks\nbasically done. need $485 more to hit goal.\nat current pace (~$367/week), will finish around +$3,400 for june.\naccount trajectory # start may 1: $319,000 end may 31: $341,740 (+$22,740, +7.1%) current june 21: $344,255 (+$2,515, +0.7% so far)\njune pace is slower but more consistent.\nzero big losses (largest was -$315 on june 8).\nprefer steady wins over volatile swings.\nwhat\u0026rsquo;s working right now # 1. vol detection:\nblocked 11 trades this month that would\u0026rsquo;ve lost money.\nestimated saved: ~$2,800.\nsystem paid for itself 10x over.\n2. correlation filtering:\nkeeping max correlation at 0.75 between positions.\navoided concentration risk 8 times this month.\n3. position sizing discipline:\nstrict 1.25% risk per trade.\nlargest loss was $315 (well within tolerance).\n4. profit targets:\nclosing at 50% profit or 2 DTE (whichever first).\nnot getting greedy. taking consistent wins.\nstrategy performance # mean reversion (options):\ntrades: 14 win rate: 71% (10 wins, 4 losses) avg win: +$318 avg loss: -$265 net: +$2,120 vol selling (options):\ntrades: 5 win rate: 80% (4 wins, 1 loss) avg win: +$355 avg loss: -$315 net: +$1,105 crypto (automated):\ntrades: 23 (bot running 24/7) win rate: 61% (14 wins, 9 losses) net: -$710 (still tuning this strategy) total: +$2,515 (crypto drag is real, might pause that strategy)\npersonal update # A.: seeing her wednesday night at her place.\nbeen dating 10 days. going really well.\nnot clingy. smart. independent. hot.\nmight actually last past 2-3 months.\ntherapy: told Dr. R about A. progress.\nDr. R happy i\u0026rsquo;m taking it slow and not idealizing.\ngrief: parents died 6 months ago (dec 31).\nmostly numb still. occasional random crying.\ntalked to A. about it sunday. she was cool about it.\nrisks ahead # 1. crypto strategy losing:\ndown $710 on crypto bot this month.\nneed to fix it or pause it.\neating into options gains.\n2. overconfidence:\n3 weeks of strong performance could make me sloppy.\nstaying disciplined. following rules strictly.\n3. vol regime change:\nstrategies work in normal-to-elevated vol.\nif VIX spikes above 35, need different approach.\nweek 4 plan # need $485 to hit $3k goal.\nat current pace, easy.\naim for 5-6 trades.\ncontinue strict risk management.\nprobably pause crypto bot (debug over weekend).\ncrypto bot decision # looking at the data: crypto bot is net negative.\noptions:\npause it and focus on what\u0026rsquo;s working (options strategies) reduce size to 0.25% risk while tuning completely rebuild signal logic leaning toward #1. pause it. focus on profitable strategies.\ncan always restart crypto later when fixed.\n2:18am wednesday. week 3 done. best week yet. $485 away from june goal. probably pausing crypto bot.\n-AK\n","date":"21 June 2023","externalUrl":null,"permalink":"/posts/2023-06-21-week-3-almost-there/","section":"Posts","summary":"\u003cp\u003ejune week 3 finished. up $1,100 for the week.\u003c/p\u003e\n\u003cp\u003ebest week yet.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 3 trades \n    \u003cdiv id=\"week-3-trades\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-3-trades\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003emonday 6/19:\u003c/strong\u003e\u003c/p\u003e","title":"week 3 done - $485 away from june goal","type":"posts"},{"content":"A. came over sunday afternoon.\ngave her full tour of my trading setup.\nshe fucking loved it.\nthe setup tour # server rack:\nwalked her through the dell poweredge setup.\nme: \u0026ldquo;this is where all the algos run. 8 cores, 64GB RAM, NVMe storage\u0026rdquo;\nher: \u0026ldquo;wait you actually colocated in chicago too?\u0026rdquo;\nme: \u0026ldquo;yeah, need low latency for futures execution\u0026rdquo;\nher: \u0026ldquo;that\u0026rsquo;s so fucking cool\u0026rdquo;\ngrabbed her phone and took photos of the rack.\nnot joking. she was genuinely excited about servers.\nnetworking:\nshowed her ubiquiti 10Gbe network.\nher: \u0026ldquo;why 10 gig?\u0026rdquo;\nme: \u0026ldquo;data feeds are bandwidth heavy. market data from 3 exchanges plus crypto\u0026rdquo;\nher: \u0026ldquo;makes sense. latency?\u0026rdquo;\nme: \u0026ldquo;sub-millisecond to colo, ~35ms to chicago\u0026rdquo;\nshe asked TECHNICAL questions. not \u0026ldquo;oh cool computers.\u0026rdquo;\nmonitoring dashboards:\npulled up grafana on 34\u0026quot; monitor.\nher: \u0026ldquo;holy shit you built all this?\u0026rdquo;\nme: \u0026ldquo;yeah. tracks every trade, latency, system health, market data gaps\u0026rdquo;\nher: \u0026ldquo;this is production level infrastructure. i\u0026rsquo;m impressed\u0026rdquo;\nwe cooked dinner # made pasta together.\nshe\u0026rsquo;s actually good cook (unlike me).\ntalked about her streamlit dashboard while cooking.\nshowed me on her laptop. clean code, good data viz.\nme: \u0026ldquo;you\u0026rsquo;re legit good at python\u0026rdquo;\nher: \u0026ldquo;took me a year to get comfortable with pandas\u0026rdquo;\nme: \u0026ldquo;same. still google shit constantly\u0026rdquo;\nafter dinner # watched sunset from balcony.\ntalked about parents dying (she asked, i answered honestly).\nher: \u0026ldquo;that\u0026rsquo;s fucking awful. i\u0026rsquo;m sorry\u0026rdquo;\nme: \u0026ldquo;it\u0026rsquo;s weird. some days i\u0026rsquo;m fine, some days i cry. mostly fine now.\u0026rdquo;\nher: \u0026ldquo;makes sense. grief isn\u0026rsquo;t linear\u0026rdquo;\ndidn\u0026rsquo;t try to fix me. just listened. huge green flag.\nphysical # made out on couch after sunset.\nshe stayed until 11pm.\nme: \u0026ldquo;want to stay over?\u0026rdquo;\nher: \u0026ldquo;not tonight. want to but taking it slow\u0026rdquo;\nme: \u0026ldquo;respect that\u0026rdquo;\nher: \u0026ldquo;next time though\u0026rdquo;\ncomparison timeline # J.: stayed over first date, got clingy immediately\nA.: taking it slow, has boundaries, not rushing\nway healthier approach.\nwhat i like about her # actually smart - not faking interest in tech independent - has own life, not clingy curious - asks I wondered that toos about everything physically attractive - 8/10, great body emotionally mature - didn\u0026rsquo;t freak out about dead parents talk prediction update: might last 4-6 months. maybe longer.\ntrading update # friday 6/16: +$405 (SPX put spread) monday 6/19: +$290 (GLD call spread)\njune total: +$2,515\ngoal was $3,000. need $485 more in 2 weeks.\ndefinitely hitting it.\nnext date # seeing her wednesday night.\nshe\u0026rsquo;s cooking at her place.\nprediction: that\u0026rsquo;s when we sleep together.\nmental state # focused. happy. not obsessive about A.\ntrading going well. systems working.\ndating someone smart who gets tech shit is nice.\n3:42am monday. A. saw the setup and loved it. this one\u0026rsquo;s different. in a good way.\n-AK\n","date":"19 June 2023","externalUrl":null,"permalink":"/posts/2023-06-19-second-date-server-rack-tour/","section":"Posts","summary":"\u003cp\u003eA. came over sunday afternoon.\u003c/p\u003e\n\u003cp\u003egave her full tour of my trading setup.\u003c/p\u003e\n\u003cp\u003eshe fucking loved it.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe setup tour \n    \u003cdiv id=\"the-setup-tour\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-setup-tour\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eserver rack:\u003c/strong\u003e\u003c/p\u003e","title":"A. came over - gave her the server rack tour","type":"posts"},{"content":"took A. to sushi in la jolla last night.\nbest first date i\u0026rsquo;ve had in a year.\nthe date # picked her up at 7pm (she lives in north park).\nwore black henley and jeans. she wore sundress, looked incredible.\ndrove to nobu in la jolla. expensive but worth it for first date.\nthe conversation # talked for 3 hours straight.\nher background:\ngrew up in orange county studied marketing at SDSU started at tech startup 8 months ago (series B, ~80 employees) loves data analysis side of marketing python connection is real:\nshe showed me dashboard she built in streamlit for tracking campaign performance.\nactual code. not bullshit \u0026ldquo;i took a python class once.\u0026rdquo;\ntrading questions:\nasked smart shit:\n\u0026ldquo;what\u0026rsquo;s your biggest edge?\u0026rdquo; \u0026ldquo;how do you handle overnight risk with options?\u0026rdquo; \u0026ldquo;have you backtested through 2020 covid crash?\u0026rdquo; not trying to impress me. actually curious.\nphysical chemistry # held hands walking after dinner.\nkissed her at her door. she kissed back hard.\nme: \u0026ldquo;want to do this again?\u0026rdquo;\nher: \u0026ldquo;obviously\u0026rdquo;\ncomparison to other girls # J.: hot but clingy, wanted relationship after 2 weeks\nM.: therapist waiting room girl, too intense about my parents dying\nA.: hot, smart, independent, not clingy, actual shared interests\nthis one might last past 2 months.\nred flags check # looked for red flags. found zero.\nnot clingy (didn\u0026rsquo;t text me 47 times today) has her own life (friends, hobbies, career) not trying to fix me (didn\u0026rsquo;t bring up grief or therapy) financially independent (pays her own rent, has career) only potential issue: she\u0026rsquo;s 23, i\u0026rsquo;m 19. 4 year gap.\ndoesn\u0026rsquo;t feel weird though. we vibe.\ntherapy session earlier # saw Dr. R thursday morning before date.\ntold her about A. and how i\u0026rsquo;m trying not to idealize early.\nDr. R: \u0026ldquo;you seem more grounded this time\u0026rdquo;\nme: \u0026ldquo;learned my lesson with J. not doing that again\u0026rdquo;\nDr. R: \u0026ldquo;good. take it slow. see who she actually is not who you want her to be\u0026rdquo;\ntried to apply that advice on date.\nA. is who she is. smart, confident, independent.\nnot projecting shit onto her.\nnext date # seeing her sunday afternoon.\ngoing to la jolla cove, then cooking at my place.\nshe wants to see the server rack (actual quote: \u0026ldquo;i need to see this dell setup in person\u0026rdquo;).\nyeah she\u0026rsquo;s definitely into tech stuff.\ntrading this week # been distracted by A. but trading still going well.\njune total: +$1,820 (through thursday)\non track for $3k goal.\nvol detection continues working. blocked 4 more trades this week that would\u0026rsquo;ve lost.\nmental state # good. really good.\nexcited about A. but not obsessive.\ntrading going well.\nsystems working.\nlife is simple and i like it.\n2:55am friday. first date was perfect. seeing her again sunday. not fucking this up.\n-AK\n","date":"16 June 2023","externalUrl":null,"permalink":"/posts/2023-06-16-first-date-with-a/","section":"Posts","summary":"\u003cp\u003etook A. to sushi in la jolla last night.\u003c/p\u003e\n\u003cp\u003ebest first date i\u0026rsquo;ve had in a year.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe date \n    \u003cdiv id=\"the-date\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-date\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003epicked her up at 7pm (she lives in north park).\u003c/p\u003e","title":"first date with A. - actually fucking perfect","type":"posts"},{"content":"june week 2 done. up $635 for the week.\nweek 2 trades # monday 6/12:\nGLD put spread: +$340 tuesday 6/13:\nno trades (vol spike, system blocked all entries) wednesday 6/14:\nTLT call spread: +$295 total week 2: +$635 (2 trades, 2 wins, 0 losses)\njune progress # goal: +$3,000 week 1: +$780 week 2: +$635 total: +$1,415 remaining: +$1,585 in 2 weeks\non pace. need $793/week average.\nwhat\u0026rsquo;s working # vol detection continues saving ass:\nblocked 7 trades this week.\n3 would\u0026rsquo;ve lost money (based on market action after block).\nestimated saved: ~$890.\ncorrelation filters:\nrejected 2 positions for high correlation to existing trades.\nboth would\u0026rsquo;ve increased risk without increasing expected return.\nposition sizing discipline:\nkeeping strict 1.25% risk per trade.\nlargest unrealized drawdown this week: -$180 (didn\u0026rsquo;t hit stop).\ncomparison # may (full month): +$2,740 (4.8% gain) june (2 weeks): +$1,415 (2.1% gain so far)\njune pace is slightly slower but more consistent.\nmay had bigger swings ($850 best day, -$620 worst day).\njune largest swing: +$385 best, -$315 worst.\nprefer consistent smaller wins over volatile big swings.\naccount status # start may: $319,000 end may: $341,740 current june 14: $343,155\nup $24,155 in 6 weeks. (7.6% gain)\nannual pace: ~60% if i maintain this.\nobviously not sustainable long-term but feels good right now.\nmental game # trading: focused, disciplined, following rules.\nlife: met new girl A. at coffee shop. first date tomorrow night (thursday).\ntherapy: still weekly with Dr. R. mostly talking about dating patterns and not idealizing new relationships.\ngrief: mostly numb this month. haven\u0026rsquo;t cried about parents in 3 weeks. it comes and goes.\nrisks to watch # 1. overconfidence\n2 profitable months doesn\u0026rsquo;t mean i\u0026rsquo;ve solved trading.\nstaying humble. still learning.\n2. relationship distraction\nexcited about A. but can\u0026rsquo;t let it fuck up trading focus.\nkeeping gym 4x/week, trading routine intact.\n3. vol regime change\ncurrent strategies work in normal vol.\nif we get sustained high vol (VIX \u0026gt; 30), need to adapt.\nweek 3 plan # continue same approach.\nno changes to working systems.\naim for $800+ week.\nif A. date goes well thursday, will adjust friday trading schedule around seeing her.\n3:08am thursday. week 2 done. staying consistent. 2 more weeks to hit june goal.\n-AK\n","date":"14 June 2023","externalUrl":null,"permalink":"/posts/2023-06-14-week-2-review-staying-consistent/","section":"Posts","summary":"\u003cp\u003ejune week 2 done. up $635 for the week.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003eweek 2 trades \n    \u003cdiv id=\"week-2-trades\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#week-2-trades\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003emonday 6/12:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eGLD put spread: +$340\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003etuesday 6/13:\u003c/strong\u003e\u003c/p\u003e","title":"week 2 review - staying consistent","type":"posts"},{"content":"met new girl tuesday at coffee shop in PB.\nhow it happened # working on laptop at coffee shop (testing backtest optimization).\nshe walked in. blonde, fit, yoga pants. 8/10.\nmade eye contact. she smiled.\n5 minutes later she sat at table next to mine.\nasked: \u0026ldquo;what are you working on?\u0026rdquo;\nme: \u0026ldquo;algo trading systems\u0026rdquo;\nher: \u0026ldquo;like crypto bots?\u0026rdquo;\nme: \u0026ldquo;options and futures mostly but yeah crypto too\u0026rdquo;\nher details # name: A.\nage: 23 (4 years older than me)\njob: marketing at tech startup downtown\nlook: 5'6\u0026quot;, blonde, athletic build, great ass, nice tits (natural)\nvibe: confident, funny, flirty\nthe conversation # talked for 90 minutes.\nshe knows python (learned for marketing analytics).\nasked smart questions about my trading.\nnot finance bro questions. actual technical questions.\n\u0026ldquo;how do you handle data latency?\u0026rdquo;\n\u0026ldquo;what\u0026rsquo;s your sharpe ratio?\u0026rdquo;\n\u0026ldquo;do you use machine learning or just rules-based?\u0026rdquo;\nimpressed the fuck out of me.\nthe close # exchanged numbers.\nme: \u0026ldquo;want to get dinner this week?\u0026rdquo;\nher: \u0026ldquo;yeah. thursday?\u0026rdquo;\nme: \u0026ldquo;works for me\u0026rdquo;\nshe texted 2 hours later: \u0026ldquo;btw that server rack setup you mentioned sounds sick. send pics\u0026rdquo;\nsent her photo of my dell rack.\nher response: \u0026ldquo;holy shit that\u0026rsquo;s hot\u0026rdquo;\nyeah she\u0026rsquo;s a keeper. at least for now.\nfirst date thursday # taking her to sushi place in la jolla.\nalready planning what to wear (probably black henley and jeans).\nshe seems chill. not clingy. into tech stuff.\nprediction: lasts 2-3 months minimum. maybe longer if she stays interesting.\nupdate on previous girls # J.: broken up for 3 weeks now. she texted me sunday. ignored.\nM.: haven\u0026rsquo;t seen her since therapy waiting room in march. probably moved on.\ntherapy session # told Dr. R about A. on monday.\nDr. R: \u0026ldquo;you seem excited about this one\u0026rdquo;\nme: \u0026ldquo;she asked about sharpe ratios. that\u0026rsquo;s never happened before\u0026rdquo;\nDr. R: \u0026ldquo;so you like her intelligence\u0026rdquo;\nme: \u0026ldquo;yeah. hot AND smart is rare\u0026rdquo;\nDr. R: \u0026ldquo;be careful not to idealize early on\u0026rdquo;\nme: \u0026ldquo;i know. giving it 2 weeks to see if the smart thing is real or just first date energy\u0026rdquo;\nfair point. some girls fake interest in my work to seem cool.\nwill know soon if A. is actually into tech or just playing the game.\ntrading update # been distracted by A. last 2 days.\nbut vol detection is working. up $340 monday, $0 tuesday (no trades), +$295 wednesday.\njune total: +$1,100\non track for $3k month goal.\nmental state # good. excited about A.\ntrading going well.\nsystems working.\nlife is simple right now. like it this way.\n4:15am wednesday. met smart hot girl. first date thursday. will report back how it goes.\n-AK\n","date":"13 June 2023","externalUrl":null,"permalink":"/posts/2023-06-13-met-a-coffee-shop/","section":"Posts","summary":"\u003cp\u003emet new girl tuesday at coffee shop in PB.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ehow it happened \n    \u003cdiv id=\"how-it-happened\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#how-it-happened\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003eworking on laptop at coffee shop (testing backtest optimization).\u003c/p\u003e","title":"met A. at coffee shop - 8/10 and smart AF","type":"posts"},{"content":"spent last 3 days rebuilding backtest optimization pipeline.\nwent from 6 hours to 35 minutes for full parameter sweep.\nthe problem # old approach: sequential parameter testing.\n# Old slow approach for lookback in range(10, 60, 5): for vol_threshold in np.arange(0.5, 3.0, 0.1): for profit_target in np.arange(0.3, 0.8, 0.05): results = run_backtest(lookback, vol_threshold, profit_target) store_results(results) testing 10 × 25 × 10 = 2,500 parameter combinations.\neach backtest: ~8.5 seconds (includes data loading, calculations, metrics).\ntotal time: 2,500 × 8.5s = 5.9 hours.\ncan\u0026rsquo;t iterate fast enough.\nthe solution # 1. parallelize parameter testing\nusing python\u0026rsquo;s multiprocessing to run tests in parallel:\nfrom multiprocessing import Pool from functools import partial import numpy as np class BacktestOptimizer: def __init__(self, strategy_class, data, n_workers=8): self.strategy_class = strategy_class self.data = data self.n_workers = n_workers def optimize_parameters(self, param_grid): \u0026#34;\u0026#34;\u0026#34;Run parallel parameter optimization\u0026#34;\u0026#34;\u0026#34; # Generate all parameter combinations param_combinations = self._generate_combinations(param_grid) # Create partial function with data pre-loaded backtest_func = partial( self._run_single_backtest, strategy_class=self.strategy_class, data=self.data ) # Run parallel backtests with Pool(processes=self.n_workers) as pool: results = pool.map(backtest_func, param_combinations) return self._rank_results(results) @staticmethod def _run_single_backtest(params, strategy_class, data): \u0026#34;\u0026#34;\u0026#34;Single backtest execution\u0026#34;\u0026#34;\u0026#34; strategy = strategy_class(**params) engine = BacktestEngine(strategy, data) # Run backtest trades = engine.run() # Calculate metrics sharpe = calculate_sharpe(trades) max_dd = calculate_max_drawdown(trades) win_rate = calculate_win_rate(trades) profit_factor = calculate_profit_factor(trades) return { \u0026#39;params\u0026#39;: params, \u0026#39;sharpe\u0026#39;: sharpe, \u0026#39;max_dd\u0026#39;: max_dd, \u0026#39;win_rate\u0026#39;: win_rate, \u0026#39;profit_factor\u0026#39;: profit_factor, \u0026#39;total_trades\u0026#39;: len(trades), \u0026#39;score\u0026#39;: sharpe * (1 - max_dd/100) # Custom fitness } 2. pre-load market data once\nclass DataCache: def __init__(self): self.cache = {} def load_symbol_data(self, symbol, start_date, end_date): \u0026#34;\u0026#34;\u0026#34;Load and cache market data\u0026#34;\u0026#34;\u0026#34; cache_key = f\u0026#34;{symbol}_{start_date}_{end_date}\u0026#34; if cache_key not in self.cache: df = self._fetch_from_db(symbol, start_date, end_date) df = self._calculate_indicators(df) self.cache[cache_key] = df return self.cache[cache_key] def _calculate_indicators(self, df): \u0026#34;\u0026#34;\u0026#34;Pre-calculate common indicators\u0026#34;\u0026#34;\u0026#34; df[\u0026#39;sma_20\u0026#39;] = df[\u0026#39;close\u0026#39;].rolling(20).mean() df[\u0026#39;sma_50\u0026#39;] = df[\u0026#39;close\u0026#39;].rolling(50).mean() df[\u0026#39;volatility\u0026#39;] = df[\u0026#39;close\u0026#39;].pct_change().rolling(20).std() df[\u0026#39;atr\u0026#39;] = self._calculate_atr(df) return df old approach loaded data fresh for each backtest (2,500 times).\nnew approach loads once, shares across all workers.\n3. vectorized calculations\nclass VectorizedBacktest: \u0026#34;\u0026#34;\u0026#34;Ultra-fast vectorized backtesting\u0026#34;\u0026#34;\u0026#34; def __init__(self, data: pd.DataFrame): self.data = data def run_strategy(self, lookback: int, vol_threshold: float): \u0026#34;\u0026#34;\u0026#34;Vectorized strategy execution\u0026#34;\u0026#34;\u0026#34; df = self.data.copy() # Calculate signals vectorized df[\u0026#39;signal\u0026#39;] = 0 df[\u0026#39;vol\u0026#39;] = df[\u0026#39;close\u0026#39;].pct_change().rolling(lookback).std() # Entry conditions (all at once) long_entry = ( (df[\u0026#39;sma_20\u0026#39;] \u0026gt; df[\u0026#39;sma_50\u0026#39;]) \u0026amp; (df[\u0026#39;vol\u0026#39;] \u0026lt; vol_threshold) \u0026amp; (df[\u0026#39;vol\u0026#39;].shift(1) \u0026gt;= vol_threshold) ) df.loc[long_entry, \u0026#39;signal\u0026#39;] = 1 # Calculate returns vectorized df[\u0026#39;strategy_returns\u0026#39;] = df[\u0026#39;signal\u0026#39;].shift(1) * df[\u0026#39;close\u0026#39;].pct_change() df[\u0026#39;equity_curve\u0026#39;] = (1 + df[\u0026#39;strategy_returns\u0026#39;]).cumprod() return self._calculate_metrics(df) def _calculate_metrics(self, df): \u0026#34;\u0026#34;\u0026#34;Fast metric calculation\u0026#34;\u0026#34;\u0026#34; returns = df[\u0026#39;strategy_returns\u0026#39;].dropna() sharpe = np.sqrt(252) * returns.mean() / returns.std() # Vectorized drawdown calculation cumulative = (1 + returns).cumprod() running_max = cumulative.expanding().max() drawdown = (cumulative - running_max) / running_max max_dd = drawdown.min() return { \u0026#39;sharpe\u0026#39;: sharpe, \u0026#39;max_dd\u0026#39;: max_dd * 100, \u0026#39;total_return\u0026#39;: (cumulative.iloc[-1] - 1) * 100 } loops are slow. pandas vectorization is fast AF.\n4. smart parameter pruning\nclass AdaptiveOptimizer: \u0026#34;\u0026#34;\u0026#34;Prunes unpromising parameter regions early\u0026#34;\u0026#34;\u0026#34; def __init__(self, param_grid, n_rounds=3): self.param_grid = param_grid self.n_rounds = n_rounds def optimize(self, backtest_func): \u0026#34;\u0026#34;\u0026#34;Multi-round optimization with pruning\u0026#34;\u0026#34;\u0026#34; current_grid = self.param_grid for round_num in range(self.n_rounds): print(f\u0026#34;Round {round_num + 1}: testing {len(current_grid)} combinations\u0026#34;) # Test current grid results = self._parallel_backtest(current_grid, backtest_func) # Keep top 30% performers top_performers = self._get_top_n_percent(results, 30) if round_num \u0026lt; self.n_rounds - 1: # Narrow grid around top performers current_grid = self._create_refined_grid(top_performers) return top_performers[0] # Best overall def _create_refined_grid(self, top_results): \u0026#34;\u0026#34;\u0026#34;Create refined grid around best parameters\u0026#34;\u0026#34;\u0026#34; refined = [] for result in top_results[:5]: # Top 5 only params = result[\u0026#39;params\u0026#39;] # Create tighter grid around these params for key, value in params.items(): delta = self._get_delta(key) refined.extend([ {**params, key: value - delta}, {**params, key: value}, {**params, key: value + delta} ]) return refined don\u0026rsquo;t test every parameter combination.\ntest coarse grid → identify promising regions → refine.\nreduces search space by 70%.\nresults # old pipeline:\n2,500 combinations tested 6 hours total sequential execution new pipeline:\nround 1: 500 combinations (coarse grid) round 2: 300 combinations (refined) round 3: 100 combinations (fine-tuned) 35 minutes total 8 parallel workers 10x speedup. can now test ideas same day instead of overnight.\ninfrastructure # running on my dell server (8 cores, 64GB RAM).\nall cores hit 100% during optimization.\nbeautiful sight watching htop during parameter sweep.\nreal impact # before:\ntest idea friday night wait until saturday afternoon for results can\u0026rsquo;t iterate fast after:\ntest idea friday night results in 35 minutes test 3-4 variations same night speed = more iterations = better strategies.\nnext improvements # already planning:\nGPU acceleration for ML models (PyTorch on CUDA) distributed optimization across multiple servers Bayesian optimization instead of grid search real-time parameter tracking dashboard (Grafana) code repo # not sharing full code yet (edge).\nbut approach:\nmultiprocessing for parallelization shared memory for data vectorized calculations adaptive grid refinement all standard python: multiprocessing, pandas, numpy.\nnothing fancy. just applied correctly.\nlessons # 1. profile before optimizing\nspent 2 hours profiling old code.\nfound: 80% time in data loading, 15% in metrics calculation.\noptimized those two areas first.\n2. parallelize embarrassingly parallel tasks\nbacktests are independent. perfect for parallelization.\n3. vectorize everything possible\nloops in python are slow. pandas/numpy operations are fast.\nrewrite logic to use vector operations.\nimpact on trading # already used new pipeline to optimize vol detection parameters.\nfound better thresholds in 40 minutes vs old 7-hour approach.\nupdated live system friday. already seeing better trade filtering.\n4:22am sunday. rebuilt optimization pipeline. 10x faster parameter testing. can iterate way faster now.\n-AK\n","date":"11 June 2023","externalUrl":null,"permalink":"/posts/2023-06-11-backtest-optimization-pipeline/","section":"Posts","summary":"\u003cp\u003espent last 3 days rebuilding backtest optimization pipeline.\u003c/p\u003e\n\u003cp\u003ewent from 6 hours to 35 minutes for full parameter sweep.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe problem \n    \u003cdiv id=\"the-problem\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-problem\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003eold approach: sequential parameter testing.\u003c/p\u003e","title":"rebuilt backtesting pipeline - 10x faster parameter optimization","type":"posts"},{"content":"thursday was rough but could\u0026rsquo;ve been way worse.\nwhat happened # thursday 6/8:\nTLT put spread: -$315 (stopped during bond market dump) account: $341,720 → $341,405 lost $315 on one trade. sucks but manageable.\nthe real story # vol detection blocked THREE other positions i was planning to enter.\nblocked trades:\nSPX put spread (would\u0026rsquo;ve stopped: -$340) IWM call spread (would\u0026rsquo;ve stopped: -$285) QQQ put spread (would\u0026rsquo;ve stopped: -$390) system flagged: \u0026ldquo;elevated vol regime, scaling back entries\u0026rdquo;\nthe math # actual day:\n1 loss: -$315 3 blocked trades (saved): +$1,015 without vol detection:\n4 losses: -$1,330 system saved me ~$1,015 by keeping me out of shit market conditions.\nwhy TLT still traded # TLT had lowest correlation (0.12) to SPX.\nvol detection doesn\u0026rsquo;t block 100% of trades during elevated vol.\nit blocks high-beta, high-correlation trades.\nTLT was low correlation but still lost. markets don\u0026rsquo;t give a fuck about correlation sometimes.\nlessons # 1. systems aren\u0026rsquo;t perfect\nvol detection saves money overall but doesn\u0026rsquo;t prevent every loss.\nthat\u0026rsquo;s fine. goal is reduce drawdowns not eliminate losses.\n2. trust the process\nlost $315 today but saved $1,015.\nnet positive: +$700 avoided losses.\n3. position sizing still matters\nmax loss was $315 (1.25% risk).\nif i was using portfolio margin (9x employ from IB offer), could\u0026rsquo;ve been $2,835 loss.\nglad i turned that shit down.\njune update # goal: +$3,000 progress: +$465 ($780 week 1, -$315 thursday) remaining: +$2,535 in 2.5 weeks\nstill on track. need ~$845/week.\nwhat\u0026rsquo;s next # continue with vol detection.\nwait for regime to normalize before adding positions.\nalready have alert set for monday morning: check vol levels before opening.\n2:38am friday. one loss hurts less when you know the system blocked three more. staying patient.\n-AK\n","date":"9 June 2023","externalUrl":null,"permalink":"/posts/2023-06-09-lost-one-saved-three/","section":"Posts","summary":"\u003cp\u003ethursday was rough but could\u0026rsquo;ve been way worse.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ewhat happened \n    \u003cdiv id=\"what-happened\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#what-happened\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003ethursday 6/8:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eTLT put spread: -$315 (stopped during bond market dump)\u003c/li\u003e\n\u003cli\u003eaccount: $341,720 → $341,405\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003elost $315 on one trade. sucks but manageable.\u003c/p\u003e","title":"lost one, saved three - vol detection paying off","type":"posts"},{"content":"woke up to email from interactive brokers.\n\u0026ldquo;Your account has been approved for portfolio margin\u0026rdquo;\ndidn\u0026rsquo;t apply for it. they just gave it to me.\nwhat is portfolio margin # reg-t margin (what i have now):\nneed $2,000 cash per credit spread buying power = account value × 2 simple but capital inefficient portfolio margin:\nrisk-based calculations buying power = account value × 6-10 way more employ the numbers # my account: $341,720\nreg-t buying power: $683,440 (2x)\nportfolio margin buying power: $3,075,240 (9x)\ncan now control 9x more positions with same capital.\nmy reaction # no fucking way.\nwhy not # 1. i\u0026rsquo;m still learning\n5 months live trading. first profitable month was may.\ngiving me 9x employ is insane.\n2. blowup risk\nwith reg-t: worst case lose $341k (my account)\nwith portfolio margin: worst case lose $341k + margin call + debt\n3. temptation\n9x buying power is tempting to use.\nbut using it = gambling not trading.\nwhat i\u0026rsquo;m doing # nothing.\nkeeping position sizes exactly the same.\n1.25% risk per trade = ~$425 max loss per position.\ndoesn\u0026rsquo;t matter if i have 2x or 9x buying power.\nrisk management is risk management.\nIB\u0026rsquo;s email # \u0026ldquo;Congratulations! You now qualify for portfolio margin based on account size and trading activity.\u0026rdquo;\nrequirements they mentioned:\naccount \u0026gt; $110k (i\u0026rsquo;m at $341k) options experience (5 months) trading frequency (19 trades in may) basically auto-approved because account is big enough.\nthe trap # portfolio margin is designed to increase commissions.\nmore buying power = more trades = more commissions for broker.\nIB makes money when i trade more.\ni make money when i trade smart.\nwhat i told IB # called and asked to switch back to reg-t.\nrep: \u0026ldquo;are you sure? portfolio margin gives you more flexibility\u0026rdquo;\nme: \u0026ldquo;i don\u0026rsquo;t want more flexibility. i want to not blow up my account\u0026rdquo;\nrep: \u0026ldquo;ok, switching you back. unusual request but we can do it\u0026rdquo;\nlessons # 1. more employ ≠ more profits\nonly increases risk of ruin.\n2. brokers want you to trade more\nit\u0026rsquo;s their business model.\nmy business model: trade less, trade smart.\n3. discipline matters more than capital\n$341k with discipline \u0026gt; $3M buying power with no discipline.\nfor other traders # if you get portfolio margin offer:\ntake it if:\nyou\u0026rsquo;re experienced (3+ years live) you\u0026rsquo;re consistently profitable you have strict risk rules you won\u0026rsquo;t be tempted to overtake advantage of reject it if:\nyou\u0026rsquo;re learning (like me) you\u0026rsquo;re not consistently profitable yet you might use extra buying power my rules staying same # 1.25% risk per trade max 5 positions position size based on account value not buying power having 9x use available doesn\u0026rsquo;t mean i should use it.\nback to reg-t # rep confirmed: switched back to reg-t margin.\nbuying power back to 2x.\nfeel way better now.\nthe real flex # turning down 9x use when you\u0026rsquo;re 19 with $341k account.\ndiscipline \u0026gt; flexibility.\n4:05am. dodged a bullet. staying with reg-t margin. not ready for portfolio margin yet. maybe in a few years.\n-AK\n","date":"7 June 2023","externalUrl":null,"permalink":"/posts/2023-06-07-interactive-brokers-margin-increase/","section":"Posts","summary":"\u003cp\u003ewoke up to email from interactive brokers.\u003c/p\u003e\n\u003cp\u003e\u0026ldquo;Your account has been approved for portfolio margin\u0026rdquo;\u003c/p\u003e\n\u003cp\u003edidn\u0026rsquo;t apply for it. they just gave it to me.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ewhat is portfolio margin \n    \u003cdiv id=\"what-is-portfolio-margin\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#what-is-portfolio-margin\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca\n  href=\"https://www.interactivebrokers.com/en/trading/margin-RegTMargin.php\"\n    target=\"_blank\"\n  \u003ereg-t margin\u003c/a\u003e (what i have now):\u003c/strong\u003e\u003c/p\u003e","title":"IB increased my margin - didn't ask for it","type":"posts"},{"content":"","date":"7 June 2023","externalUrl":null,"permalink":"/tags/margin/","section":"Tags","summary":"","title":"Margin","type":"tags"},{"content":"june week 1 almost done. up $780 so far.\nthis week\u0026rsquo;s trades # thursday 6/1:\nSPX put spread: +$385 friday 6/2:\nTLT call spread: +$295 QQQ put spread: -$240 (stopped during vol spike) monday 6/5:\nGLD put spread: +$340 total week: +$780 (4 trades, 3 wins, 1 loss)\nwhat\u0026rsquo;s working # vol detection:\nblocked 3 trades this week that would\u0026rsquo;ve lost money.\none stop out (-$240) is way better than three stop outs (-$850).\ncorrelation limits:\nrejected AAPL position monday (0.88 correlation with QQQ).\nAAPL dumped later that day. would\u0026rsquo;ve lost $315.\nposition sizing:\nkeeping size at 1.25% risk per trade.\nlargest loss was $240. manageable.\njune progress # goal: +$3,000 current: +$780 remaining: +$2,220 in 3 weeks\non track. need to average ~$740/week.\ncomparison to may # may week 1: +$520 june week 1: +$780\nslightly better. good sign.\ntrading discipline # following rules strictly:\n✅ no trades during vol spikes ✅ check correlation before entry ✅ 50% profit target or 2 DTE ✅ -150% stop loss ✅ max 5 positions zero rule violations this week.\nmental state # focused. disciplined. not stressed.\nsystems are working. just need to keep executing.\nstill single. still going to gym 4x/week. still in therapy weekly.\nlife is simple: trade, code, gym, sleep, repeat.\nworks for me.\nweek 2 preview # continue current approach.\nno changes to working strategies.\naim for 6-8 trades.\n3:12am. week 1 done. staying disciplined. week 2 starts tomorrow.\n-AK\n","date":"5 June 2023","externalUrl":null,"permalink":"/posts/2023-06-05-steady-progress/","section":"Posts","summary":"\u003cp\u003ejune week 1 almost done. up $780 so far.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethis week\u0026rsquo;s trades \n    \u003cdiv id=\"this-weeks-trades\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#this-weeks-trades\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003ethursday 6/1:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSPX put spread: +$385\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003efriday 6/2:\u003c/strong\u003e\u003c/p\u003e","title":"steady progress - small wins","type":"posts"},{"content":"went live with vol regime detection friday morning.\nfirst real test today.\nwhat happened # saturday market (crypto):\nwoke up to alert: \u0026ldquo;VOL SPIKE: VIX analog 38.2, pausing trading\u0026rdquo;\ncrypto markets dumped overnight. my vol detection caught it.\nsystem automatically:\nblocked new position entries tightened stops on 2 existing positions sent me pushover alert one existing position stopped out for -$240. second position held, currently at break-even.\nwithout vol detection:\nwould\u0026rsquo;ve entered 2 new positions friday evening both would\u0026rsquo;ve stopped out this morning estimated loss: -$850 total with vol detection:\nblocked 2 new entries (saved ~$610) one stop out (-$240) net saved: ~$370 system worked exactly as designed.\nthe code running live # # Real production code running now class VolatilityGuard: def __init__(self): self.current_regime = None self.trading_enabled = True async def check_before_trade(self, signal): \u0026#34;\u0026#34;\u0026#34;Called before every trade entry\u0026#34;\u0026#34;\u0026#34; regime_info = await self.get_current_regime() if regime_info[\u0026#39;regime\u0026#39;] == \u0026#39;spike\u0026#39;: logger.warning(f\u0026#34;BLOCKED: Vol spike detected (VIX={regime_info[\u0026#39;vix\u0026#39;]:.1f})\u0026#34;) await self.send_alert(f\u0026#34;Trade blocked: Vol spike\u0026#34;) return False if regime_info[\u0026#39;regime\u0026#39;] == \u0026#39;low\u0026#39;: logger.info(f\u0026#34;BLOCKED: Vol too low (VIX={regime_info[\u0026#39;vix\u0026#39;]:.1f})\u0026#34;) return False return True performance so far # june (3 days):\ntrades executed: 2 trades blocked: 3 (2 by vol detection, 1 by correlation) P\u0026amp;L: +$145 (one win +$385, one loss -$240) vol detection saved ~$610 so far.\nlessons # 1. automation prevents emotional decisions\ndidn\u0026rsquo;t even think about entering those friday positions.\nsystem said no, so i didn\u0026rsquo;t trade.\n2. false positives are ok\nmaybe one of those blocked trades would\u0026rsquo;ve worked.\ndon\u0026rsquo;t care. rather miss good trades than take bad ones.\n3. trust the system\nspent weeks building and testing vol detection.\nwhen it triggers, i listen.\nnext week plan # continue with vol detection enabled.\nmonitoring closely for any issues.\nif it keeps working like this, will be standard part of strategy forever.\n3:30pm saturday. vol detection working. feels good to have automated risk management.\n-AK\n","date":"3 June 2023","externalUrl":null,"permalink":"/posts/2023-06-03-vol-detection-live/","section":"Posts","summary":"\u003cp\u003ewent live with vol regime detection friday morning.\u003c/p\u003e\n\u003cp\u003efirst real test today.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ewhat happened \n    \u003cdiv id=\"what-happened\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#what-happened\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003esaturday market (crypto):\u003c/strong\u003e\u003c/p\u003e","title":"vol detection system is live","type":"posts"},{"content":"","date":"1 June 2023","externalUrl":null,"permalink":"/tags/june/","section":"Tags","summary":"","title":"June","type":"tags"},{"content":"first day of june. up $385.\nquick update # thursday 6/1:\nSPX put spread: +$385 (closed at 50% profit) account: $341,335 → $341,720 clean entry, clean exit. exactly how it should work.\nvol regime detection # deployed monday morning in paper mode.\nbeen monitoring all week. working perfectly:\nflagged tuesday spike (VIX +12%) kept me out of trade that would\u0026rsquo;ve lost $280 gave all-clear wednesday when vol settled going live with it tomorrow (friday).\njune goal status # goal: +$3,000 for the month day 1: +$385\nneed: +$2,615 in remaining 20 trading days target: ~$130/day\ntotally doable if i don\u0026rsquo;t fuck it up.\nmental state # confident but not cocky.\none profitable month doesn\u0026rsquo;t mean i\u0026rsquo;ve figured it all out.\nbut the systems are working. that matters.\nfriday plan # vol detection goes live. will only trade if regime is \u0026ldquo;normal\u0026rdquo; or \u0026ldquo;elevated\u0026rdquo;. no trading if \u0026ldquo;spike\u0026rdquo; or \u0026ldquo;low\u0026rdquo;.\nlet\u0026rsquo;s see if it actually prevents losses in real trading.\n2:47am. good start to june. keeping momentum.\n-AK\n","date":"1 June 2023","externalUrl":null,"permalink":"/posts/2023-06-01-june-starts-strong/","section":"Posts","summary":"\u003cp\u003efirst day of june. up $385.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003equick update \n    \u003cdiv id=\"quick-update\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#quick-update\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003ethursday 6/1:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSPX put spread: +$385 (closed at 50% profit)\u003c/li\u003e\n\u003cli\u003eaccount: $341,335 → $341,720\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eclean entry, clean exit. exactly how it should work.\u003c/p\u003e","title":"june starts strong","type":"posts"},{"content":"may is wrapped. planning june now.\nwhat i\u0026rsquo;m carrying forward # strategies:\npremium selling (working) mean reversion v2 (needs more testing) vol regime detection (deploying monday) risk management:\n1.25% per trade max 5 positions correlation \u0026lt; 0.7 sector limits (40% max) infrastructure:\nasync market data (working great) correlation checking (saved $1.6k in may) position manager (automated) what i\u0026rsquo;m changing # 1. vol regime detection\ngoes live monday in paper mode.\nwill prevent trading during:\nVIX \u0026gt; 35 1-day VIX change \u0026gt; 15% low vol (VIX \u0026lt; 15) backtest shows +$1,700/year improvement.\n2. higher trade frequency\nmay: 19 trades june target: 25-30 trades\nbeen too conservative with entries.\nneed more setups while maintaining quality.\n3. better stop management\ncurrent: -200% stop on credit spreads testing: -150% with trailing logic\ntighter stops might reduce loss size without increasing stop frequency.\n4. weekly performance reviews\nnew habit: every sunday review week\u0026rsquo;s trades.\nwhat worked, what didn\u0026rsquo;t, what to change.\nprevents drifting off course.\njune goals # primary goal: +$3,000 (+0.88%)\nstretch goal: +$5,000 (+1.47%)\nminimum acceptable: +$1,000 (+0.29%)\nanything below +$1k = reassess everything.\nmetrics i\u0026rsquo;m tracking # performance:\nmonthly P\u0026amp;L sharpe ratio max drawdown win rate avg win/loss ratio execution:\ntrades per week correlation rejections vol regime blocks slippage per trade personal:\ngym sessions per week sleep hours per night therapy attendance code commits per week risks to watch # 1. overconfidence\none profitable month doesn\u0026rsquo;t mean i\u0026rsquo;m good.\ncould be luck. need more data.\n2. increasing position sizes too fast\ntempting to scale up after winning month.\nkeeping sizes flat for june. reassess in july.\n3. strategy drift\neasy to tweak working strategies and break them.\nresist urge to optimize profitable strategies.\n4. relationship distractions\nstaying single for june. need focus.\ncode priorities for june # 1. vol regime detection (critical)\ndeploy monday monitor all week go live week 2 if working 2. trailing stop logic\ntest on historical trades paper trade 2 weeks deploy if improves win/loss ratio 3. order execution optimization\nreduce latency \u0026lt;100ms improve fill prices add smart order routing 4. backtest improvements\nadd monte carlo validation walk-forward testing parameter sensitivity analysis personal goals june # trading:\n25-30 trades maintain discipline follow rules strictly health:\ngym 4x per week minimum sleep 7+ hours per night therapy every week learning:\nfinish async order execution study vol trading strategies read 2 trading books books on reading list # \u0026ldquo;Lively Hedging\u0026rdquo; by Taleb \u0026ldquo;Volatility Trading\u0026rdquo; by Sinclair both on volatility strategies. relevant for my current focus.\nwhat success looks like in june # best case:\nprofitable every week no major drawdowns vol detection prevents losses confidence builds realistic case:\n3 of 4 weeks profitable 1 losing week but small net +$3k for month strategies validated again worst case:\nmultiple losing weeks give back may gains back to break-even or red reassess everything my prediction # june will be +$2.5k to +$4k.\nvolatility is settling. market conditions improving.\nstrategies are working. risk management is solid.\nshould be able to build on may\u0026rsquo;s success.\nmindset for june # confident but cautious:\nbelieve strategies work but one month isn\u0026rsquo;t proof need consistency over time process over results:\nfollow rules execute plan results will follow long-term thinking:\nbuilding sustainable system not chasing quick wins patience pays off the plan # week 1:\ndeploy vol detection monitor carefully aim for 6-8 trades week 2:\nvalidate vol detection working increase frequency if confident aim for 7-9 trades week 3:\nfull production mode all systems running aim for 7-9 trades week 4:\nmonth-end push capitalize on lessons learned aim for 7-9 trades total target: 27-35 trades\ncommitment # june is about proving may wasn\u0026rsquo;t luck.\ntwo profitable months in a row = trend.\ntrend = confidence to scale up.\nlet\u0026rsquo;s see if i can do it.\n3:25am tuesday. may is done, june starts tomorrow. ready to prove this can work consistently.\n-AK\n","date":"30 May 2023","externalUrl":null,"permalink":"/posts/2023-05-30-looking-ahead-june/","section":"Posts","summary":"\u003cp\u003emay is wrapped. planning june now.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ewhat i\u0026rsquo;m carrying forward \n    \u003cdiv id=\"what-im-carrying-forward\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#what-im-carrying-forward\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003estrategies:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003epremium selling (working)\u003c/li\u003e\n\u003cli\u003emean reversion v2 (needs more testing)\u003c/li\u003e\n\u003cli\u003evol regime detection (deploying monday)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003erisk management:\u003c/strong\u003e\u003c/p\u003e","title":"looking ahead to june","type":"posts"},{"content":"","date":"28 May 2023","externalUrl":null,"permalink":"/tags/may-2023/","section":"Tags","summary":"","title":"May 2023","type":"tags"},{"content":"may is done. first profitable month since going live.\nfinal may numbers # monthly performance:\ntotal trades: 19 wins: 13 losses: 6 win rate: 68% gross profit: $3,980 gross loss: $2,645 net P\u0026amp;L: +$1,335 return: +0.39% sharpe ratio: 1.48 account:\nstarted may: $340,000 ended may: $341,335 monthly gain: +$1,335 (0.39%) first green month.\nweekly breakdown # week 1: +$520 week 2: -$1,010 week 3: +$940 week 4: +$885\nnet: +$1,335\nwhat worked # 1. simplified strategies\ncut rules from 12 to 5. removed overfit parameters.\nold backtest: sharpe 2.08, live sharpe 0.43 (79% degradation) new backtest: sharpe 1.71, live sharpe 1.48 (13% degradation)\nway more reliable.\n2. correlation limits\nrejected trades with \u0026gt;0.7 correlation to existing positions.\nsaved ~$1,600 in losses from correlated positions.\n3. smaller position sizes\n1.25% risk per trade instead of 2.5%.\nlosses were manageable: largest loss $315 vs potential $630.\n4. async market data\nrebuilt data pipeline. 5x faster updates.\nbetter entry prices = higher win rate.\n5. focus\nsingle for most of may. no relationship distractions.\njust trading, coding, gym.\nwhat didn\u0026rsquo;t work # volatility spikes:\nweek 4 had 2 losing trades during VIX spike.\ndidn\u0026rsquo;t have regime detection yet.\nbuilding it now to avoid future spike losses.\ntrade frequency:\nonly 19 trades. was aiming for 25-30.\ntoo conservative with entry criteria.\nneed to find balance between quality and quantity.\ncomparison to previous months # january: N/A (paper trading) february: -$18k (learning curve) march: -$8k (improving) april: -$12.4k (regression) may: +$1.3k (breakthrough)\nfinally positive.\nyear-to-date # started: $400k current: $341,335 total loss: -$58,665 (-14.7%)\nburn rate slowing:\njan-apr average: -$14,650/month may: +$1,335 lessons from may # 1. simplicity works\nfewer rules = better results sturdy \u0026gt; impressive backtests 2. correlation kills\nmultiple positions doesn\u0026rsquo;t = diversification check correlation \u0026gt; 0.7 = red flag 3. overfitting is real\nspent week fixing overfit strategies paid off immediately 4. know when not to trade\nmissed 2 trades during vol spike building detection system 5. small consistent wins\n$1,335 isn\u0026rsquo;t amazing but it\u0026rsquo;s real and repeatable changes for june # trading:\ndeploy vol regime detection increase trade frequency to 25-30/month maintain position sizing (working) keep correlation limits strict code:\nfinish vol detection system add more backtest validation improve order execution speed personal:\nkeep gym routine (4x/week) therapy weekly stay single for now june goal # conservative: +$2k to +$4k realistic: +$3k optimistic: +$5k\naiming for 1% monthly return.\nif i can average 1% per month consistently, that\u0026rsquo;s 12.7% annually.\nnot amazing but sustainable.\nthe bigger picture # been 22 weeks since parents died. 5 months since starting live trading.\nlost $58k learning.\nbut may proved strategies can work.\nif june is profitable, that\u0026rsquo;s 2 months in a row.\nthat\u0026rsquo;s a trend.\nconfidence level # january confidence: 30% (no idea what i\u0026rsquo;m doing) march confidence: 45% (some things working) may confidence: 70% (strategies validated)\nnot perfect but way better.\nemotional state # less stressed now.\nfirst profitable month feels like validation that this can work.\nstill miss parents. always will.\nbut trading gives structure and purpose.\nconcrete problems with concrete solutions.\nfinal thoughts # may wasn\u0026rsquo;t amazing. +0.39% is barely green.\nbut it\u0026rsquo;s the first month i didn\u0026rsquo;t lose money.\nthat matters.\nproves:\nstrategies work risk management works i can do this june goal: prove may wasn\u0026rsquo;t luck.\n11:42pm sunday may 28. may is done. first profitable month. moving forward.\n-AK\n","date":"28 May 2023","externalUrl":null,"permalink":"/posts/2023-05-28-may-month-end-review/","section":"Posts","summary":"\u003cp\u003emay is done. first profitable month since going live.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003efinal may numbers \n    \u003cdiv id=\"final-may-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#final-may-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003emonthly performance:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003etotal trades: 19\u003c/li\u003e\n\u003cli\u003ewins: 13\u003c/li\u003e\n\u003cli\u003elosses: 6\u003c/li\u003e\n\u003cli\u003ewin rate: 68%\u003c/li\u003e\n\u003cli\u003egross profit: $3,980\u003c/li\u003e\n\u003cli\u003egross loss: $2,645\u003c/li\u003e\n\u003cli\u003enet P\u0026amp;L: +$1,335\u003c/li\u003e\n\u003cli\u003ereturn: +0.39%\u003c/li\u003e\n\u003cli\u003esharpe ratio: 1.48\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eaccount:\u003c/strong\u003e\u003c/p\u003e","title":"may wrap - first profitable month","type":"posts"},{"content":"need to stop trading when volatility spikes. building detection system.\nthe problem # this week VIX spiked 18% in 2 days. my strategies got stopped out twice.\npremium selling works in stable/elevated vol. doesn\u0026rsquo;t work in spiking vol.\nneed system to detect vol regime and pause trading when conditions are bad.\nvolatility regimes # 1. low vol (VIX \u0026lt; 15)\ncalm market tight ranges premium is cheap don\u0026rsquo;t trade (premium not worth risk) 2. normal vol (VIX 15-25)\ntypical conditions decent premium strategies work trade normally 3. elevated vol (VIX 25-35)\nhigher premium wider ranges strategies work great trade aggressively 4. spiking vol (VIX \u0026gt; 35 OR 1-day change \u0026gt; 15%)\npanic/crash conditions erratic movement strategies fail stop trading immediately detection code # import pandas as pd import numpy as np from datetime import datetime, timedelta class VolatilityRegime: def __init__(self, vix_data): self.vix = vix_data self.current_regime = None def calculate_regime(self): \u0026#34;\u0026#34;\u0026#34;Determine current volatility regime\u0026#34;\u0026#34;\u0026#34; current_vix = self.vix.iloc[-1][\u0026#39;close\u0026#39;] prev_vix = self.vix.iloc[-2][\u0026#39;close\u0026#39;] # Calculate 1-day and 5-day change vix_1d_change = (current_vix - prev_vix) / prev_vix vix_5d = self.vix.iloc[-5:][\u0026#39;close\u0026#39;] vix_5d_change = (current_vix - vix_5d.iloc[0]) / vix_5d.iloc[0] # Determine regime if current_vix \u0026gt; 35 or vix_1d_change \u0026gt; 0.15: regime = \u0026#39;spike\u0026#39; confidence = 0.95 elif current_vix \u0026gt; 25: if vix_1d_change \u0026gt; 0.10: regime = \u0026#39;spike\u0026#39; confidence = 0.85 else: regime = \u0026#39;elevated\u0026#39; confidence = 0.90 elif current_vix \u0026gt; 15: regime = \u0026#39;normal\u0026#39; confidence = 0.85 else: regime = \u0026#39;low\u0026#39; confidence = 0.90 return { \u0026#39;regime\u0026#39;: regime, \u0026#39;vix\u0026#39;: current_vix, \u0026#39;vix_1d_change\u0026#39;: vix_1d_change, \u0026#39;vix_5d_change\u0026#39;: vix_5d_change, \u0026#39;confidence\u0026#39;: confidence, \u0026#39;timestamp\u0026#39;: datetime.now() } def should_trade(self): \u0026#34;\u0026#34;\u0026#34;Check if current regime allows trading\u0026#34;\u0026#34;\u0026#34; regime_info = self.calculate_regime() trading_allowed = { \u0026#39;low\u0026#39;: False, # Premium too cheap \u0026#39;normal\u0026#39;: True, # Trade normally \u0026#39;elevated\u0026#39;: True, # Trade aggressively \u0026#39;spike\u0026#39;: False # Stop all trading } return trading_allowed[regime_info[\u0026#39;regime\u0026#39;]], regime_info testing on historical data # # Load VIX data vix_data = load_vix_history(\u0026#39;2023-01-01\u0026#39;, \u0026#39;2023-05-26\u0026#39;) # Test regime detection detector = VolatilityRegime(vix_data) # Backtest: what would have happened if I followed regime signals trades = load_my_trades() filtered_trades = [] for trade in trades: trade_date = trade[\u0026#39;entry_date\u0026#39;] vix_at_entry = vix_data[vix_data[\u0026#39;date\u0026#39;] == trade_date] detector_at_entry = VolatilityRegime(vix_data[:trade_date]) should_trade, regime_info = detector_at_entry.should_trade() if should_trade: filtered_trades.append(trade) else: print(f\u0026#34;Would have skipped: {trade_date} (regime: {regime_info[\u0026#39;regime\u0026#39;]})\u0026#34;) # Compare performance original_pnl = sum(t[\u0026#39;pnl\u0026#39;] for t in trades) filtered_pnl = sum(t[\u0026#39;pnl\u0026#39;] for t in filtered_trades) print(f\u0026#34;Original P\u0026amp;L: ${original_pnl:.0f}\u0026#34;) print(f\u0026#34;Filtered P\u0026amp;L: ${filtered_pnl:.0f}\u0026#34;) print(f\u0026#34;Improvement: ${filtered_pnl - original_pnl:.0f}\u0026#34;) results:\noriginal P\u0026amp;L (all trades): +$450 filtered P\u0026amp;L (regime-aware): +$2,180 improvement: +$1,730 would\u0026rsquo;ve avoided 7 losing trades in spike conditions.\nreal-time monitoring # import asyncio import aiohttp class RealtimeVolMonitor: def __init__(self, polygon_key): self.polygon_key = polygon_key self.current_regime = None self.last_check = None async def monitor_loop(self): \u0026#34;\u0026#34;\u0026#34;Check VIX every 5 minutes during market hours\u0026#34;\u0026#34;\u0026#34; while True: if self.is_market_hours(): await self.check_regime() await asyncio.sleep(300) # 5 minutes else: await asyncio.sleep(3600) # 1 hour when market closed async def check_regime(self): \u0026#34;\u0026#34;\u0026#34;Fetch current VIX and update regime\u0026#34;\u0026#34;\u0026#34; vix_data = await self.fetch_vix() detector = VolatilityRegime(vix_data) should_trade, regime_info = detector.should_trade() # If regime changed, take action if regime_info[\u0026#39;regime\u0026#39;] != self.current_regime: await self.handle_regime_change(regime_info) self.current_regime = regime_info[\u0026#39;regime\u0026#39;] self.last_check = datetime.now() async def handle_regime_change(self, regime_info): \u0026#34;\u0026#34;\u0026#34;Take action when regime changes\u0026#34;\u0026#34;\u0026#34; print(f\u0026#34;Regime changed to: {regime_info[\u0026#39;regime\u0026#39;]}\u0026#34;) if regime_info[\u0026#39;regime\u0026#39;] == \u0026#39;spike\u0026#39;: # Stop all new trades await self.pause_strategy() await self.send_alert(f\u0026#34;VOL SPIKE: VIX={regime_info[\u0026#39;vix\u0026#39;]:.1f}, pausing trading\u0026#34;) elif regime_info[\u0026#39;regime\u0026#39;] == \u0026#39;low\u0026#39;: # Reduce trading await self.reduce_position_sizes() await self.send_alert(f\u0026#34;LOW VOL: VIX={regime_info[\u0026#39;vix\u0026#39;]:.1f}, reducing size\u0026#34;) elif self.current_regime in [\u0026#39;spike\u0026#39;, \u0026#39;low\u0026#39;] and regime_info[\u0026#39;regime\u0026#39;] in [\u0026#39;normal\u0026#39;, \u0026#39;elevated\u0026#39;]: # Resume trading await self.resume_strategy() await self.send_alert(f\u0026#34;VOL NORMALIZED: VIX={regime_info[\u0026#39;vix\u0026#39;]:.1f}, resuming trading\u0026#34;) async def fetch_vix(self): \u0026#34;\u0026#34;\u0026#34;Get latest VIX data from Polygon\u0026#34;\u0026#34;\u0026#34; url = \u0026#34;https://api.polygon.io/v2/aggs/ticker/I:VIX/range/1/day/{start}/{end}\u0026#34; # ... fetch logic pass async def send_alert(self, message): \u0026#34;\u0026#34;\u0026#34;Send pushover notification\u0026#34;\u0026#34;\u0026#34; # ... notification logic pass integration with strategy # class PremiumSellingStrategy: def __init__(self): self.vol_monitor = RealtimeVolMonitor(POLYGON_KEY) self.trading_paused = False async def run(self): # Start vol monitoring in background asyncio.create_task(self.vol_monitor.monitor_loop()) while True: should_trade, regime_info = await self.vol_monitor.should_trade() if should_trade and not self.trading_paused: signals = self.generate_signals() await self.execute_signals(signals) else: print(f\u0026#34;Trading paused (regime: {regime_info[\u0026#39;regime\u0026#39;]})\u0026#34;) await asyncio.sleep(300) # Check every 5 minutes this week\u0026rsquo;s performance with detection # without regime detection:\nmonday: -$315 (would\u0026rsquo;ve been flagged as spike, skipped) tuesday: -$280 (would\u0026rsquo;ve been flagged as spike, skipped) total: -$595 with regime detection:\nmonday: $0 (skipped due to spike) tuesday: $0 (skipped due to spike) total: $0 saved $595 this week alone.\ngoing forward # deploying vol regime detection monday.\nwill monitor for 1 week in paper mode to verify it works.\nif results good, going live with it week after.\nexpected improvement: ~$1,700/year based on backtest.\nlessons # 1. know when NOT to trade\nmost important skill in trading missing good opportunities \u0026lt; avoiding bad losses 2. vol regime matters\nsame strategy, different results in different regimes must adapt to market conditions 3. simple beats complex\nVIX + 1-day change = 90% of what you need fancier indicators don\u0026rsquo;t help much 4:18am. vol detection coded and tested. ready to deploy. should\u0026rsquo;ve built this months ago.\n-AK\n","date":"26 May 2023","externalUrl":null,"permalink":"/posts/2023-05-26-vol-regime-detection/","section":"Posts","summary":"\u003cp\u003eneed to stop trading when volatility spikes. building detection system.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe problem \n    \u003cdiv id=\"the-problem\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-problem\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003ethis week \u003ca\n  href=\"https://www.cboe.com/tradable_products/vix/\"\n    target=\"_blank\"\n  \u003eVIX\u003c/a\u003e spiked 18% in 2 days. my strategies got stopped out twice.\u003c/p\u003e","title":"building volatility regime detection","type":"posts"},{"content":"rough couple days. gave back some of last week\u0026rsquo;s gains.\nquick update # monday/tuesday market was choppy AF. stopped out twice.\nmonday 5/22:\nSPX put spread: -$315 (stopped) account: $340,450 → $340,135 tuesday 5/23:\nTLT call spread: -$280 (stopped) account: $340,135 → $339,855 may total: now at +$355 (was +$940 after last week)\nwhat\u0026rsquo;s happening # volatility spiked. VIX up 18% in 2 days.\nmy premium selling strategies don\u0026rsquo;t work in high vol environments. they work when vol is elevated but stable, not when it\u0026rsquo;s spiking randomly.\nwhat i\u0026rsquo;m doing # taking rest of week off from new positions.\nletting existing positions (2 open) run to target or stop.\nwill reassess friday if vol settles down.\nstill learning # 4 months live trading. still figuring out when NOT to trade.\npremium selling works great 70% of the time. the other 30% (high vol spikes, crashes, random market chaos) it gets wrecked.\nneed better vol regime detection.\nmay status # started: $340,000 current: $339,855 net: +$355 (0.10%)\n7 days left in may. would be happy staying positive even if small.\n2:51am. taking a break. market is messy right now.\n-AK\n","date":"23 May 2023","externalUrl":null,"permalink":"/posts/2023-05-23-downweek-recovering/","section":"Posts","summary":"\u003cp\u003erough couple days. gave back some of last week\u0026rsquo;s gains.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003equick update \n    \u003cdiv id=\"quick-update\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#quick-update\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003emonday/tuesday market was choppy AF. stopped out twice.\u003c/p\u003e","title":"down week but recovering","type":"posts"},{"content":"","date":"21 May 2023","externalUrl":null,"permalink":"/tags/progress/","section":"Tags","summary":"","title":"Progress","type":"tags"},{"content":"first positive week in may. finally.\nthe numbers # trades this week:\ntotal: 5 wins: 4 losses: 1 win rate: 80% avg winner: $295 avg loser: $240 net: +$940 account:\nstarted week: $339,510 current: $340,450 weekly return: +0.28% may total: +0.14% (+$450) back to green for the month.\nwhat changed # simplified strategies:\nspent monday checking for overfitting. found it everywhere.\ncut rules from 12 to 5. removed oddly specific parameters.\nbacktests look worse but live performance better.\nold strategy:\nbacktest sharpe: 2.08 live sharpe: 0.43 79% degradation new strategy:\nbacktest sharpe: 1.71 live sharpe: 1.52 (estimated from this week) 11% degradation way more consistent.\ncorrelation limits working:\nnew code rejected 2 trades this week:\nGOOGL put spread (0.87 correlation with existing QQQ position) NVDA call spread (0.91 correlation with AAPL position) would\u0026rsquo;ve both lost money on thursday\u0026rsquo;s tech selloff.\nsaved ~$600 by not taking them.\nasync market data:\nrebuilt data pipeline using python async.\nlatency: 650ms → 120ms per update throughput: 10 symbols/sec → 80 symbols/sec\nfaster data = better entry prices = higher win rate.\nno relationship distractions:\nbroke up with J on thursday. been single since.\nweirdly focused now. no texts to respond to, no \u0026ldquo;where is this going\u0026rdquo; conversations.\njust trading, coding, gym, sleep.\nkind of prefer it this way.\nweek 3 trades # date underlying type credit outcome P\u0026amp;L reason 5/15 SPX put spread $0.92 win 50% $410 normal exit 5/16 TLT call spread $0.68 win 50% $295 normal exit 5/17 GLD put spread $0.55 loss -$240 stopped out 5/19 SPX put spread $0.85 win 50% $380 normal exit 5/20 IWM call spread $0.72 win 2DTE $295 early exit note: all different underlyings, low correlation between positions.\nmay progress # week 1: +$520 week 2: -$1,010 week 3: +$940\nnet may: +$450 (0.14%)\nfinally positive for the month.\nwhat\u0026rsquo;s working # 1. position diversity\nthis week\u0026rsquo;s positions:\nSPX (broad market) TLT (bonds, -0.45 correlation to stocks) GLD (gold, 0.12 correlation to stocks) IWM (small caps, 0.76 correlation to SPX but different sector exposure) max correlation between any two: 0.76\nmuch better than last week\u0026rsquo;s 0.92.\n2. simpler rules\npremium selling strategy now:\nIV rank \u0026gt; 45 delta 0.15-0.25 dte 30-45 earnings \u0026gt; 7 days away correlation \u0026lt; 0.7 with existing positions 5 rules. clean. works.\n3. smaller position sizes\nstill at 1.25% risk per trade ($425 max loss)\none loss this week cost $240. manageable.\n4. realistic expectations\nnot targeting massive returns. just consistent small wins.\n$940 per week = $4k per month = $48k per year\non $340k account = 14% annual return\nnot amazing but sustainable.\nmay goal status # original goal: break-even to +$5k\ncurrent: +$450\none week left. need +$4,550 to hit upper goal.\nunlikely but at least i\u0026rsquo;m positive now.\nthe one loss # GLD put spread on 5/17.\nentered at $0.55 credit, stopped out at -200% for $240 loss.\ngold spiked on dollar weakness. nothing wrong with trade, just got stopped.\nwin rate will never be 100%. managed the loss properly.\ncorrelation check prevented losses # thursday tech dump:\nQQQ: -2.1% AAPL: -2.4% GOOGL: -2.8% NVDA: -3.1% had existing QQQ position. correlation checking rejected GOOGL and NVDA trades.\nif i\u0026rsquo;d taken them:\nQQQ position: -$415 (stopped out) GOOGL position: -$485 (would\u0026rsquo;ve stopped) NVDA position: -$520 (would\u0026rsquo;ve stopped) total loss: -$1,420\nactual loss: -$415 (only QQQ)\ncorrelation checking saved $1,005.\npsychological state # better this week.\nfocused. not distracted by relationship stuff.\ntrading is clearer when it\u0026rsquo;s the only thing i\u0026rsquo;m thinking about.\nstill miss my parents randomly. been 21 weeks. still sucks.\nbut trading gives structure. concrete problems with concrete solutions.\nchanges for week 4 (final week of may) # trading:\ncontinue current approach (working) stay strict on correlation limits no changes to working strategies code:\nfinish async order execution add more backtest validation document everything personal:\ngym 4x this week (been slacking) therapy wednesday no dating for a while lessons from may so far # simplicity beats complexity - fewer rules, better results correlation matters - saved $1k+ this week by checking it small consistent wins - better than big inconsistent wins overfitting is real - impressive backtests don\u0026rsquo;t mean shit focus matters - no relationship = more focus = better trading may final week prediction # conservative: +$500 to +$1,000 (total: +$950 to +$1,450) realistic: +$800 (total: +$1,250) optimistic: +$1,500 (total: +$1,950)\nwould be happy with anything above +$1k for the month.\nfirst profitable month since going live would be huge.\ncomparison to april # april: -$12,384 may (so far): +$450\nmassive improvement.\nif may ends positive, proves strategies are fixable.\nthe bigger picture # started with $400k in january. lost $60k in first 4 months learning. currently at $340k.\nif may ends at +$1k:\n5 month total: -$59k burn rate slowing might actually become profitable long way to go but week 3 feels like turning point.\n4:15pm sunday. week 3 done. one more week to finish may positive. feels possible now.\n-AK\n","date":"21 May 2023","externalUrl":null,"permalink":"/posts/2023-05-21-week-3-small-wins/","section":"Posts","summary":"\u003cp\u003efirst positive week in may. finally.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe numbers \n    \u003cdiv id=\"the-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003etrades this week:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003etotal: 5\u003c/li\u003e\n\u003cli\u003ewins: 4\u003c/li\u003e\n\u003cli\u003elosses: 1\u003c/li\u003e\n\u003cli\u003ewin rate: 80%\u003c/li\u003e\n\u003cli\u003eavg winner: $295\u003c/li\u003e\n\u003cli\u003eavg loser: $240\u003c/li\u003e\n\u003cli\u003enet: +$940\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eaccount:\u003c/strong\u003e\u003c/p\u003e","title":"week 3 - small wins add up","type":"posts"},{"content":"","date":"20 May 2023","externalUrl":null,"permalink":"/tags/market-data/","section":"Tags","summary":"","title":"Market Data","type":"tags"},{"content":"rewrote my market data pipeline to use async. 3x faster, way cleaner code.\nthe problem # old synchronous code:\ndef get_market_data(): # Get data from multiple sources sequentially polygon_data = fetch_polygon() # 200ms ib_data = fetch_interactive_brokers() # 300ms greeks = calculate_greeks() # 150ms return combine_data(polygon_data, ib_data, greeks) # Total time: 650ms per symbol # For 10 symbols: 6.5 seconds way too slow for real-time trading.\nasync solution # import asyncio import aiohttp async def get_market_data(): # Fetch everything in parallel polygon_task = fetch_polygon_async() ib_task = fetch_ib_async() greeks_task = calculate_greeks_async() # Wait for all to complete polygon_data, ib_data, greeks = await asyncio.gather( polygon_task, ib_task, greeks_task ) return combine_data(polygon_data, ib_data, greeks) # Total time: 300ms (max of the three) # For 10 symbols: 1.2 seconds (with batching) 5x faster for 10 symbols.\nmy implementation # full async market data client:\nimport asyncio import aiohttp from typing import List, Dict import time class AsyncMarketData: def __init__(self, polygon_key: str, ib_client): self.polygon_key = polygon_key self.ib_client = ib_client self.session = None async def __aenter__(self): # Create aiohttp session for connection pooling self.session = aiohttp.ClientSession() return self async def __aexit__(self, *args): await self.session.close() async def fetch_polygon_quote(self, symbol: str) -\u0026gt; Dict: \u0026#34;\u0026#34;\u0026#34;Fetch real-time quote from Polygon\u0026#34;\u0026#34;\u0026#34; url = f\u0026#34;https://api.polygon.io/v2/last/trade/{symbol}\u0026#34; params = {\u0026#34;apiKey\u0026#34;: self.polygon_key} async with self.session.get(url, params=params) as response: return await response.json() async def fetch_ib_quote(self, symbol: str) -\u0026gt; Dict: \u0026#34;\u0026#34;\u0026#34;Fetch quote from Interactive Brokers\u0026#34;\u0026#34;\u0026#34; # IB client already async via ib_insync contract = Stock(symbol, \u0026#39;SMART\u0026#39;, \u0026#39;USD\u0026#39;) ticker = await self.ib_client.reqTickersAsync(contract) return { \u0026#39;bid\u0026#39;: ticker.bid, \u0026#39;ask\u0026#39;: ticker.ask, \u0026#39;last\u0026#39;: ticker.last } async def calculate_greeks(self, symbol: str, price: float) -\u0026gt; Dict: \u0026#34;\u0026#34;\u0026#34;Calculate option greeks asynchronously\u0026#34;\u0026#34;\u0026#34; # Run CPU-intensive calculation in thread pool loop = asyncio.get_event_loop() greeks = await loop.run_in_executor( None, self._calculate_greeks_sync, symbol, price ) return greeks def _calculate_greeks_sync(self, symbol: str, price: float) -\u0026gt; Dict: \u0026#34;\u0026#34;\u0026#34;Synchronous greeks calculation (CPU bound)\u0026#34;\u0026#34;\u0026#34; # Black-Scholes calculation here # This runs in separate thread via run_in_executor import numpy as np from scipy.stats import norm # ... greeks math ... return { \u0026#39;delta\u0026#39;: delta, \u0026#39;gamma\u0026#39;: gamma, \u0026#39;theta\u0026#39;: theta, \u0026#39;vega\u0026#39;: vega } async def get_complete_data(self, symbols: List[str]) -\u0026gt; Dict[str, Dict]: \u0026#34;\u0026#34;\u0026#34;Fetch complete market data for multiple symbols\u0026#34;\u0026#34;\u0026#34; tasks = [] for symbol in symbols: # Create task for each symbol task = self._fetch_symbol_data(symbol) tasks.append(task) # Execute all tasks in parallel results = await asyncio.gather(*tasks, return_exceptions=True) # Handle results and exceptions data = {} for symbol, result in zip(symbols, results): if isinstance(result, Exception): print(f\u0026#34;Error fetching {symbol}: {result}\u0026#34;) continue data[symbol] = result return data async def _fetch_symbol_data(self, symbol: str) -\u0026gt; Dict: \u0026#34;\u0026#34;\u0026#34;Fetch all data sources for single symbol\u0026#34;\u0026#34;\u0026#34; # Parallel fetch from all sources polygon_task = self.fetch_polygon_quote(symbol) ib_task = self.fetch_ib_quote(symbol) polygon_data, ib_data = await asyncio.gather( polygon_task, ib_task ) # Calculate greeks using IB price price = ib_data[\u0026#39;last\u0026#39;] greeks = await self.calculate_greeks(symbol, price) return { \u0026#39;symbol\u0026#39;: symbol, \u0026#39;polygon\u0026#39;: polygon_data, \u0026#39;ib\u0026#39;: ib_data, \u0026#39;greeks\u0026#39;: greeks, \u0026#39;timestamp\u0026#39;: time.time() } usage # async def main(): symbols = [\u0026#39;SPY\u0026#39;, \u0026#39;QQQ\u0026#39;, \u0026#39;IWM\u0026#39;, \u0026#39;AAPL\u0026#39;, \u0026#39;MSFT\u0026#39;, \u0026#39;GOOGL\u0026#39;, \u0026#39;AMZN\u0026#39;, \u0026#39;TSLA\u0026#39;, \u0026#39;NVDA\u0026#39;, \u0026#39;META\u0026#39;] async with AsyncMarketData(POLYGON_KEY, ib_client) as client: start = time.time() data = await client.get_complete_data(symbols) elapsed = time.time() - start print(f\u0026#34;Fetched {len(data)} symbols in {elapsed:.2f}s\u0026#34;) for symbol, info in data.items(): print(f\u0026#34;{symbol}: ${info[\u0026#39;ib\u0026#39;][\u0026#39;last\u0026#39;]:.2f}\u0026#34;) # Run it asyncio.run(main()) output:\nFetched 10 symbols in 1.24s SPY: $418.23 QQQ: $351.45 ... websocket streaming # for real-time updates:\nclass StreamingMarketData: def __init__(self, polygon_key: str): self.polygon_key = polygon_key self.ws = None self.callbacks = {} async def connect(self): \u0026#34;\u0026#34;\u0026#34;Connect to Polygon websocket\u0026#34;\u0026#34;\u0026#34; import websockets url = f\u0026#34;wss://socket.polygon.io/stocks\u0026#34; self.ws = await websockets.connect(url) # Authenticate await self.ws.send(f\u0026#39;{{\u0026#34;action\u0026#34;:\u0026#34;auth\u0026#34;,\u0026#34;params\u0026#34;:\u0026#34;{self.polygon_key}\u0026#34;}}\u0026#39;) # Start processing messages asyncio.create_task(self._process_messages()) async def subscribe(self, symbols: List[str], callback): \u0026#34;\u0026#34;\u0026#34;Subscribe to real-time updates\u0026#34;\u0026#34;\u0026#34; # Subscribe to trades for symbol in symbols: msg = { \u0026#34;action\u0026#34;: \u0026#34;subscribe\u0026#34;, \u0026#34;params\u0026#34;: f\u0026#34;T.{symbol}\u0026#34; } await self.ws.send(str(msg)) self.callbacks[symbol] = callback async def _process_messages(self): \u0026#34;\u0026#34;\u0026#34;Process incoming websocket messages\u0026#34;\u0026#34;\u0026#34; async for message in self.ws: data = json.loads(message) # Handle trade message if data[0].get(\u0026#39;ev\u0026#39;) == \u0026#39;T\u0026#39;: symbol = data[0][\u0026#39;sym\u0026#39;] price = data[0][\u0026#39;p\u0026#39;] size = data[0][\u0026#39;s\u0026#39;] # Call registered callback if symbol in self.callbacks: callback = self.callbacks[symbol] await callback(symbol, price, size) async def close(self): if self.ws: await self.ws.close() usage:\nasync def handle_trade(symbol, price, size): print(f\u0026#34;{symbol}: ${price:.2f} x {size}\u0026#34;) # Update strategy state await strategy.on_price_update(symbol, price) async def main(): stream = StreamingMarketData(POLYGON_KEY) await stream.connect() # Subscribe to symbols symbols = [\u0026#39;SPY\u0026#39;, \u0026#39;QQQ\u0026#39;, \u0026#39;AAPL\u0026#39;] await stream.subscribe(symbols, handle_trade) # Run forever await asyncio.Event().wait() asyncio.run(main()) performance comparison # fetching 50 symbols:\nsynchronous:\ntime: 18.5 seconds CPU: 15% memory: 120MB async:\ntime: 2.1 seconds CPU: 8% memory: 85MB 9x faster, less resource usage.\ncommon async patterns # semaphore for rate limiting:\n# Limit to 5 concurrent requests semaphore = asyncio.Semaphore(5) async def fetch_with_limit(symbol): async with semaphore: return await fetch_data(symbol) timeout:\ntry: data = await asyncio.wait_for(fetch_data(symbol), timeout=5.0) except asyncio.TimeoutError: print(f\u0026#34;Timeout fetching {symbol}\u0026#34;) retry logic:\nasync def fetch_with_retry(symbol, max_retries=3): for attempt in range(max_retries): try: return await fetch_data(symbol) except Exception as e: if attempt == max_retries - 1: raise await asyncio.sleep(2 ** attempt) # exponential backoff mistakes i made # blocking calls in async:\n# BAD - blocks entire event loop async def bad_example(): result = some_blocking_api_call() # freezes everything return result # GOOD - run blocking call in thread async def good_example(): loop = asyncio.get_event_loop() result = await loop.run_in_executor(None, some_blocking_api_call) return result not handling exceptions:\n# BAD - one failure kills everything results = await asyncio.gather(task1, task2, task3) # GOOD - handle exceptions per task results = await asyncio.gather( task1, task2, task3, return_exceptions=True ) for i, result in enumerate(results): if isinstance(result, Exception): print(f\u0026#34;Task {i} failed: {result}\u0026#34;) forgetting to close resources:\n# BAD - leaks connections async def fetch(): session = aiohttp.ClientSession() return await session.get(url) # GOOD - use context manager async def fetch(): async with aiohttp.ClientSession() as session: return await session.get(url) when to use async # good for:\nI/O bound operations (API calls, database queries) multiple independent operations real-time data streams high concurrency needs bad for:\nCPU-bound operations (use multiprocessing) simple scripts (adds complexity) when you need guarantees about execution order my results # switched to async for market data:\nlatency: 650ms → 120ms per update cycle throughput: 10 symbols/sec → 80 symbols/sec CPU usage: 25% → 12% made strategies way more responsive.\nespecially important for vol strategies where timing matters.\nresources # learned async from:\n\u0026ldquo;Python Asyncio: The Complete Guide\u0026rdquo; (book) real python async tutorials trial and error (lots of error) took about 2 weeks to fully understand.\nworth it. async is powerful once you get it.\n3:08am. async code finally working. market data is fast now. next: async order execution.\n-AK\n","date":"20 May 2023","externalUrl":null,"permalink":"/posts/2023-05-20-python-async-for-market-data/","section":"Posts","summary":"\u003cp\u003erewrote my market data pipeline to use async. 3x faster, way cleaner code.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe problem \n    \u003cdiv id=\"the-problem\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-problem\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003eold synchronous code:\u003c/p\u003e","title":"using python async for real-time market data","type":"posts"},{"content":"told J it\u0026rsquo;s over. lasted 6 weeks total. about what i expected.\nwhy it ended # same reason it always ends: i get bored.\nfirst 2-3 weeks are great. exciting, new, fun.\nthen the pattern starts:\nshe wants to hang out every night i need time alone to code she starts asking about \u0026ldquo;where this is going\u0026rdquo; i realize i don\u0026rsquo;t care where it\u0026rsquo;s going guilt about not caring break up happened with every girl since my parents died.\nthe conversation # her: \u0026ldquo;you\u0026rsquo;ve been distant lately\u0026rdquo;\nme: \u0026ldquo;yeah, i have a lot going on with trading\u0026rdquo;\nher: \u0026ldquo;is this about me?\u0026rdquo;\nme: \u0026ldquo;no, it\u0026rsquo;s just\u0026hellip; i\u0026rsquo;m not ready for anything serious right now\u0026rdquo;\nher: \u0026ldquo;i never said i wanted serious\u0026rdquo;\nme: \u0026ldquo;yeah but you kinda do. and that\u0026rsquo;s fine. i just can\u0026rsquo;t do it\u0026rdquo;\nher: \u0026ldquo;so that\u0026rsquo;s it?\u0026rdquo;\nme: \u0026ldquo;yeah\u0026rdquo;\nshe cried. i felt like shit. but it would\u0026rsquo;ve been worse to keep going when i knew it wasn\u0026rsquo;t going anywhere.\nthe real reason # not trading stress. not \u0026ldquo;not ready\u0026rdquo;.\ni just don\u0026rsquo;t feel anything.\nbeen like this since december 31. parents died and something in me shut off.\nhad 4 girlfriends since then:\nK: 3 weeks M: met at therapy, 11 days S: 4 weeks J: 6 weeks none of them got past the point where i actually cared.\ntherapy session yesterday # dr. r: \u0026ldquo;you\u0026rsquo;re protecting yourself\u0026rdquo;\nme: \u0026ldquo;from what\u0026rdquo;\ndr. r: \u0026ldquo;from caring about someone who might leave\u0026rdquo;\nme: \u0026ldquo;they all leave anyway. or i leave first\u0026rdquo;\ndr. r: \u0026ldquo;exactly. you leave before you can get hurt\u0026rdquo;\nme: \u0026ldquo;my parents didn\u0026rsquo;t leave on purpose\u0026rdquo;\ndr. r: \u0026ldquo;but they left\u0026rdquo;\nfuck.\npattern i\u0026rsquo;m noticing # meet girl → exciting for 2 weeks → realize i don\u0026rsquo;t care → feel guilty → end it → repeat\nbeen 20 weeks since parents died. had 4 relationships. average 3.5 weeks each.\nnone lasted longer than 6 weeks.\nwhat J said when leaving # \u0026ldquo;you\u0026rsquo;re a good guy but you\u0026rsquo;re not actually here. like you\u0026rsquo;re going through the motions but there\u0026rsquo;s nothing behind it.\u0026rdquo;\nshe\u0026rsquo;s right.\ni show up, say the right things, we have good sex, but i\u0026rsquo;m not really present.\nmostly thinking about trading strategies or code or literally anything else.\nsan diego dating is weird # so many girls here. all hot, most flaky, none stick.\nwhich is fine because i don\u0026rsquo;t stick either.\ndating apps make it too easy. swipe, meet, hook up, repeat.\nused to want a relationship. now i just want to be left alone to code.\ntrading connection # losing money makes everything worse.\ndown $60k total since january. down $490 in may so far.\nhard to care about relationship problems when you\u0026rsquo;re bleeding money every week.\nJ would ask \u0026ldquo;how was your day\u0026rdquo; and i\u0026rsquo;d be thinking \u0026ldquo;lost $1,400 on correlation risk, refactoring entire risk management system, no i don\u0026rsquo;t want to talk about it.\u0026rdquo;\nnot fair to her.\nwhat i actually want # honestly? just want to:\nfix my trading strategies make money consistently not feel guilty about being alone stop pretending to care about dating when i don\u0026rsquo;t maybe in a year when trading is profitable and i\u0026rsquo;m not bleeding money.\nmaybe never. maybe this is just who i am now.\nparents would\u0026rsquo;ve liked J # mom would\u0026rsquo;ve said \u0026ldquo;she\u0026rsquo;s sweet, give her a chance\u0026rdquo;\ndad would\u0026rsquo;ve said \u0026ldquo;don\u0026rsquo;t fuck it up\u0026rdquo;\nwell. i fucked it up.\nbut also didn\u0026rsquo;t want to not fuck it up. which is the real problem.\nnext steps # no more dating for a while. focus on trading.\ndeleted tinder, hinge, bumble.\ngoing to the gym more. therapy weekly. coding daily.\nif i\u0026rsquo;m going to be alone might as well be alone and profitable instead of alone and broke.\nthe number # parents died 20 weeks ago.\nstill waiting for it to hurt less.\ndr. r says grief isn\u0026rsquo;t linear. some days fine, some days not.\ntoday is not fine but also not terrible. just numb.\ntrading helps. gives me something concrete to focus on besides the fact that i\u0026rsquo;m 19 and both my parents are dead and i can\u0026rsquo;t seem to care about anyone.\n1:45am thursday. J is gone. account is at $339k. life continues.\n-AK\n","date":"18 May 2023","externalUrl":null,"permalink":"/posts/2023-05-18-broke-up-with-j-again/","section":"Posts","summary":"\u003cp\u003etold J it\u0026rsquo;s over. lasted 6 weeks total. about what i expected.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ewhy it ended \n    \u003cdiv id=\"why-it-ended\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#why-it-ended\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003esame reason it always ends: i get bored.\u003c/p\u003e","title":"officially broke up with J","type":"posts"},{"content":"worried my strategies are overfit to historical data. spent today testing for it. been reading NexusFi backtesting threads about this exact problem.\nthe problem # my backtests look great:\nsharpe 2.1 70% win rate max drawdown 8% live trading: not so great.\nthis might be overfitting.\nwhat is overfitting # optimizing strategy parameters until backtest looks perfect, but performance doesn\u0026rsquo;t translate to live trading.\nclassic example:\n# Optimize these parameters lookback_period = 47 # why 47? because backtest says so volatility_threshold = 2.37 # why 2.37? because backtest says so profit_target = 0.523 # suspiciously specific # These parameters have no logical basis # They just happened to work in backtest if parameters are oddly specific (2.37 instead of 2.0 or 2.5), probably overfit.\ntests i ran # 1. out-of-sample testing\ntrain on 2020-2022, test on 2023:\n# Training period train_start = \u0026#39;2020-01-01\u0026#39; train_end = \u0026#39;2022-12-31\u0026#39; # Optimize parameters on training data best_params = optimize_strategy(train_start, train_end) # Test on completely unseen data test_start = \u0026#39;2023-01-01\u0026#39; test_end = \u0026#39;2023-05-15\u0026#39; test_results = backtest_strategy(test_start, test_end, best_params) # Compare performance print(f\u0026#34;Training Sharpe: {train_sharpe:.2f}\u0026#34;) print(f\u0026#34;Test Sharpe: {test_sharpe:.2f}\u0026#34;) print(f\u0026#34;Degradation: {(train_sharpe - test_sharpe) / train_sharpe * 100:.1f}%\u0026#34;) results:\ntraining sharpe: 2.08 test sharpe: 1.43 degradation: 31% that\u0026rsquo;s pretty bad. strategy performs way worse on unseen data.\n2. walk-forward analysis\ntest strategy on rolling windows:\n# Walk forward with 90-day train, 30-day test window_size = 90 test_size = 30 results = [] for start_date in date_range(\u0026#39;2020-01-01\u0026#39;, \u0026#39;2023-05-01\u0026#39;, step=30): train_end = start_date + timedelta(days=window_size) test_end = train_end + timedelta(days=test_size) # Train params = optimize(start_date, train_end) # Test perf = backtest(train_end, test_end, params) results.append(perf) # Aggregate all test periods overall_sharpe = calculate_sharpe(results) results:\naverage test sharpe: 1.38 consistency: 12 of 15 periods profitable worst period: -12% (feb 2023) walk-forward shows strategy works but not as well as single backtest suggested.\n3. parameter sensitivity\ntest how sensitive results are to parameter changes:\nbase_sharpe = 2.08 # optimal parameters # Test small parameter changes for delta in [-10%, -5%, +5%, +10%]: modified_lookback = base_lookback * (1 + delta) modified_sharpe = backtest_with_params(modified_lookback, ...) degradation = (base_sharpe - modified_sharpe) / base_sharpe print(f\u0026#34;Lookback {delta:+.0%}: Sharpe {modified_sharpe:.2f} ({degradation:+.1%})\u0026#34;) results:\n-10% lookback: sharpe 1.92 (-8%) -5% lookback: sharpe 1.98 (-5%) +5% lookback: sharpe 2.01 (-3%) +10% lookback: sharpe 1.89 (-9%) performance cliff at ±10%. not good.\nif tiny parameter changes destroy performance, strategy is fragile and probably overfit.\n4. monte carlo simulation\nrandomly shuffle trade returns to test if performance is luck:\nimport random actual_trades = get_backtest_trades() actual_sharpe = calculate_sharpe(actual_trades) # Run 1000 simulations with shuffled trades simulated_sharpes = [] for i in range(1000): shuffled = random.sample(actual_trades, len(actual_trades)) sim_sharpe = calculate_sharpe(shuffled) simulated_sharpes.append(sim_sharpe) # Where does actual performance rank? percentile = sum(s \u0026lt; actual_sharpe for s in simulated_sharpes) / 1000 print(f\u0026#34;Actual Sharpe: {actual_sharpe:.2f}\u0026#34;) print(f\u0026#34;Percentile: {percentile:.1%}\u0026#34;) results:\nactual sharpe: 2.08 percentile: 73rd only better than 73% of random shuffles. not great.\nstrong strategies should be \u0026gt;95th percentile.\nsigns of overfitting # found in my strategies:\n✅ overly specific parameters - 2.37 instead of 2.0 ✅ degradation on unseen data - 31% sharpe drop ✅ parameter sensitivity - 8% drop with small changes ✅ mediocre monte carlo - only 73rd percentile ✅ too many rules - 12 entry conditions (probably 3-4 would work) yeah, i\u0026rsquo;m overfit.\nhow to avoid overfitting # use simple parameters:\n# Bad (overfit) lookback = 47 threshold = 2.37 profit_target = 0.523 # Good (sound) lookback = 50 # round numbers threshold = 2.0 # logical values profit_target = 0.50 # clean percentage fewer rules:\nbefore:\nIV rank \u0026gt; 45 IV percentile \u0026gt; 70 delta \u0026lt; 0.20 delta \u0026gt; 0.12 volume \u0026gt; 500 bid-ask spread \u0026lt; 0.05 dte between 30-45 dte not 35-40 (weird exclusion) underlying price \u0026gt; $50 earnings \u0026gt; 7 days away vix \u0026lt; 30 no positions in same sector 12 rules. probably 6 are noise.\nafter:\nIV rank \u0026gt; 45 delta 0.15-0.25 dte 30-45 earnings \u0026gt; 7 days away 4 rules. cleaner, more reliable.\nregularization in optimization:\npenalize complexity:\ndef fitness_function(params, trades): sharpe = calculate_sharpe(trades) complexity = count_rules(params) # Penalize complex strategies penalty = complexity * 0.1 return sharpe - penalty simpler strategies get higher fitness even if sharpe is slightly lower.\nwalk-forward not single backtest:\ndon\u0026rsquo;t optimize on all historical data. use rolling windows.\nout-of-sample validation:\nalways hold back 20-30% of data for final validation.\nnever optimize on validation set.\nfixing my strategies # going through each strategy:\npremium selling:\nreduced from 12 rules to 5 simplified parameters (round numbers) retested walk-forward new results:\ntraining sharpe: 1.82 (lower) test sharpe: 1.65 (9% degradation, better) monte carlo: 89th percentile (much better) less impressive backtest but more strong.\nmean reversion:\nreduced from 8 rules to 4 removed oddly specific parameters retested new results:\ntraining sharpe: 1.65 test sharpe: 1.52 (8% degradation) monte carlo: 91st percentile better.\nlive vs backtest comparison # before (overfit strategies):\nbacktest sharpe: 2.08 live sharpe (4 months): 0.43 degradation: 79% brutal.\nafter (simpler strategies):\nbacktest sharpe: 1.71 expected live sharpe: ~1.45 expected degradation: 15% more realistic expectations.\nlessons # impressive backtests are suspicious - if it looks too good, probably overfit simplicity is robustness - fewer rules = more likely to work live test multiple ways - out-of-sample, walk-forward, monte carlo parameter sensitivity matters - strategy should work with approximate parameters accept lower backtest performance - if it translates to live, worth it my new testing protocol # before going live with any strategy:\nout-of-sample test (30% degradation max) walk-forward analysis (consistency check) parameter sensitivity (10% parameter change = \u0026lt;10% performance change) monte carlo simulation (\u0026gt;90th percentile) simplicity check (≤5 rules) if fails any test, back to drawing board.\ncurrent strategies status # premium selling v2:\npasses all tests going live next week with minimum size mean reversion v2:\npasses 4 of 5 tests needs more work momentum:\nfails everything scrapped entirely reality check # my strategies weren\u0026rsquo;t as good as backtests suggested. they were overfit.\nfixing them means accepting lower expected returns but higher probability they\u0026rsquo;ll actually work.\nbetter to make 15% annually consistently than backtest 50% and make 0% live.\n3:22am. spent all day on this. strategies are simpler now. hopefully actually work in live trading.\n-AK\n","date":"16 May 2023","externalUrl":null,"permalink":"/posts/2023-05-16-backtest-overfitting-check/","section":"Posts","summary":"\u003cp\u003eworried my strategies are overfit to historical data. spent today testing for it. been reading \u003ca\n  href=\"https://nexusfi.com/showthread.php?t=5429\"\n    target=\"_blank\"\n  \u003eNexusFi backtesting threads\u003c/a\u003e about this exact problem.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe problem \n    \u003cdiv id=\"the-problem\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-problem\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003emy backtests look great:\u003c/p\u003e","title":"checking my backtests for overfitting","type":"posts"},{"content":"week 2 sucked. gave back week 1 gains and then some.\nthe numbers # trades this week:\ntotal: 7 wins: 3 losses: 4 win rate: 43% avg winner: $310 avg loser: $485 net: -$1,010 account:\nstarted week: $340,520 current: $339,510 weekly return: -0.30% may total: -0.14% (-$490) what went wrong # may 10 correlation disaster:\nhad 3 positions all in tech. market dumped 2%, all hit stops.\nlost $1,400 in one day.\npositions:\nQQQ put spread AAPL put spread MSFT put spread correlation between them: 0.92\nmight as well been the same trade 3 times.\nwrote correlation checking code after this. won\u0026rsquo;t happen again.\nother losses:\nmay 9: $280 loss, stopped out too early (paranoid after correlation loss) may 12: $385 loss, IV crush after earnings may 13: $190 loss, rolled position badly what went right # added correlation checking:\nnew code checks correlation before adding positions. won\u0026rsquo;t allow \u0026gt;0.7 correlation.\ntested on last 30 days: would\u0026rsquo;ve prevented $1,000 in losses.\nkept position sizes small:\nlosses hurt but didn\u0026rsquo;t blow up account. still have $339k.\nat old position sizing, may 10 would\u0026rsquo;ve been $2,800 loss instead of $1,400.\nlearned expensive lessons:\ncorrelation matters more than i thought tech sector moves as single unit need true diversification, not just multiple positions may goal status # goal: break-even to +$5k for the month\ncurrent: -$490 (15 days in)\nneed: +$490 to break-even, +$5,490 for goal\nremaining time: 16 days\nneeded weekly: +$250 to break-even, +$2,750 for goal\nbreak-even is still possible. goal is unlikely unless i have big winning week.\nchanges for week 3 # 1. correlation limits enforced\ncode now rejects positions with correlation \u0026gt;0.7 to existing positions.\ntested: would\u0026rsquo;ve saved $1,000 this week.\n2. sector exposure limits\nmax 40% of capital in any sector. forces diversification.\n3. tighter stops on earnings plays\nIV crush losses are predictable. should\u0026rsquo;ve known better.\n4. weekly correlation check\neven if positions start uncorrelated, correlation can develop. checking friday.\nweek 2 trades breakdown # date type credit outcome P\u0026amp;L correlation 5/8 QQQ put $0.88 win $385 n/a 5/9 AAPL put $0.75 loss -$280 0.89 w/ QQQ 5/9 MSFT put $0.82 loss -$295 0.91 w/ QQQ 5/10 SPX call $0.95 loss -$825 stop cascade 5/11 TLT call $0.65 win $280 -0.45 w/ stocks 5/12 GOOGL put $1.20 loss -$385 earnings IV 5/13 ES future - win $315 0.82 w/ SPX 3 losses were correlation-related (QQQ/AAPL/MSFT). won\u0026rsquo;t repeat.\ncomparison to april # april weekly average: -$3,100 may week 2: -$1,010\nstill losing but losses are smaller. progress i guess.\npsychological state # frustrated but not panicking.\nlosses suck but they\u0026rsquo;re educational. correlation risk is real and i have code to prevent it now.\ndown $60k total since january. not great but still have $339k to work with.\n4 more months at this burn rate = broke. need to actually become profitable soon.\npersonal shit # broke up with J (as expected). lasted 5 weeks. new record is still 6 months.\ntherapy wednesday. talked about trading losses and correlation risk. dr. r said \u0026ldquo;sounds like you learned something expensive.\u0026rdquo; yeah no shit.\nhaven\u0026rsquo;t been to the gym in 3 weeks. need to fix that.\nsleep is still bad. waking up at 2-3am checking futures.\nweek 3 preview # focus:\ntrade less (quality over quantity) enforce correlation limits strictly aim for +$500 to offset this week avoid earnings plays unless IV edge is huge new rules:\nmax 2 positions per sector correlation must be \u0026lt;0.7 weekly portfolio correlation review no positions day before earnings may forecast update # conservative: -$2k to break-even (from -$5k to +$2k original) realistic: -$1k (from -$10k original) optimistic: +$2k (from +$5k original)\nlowered expectations after week 2. rather under-promise and over-deliver.\nsilver lining # correlation lesson cost $1,400. could\u0026rsquo;ve been $10k later when position sizes are bigger.\nbetter to learn now with small account than later with big one.\ncode is better. risk management is better. will pay off eventually.\n3:40pm sunday. week 2 done, moving on. week 3 starts tomorrow.\n-AK\n","date":"14 May 2023","externalUrl":null,"permalink":"/posts/2023-05-14-week-2-review-back-to-red/","section":"Posts","summary":"\u003cp\u003eweek 2 sucked. gave back week 1 gains and then some.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe numbers \n    \u003cdiv id=\"the-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003etrades this week:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003etotal: 7\u003c/li\u003e\n\u003cli\u003ewins: 3\u003c/li\u003e\n\u003cli\u003elosses: 4\u003c/li\u003e\n\u003cli\u003ewin rate: 43%\u003c/li\u003e\n\u003cli\u003eavg winner: $310\u003c/li\u003e\n\u003cli\u003eavg loser: $485\u003c/li\u003e\n\u003cli\u003enet: -$1,010\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eaccount:\u003c/strong\u003e\u003c/p\u003e","title":"week 2 review - back in the red","type":"posts"},{"content":"","date":"13 May 2023","externalUrl":null,"permalink":"/tags/code-organization/","section":"Tags","summary":"","title":"Code Organization","type":"tags"},{"content":"","date":"13 May 2023","externalUrl":null,"permalink":"/tags/github/","section":"Tags","summary":"","title":"Github","type":"tags"},{"content":"got asked on r/algotrading how i organize my trading repos. here\u0026rsquo;s my setup after 4 months of refactoring.\nrepo structure # i have 4 main repos:\n1. trading-strategies (private)\nall my actual strategies backtests optimization code performance analysis 2. trading-infrastructure (private)\nbroker API wrappers data feed connections order management position tracking risk management 3. trading-tools (public)\ngeneric utilities technical indicators backtesting helpers visualization tools nothing proprietary 4. trading-research (private)\njupyter notebooks strategy ideas failed experiments market analysis why separate repos? # modularity:\ncan update infrastructure without touching strategies can share tools publicly without exposing strategies easier to test each component independently security:\nstrategies stay private tools can be public (builds reputation on github) API keys never committed (environment variables) deployment:\ninfrastructure runs 24/7 on server strategies can be started/stopped independently tools installed as python packages directory structure # trading-strategies/ ├── strategies/ │ ├── premium_selling/ │ │ ├── __init__.py │ │ ├── iv_rank_strategy.py │ │ ├── config.yaml │ │ └── backtest.py │ ├── mean_reversion/ │ └── volatility/ ├── backtests/ │ ├── results/ │ └── analysis/ ├── optimization/ ├── tests/ ├── requirements.txt └── README.md trading-infrastructure/ ├── brokers/ │ ├── interactive_brokers.py │ ├── tastyworks.py │ └── base_broker.py ├── data/ │ ├── polygon_client.py │ ├── data_manager.py │ └── storage/ ├── execution/ │ ├── order_manager.py │ ├── position_manager.py │ └── risk_manager.py ├── monitoring/ │ ├── alerting.py │ └── metrics.py ├── config/ │ ├── production.yaml │ └── development.yaml ├── tests/ └── README.md key principles # 1. separation of concerns\nstrategy code doesn\u0026rsquo;t know about broker APIs:\n# strategies/premium_selling/iv_rank_strategy.py class IVRankStrategy: def generate_signals(self, market_data): # Pure strategy logic # No broker-specific code # Returns generic Signal objects pass # infrastructure/execution/order_manager.py class OrderManager: def execute_signal(self, signal, broker): # Handles broker-specific execution # Strategy doesn\u0026#39;t care which broker pass 2. configuration files\nall settings in yaml, not hardcoded:\n# strategies/premium_selling/config.yaml strategy: name: \u0026#34;IV Rank Premium Selling\u0026#34; enabled: true entry: iv_rank_min: 45 delta_max: 0.20 dte_min: 30 dte_max: 45 exit: profit_target: 0.50 stop_loss: 2.00 dte_min: 2 position: max_positions: 5 capital_per_trade: 10000 max_loss_per_trade: 425 3. environment variables for secrets\n# Never commit API keys import os POLYGON_API_KEY = os.getenv(\u0026#39;POLYGON_API_KEY\u0026#39;) IB_HOST = os.getenv(\u0026#39;IB_HOST\u0026#39;, \u0026#39;127.0.0.1\u0026#39;) IB_PORT = int(os.getenv(\u0026#39;IB_PORT\u0026#39;, 7497)) # Keys stored in .env (gitignored) # or in server environment variables 4. thorough tests\n# tests/test_iv_rank_strategy.py import pytest from strategies.premium_selling import IVRankStrategy def test_iv_rank_filter(): strategy = IVRankStrategy() # IV rank too low, should reject assert strategy.passes_iv_filter(iv_rank=30) == False # IV rank acceptable, should pass assert strategy.passes_iv_filter(iv_rank=50) == True def test_signal_generation(): strategy = IVRankStrategy() market_data = load_test_data() signals = strategy.generate_signals(market_data) assert len(signals) \u0026gt; 0 assert all(s.iv_rank \u0026gt; 45 for s in signals) what goes in each repo # trading-strategies:\nstrategy logic entry/exit rules position sizing backtests optimization trading-infrastructure:\nbroker connections data feeds order execution risk management monitoring/alerting trading-tools (public):\ntechnical indicators backtesting framework data utilities charting helpers generic trading utilities trading-research:\njupyter notebooks exploratory analysis failed strategy ideas market research optimization experiments git workflow # development:\ncreate feature branch write tests implement feature run tests locally commit with descriptive message testing:\npush to github run full test suite on server paper trade for 1 week minimum review results production:\nmerge to main branch deploy to production server start with minimum position size scale up after 2 weeks commit messages # i use conventional commits format:\nfeat: add IV percentile filter to premium selling strategy fix: correct slippage calculation in backtest docs: update strategy README with performance metrics test: add correlation checking tests refactor: simplify order execution logic makes git history searchable.\nbranching strategy # main: production code, always deployable develop: integration branch for new features feature/xxx: individual feature branches hotfix/xxx: urgent production fixes\npre-commit hooks # # .git/hooks/pre-commit #!/bin/bash # Run tests before allowing commit pytest tests/ # Check for debugging code if grep -r \u0026#34;import pdb\u0026#34; strategies/; then echo \u0026#34;Error: Found debugging code (pdb)\u0026#34; exit 1 fi # Check for hardcoded secrets if grep -r \u0026#34;api_key.*=.*[\u0026#39;\\\u0026#34;].*[\u0026#39;\\\u0026#34;]\u0026#34; . --include=\u0026#34;*.py\u0026#34;; then echo \u0026#34;Error: Found hardcoded API key\u0026#34; exit 1 fi what i keep private vs public # private:\nactual trading strategies performance data optimization results broker configurations anything that makes me money public:\ngeneric utilities backtesting framework technical indicators chart generators data processing tools github actions (automated testing) # # .github/workflows/test.yml name: Run Tests on: [push, pull_request] jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - uses: actions/setup-python@v2 with: python-version: 3.11 - run: pip install -r requirements.txt - run: pytest tests/ --cov runs tests automatically on every push.\ndocumentation # every strategy has README.md with:\ndescription entry/exit rules expected performance risk parameters backtest results known issues keeps me from forgetting what i was thinking when i wrote it.\nbackup strategy # github is primary, but i also:\nlocal backup to external drive (weekly) backup to second git server (daily) encrypted backup to cloud (monthly) losing strategy code = catastrophic. redundancy matters.\ncode review # i\u0026rsquo;m solo but i still do code review:\nwrite code in feature branch let it sit 24 hours review with fresh eyes merge if it still looks good helps catch stupid mistakes.\nperformance tracking in git # i tag releases with performance metrics:\ngit tag -a v1.2.0 -m \u0026#34; IV Rank Strategy v1.2.0 - Sharpe: 1.85 - Win rate: 68% - Max DD: -8% - Backtest: 2020-2023 \u0026#34; can see how strategy evolved over time.\nlessons learned # what works:\nseparate repos for different concerns yaml configs for everything extensive tests clear commit messages what doesn\u0026rsquo;t work:\nmonolithic repo with everything hardcoded values no tests \u0026ldquo;WIP\u0026rdquo; commit messages mistakes i made:\nput strategies and infrastructure in same repo initially (nightmare to separate later) committed API key once (had to regenerate) didn\u0026rsquo;t write tests early (pain to add later) no documentation (forgot how my own code works) time investment # organizing code properly = ~20 hours initially\nsaves ~5 hours per week in debugging and maintenance\npaid for itself in first month.\n2:55pm. someone will probably ask for my public trading-tools repo. might open source it if people are interested.\n-AK\n","date":"13 May 2023","externalUrl":null,"permalink":"/posts/2023-05-13-github-code-organization/","section":"Posts","summary":"\u003cp\u003egot asked on \u003ca\n  href=\"https://www.reddit.com/r/algotrading/\"\n    target=\"_blank\"\n  \u003er/algotrading\u003c/a\u003e how i organize my trading repos. here\u0026rsquo;s my setup after 4 months of refactoring.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003erepo structure \n    \u003cdiv id=\"repo-structure\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#repo-structure\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003ei have 4 main repos:\u003c/p\u003e","title":"how i organize my trading code on github","type":"posts"},{"content":"lost $1,400 yesterday because i didn\u0026rsquo;t track correlation between my positions. dumb mistake.\nwhat happened # may 10, 2pm:\nhad 3 open credit spreads all \u0026ldquo;independent\u0026rdquo; strategies all on tech stocks market dumped 2%. all 3 positions hit stops at same time.\ntotal loss: $1,400\nshould\u0026rsquo;ve been $400-500 max (one position losing).\nthe problem # my 3 \u0026ldquo;independent\u0026rdquo; positions:\nQQQ put spread (tech ETF) AAPL put spread (tech stock) MSFT put spread (tech stock) thought i was diversified. i wasn\u0026rsquo;t.\nQQQ is 40% AAPL + MSFT. when tech dumps, all 3 move together.\ncorrelation = 0.92 between these positions. might as well have been the same trade 3 times.\nwhat i should\u0026rsquo;ve tracked # import pandas as pd import numpy as np # Get position correlations positions = [\u0026#39;QQQ\u0026#39;, \u0026#39;AAPL\u0026#39;, \u0026#39;MSFT\u0026#39;] returns = get_historical_returns(positions, days=30) correlation_matrix = returns.corr() print(correlation_matrix) # QQQ AAPL MSFT # QQQ 1.00 0.89 0.91 # AAPL 0.89 1.00 0.93 # MSFT 0.91 0.93 1.00 # All highly correlated = not diversified correlation \u0026gt; 0.7 = basically same position\ni had 0.92. stupid.\nposition limits i should\u0026rsquo;ve had # by sector:\nmax 2 positions in same sector max 40% of capital in correlated positions (\u0026gt;0.7) by underlying:\nmax 1 position per stock ETFs count as multiple stocks (check holdings) by strategy:\neven \u0026ldquo;different\u0026rdquo; strategies can correlate premium selling on correlated underlyings = same risk how to actually diversify # good diversification:\nSPX put spread (broad market) TLT call spread (bonds - negative correlation to stocks) GLD put spread (gold - low correlation) correlation matrix:\nSPX TLT GLD SPX 1.00 -0.45 0.12 TLT -0.45 1.00 -0.18 GLD 0.12 -0.18 1.00 negative correlation to TLT = when stocks dump, bonds rally, TLT position makes money.\ncode i added # class PositionManager: def __init__(self): self.positions = [] self.max_correlation = 0.70 self.max_sector_exposure = 0.40 def check_correlation(self, new_position): \u0026#34;\u0026#34;\u0026#34;Check if new position is too correlated with existing\u0026#34;\u0026#34;\u0026#34; if len(self.positions) == 0: return True # Get symbols of current positions current_symbols = [p.underlying for p in self.positions] # Calculate correlation with new position all_symbols = current_symbols + [new_position.underlying] returns = self.get_returns(all_symbols, days=30) corr_matrix = returns.corr() # Check correlation with each existing position for symbol in current_symbols: correlation = corr_matrix.loc[symbol, new_position.underlying] if abs(correlation) \u0026gt; self.max_correlation: print(f\u0026#34;REJECTED: {new_position.underlying} correlation {correlation:.2f} with {symbol}\u0026#34;) return False return True def check_sector_exposure(self, new_position): \u0026#34;\u0026#34;\u0026#34;Check if adding position exceeds sector limits\u0026#34;\u0026#34;\u0026#34; sector = self.get_sector(new_position.underlying) # Calculate current sector exposure sector_capital = sum(p.capital_at_risk for p in self.positions if self.get_sector(p.underlying) == sector) total_capital = self.account_value new_exposure = (sector_capital + new_position.capital_at_risk) / total_capital if new_exposure \u0026gt; self.max_sector_exposure: print(f\u0026#34;REJECTED: {sector} exposure {new_exposure:.1%} exceeds {self.max_sector_exposure:.1%}\u0026#34;) return False return True def add_position(self, position): \u0026#34;\u0026#34;\u0026#34;Add position after checking correlation and sector limits\u0026#34;\u0026#34;\u0026#34; if not self.check_correlation(position): return False if not self.check_sector_exposure(position): return False self.positions.append(position) return True what this would\u0026rsquo;ve prevented # may 10 scenario with correlation checking:\nadd QQQ put spread ✅ (no existing positions) add AAPL put spread ❌ (correlation 0.89 with QQQ, rejected) add MSFT put spread ❌ (correlation 0.91 with QQQ, rejected) would\u0026rsquo;ve only had 1 position in tech. loss: $400 instead of $1,400.\nsaved $1,000.\nother correlation mistakes # strategies that correlate more than you think:\nshort volatility strategies (all lose when VIX spikes) premium selling (all lose in crashes) mean reversion (all lose in trends) momentum (all lose in reversals) even \u0026ldquo;different\u0026rdquo; strategies can correlate during market stress.\nmay performance so far # week 1: +$520 week 2 (so far): -$1,400\nnet may: -$880\nback below break-even. frustrated but it\u0026rsquo;s a good lesson.\nbetter to lose $1,400 learning about correlation now than $10k later when account is bigger.\nwhat i\u0026rsquo;m changing # added correlation checking to position manager (code above) max 2 positions per sector target negative correlation between positions checking correlation weekly, not just at entry if correlation \u0026gt; 0.7 develops during hold, close one position sectors i\u0026rsquo;m using for limits # technology (QQQ, AAPL, MSFT, GOOGL, etc) financials (JPM, BAC, XLF, etc) healthcare (JNJ, UNH, XLV, etc) energy (XLE, CVX, XOM, etc) bonds (TLT, IEF, AGG) commodities (GLD, SLV, USO) testing the new system # backtesting last 30 days with correlation limits:\noriginal: 14 trades, -$880 net with limits: 9 trades (5 rejected), +$340 net correlation checking would\u0026rsquo;ve prevented all my correlated losses.\nthe math # without correlation limits:\n3 positions @ $400 risk each = $1,200 total risk correlation 0.92 means effective risk = $1,100 (not $400) actual loss: $1,400 (worse than expected) with correlation limits:\n3 positions with correlation \u0026lt; 0.3 effective risk = $650 (true diversification benefit) expected max loss = $700 (much better) lesson # diversification isn\u0026rsquo;t about number of positions. it\u0026rsquo;s about correlation between positions.\n10 positions in tech = 1 position 3 positions across uncorrelated sectors = actual diversification\n3:15am. expensive lesson but necessary. correlation checking goes live tomorrow.\n-AK\n","date":"11 May 2023","externalUrl":null,"permalink":"/posts/2023-05-11-correlation-risk-learned-hard-way/","section":"Posts","summary":"\u003cp\u003elost $1,400 yesterday because i didn\u0026rsquo;t track correlation between my positions. dumb mistake.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ewhat happened \n    \u003cdiv id=\"what-happened\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#what-happened\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003emay 10, 2pm:\u003c/p\u003e","title":"correlation risk - learned the hard way","type":"posts"},{"content":"","date":"11 May 2023","externalUrl":null,"permalink":"/tags/lessons/","section":"Tags","summary":"","title":"Lessons","type":"tags"},{"content":"","date":"9 May 2023","externalUrl":null,"permalink":"/tags/apis/","section":"Tags","summary":"","title":"Apis","type":"tags"},{"content":"been using both IB and tastyworks for 4 months now. the thing is matters for algo trading.\nbackground # started with interactive brokers in january when i went live. added tastyworks in march specifically for options premium selling.\nboth have python APIs. both work. neither is perfect.\ninteractive brokers (IB) # what i use it for:\nprimary execution for spreads futures trading (ES, NQ) portfolio margin account API: ib_insync\nfrom ib_insync import IB, Stock, Option, MarketOrder ib = IB() ib.connect(\u0026#39;127.0.0.1\u0026#39;, 7497, clientId=1) # Get option chains contracts = ib.reqContractDetails(Option(\u0026#39;SPX\u0026#39;, \u0026#39;20230519\u0026#39;, 4100, \u0026#39;C\u0026#39;)) # Place order order = MarketOrder(\u0026#39;BUY\u0026#39;, 1) trade = ib.placeOrder(contract, order) pros:\ncovers everything (stocks, options, futures, forex, crypto) real-time data included if you meet activity requirements portfolio margin = way better capital efficiency TWS gateway runs 24/7, auto-reconnects mature API, tons of examples on github cons:\nAPI is complex AF (took me 2 weeks to fully understand) TWS required (java application, resource heavy) order rejection messages are cryptic must maintain $100k minimum for portfolio margin paper trading environment often has different behavior than live cost:\n$0.65 per contract for options $0.25 per contract for futures tiered pricing reduces cost at volume $10/month market data (waived if you trade enough) tastyworks # what i use it for:\noptions-focused strategies premium selling plays backup execution if IB has issues API: tastytrade (unofficial python wrapper)\nfrom tastytrade import Session, Account from tastytrade.instruments import get_option_chain session = Session(\u0026#39;username\u0026#39;, \u0026#39;password\u0026#39;) account = Account.get_accounts(session)[0] # Get option chains (way easier than IB) chain = get_option_chain(session, \u0026#39;SPX\u0026#39;) # Place spread order order = { \u0026#39;order-type\u0026#39;: \u0026#39;Limit\u0026#39;, \u0026#39;time-in-force\u0026#39;: \u0026#39;Day\u0026#39;, \u0026#39;price\u0026#39;: 0.42, \u0026#39;legs\u0026#39;: [...] } pros:\nAPI designed for options traders (easier to use) spreads are native orders (not leg-by-leg like some brokers) commission-free stock trades mobile app is actually good fast order fills on spreads great for premium selling strategies cons:\nno futures support (options only + stocks) no portfolio margin (reg-t only) API documentation is sparse unofficial python library (could break) paper trading environment doesn\u0026rsquo;t exist must test everything live with small size cost:\n$1.00 per contract to open $0 to close if under $0.65 no monthly fees free real-time data which is better? # depends what you\u0026rsquo;re doing.\nfor algo traders who need:\neverything: IB wins (stocks, options, futures, global markets) portfolio margin: IB only option futures: IB only option options premium selling: tastyworks easier API, better fills beginners: tastyworks simpler to code advanced strategies: IB more flexible my setup # i use both:\nprimary execution: IB\nfutures trades complex multi-leg options anything requiring portfolio margin secondary execution: tastyworks\nsimple credit spreads premium selling strategies backup if IB has downtime data source: polygon.io\nneither broker for market data polygon is cleaner, faster, more reliable code comparison # placing a credit spread:\nIB (more complex):\n# IB requires leg-by-leg contract definition short_leg = Option(\u0026#39;SPX\u0026#39;, \u0026#39;20230519\u0026#39;, 4100, \u0026#39;P\u0026#39;, \u0026#39;SMART\u0026#39;) long_leg = Option(\u0026#39;SPX\u0026#39;, \u0026#39;20230519\u0026#39;, 4050, \u0026#39;P\u0026#39;, \u0026#39;SMART\u0026#39;) # Create combo order combo = ib.ComboLeg() # ... 20 more lines of setup code tastyworks (simpler):\n# Tastyworks handles spread as single order spread = { \u0026#39;symbol\u0026#39;: \u0026#39;SPX\u0026#39;, \u0026#39;expiration\u0026#39;: \u0026#39;2023-05-19\u0026#39;, \u0026#39;legs\u0026#39;: [ {\u0026#39;strike\u0026#39;: 4100, \u0026#39;type\u0026#39;: \u0026#39;put\u0026#39;, \u0026#39;action\u0026#39;: \u0026#39;sell\u0026#39;}, {\u0026#39;strike\u0026#39;: 4050, \u0026#39;type\u0026#39;: \u0026#39;put\u0026#39;, \u0026#39;action\u0026#39;: \u0026#39;buy\u0026#39;} ] } for credit spreads, tastyworks is way easier to code.\nreliability # IB:\n99.5% uptime in my experience occasional disconnects during high volatility TWS gateway needs restart every few days order rejections rare but cryptic tastyworks:\n99.8% uptime faster order fills on spreads API occasionally rate-limits (no warning) mobile app works when API is down support # IB:\nphone support exists but slow chat support hit or miss community forums helpful documentation full but dense tastyworks:\nchat support is fast phone support good API support non-existent (unofficial library) documentation is sparse for new algo traders # start with tastyworks if you\u0026rsquo;re only trading options. simpler API, easier to learn.\nswitch to IB when you need:\nportfolio margin futures global markets more complex strategies i started with IB because i knew i\u0026rsquo;d need everything eventually. would\u0026rsquo;ve been easier to learn on tastyworks first.\nrelevant discussions # been following the trading reviews and vendor discussions on NexusFi. good place to see what other algo traders are using and why.\ncost comparison (my actual costs) # april 2023:\nIB commissions: $284 (438 contracts) tastyworks commissions: $89 (89 contracts) total: $373 in commissions at my volume, IB is slightly cheaper per contract but tastyworks has better fills which offset the higher commission.\nrecommendation # if you\u0026rsquo;re starting out: tastyworks for options-only algo trading\nif you\u0026rsquo;re serious: IB for everything, tastyworks for options backup\nif you\u0026rsquo;re broke: IB has $0 minimum, tastyworks needs $2k\ni\u0026rsquo;m keeping both. redundancy matters when your code is placing real orders with real money.\n2:38am. spent way too long writing this but these broker choices matter. wrong API can cost you hours of dev time.\n-AK\n","date":"9 May 2023","externalUrl":null,"permalink":"/posts/2023-05-09-ib-api-vs-tastyworks-api/","section":"Posts","summary":"\u003cp\u003ebeen using both IB and tastyworks for 4 months now. the thing is matters for algo trading.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ebackground \n    \u003cdiv id=\"background\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#background\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003estarted with interactive brokers in january when i went live. added tastyworks in march specifically for options premium selling.\u003c/p\u003e","title":"interactive brokers vs tastyworks APIs - which is better for algo trading","type":"posts"},{"content":"","date":"9 May 2023","externalUrl":null,"permalink":"/tags/reviews/","section":"Tags","summary":"","title":"Reviews","type":"tags"},{"content":"been using polygon.io for options data since april. here\u0026rsquo;s my review after 1 month.\nbackground # was using alpha vantage (free tier) until march. data quality was shit:\ndelayed quotes (5-15 min lag) missing greeks API rate limits constantly hit no real-time options chain switched to polygon april 1. paying $99/month for stocks + options plan.\nwhat polygon gives you # real-time data:\nstock prices (sub-second latency) options chains (all strikes, all expirations) greeks (delta, gamma, theta, vega, rho) IV data open interest and volume historical data:\nminute bars back to 2004 daily bars back to forever options historical pricing splits/dividends adjusted API quality:\nwebsocket streaming (for real-time) REST API (for historical) 5 requests/second limit (plenty for my needs) python client library (works well) integration code # from polygon import RESTClient from polygon import WebSocketClient class PolygonDataFeed: def __init__(self, api_key): self.rest_client = RESTClient(api_key) self.ws_client = WebSocketClient( api_key=api_key, feed=\u0026#39;options\u0026#39; # or \u0026#39;stocks\u0026#39;, \u0026#39;forex\u0026#39;, \u0026#39;crypto\u0026#39; ) def get_options_chain(self, underlying, expiration): \u0026#34;\u0026#34;\u0026#34;Get full options chain for expiration date\u0026#34;\u0026#34;\u0026#34; chain = self.rest_client.list_options_contracts( underlying_ticker=underlying, expiration_date=expiration ) return chain def get_option_greeks(self, option_symbol): \u0026#34;\u0026#34;\u0026#34;Get greeks for specific option\u0026#34;\u0026#34;\u0026#34; snapshot = self.rest_client.get_snapshot_option( underlying_ticker=self.extract_underlying(option_symbol), option_contract=option_symbol ) return snapshot.greeks def stream_quotes(self, symbols, callback): \u0026#34;\u0026#34;\u0026#34;Stream real-time option quotes\u0026#34;\u0026#34;\u0026#34; def handle_msg(msgs): for msg in msgs: callback(msg) self.ws_client.subscribe_options_trades(symbols) self.ws_client.run(handle_msg) data quality # greeks accuracy:\ncompared polygon greeks vs my black-scholes calculations. usually within 2-3% which is fine for my strategies.\noccasionally see bigger differences (5-10%) on deep OTM options with low volume. probably stale data or wide bid-ask causing issues.\nlatency:\nwebsocket quotes arrive 50-200ms after trade timestamp. good enough for my 1-5 minute bar strategies.\nnot suitable for HFT but i\u0026rsquo;m not doing that.\nreliability:\none outage in april (lasted 15 minutes). otherwise 99.9%+ uptime.\nhistorical data requests occasionally timeout but retry logic handles it.\nvs alternatives # polygon vs alpha vantage:\npolygon: real-time, accurate greeks, $99/month alpha vantage: delayed, missing data, free obvious winner for anyone serious.\npolygon vs IEX cloud:\npolygon: better options coverage IEX: cheaper for stocks-only i need options so polygon wins.\npolygon vs interactive brokers data:\npolygon: cleaner API, better docs IB: free if you\u0026rsquo;re a customer, but API is painful using both. polygon for backtesting/analysis, IB for live trading execution.\ncost analysis # $99/month = $1,188/year\nneeds to save me one bad trade per year to be worth it.\nbetter data already helped me:\navoid 3 low-IV setups in april (saved ~$400) caught assignment risk earlier (saved ~$200) more accurate position greeks (better risk management) easily worth $100/month.\nwhat i wish was better # 1. options chains are huge\ndownloading full SPX chain with all strikes/expirations returns 5000+ contracts. takes 10-15 seconds.\nwish they had better filtering on the API side instead of downloading everything then filtering locally.\n2. IV percentile would be nice\nthey give you IV rank in some places but not consistently. had to build my own percentile calculations from historical IV.\n3. docs could be better\ngenerally good but some endpoints poorly documented. had to trial-and-error to figure out correct parameters.\nalternatives i considered # thetadata:\n$60/month similar features smaller company (worried about reliability) tradier:\n$30/month less options coverage slower updates tastyworks/TD ameritrade APIs:\nfree with account data quality inconsistent rate limits too restrictive recommendation # if you\u0026rsquo;re trading options algorithmically, polygon is worth it. $99/month is nothing compared to trading losses from bad data.\ni\u0026rsquo;ll probably keep polygon long-term. only reason to switch would be if i move to HFT and need ultra-low latency (which isn\u0026rsquo;t happening).\nmy setup # currently:\npolygon for real-time data + backtesting IB for order execution timescaledb for storing historical bars redis for caching recent data works well. no latency issues. data quality is solid.\n8:15pm. been meaning to write this review for weeks. polygon is legit, would recommend.\n-AK\n","date":"7 May 2023","externalUrl":null,"permalink":"/posts/2023-05-07-polygon-data-feed-review/","section":"Posts","summary":"\u003cp\u003ebeen using polygon.io for options data since april. here\u0026rsquo;s my review after 1 month.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ebackground \n    \u003cdiv id=\"background\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#background\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003ewas using alpha vantage (free tier) until march. data quality was shit:\u003c/p\u003e","title":"polygon.io data feed review after 1 month","type":"posts"},{"content":"first week of may done. +$520.\nnot amazing but way better than april\u0026rsquo;s weekly average (-$3k/week).\nthe numbers # trades this week:\ntotal: 4 wins: 3 losses: 1 win rate: 75% avg winner: $240 avg loser: $200 net: +$520 account:\nstarted may: $340,000 current: $340,520 weekly return: +0.15% annualized: 8.1% what worked # 1. smaller position sizes\nmax loss per trade: $425 (down from $850)\nmeant my one loser cost $200 instead of potentially $400+. saved ~$200 by cutting size.\nalso less stress. can hold positions without checking every 10 minutes.\n2. only 3 strategies\nstopped trading momentum, crypto arb, calendars. only doing:\nIV rank premium selling vol mean reversion earnings fade less complexity = less cognitive load = fewer mistakes.\n3. fixed assignment bug\nspent 6 hours wednesday fixing the early assignment bug that cost me $5k in april. no assignments this week but at least code is ready now.\n4. weekly review process\nevery friday: analyze all trades, update strategy docs, plan next week.\nthis post is part of that. forces me to actually think about what\u0026rsquo;s working vs just grinding trades.\nwhat didn\u0026rsquo;t work # 1. trade frequency\nonly 4 trades in 5 days. was aiming for 1-2 per day.\ntoo conservative with entry criteria. raised IV rank requirement from 40 to 45 which filtered out 3 potential setups.\nneed to find balance between quality and quantity.\n2. earnings fade\nnew strategy, tested once this week. lost $200.\nbought back spread too early (panic closed when underlying moved against me). should\u0026rsquo;ve held for target or stop.\nmaybe not ready for this strategy yet. might pause it.\n3. still not sleeping well\neven with smaller size i\u0026rsquo;m waking up at 2-3am checking futures. old habits.\nneed to trust the stops and actually sleep.\nlessons from week 1 # smaller size helps mentally - can think clearly instead of panic-trading 3 strategies is manageable - anything more was too much code bugs are expensive - $5k lesson learned in april quality \u0026gt; quantity - 4 good setups beat 10 mediocre ones weekly reviews work - forces accountability plan for week 2 # trading:\naim for 6-8 trades (slightly higher frequency) lower IV rank back to 43 (from 45) to get more setups pause earnings fade strategy, focus on the 2 proven ones code:\nfinish assignment testing add correlation tracking between positions build weekly performance dashboard personal:\ntry to sleep before 2am at least 3 nights go to the gym (haven\u0026rsquo;t been in 2 weeks) maybe call that girl who texted me yesterday may goal check # goal: break-even to +$5k for the month\nweek 1: +$520 remaining: +$0 to +$4,480 in next 3 weeks\npossible? yeah if i don\u0026rsquo;t fuck up.\nneed to average +$1k/week (or break-even on weeks 2-4). totally doable with current strategy performance.\none month since\u0026hellip; # parents died 18 weeks ago today (december 31).\nsome weeks i barely think about them. this week i thought about them a lot.\ncleared out more of dad\u0026rsquo;s stuff from the garage. found his old trading books from the 90s. kept a few, donated the rest.\nhe would\u0026rsquo;ve liked that i\u0026rsquo;m trading algorithmically. was always into tech and automation.\ntrading gives me something to focus on besides the fact they\u0026rsquo;re gone. some days that\u0026rsquo;s worth more than the money.\n2:22pm saturday. week 1 done, 3 more weeks to go. need this month to work.\n-AK\n","date":"6 May 2023","externalUrl":null,"permalink":"/posts/2023-05-06-week-1-review/","section":"Posts","summary":"\u003cp\u003efirst week of may done. +$520.\u003c/p\u003e\n\u003cp\u003enot amazing but way better than april\u0026rsquo;s weekly average (-$3k/week).\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe numbers \n    \u003cdiv id=\"the-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003etrades this week:\u003c/strong\u003e\u003c/p\u003e","title":"week 1 review - small progress","type":"posts"},{"content":"","date":"4 May 2023","externalUrl":null,"permalink":"/tags/bugs/","section":"Tags","summary":"","title":"Bugs","type":"tags"},{"content":"","date":"4 May 2023","externalUrl":null,"permalink":"/tags/coding/","section":"Tags","summary":"","title":"Coding","type":"tags"},{"content":"found the bug that cost me $5k in april. took 6 hours but finally fucking fixed it.\nthe problem # selling options spreads. sometimes short leg gets assigned early (ITM before expiration).\nmy code didn\u0026rsquo;t handle this. kept treating it like an open position. meanwhile i\u0026rsquo;m holding naked long option with no hedge.\nhappened twice in april:\nfirst time: lost $2,800 before i noticed second time: lost $2,100 total damage: $4,900\nwhat i should\u0026rsquo;ve coded # def check_assignments(self): \u0026#34;\u0026#34;\u0026#34;Check for early assignments on short options\u0026#34;\u0026#34;\u0026#34; for position in self.open_positions: if position.is_short and position.option_type in [\u0026#39;call\u0026#39;, \u0026#39;put\u0026#39;]: # Query broker API for assignment assigned = self.broker.check_assignment(position.symbol) if assigned: self.handle_assignment(position) logger.warning(f\u0026#34;Assignment detected: {position.symbol}\u0026#34;) what i actually coded # nothing. literally no assignment detection at all.\njust assumed spreads would stay spreads until expiration or i closed them. dumb AF.\nthe fix # added assignment checking to my position monitor. runs every 15 minutes during market hours.\nif short leg assigned:\nimmediately close long leg log the assignment update position database recalculate risk exposure alert me via pushover notification also added backtest logic to simulate early assignments (using ITM probability distribution). now my backtests account for this.\ntesting the fix # can\u0026rsquo;t fully test without getting assigned (which is random). but paper trading should catch obvious issues.\nadded unit tests that mock assignment scenarios:\nITM assignment with profit ITM assignment with loss assignment near expiration assignment far from expiration all tests pass. code handles assignments correctly now.\nthe real cost # $4,900 in actual losses, but also:\nprobably another $2k in missed opportunities (was scared to trade while bug existed) week of stress wondering if i\u0026rsquo;d get assigned again lost confidence in my code lesson # when selling options you MUST handle:\nearly assignment risk dividend risk (for stock options) pin risk (at expiration) corporate actions i had none of this. just assumed happy path where spreads closed normally.\noptions trading is hard enough without your code actively fucking you.\ncode changes # class PositionMonitor: def __init__(self, broker): self.broker = broker self.check_interval = 900 # 15 minutes def monitor_loop(self): while market_open(): self.check_assignments() self.check_risk_limits() self.check_stop_losses() time.sleep(self.check_interval) def check_assignments(self): positions = self.broker.get_positions() for pos in positions: if pos.is_short_option: if self.broker.was_assigned(pos.symbol): self.handle_assignment(pos) def handle_assignment(self, position): # Close corresponding long leg immediately long_leg = self.find_long_leg(position) if long_leg: self.broker.close_position(long_leg, \u0026#39;ASSIGNMENT\u0026#39;) # Update internal state self.positions.remove(position) self.log_assignment(position) # Alert self.send_alert(f\u0026#34;Assignment: {position.symbol}\u0026#34;) not perfect but way better than before.\nmay so far # 3 days in, +$340 total. no assignments yet (knock on wood).\nsmaller position sizes helping. less stress. can actually focus on coding instead of panic-managing positions.\nif this month goes well, might finally feel like i know what i\u0026rsquo;m doing.\n3:47am. finally fixed this shit. gonna sleep better knowing assignments won\u0026rsquo;t fuck me anymore.\n-AK\n","date":"4 May 2023","externalUrl":null,"permalink":"/posts/2023-05-04-fixed-assignment-bug/","section":"Posts","summary":"\u003cp\u003efound the bug that cost me $5k in april. took 6 hours but finally fucking fixed it.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe problem \n    \u003cdiv id=\"the-problem\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-problem\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003eselling options spreads. sometimes short leg gets assigned early (ITM before expiration).\u003c/p\u003e","title":"fixed the fucking assignment bug","type":"posts"},{"content":"cut position sizes in half. only trading 3 strategies now.\nfirst day of may went\u0026hellip; fine? +$180 on one trade. nothing else triggered.\nnew risk rules # old position sizing: 2.5% risk per trade = $850 max loss (on $340k account)\nnew position sizing: 1.25% risk per trade = $425 max loss\nyeah it\u0026rsquo;s conservative AF but i need to extend runway. at old burn rate ($15k/month) i\u0026rsquo;d be broke by november. new sizing should cut that to ~$7k/month if strategies still suck.\nthe 3 strategies i\u0026rsquo;m keeping # 1. IV rank premium selling\nonly trade when IV rank \u0026gt; 45 (raised from 40) 50% profit target or 2 DTE -150% stop loss this one made money in march/april 2. volatility mean reversion\nlong options when VIX spike \u0026gt; 15% in single day hold 3-7 days for vol crush hasn\u0026rsquo;t worked yet but backtest is solid 3. earnings fade\nsell overpriced post-earnings premium only trade stocks that beat estimates but IV still elevated 1-3 day hold new strategy, testing with smallest size everything else paused. too much complexity was killing me.\nwhat i\u0026rsquo;m NOT doing anymore # momentum strategies (4 losing months straight) crypto arb (too much slippage) calendar spreads (too much theta decay uncertainty) anything requiring \u0026gt; 5 DTE hold (too much exposure) today\u0026rsquo;s trade # sold SPX put spread. credit $0.42, target $0.21. IV rank was 52.\nclosed at $0.20 for $180 profit after commissions.\nheld for 4 hours. done by 1pm.\nboring but profitable. that\u0026rsquo;s the goal now.\nmental state # honestly feel better trading smaller. less stress. can actually sleep when i have open positions.\napril was anxiety every fucking day. waking up at 2am checking futures. refreshing P\u0026amp;L every 10 minutes.\ntoday i checked twice. once at open, once before close. both times account was fine.\nmaybe this is what sustainable trading looks like? small wins, small losses, sleep at night.\nthe plan # if may ends between -$5k and +$5k i\u0026rsquo;ll call it success. would prove:\nstrategies work at smaller size risk management prevents blowups can scale back up slowly if may ends worse than -$10k, taking june completely off to rebuild everything from scratch.\n2:14am. couldn\u0026rsquo;t sleep so wrote this instead. hoping may is different.\n-AK\n","date":"2 May 2023","externalUrl":null,"permalink":"/posts/2023-05-02-may-day-1-smaller-bets/","section":"Posts","summary":"\u003cp\u003ecut position sizes in half. only trading 3 strategies now.\u003c/p\u003e\n\u003cp\u003efirst day of may went\u0026hellip; fine? +$180 on one trade. nothing else triggered.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003enew risk rules \n    \u003cdiv id=\"new-risk-rules\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#new-risk-rules\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003eold position sizing: 2.5% risk per trade = $850 max loss (on $340k account)\u003c/p\u003e","title":"may day 1 - smaller position sizes","type":"posts"},{"content":"april P\u0026amp;L: -$12,384 4-month total: -$60k\nnot improving fast enough.\nthe numbers # Figure 1: Monthly and cumulative P\u0026amp;L Jan-Apr 2023. Trend is slightly improving but still deep red.\nmonthly breakdown:\njanuary: -$22k (learning curve) february: -$18k (overfitting issues) march: -$8k (improving) april: -$12k (regression) thought i was improving in march. april proved me wrong.\nwhat went right # implemented new risk management (saved ~$8k in potential losses) fixed backtest assumptions (now realistic) automated greeks tracking switched to polygon.io data daily loss limit prevented blowup days what went wrong # still losing money overall new risk rules limited losses but also limited learning paper trading boring, went back live too early assignment bug cost $5k emotional discipline still shit year-to-date: -15% # started with $400k currently at $340k burn rate: $15k/month average\nat this rate: broke by november 2023\nneed to either:\nbecome profitable in next 2 months reduce position sizes even more (extend runway) get a real job (fuck that) break-even goal for may # not targeting profits yet. just want to not lose money.\nbreak-even would be huge progress. means:\nrisk management working strategies actually viable can scale up slowly lose another $15k in may? might be time to seriously reconsider this whole thing.\npersonal shit # broke up with J (finally) cleared out dad\u0026rsquo;s office therapy helping i guess still can\u0026rsquo;t sleep most nights considered pausing trading entirely, didn\u0026rsquo;t what i\u0026rsquo;m changing for may # 1. only trade 3 best strategies pausing everything else. too much complexity.\n2. smaller positions cutting size in half. rather make $5k slowly than lose $15k quickly.\n3. strict paper testing nothing goes live without 30 days paper trading first. no exceptions.\n4. weekly reviews every friday: analyze week, document lessons, adjust if needed\nthe question nobody asks # \u0026ldquo;why keep trading if you\u0026rsquo;re down $60k?\u0026rdquo;\nbecause:\ninheritance money specifically for this ($2M total, trading with $400k) already invested 4 months, quitting now = admitting total failure still believe algos can work if i unfuck my strategies alternative is getting regular job and i\u0026rsquo;d rather eat glass also: parents\u0026rsquo; life insurance paying for this education feels weirdly appropriate. they believed in me doing something entrepreneurial. trading counts.\nmay prediction # conservative: -$5k to +$2k realistic: -$10k pessimistic: -$20k\nif may ends worse than -$15k, taking june completely off to rebuild from scratch.\n11:45pm saturday. month-end reviews are depressing but necessary. may has to be better.\n-AK\n","date":"29 April 2023","externalUrl":null,"permalink":"/posts/2023-04-29-april-wrap/","section":"Posts","summary":"\u003cp\u003eapril P\u0026amp;L: -$12,384\n4-month total: -$60k\u003c/p\u003e\n\u003cp\u003enot improving fast enough.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe numbers \n    \u003cdiv id=\"the-numbers\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-numbers\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\n\n\n\n\n\n\n\u003cfigure\u003e\n    \u003cimg class=\"my-0 rounded-md\" loading=\"lazy\" alt=\"April Month Review\" src=\"/images/2023/04/2023-04-29-month-review.png\"\u003e\n\n  \n\u003c/figure\u003e\n\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eFigure 1: Monthly and cumulative P\u0026amp;L Jan-Apr 2023. Trend is slightly improving but still deep red.\u003c/em\u003e\u003c/p\u003e","title":"april wrap - down another 12k","type":"posts"},{"content":"","date":"29 April 2023","externalUrl":null,"permalink":"/tags/reality/","section":"Tags","summary":"","title":"Reality","type":"tags"},{"content":"","date":"27 April 2023","externalUrl":null,"permalink":"/tags/servers/","section":"Tags","summary":"","title":"Servers","type":"tags"},{"content":"current setup is working but thinking about upgrades. also might be procrastinating dealing with trading losses.\ncurrent setup # home server:\ndell poweredge r730 dual xeon e5-2680 v4 (28 cores total) 128gb ram 2x 1tb nvme ssd runs all my backtesting, monitoring, databases network:\nubiquiti dream machine pro 10gbe to server 1gbe internet (spectrum business) cost: paid $2,800 for server on ebay, $400 for networking\nworks fine. no latency issues for my current strategies (1-5 minute bars, not HFT).\nwhat i\u0026rsquo;m considering # colocation in chicago\nrent rack space near CME datacenter put dedicated server there sub-millisecond latency to exchange cost: $150-300/month + $2k for server\nquestion: do i actually need this? my strategies aren\u0026rsquo;t latency-sensitive. not doing market making or arbitrage.\nprobably not worth it until i\u0026rsquo;m profitable enough to afford burning $3k/year on colo.\nstorage upgrade # backtesting generates TB of data. currently at 800gb used on 1tb drives.\noptions:\nadd more nvme drives ($400 for 2x2tb) migrate old backtest data to spinning rust ($150 for 8tb HDD) leaning toward HDD for old data. don\u0026rsquo;t need nvme speeds for 2020 backtests i\u0026rsquo;ll never run again.\nthe real question # am i thinking about server upgrades because i need them? or because it\u0026rsquo;s easier than thinking about being down $60k?\nprobably the second one.\nservers are concrete problems with concrete solutions. trading losses are abstract pain with unclear path forward.\nwhat i actually need # less server upgrades, more strategy improvements.\nmy hardware can handle 100x my current trading volume. the bottleneck isn\u0026rsquo;t CPU or network latency.\nthe bottleneck is my strategies suck.\nbut also # the dell r730 is sick AF and i love having a server rack in my closet. LEDs everywhere. sounds like a jet engine. probably using $100/month in electricity.\nworth it? questionable. cool factor? 100%.\n3:22am. gonna price out the HDD storage upgrade but probably won\u0026rsquo;t buy anything. need to focus on trading not hardware.\n-AK\n","date":"27 April 2023","externalUrl":null,"permalink":"/posts/2023-04-27-server-upgrade-thoughts/","section":"Posts","summary":"\u003cp\u003ecurrent setup is working but thinking about upgrades. also might be procrastinating dealing with trading losses.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ecurrent setup \n    \u003cdiv id=\"current-setup\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#current-setup\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003ehome server:\u003c/strong\u003e\u003c/p\u003e","title":"thinking about server upgrades","type":"posts"},{"content":"after losing $60k in 4 months i finally built risk management that doesn\u0026rsquo;t suck.\nwhat wasn\u0026rsquo;t working # my \u0026ldquo;risk management\u0026rdquo; before:\nmax 2% risk per trade (i\u0026rsquo;d override this constantly) stop losses at -20% (never hit because options expire worthless first) \u0026ldquo;diversify across strategies\u0026rdquo; (all strategies correlated anyway) basically no real risk management. just guidelines i\u0026rsquo;d ignore when feeling confident.\nnew rules i can\u0026rsquo;t override # hard-coded into my execution engine. can\u0026rsquo;t trade without following these:\n1. daily loss limit: $2,000\ndef check_daily_limit(): today_pnl = get_todays_pnl() if today_pnl \u0026lt; -2000: disable_all_strategies() send_alert(\u0026#34;Daily limit hit: -$2000\u0026#34;) return False return True if i\u0026rsquo;m down $2k in a day, algo stops trading automatically. no override. done for the day.\n2. max position size: $15k per strategy\ndoesn\u0026rsquo;t matter what my account size is. single strategy can\u0026rsquo;t have \u0026gt;$15k at risk.\nforces diversification. can\u0026rsquo;t go all-in on one \u0026ldquo;sure thing\u0026rdquo; anymore.\n3. max portfolio heat: 30%\n\u0026ldquo;heat\u0026rdquo; = total capital at risk across all positions\nif 30% of my account ($108k currently) is at risk, no new positions until something closes.\nthe impact # Figure 1: Impact of new risk rules on losses (backtested on march 2023 data)\nif i had these rules in january:\naverage loss per trade: $3.2k → $1.8k max single loss: $8.5k → $3.5k losing days per month: 12 → 8 would\u0026rsquo;ve saved ~$25k over 4 months.\nthe hard part: following them # built the code. now comes the hard part: not fucking disabling it when i \u0026ldquo;know better\u0026rdquo;\nalready caught myself wanting to override daily limit twice this week. algo said \u0026ldquo;no more trades\u0026rdquo; at -$2k, i wanted to trade more to \u0026ldquo;make it back\u0026rdquo;\nresisted. logged out. went to the gym instead.\nportfolio heat calculation # this one\u0026rsquo;s tricky with options:\ndef calculate_portfolio_heat(): \u0026#34;\u0026#34;\u0026#34;Calculate total capital at risk\u0026#34;\u0026#34;\u0026#34; total_heat = 0 for position in get_open_positions(): if position.type == \u0026#39;option_spread\u0026#39;: # Risk = max loss on spread heat = position.max_loss elif position.type == \u0026#39;naked_option\u0026#39;: # Risk = position value (could go to zero) heat = position.market_value else: # Futures, stocks: use stop distance heat = abs(position.entry_price - position.stop_price) * position.quantity total_heat += heat account_value = get_account_equity() heat_percent = (total_heat / account_value) * 100 return heat_percent why 30% max heat # at 30% heat, if everything goes to zero simultaneously (unlikely), i lose 30% of account.\npainful but not account-ending. still have $250k+ to rebuild.\nat my old \u0026ldquo;no limit\u0026rdquo; approach, i had 70%+ heat during march. one bad day could\u0026rsquo;ve blown up the account.\nthe psychological benefit # knowing i can\u0026rsquo;t lose more than $2k in a day helps me sleep.\nbefore: would stay up until 2am worried about positions, checking markets now: hit $2k limit, algo stops, i can actually relax\nworth the opportunity cost of \u0026ldquo;missed gains\u0026rdquo; from being risk-off.\n2:58am. new risk rules deployed. let\u0026rsquo;s see if i can make it through may without hitting -$20k for the month.\n-AK\n","date":"25 April 2023","externalUrl":null,"permalink":"/posts/2023-04-25-risk-management-rules/","section":"Posts","summary":"\u003cp\u003eafter losing $60k in 4 months i finally built \u003ca\n  href=\"https://www.investopedia.com/trading/risk-management/\"\n    target=\"_blank\"\n  \u003erisk management\u003c/a\u003e that doesn\u0026rsquo;t suck.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ewhat wasn\u0026rsquo;t working \n    \u003cdiv id=\"what-wasnt-working\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#what-wasnt-working\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003emy \u0026ldquo;risk management\u0026rdquo; before:\u003c/p\u003e","title":"actual risk management rules that work","type":"posts"},{"content":"","date":"25 April 2023","externalUrl":null,"permalink":"/tags/stops/","section":"Tags","summary":"","title":"Stops","type":"tags"},{"content":"been avoiding it for 4 months. finally went through dad\u0026rsquo;s home office.\nwhat i found # his trading books (all outdated, pre-2000s stuff about fundamentals)\nframed photo of me at 8 years old\nbusiness cards from his biotech VP job\nnotes about stock options from his company (never exercised, company went under)\nrandom shit.\nthe hard part # his computer was still logged in. last thing he googled: \u0026ldquo;best restaurants la jolla new years eve 2022\u0026rdquo;\nthey were planning dinner for NYE. never made it. car crash killed them both around 9pm on their way to the restaurant.\ni was home coding a trading algorithm. didn\u0026rsquo;t even know they left.\nkept some stuff # took his engineering textbooks. probably won\u0026rsquo;t read them but feels wrong to throw out.\nfound $2,400 cash in his desk drawer. no idea why he had that much cash sitting around. adding it to my trading account i guess. down $59k so every bit helps.\nhis watch. nice omega speedmaster. worth like $8k. not selling it.\nthrew out most of it # donation boxes: clothes, books, random office supplies, old tech\ntrash: papers, receipts, broken electronics\nsold: his desk ($400), office chair ($150), monitors ($200)\nmom\u0026rsquo;s stuff is next # can\u0026rsquo;t deal with her closet yet. too much. all her real estate marketing materials, her awards, photos of properties she sold.\nmaybe next month. or next year. whatever.\nback to trading # paused live trading this week anyway (down $59k, needed a break). good timing to deal with this stuff.\ntherapist proud of me for \u0026ldquo;making progress on grief work.\u0026rdquo; sure. feels more like i just cleaned a room.\nJ texted asking to hang out. told her i\u0026rsquo;m busy. she\u0026rsquo;s getting clingy. probably done with her soon.\n4:09am. office is empty now. weird seeing it cleared out.\ndad would probably think my algo trading is dumb. mom would worry i\u0026rsquo;m stressed. both dead so their opinions don\u0026rsquo;t matter anymore.\nback to fixing my backtests.\n-AK\n","date":"23 April 2023","externalUrl":null,"permalink":"/posts/2023-04-23-dads-office/","section":"Posts","summary":"\u003cp\u003ebeen avoiding it for 4 months. finally went through dad\u0026rsquo;s home office.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ewhat i found \n    \u003cdiv id=\"what-i-found\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#what-i-found\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003ehis trading books (all outdated, pre-2000s stuff about fundamentals)\u003c/p\u003e","title":"cleared out dad's office today","type":"posts"},{"content":"your backtest is only as good as your data. spent $200/month on polygon.io and holy shit the difference vs free data.\nwhat i was using (bad) # alpha vantage free tier\n5 API calls per minute (fucking useless) 500 calls per day max data sometimes delayed 15+ minutes missing bars constantly greeks calculated from who knows what IV model backtested on this garbage data for 2 years. explains why my results don\u0026rsquo;t match live trading.\nwhat i switched to (good) # polygon.io pro plan ($199/month)\nunlimited API calls real-time data (websocket streams) clean OHLCV bars, no missing data proper options data with greeks historical data back to 2003 the data quality difference # pulled same SPX option data from both sources for april 15:\nalpha vantage:\n342 bars for trading day (missing 28 bars) greeks randomly null on 15% of bars bid-ask spread data completely wrong volume data doesn\u0026rsquo;t match actual exchange volume polygon:\n370 bars for trading day (complete) greeks on every bar accurate bid-ask spreads volume matches exchange reports when i reran my backtests on polygon data:\nsharpe dropped from 2.1 to 0.9 win rate dropped from 58% to 51% max drawdown increased from 12% to 22% basically my strategies looked way better on shitty data because the data had gaps i was accidentally exploiting.\ncost justification # $199/month sounds expensive for someone down $59k. but think about it:\nif bad data costs me $500/month in:\nmissed trades (bars missing) bad fills (wrong bid-ask spreads) wrong position sizing (bad greeks) then $199/month is worth it to avoid those losses.\nother options i looked at # IEX Cloud ($99/month)\ngood for stocks options data is meh no greeks ThetaData ($50/month)\namazing for options only historical, no real-time using this + polygon combo Bloomberg Terminal ($2,000/month)\nLMAO no overkill for retail algo trader the free vs paid debate # saw people on r/algotrading arguing you can trade successfully with free data.\nmaybe for daily/weekly timeframes. not for options with 30-60 day expiry where accurate greeks matter.\nswitching my entire workflow # migrating all my backtests to polygon data now. gonna take a week to:\ndownload all historical data i need (2020-2023) rerun every backtest rebuild strategies that fail with clean data test on paper before going back to live already seeing strategies that worked on alpha vantage completely fail on polygon data. good to know NOW before i lose another $10k.\n3:47am. $199/month hurts but losing $59k hurts more. data quality matters.\n-AK\n","date":"21 April 2023","externalUrl":null,"permalink":"/posts/2023-04-21-data-feeds-comparison/","section":"Posts","summary":"\u003cp\u003eyour backtest is only as good as your data. spent $200/month on polygon.io and holy shit the difference vs free data.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ewhat i was using (bad) \n    \u003cdiv id=\"what-i-was-using-bad\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#what-i-was-using-bad\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003ealpha vantage free tier\u003c/strong\u003e\u003c/p\u003e","title":"data feed comparison - polygon vs alpha vantage","type":"posts"},{"content":"options greeks change every second. tracking them manually is impossible. automated it.\nthe problem with static greeks # most platforms show you greeks at order time. cool. but what about 2 hours later when underlying moved 2%?\ndelta that was -0.30 is now -0.45. gamma accelerated. theta decay hit. your position risk completely changed.\nif you\u0026rsquo;re not tracking this in real-time, you\u0026rsquo;re flying blind.\nwhat i built # python script that:\nfetches live greeks every 5 seconds from ThetaData API calculates portfolio-level greeks (sum across all positions) stores in postgres for historical analysis alerts if portfolio delta \u0026gt;100 or gamma \u0026gt;50 Figure 1: Greeks evolution throughout the trading day for a short put spread position.\nwhy this matters # example from last week:\nopened SPX put spread: delta -0.25, gamma 0.015, theta -0.08\n3 hours later SPX dropped 1.5%. my greeks:\ndelta: -0.48 (almost doubled) gamma: 0.032 (more than doubled) theta: -0.12 position went from small delta exposure to \u0026ldquo;holy shit if SPX drops another 1% i\u0026rsquo;m fucked\u0026rdquo;\nmy automated system sent alert at delta -0.40. closed half the position. saved probably $2k when SPX continued dropping.\nintegration with IB # using ib_insync python library to pull greeks:\nfrom ib_insync import * import time class GreeksTracker: def __init__(self): self.ib = IB() self.ib.connect(\u0026#39;127.0.0.1\u0026#39;, 7497, clientId=1) def get_position_greeks(self, contract): \u0026#34;\u0026#34;\u0026#34;Fetch current greeks for a position\u0026#34;\u0026#34;\u0026#34; ticker = self.ib.reqTickers(contract)[0] greeks = { \u0026#39;delta\u0026#39;: ticker.modelGreeks.delta if ticker.modelGreeks else None, \u0026#39;gamma\u0026#39;: ticker.modelGreeks.gamma if ticker.modelGreeks else None, \u0026#39;theta\u0026#39;: ticker.modelGreeks.theta if ticker.modelGreeks else None, \u0026#39;vega\u0026#39;: ticker.modelGreeks.vega if ticker.modelGreeks else None, \u0026#39;timestamp\u0026#39;: time.time() } return greeks def track_portfolio_greeks(self): \u0026#34;\u0026#34;\u0026#34;Calculate portfolio-level greeks\u0026#34;\u0026#34;\u0026#34; positions = self.ib.positions() total_delta = 0 total_gamma = 0 total_theta = 0 total_vega = 0 for pos in positions: if pos.contract.secType == \u0026#39;OPT\u0026#39;: # Options only greeks = self.get_position_greeks(pos.contract) if greeks[\u0026#39;delta\u0026#39;]: total_delta += greeks[\u0026#39;delta\u0026#39;] * pos.position total_gamma += greeks[\u0026#39;gamma\u0026#39;] * pos.position total_theta += greeks[\u0026#39;theta\u0026#39;] * pos.position total_vega += greeks[\u0026#39;vega\u0026#39;] * pos.position return { \u0026#39;total_delta\u0026#39;: total_delta, \u0026#39;total_gamma\u0026#39;: total_gamma, \u0026#39;total_theta\u0026#39;: total_theta, \u0026#39;total_vega\u0026#39;: total_vega, \u0026#39;timestamp\u0026#39;: time.time() } the theta decay advantage # one benefit of tracking theta: can see exactly how much i\u0026rsquo;m collecting per day from selling premium.\nmy current positions theta: -$180/day (negative because i\u0026rsquo;m short options)\nthat means if nothing moves, i collect $180 every day from time decay. $180 * 20 trading days = $3,600/month passive income.\nexcept when SPX moves 2% and delta/gamma wipe out a week of theta gains in 10 minutes. but that\u0026rsquo;s options trading.\nalert thresholds # set up telegram alerts for:\nportfolio delta \u0026gt;100 (too directional) portfolio gamma \u0026gt;50 (too much convexity risk) theta \u0026lt;-$500/day (too much premium sold) any single position delta \u0026gt;30 (position too large) been super helpful. caught myself over-leveraged twice this week based on gamma alerts.\ncomparing to theoretical # also track difference between realized greeks and theoretical (black-scholes):\nif realized delta differs from BS delta by \u0026gt;10%, usually means:\nbad data feed assignment risk priced in wide bid-ask spread affecting greeks helps me spot when my greeks are bullshit vs when position actually changed.\n2:15am. greeks tracker running smooth. now i can see exactly how fucked i am in real-time instead of guessing.\n-AK\n","date":"18 April 2023","externalUrl":null,"permalink":"/posts/2023-04-18-greeks-automation/","section":"Posts","summary":"\u003cp\u003eoptions greeks change every second. tracking them manually is impossible. automated it.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe problem with static greeks \n    \u003cdiv id=\"the-problem-with-static-greeks\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-problem-with-static-greeks\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003emost platforms show you greeks at order time. cool. but what about 2 hours later when underlying moved 2%?\u003c/p\u003e","title":"automating options greeks tracking","type":"posts"},{"content":"SPX shit the bed friday. took me with it.\nweek P\u0026amp;L: -$8,142 total since jan: -$59k\nwhat happened # one of my short put spreads on SPX got assigned early. didn\u0026rsquo;t have a handler for that in my code. position sat open for 3 hours bleeding before i noticed.\nby the time i manually closed: -$5k on that single trade.\nthe other -$3k was normal strategy losses. still sucks.\nthe emotional part # hard not to spiral when you see -$59k in 3.5 months. that\u0026rsquo;s my parents\u0026rsquo; life insurance money. feels like i\u0026rsquo;m pissing away their legacy.\ntherapist asks \u0026ldquo;would they want you to keep trading?\u0026rdquo; honestly don\u0026rsquo;t know. dad would probably say figure it out or quit. mom would worry i\u0026rsquo;m stressed.\nboth are dead so can\u0026rsquo;t ask them.\ntaking a break # pausing live trading monday. going back to paper for at least a week.\nneed to:\nfix the assignment bug retest ALL my code with new slippage assumptions actually follow my own risk rules instead of overriding them losing $59k hurts but losing $150k would end this experiment.\nJ is getting annoying # girlfriend texted me like 40 times friday while i was dealing with this. \u0026ldquo;why aren\u0026rsquo;t you responding\u0026rdquo; \u0026ldquo;are you mad\u0026rdquo; \u0026ldquo;hello??\u0026rdquo;\ntold her i was working. she said \u0026ldquo;it\u0026rsquo;s 2pm on friday just take a break.\u0026rdquo;\ndoesn\u0026rsquo;t get it. when you\u0026rsquo;re down $5k you don\u0026rsquo;t just \u0026ldquo;take a break\u0026rdquo; you fix the fucking problem.\nprobably breaking up with her soon anyway.\n5:42am sunday. couldn\u0026rsquo;t sleep. thinking about whether this whole algo trading thing is viable or if i\u0026rsquo;m just burning money.\n90 days in, down 14.75%. not great.\n-AK\n","date":"16 April 2023","externalUrl":null,"permalink":"/posts/2023-04-16-down-8k-week/","section":"Posts","summary":"\u003cp\u003eSPX shit the bed friday. took me with it.\u003c/p\u003e\n\u003cp\u003eweek P\u0026amp;L: -$8,142\ntotal since jan: -$59k\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ewhat happened \n    \u003cdiv id=\"what-happened\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#what-happened\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003eone of my short put spreads on SPX got assigned early. didn\u0026rsquo;t have a handler for that in my code. position sat open for 3 hours bleeding before i noticed.\u003c/p\u003e","title":"down 8k this week","type":"posts"},{"content":"","date":"16 April 2023","externalUrl":null,"permalink":"/tags/emotional/","section":"Tags","summary":"","title":"Emotional","type":"tags"},{"content":"","date":"16 April 2023","externalUrl":null,"permalink":"/categories/trading-psychology/","section":"Categories","summary":"","title":"Trading Psychology","type":"categories"},{"content":"can\u0026rsquo;t fix what you don\u0026rsquo;t measure. built a grafana dashboard to track everything my algos are doing.\nwhy i need this # when strategies shit the bed, i need to know immediately. not 2 hours later when i check my phone and see -$5k.\nalso need historical data to analyze what went wrong. \u0026ldquo;my algo lost money\u0026rdquo; isn\u0026rsquo;t useful. \u0026ldquo;my algo\u0026rsquo;s sharpe dropped from 1.2 to 0.3 on april 12 at 10:47am\u0026rdquo; is actionable.\nthe stack # prometheus - scrapes metrics every 5 seconds grafana - visualizes everything in real-time dashboards postgres - stores trade history for longer-term analysis\nrunning all this on my home server (dell r730 in the closet). total cost: $0/month after initial $3k hardware investment.\nwhat i\u0026rsquo;m tracking # broke it into 4 dashboard categories:\n1. account metrics\ntotal equity (live updating) daily P\u0026amp;L buying power used margin utilization % 2. strategy performance\nP\u0026amp;L by strategy trades executed per strategy win rate (rolling 30 trades) sharpe ratio (rolling 30 days) current drawdown vs max drawdown 3. execution quality\norder fill time (target \u0026lt;100ms) slippage per trade rejected orders API latency to IB 4. system health\nCPU/RAM usage network latency database query time python process status custom metrics in python # instrumented all my strategy code with prometheus client:\nfrom prometheus_client import Counter, Histogram, Gauge import time # Define metrics trades_executed = Counter(\u0026#39;trades_executed_total\u0026#39;, \u0026#39;Total trades executed\u0026#39;, [\u0026#39;strategy\u0026#39;, \u0026#39;direction\u0026#39;]) trade_pnl = Histogram(\u0026#39;trade_pnl_dollars\u0026#39;, \u0026#39;P\u0026amp;L per trade in dollars\u0026#39;, [\u0026#39;strategy\u0026#39;]) position_size = Gauge(\u0026#39;position_size_current\u0026#39;, \u0026#39;Current position size\u0026#39;, [\u0026#39;strategy\u0026#39;, \u0026#39;symbol\u0026#39;]) slippage = Histogram(\u0026#39;slippage_ticks\u0026#39;, \u0026#39;Slippage in ticks\u0026#39;, [\u0026#39;order_type\u0026#39;]) class Strategy: def execute_trade(self, symbol, direction, quantity): start_time = time.time() # Place order order = self.broker.place_order(symbol, direction, quantity) # Track execution time execution_time = time.time() - start_time # Record metrics trades_executed.labels( strategy=self.name, direction=direction ).inc() # Calculate slippage expected_price = self.get_mid_price(symbol) actual_price = order.filled_price slippage_ticks = abs(expected_price - actual_price) / 0.01 slippage.labels(order_type=\u0026#39;market\u0026#39;).observe(slippage_ticks) # Update position gauge position_size.labels( strategy=self.name, symbol=symbol ).set(order.filled_quantity) return order alerts that saved my ass # set up alertmanager to send telegram messages when:\naccount down \u0026gt;2% in single day any strategy sharpe drops below 0.5 slippage \u0026gt;10 ticks on any trade system latency \u0026gt;500ms python process crashes already caught 2 bugs this week from alerts:\nstrategy tried to trade after market close (rejected orders spiked) database connection leaked, queries taking 5+ seconds seeing patterns in real-time # most useful: correlating performance drops with specific events\nexample: noticed sharpe ratio tanking every tuesday 10am. pulled up order logs. realized that\u0026rsquo;s when economic data releases, spreads widen, slippage spikes.\nsolution: pause trading 9:55-10:05am on econ release days. saved probably $500/week in slippage costs.\ncost: $0 ongoing # prometheus + grafana are free. postgres is free. running on hardware i already own.\nonly cost is time to set it up (~8 hours) and maintain dashboards (~1 hour/week).\ncompare to commercial solutions like trading view pro ($60/month) or proprietary platforms ($200-500/month). fuck that.\nsharing grafana config # might open source my grafana dashboard configs on github if anyone\u0026rsquo;s interested. pretty specific to my strategies but could be useful template.\n3:05am. dashboards are looking sick. now i can see my losses in beautiful real-time graphs instead of ugly broker statements.\n-AK\n","date":"14 April 2023","externalUrl":null,"permalink":"/posts/2023-04-14-grafana-monitoring/","section":"Posts","summary":"\u003cp\u003ecan\u0026rsquo;t fix what you don\u0026rsquo;t measure. built a grafana dashboard to track everything my algos are doing.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ewhy i need this \n    \u003cdiv id=\"why-i-need-this\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#why-i-need-this\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003ewhen strategies shit the bed, i need to know immediately. not 2 hours later when i check my phone and see -$5k.\u003c/p\u003e","title":"grafana monitoring setup for algo trading","type":"posts"},{"content":"my backtests showed +20% annual returns. i\u0026rsquo;m down 12.75% after 3 months live.\nsomething is very fucking wrong.\nthe numbers don\u0026rsquo;t match # Figure 1: Backtest returns (2020-2022 data) vs actual live performance (2023). Complete opposite.\nbacktests: steady positive returns every month live trading: steady losses every month\ni thought maybe just bad luck in Q1 2023. but this gap is too big to be variance. this is systematic failure.\nwhat i fucked up # spent today analyzing every difference between backtest and live. found 5 major issues:\n1. slippage assumptions\nbacktest assumed 1 tick slippage on options. reality is more like 3-5 ticks during volatile periods.\nFigure 2: My actual slippage is 3x what i modeled. Killing returns.\non a $100 option, that\u0026rsquo;s $0.30 vs $0.90-$1.50 slippage. multiply by 200+ trades per month and suddenly i\u0026rsquo;m down $2k-3k just from execution costs i didn\u0026rsquo;t model.\n2. overfitting to 2020-2022 bull market\nall my backtest data is from covid recovery bull market. 2023 is completely different regime:\nhigher rates (fed funds 0% → 4.5%) higher vol (VIX avg 16 → 22) sector rotation (tech bleeding, energy pumping) my strategies optimized for low vol, low rate environment. they\u0026rsquo;re dogshit in current market.\n3. commission assumptions\nthought IB options were $0.65/contract. they are. but i didn\u0026rsquo;t account for:\nexchange fees ($0.04-0.12 per contract) regulatory fees ($0.02 per contract) clearing fees total: ~$1.00-1.20 per contract all-in again, multiply by 200 contracts/month = $200-240 i didn\u0026rsquo;t model\n4. fill assumptions\nbacktested using mid-price fills. LMAO.\nin live trading i\u0026rsquo;m lucky to get filled at bid when selling, ask when buying. sometimes worse during fast markets.\nthis alone probably costs 0.5-1% per trade. on 50 trades/month that\u0026rsquo;s 25-50% of my returns gone.\n5. data quality\nused free alpha vantage data for backtests. missing bars, bad greeks, stale prices.\nswitched to polygon.io for live trading ($199/month). data is WAY cleaner but also shows my strategies were fitted to noisy data that no longer matches reality.\nthe overfit problem # here\u0026rsquo;s the brutal truth: i probably optimized my strategies to fit the noise in my shitty backtest data.\nclassic overfit mistake. my sharpe ratio of 2.1 in backtests? that was curve-fitted garbage.\nreal sharpe is probably 0.3-0.5 if i\u0026rsquo;m lucky. currently it\u0026rsquo;s -0.8 because i\u0026rsquo;m losing money.\nwhat i\u0026rsquo;m doing different # walk-forward testing: instead of optimizing on all 2020-2022 data, now i:\noptimize on 2020-2021 test on 2022 if 2022 works, optimize on 2020-2022 test on Q1 2023 paper trading this would\u0026rsquo;ve caught the regime change problem.\nrealistic costs: new backtest assumptions:\nslippage: 4 ticks average (conservative) commissions: $1.20 per contract all-in fills: always at bid/ask, never mid realistic order sizes (no assuming infinite liquidity) out-of-sample data: saving 20% of data for final validation. never touching it until strategy is 100% locked.\nregime filters: adding VIX filter. if VIX \u0026gt; 25, reduce position size or pause strategies that assume low vol.\nstarting over basically # these changes dropped my backtest sharpe from 2.1 to 0.6.\nthat\u0026rsquo;s\u0026hellip; more realistic but also depressing. means i need completely new strategies or accept that 10-15% annual returns is more realistic than the 50%+ i was dreaming about.\n2:31am and i should sleep but gonna rerun backtests with new assumptions. probably won\u0026rsquo;t finish until 5am but whatever.\nlive and learn. $51k tuition so far.\n-AK\n","date":"11 April 2023","externalUrl":null,"permalink":"/posts/2023-04-11-backtest-vs-live-wtf/","section":"Posts","summary":"\u003cp\u003emy backtests showed +20% annual returns. i\u0026rsquo;m down 12.75% after 3 months live.\u003c/p\u003e\n\u003cp\u003esomething is very fucking wrong.\u003c/p\u003e\n\n\u003ch2 class=\"relative group\"\u003ethe numbers don\u0026rsquo;t match \n    \u003cdiv id=\"the-numbers-dont-match\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-numbers-dont-match\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003e\n\n\n\n\n\n\n\u003cfigure\u003e\n    \u003cimg class=\"my-0 rounded-md\" loading=\"lazy\" alt=\"Backtest vs Live\" src=\"/images/2023/04/2023-04-11-backtest-vs-live.png\"\u003e\n\n  \n\u003c/figure\u003e\n\u003c/p\u003e","title":"backtest vs live - wtf happened","type":"posts"},{"content":"met J at pacific beach last weekend. brunette, great body, works in marketing at some startup downtown.\nbeen seeing her for like 5 days now. she\u0026rsquo;s fun. doesn\u0026rsquo;t ask too many questions about what i do which is nice. told her \u0026ldquo;i trade stocks from home\u0026rdquo; and she just said \u0026ldquo;cool\u0026rdquo; and moved on.\nhonestly refreshing after the last girl who wanted to see my charts and \u0026ldquo;learn about trading.\u0026rdquo; no thanks.\nthe usual pattern # probably give it 3-4 weeks max before i get bored. always happens. things are great for like 2 weeks then i start finding little things that annoy me.\nJ talks a lot. like A LOT. which is fine now but i can already tell it\u0026rsquo;ll get old. also she wants to hang out every night which\u0026hellip; no. i have algos to code.\ntrading while dating # lost another $3k this week. down $51k total now since january. J doesn\u0026rsquo;t know. probably won\u0026rsquo;t tell her unless she asks directly.\nhard to focus on fixing my position sizing code when she\u0026rsquo;s texting every hour. turned my phone on do not disturb during trading hours (9:30am-4pm). she noticed and asked if i was mad.\nnot mad, just need to focus.\nsan diego dating scene # been here my whole life (born july 4 2003, grew up in la jolla). dating scene is\u0026hellip; interesting. lots of hot girls, most are flaky AF or just want instagram content.\nJ seems more chill than most. we\u0026rsquo;ll see how long it lasts.\nparents would\u0026rsquo;ve liked her probably. mom always wanted me to \u0026ldquo;settle down\u0026rdquo; even though i was 19 when they died. not ready for that.\nanyway back to coding. she\u0026rsquo;s coming over later and i need to finish testing this volatility adjustment before tonight.\n-AK\n","date":"8 April 2023","externalUrl":null,"permalink":"/posts/2023-04-08-new-girl-j/","section":"Posts","summary":"\u003cp\u003emet J at pacific beach last weekend. brunette, great body, works in marketing at some startup downtown.\u003c/p\u003e\n\u003cp\u003ebeen seeing her for like 5 days now. she\u0026rsquo;s fun. doesn\u0026rsquo;t ask too many questions about what i do which is nice. told her \u0026ldquo;i trade stocks from home\u0026rdquo; and she just said \u0026ldquo;cool\u0026rdquo; and moved on.\u003c/p\u003e","title":"new girl J","type":"posts"},{"content":"been up since 3am coding a proper position sizing module. my current approach (fixed 2% risk per trade) is bleeding me out.\ndown another $8k this week. total drawdown now -$48k since january. at this rate i\u0026rsquo;ll be broke by august.\nthe problem with fixed % risk # everyone says \u0026ldquo;risk 2% per trade\u0026rdquo; like it\u0026rsquo;s some magic number. bullshit. here\u0026rsquo;s why it doesn\u0026rsquo;t work for algo trading:\nvolatility changes: SPX options in jan 2023 had VIX at 18. now it\u0026rsquo;s at 22. same 2% position size = different actual risk\ncorrelation: when all my strategies correlate (like during march banking crisis), i\u0026rsquo;m not risking 2% per trade, i\u0026rsquo;m risking 10%+ on correlated positions\ncapital efficiency: 2% on a $360k account is $7.2k risk per trade. but some of my option spreads only need $2k margin. why tie up extra capital?\nbacktested 4 different approaches # spent last 2 nights backtesting different position sizing methods on my 2020-2022 data:\nFigure 1: Backtest results for 4 position sizing strategies. Kelly Criterion wins on Sharpe.\nresults:\nFixed $10k: Sharpe 0.8, safe but underutilizes capital Fixed 2% Risk: Sharpe 1.2, what i\u0026rsquo;m using now (clearly not working live) Kelly Criterion: Sharpe 1.6, highest risk-adjusted returns Volatility-Adjusted: Sharpe 1.4, scales position based on VIX risk-return tradeoff # Figure 2: Risk vs return for each sizing method. Kelly has best return for risk taken.\nkelly criterion looks amazing in backtests but everyone says it\u0026rsquo;s too aggressive for live trading. probably right. the math assumes you know your exact win rate and payoff ratio. i definitely don\u0026rsquo;t after only 90 days live.\nmy new approach: volatility-adjusted kelly # built a hybrid that takes kelly formula but scales it down based on:\ncurrent VIX - when VIX \u0026gt; 20, reduce position size 30% strategy correlation - if another strategy has open position in correlated asset, reduce size 20% recent drawdown - if down \u0026gt;5% in past 10 days, reduce size 40% here\u0026rsquo;s the core logic (simplified):\ndef calculate_position_size(strategy, current_vix, active_positions, recent_pnl): \u0026#34;\u0026#34;\u0026#34; Volatility-adjusted Kelly position sizing Args: strategy: Strategy object with win_rate, avg_win, avg_loss current_vix: Current VIX level active_positions: List of currently open positions recent_pnl: P\u0026amp;L from last 10 trading days Returns: Position size in dollars \u0026#34;\u0026#34;\u0026#34; # Base Kelly fraction win_rate = strategy.win_rate avg_win = strategy.avg_win avg_loss = abs(strategy.avg_loss) # Kelly formula: f = (p*b - q) / b # where p = win rate, q = loss rate, b = win/loss ratio b = avg_win / avg_loss kelly_fraction = (win_rate * b - (1 - win_rate)) / b # Conservative: use 1/4 Kelly (recommended for live trading) position_fraction = kelly_fraction * 0.25 # Adjust for volatility vix_adjustment = 1.0 if current_vix \u0026gt; 20: vix_adjustment = 0.7 # Reduce 30% in high vol elif current_vix \u0026gt; 25: vix_adjustment = 0.5 # Reduce 50% in extreme vol position_fraction *= vix_adjustment # Check for correlated positions correlation_adjustment = 1.0 for pos in active_positions: if is_correlated(strategy.asset, pos.asset, threshold=0.6): correlation_adjustment *= 0.8 # Reduce 20% per correlated position position_fraction *= correlation_adjustment # Drawdown adjustment dd_adjustment = 1.0 if recent_pnl \u0026lt; -0.05: # Down \u0026gt;5% dd_adjustment = 0.6 # Reduce 40% during drawdown position_fraction *= dd_adjustment # Apply to account equity account_equity = get_account_equity() position_size = account_equity * position_fraction # Sanity checks MAX_POSITION = account_equity * 0.10 # Never risk \u0026gt;10% on single trade MIN_POSITION = 1000 # Minimum $1k position position_size = max(min(position_size, MAX_POSITION), MIN_POSITION) return position_size def is_correlated(asset1, asset2, threshold=0.6): \u0026#34;\u0026#34;\u0026#34;Check if two assets are correlated above threshold\u0026#34;\u0026#34;\u0026#34; # Fetch 30-day correlation from historical data correlation = calculate_correlation(asset1, asset2, days=30) return abs(correlation) \u0026gt; threshold def get_account_equity(): \u0026#34;\u0026#34;\u0026#34;Get current account equity from broker API\u0026#34;\u0026#34;\u0026#34; # Integration with Interactive Brokers API return ib_connection.account_summary()[\u0026#39;TotalCashValue\u0026#39;] testing it on paper first # not deploying this live yet. learned my lesson about jumping straight to live trading.\ngonna run this on paper for 2 weeks minimum. need to see:\ndoes it actually reduce position size during high vol? ✓ does correlation detection work? (testing now) does drawdown protection kick in correctly? ✓ what\u0026rsquo;s the max position size it generates? (need to verify not too aggressive) the math checks out but\u0026hellip; # backtests show this could\u0026rsquo;ve saved me $20k in losses during march. but backtests also showed my original strategies would work, so grain of salt.\nmain concern: am i over-engineering this? maybe the real problem isn\u0026rsquo;t position sizing, it\u0026rsquo;s that my strategies suck.\nbeen reading some algo trading discussions on reddit and seems like everyone struggles with this. some traders just use fixed fractional and call it a day.\nbut i\u0026rsquo;m down $48k in 3 months so i need to do SOMETHING different.\n4:23am. gonna test this on paper starting monday. if it works i\u0026rsquo;ll share the full code on github.\n-AK\n","date":"6 April 2023","externalUrl":null,"permalink":"/posts/2023-04-06-position-sizing-kill-me/","section":"Posts","summary":"\u003cp\u003ebeen up since 3am coding a proper position sizing module. my current approach (fixed 2% risk per trade) is bleeding me out.\u003c/p\u003e\n\u003cp\u003edown another $8k this week. total drawdown now -$48k since january. at this rate i\u0026rsquo;ll be broke by august.\u003c/p\u003e","title":"position sizing is killing me - fixing it with code","type":"posts"},{"content":"3 months into trading with real money and i\u0026rsquo;m down $40k. not what i expected but also exactly what i should\u0026rsquo;ve expected.\npaper trading for 3 years (2020-2022) gave me this false confidence that live trading would be similar. LMAO nope. completely different game when actual money is on the line.\nthe numbers don\u0026rsquo;t lie # started with $400k in january. sitting at $360k today. that\u0026rsquo;s a 10% drawdown in 90 days.\nFigure 1: My equity curve for the first 3 months of live trading. That\u0026rsquo;s a lot of red.\nthe worst part? i KNOW why this is happening:\nposition sizing too aggressive - started with 2% risk per trade, blew past that multiple times when \u0026ldquo;confident\u0026rdquo; over-optimized strategies - backtests looked amazing, forward testing not so much emotional trading - yeah i\u0026rsquo;m \u0026ldquo;100% algorithmic\u0026rdquo; but i keep manually stopping algos when they\u0026rsquo;re down market regime change - my 2020-2022 paper trading data doesn\u0026rsquo;t match 2023 market conditions distribution is brutal # Figure 2: Daily returns distribution. Mean is negative at -0.41%. Not good.\nfat left tail means my losing days are LOSING. like -5% to -8% kind of days. winning days are more consistent but smaller (+1% to +3%). classic asymmetric risk profile that\u0026rsquo;s bleeding me slowly.\navg daily return: -0.41% daily volatility: 2.33% sharpe ratio: fucking terrible (negative)\nvolatility is insane # Figure 3: 7-day rolling volatility (annualized). Averaging 35-40% which is way too high.\nmy vol is all over the place. some weeks i\u0026rsquo;m at 25% annualized (manageable), other weeks i\u0026rsquo;m hitting 50%+ (wtf am i doing).\nthis tells me my strategies aren\u0026rsquo;t consistent. probably because i keep tweaking them mid-trade based on P\u0026amp;L. need to stop doing that.\nwhat i\u0026rsquo;m changing # been thinking about this a lot at 2am when i can\u0026rsquo;t sleep (like right now). here\u0026rsquo;s the plan:\nposition sizing: cutting risk to 0.5% per trade max. yeah it\u0026rsquo;s conservative AF but i need to survive to learn\nstrategy freeze: picking my 3 best backtested strategies and running them for 60 days UNMODIFIED. no matter what happens. need real forward test data.\nemotional discipline: this is the hardest one. when i see -$5k day i want to shut everything down. need to trust the process or admit this doesn\u0026rsquo;t work.\nmarket analysis: spending more time understanding current regime vs historical data. 2023 ≠ 2021 bull market conditions.\nthe grief factor # NGL parents dying 3 months ago probably isn\u0026rsquo;t helping my decision making. some days i\u0026rsquo;m numb and trade fine. other days i\u0026rsquo;m emotional and make stupid decisions.\ntherapist says i\u0026rsquo;m using trading as distraction from grief. probably right. but also i need to figure this shit out because $400k → $360k → $0 is a path i can see happening if i don\u0026rsquo;t fix this.\ntuition paid so far: $40k # everyone says trading is expensive education. they\u0026rsquo;re right. $40k in 90 days is painful but could be worse.\nat this rate i\u0026rsquo;ll blow through $160k in a year. that\u0026rsquo;s\u0026hellip; not sustainable. need to fix this in Q2 or seriously reconsider the whole \u0026ldquo;full time trader\u0026rdquo; thing.\n2:47am and i should sleep but probably won\u0026rsquo;t. gonna review my position sizing code instead.\nif you\u0026rsquo;re thinking about going live with algos: expect to lose money at first. a lot of money. paper trading teaches you nothing about emotional discipline or real market conditions.\n-AK\n","date":"3 April 2023","externalUrl":null,"permalink":"/posts/2023-04-03-first-90-days-live-reality-check/","section":"Posts","summary":"\u003cp\u003e3 months into trading with real money and i\u0026rsquo;m down $40k. not what i expected but also exactly what i should\u0026rsquo;ve expected.\u003c/p\u003e\n\u003cp\u003epaper trading for 3 years (2020-2022) gave me this false confidence that live trading would be similar. LMAO nope. completely different game when actual money is on the line.\u003c/p\u003e","title":"first 90 days live - reality check","type":"posts"},{"content":"","date":"3 April 2023","externalUrl":null,"permalink":"/tags/learning/","section":"Tags","summary":"","title":"Learning","type":"tags"},{"content":" first month done # march 15 - march 31 (2.5 weeks live)\nwent from paper trading to real money. lost $180k in february learning. figured some shit out. went live march 15\nhere\u0026rsquo;s what happened\nfinal march numbers # trading performance:\ntotal trades: 14 wins: 10 losses: 4 win rate: 71.4% gross profit: $4,350 (winners) gross loss: $545 (losers) net P\u0026amp;L: $3,805 slippage cost: $285 return on $400k: 0.95% annualized: 11.4% sharpe ratio: 2.08 max drawdown: -1.2% vs backtest prediction:\npredicted return: 0.8% actual return: 0.95% prediction error: +19% (actual beat prediction) pretty fucking good for first month\nwhat worked # 1. the 50% profit rule\nclosed every winner at 50% profit or 2 DTE\nthis kept me from getting greedy and holding into risk\nexample: march 29 spread was up 65% but i closed at 50%. next day SPX gapped up and would\u0026rsquo;ve stopped me out for loss instead\n2. IV rank filtering\nonly sold premium when IV rank \u0026gt; 40\nkept me out of 6 shit setups where credits would\u0026rsquo;ve been terrible\nmarch 18-20 had low IV (rank 35-38). didn\u0026rsquo;t trade. saved probably $300 in losses\n3. position sizing\n2.5% risk per trade = $1,000 max loss\nlargest actual loss was $180. never came close to max\n5 positions max. hit that limit twice. prevented overleverage\n4. limit orders\nswitched to limit orders march 22\nsaved $4.20 per spread on average vs market orders\ntotal savings: ~$420 over 10 trades with limits\nwhat didn\u0026rsquo;t work # 1. stop losses too wide\nhad stops at -200% (spread doubles against me)\nhit max loss 4 times. should\u0026rsquo;ve cut earlier\napril plan: tighten to -150% and see if that reduces loss size without increasing stop frequency\n2. trade frequency\nonly 14 trades in 16 days. backtest assumed 20/month\nprobably left setups on table by being too conservative\nneed to be more aggressive when IV rank \u0026gt; 40 and setups appear\n3. slippage model\nmodel predicted $6.40 average slippage\nactual with limit orders was $4.85\nneed to update model or i\u0026rsquo;ll keep underestimating returns\nall 14 trades # date type credit outcome P\u0026amp;L hold days 3/15 call $0.85 win 50% $430 9 3/16 put $0.90 win 50% $445 8 3/17 call $0.70 loss -$95 2 3/17 put $0.75 win 50% $285 6 3/20 call $0.65 loss -$135 1 3/21 put $0.95 win 50% $475 7 3/22 call $0.88 win 50% $440 6 3/23 put $0.92 win 50% $460 5 3/24 call $0.78 loss -$150 2 3/27 put $0.82 win 2DTE $325 4 3/28 call $0.86 win 50% $430 5 3/29 put $0.98 win 50% $490 8 3/30 call $0.72 loss -$115 1 3/31 put $0.90 win 50% $370 6 average winner: $435 average loser: $124 win/loss ratio: 3.5:1\nlessons learned # backtesting works - predicted 0.8% return, got 0.95%. close enough to trust the model\nslippage is real but manageable - limit orders help a lot. market orders fuck you\n50% rule saves you - got tempted to hold for more profit 3 times. glad i stuck to rule\nposition sizing prevents disaster - never came close to blowing up because risk was controlled\nIV matters more than i thought - trading when IV rank \u0026lt; 40 is donating money to market makers\napril changes # going into april with these adjustments:\ntighten stops to -150% (from -200%) increase trade frequency - look for 20-22 trades in april update slippage model to assume $5 avg with limit orders add new IV filter (absolute IV \u0026gt; 18 AND percentile \u0026gt; 70) track correlation between positions to avoid overexposure the bigger picture # march 15 i had $220k left after losing $180k in february\nnow have $223,805 (0.95% gain)\nif i can average 1% per month for rest of year that\u0026rsquo;s $232k by december\nnot amazing but proves the strategy works\nyear 2 (2024) will be about scaling - more capital, more trades, same sharpe\npersonal shit # parents have been dead 13 weeks as of today\nsome days i don\u0026rsquo;t think about them at all. some days i can\u0026rsquo;t stop\ntrading helps. gives me something concrete to focus on\nM. and i are still seeing each other. 11 days now. she\u0026rsquo;s cool. probably won\u0026rsquo;t last but it\u0026rsquo;s fine\ntherapist says i\u0026rsquo;m \u0026ldquo;making progress\u0026rdquo; but i still don\u0026rsquo;t really know what that means\nanyway. march done. april starts tomorrow\nlet\u0026rsquo;s see if i can do this again\n-AK\n","date":"31 March 2023","externalUrl":null,"permalink":"/posts/2023-03-31-march-2023-review/","section":"Posts","summary":"\u003ch2 class=\"relative group\"\u003efirst month done \n    \u003cdiv id=\"first-month-done\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#first-month-done\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003emarch 15 - march 31 (2.5 weeks live)\u003c/p\u003e\n\u003cp\u003ewent from paper trading to real money. lost $180k in february learning. figured some shit out. went live march 15\u003c/p\u003e","title":"march 2023: first month live trading results","type":"posts"},{"content":"","date":"31 March 2023","externalUrl":null,"permalink":"/tags/march-2023/","section":"Tags","summary":"","title":"March-2023","type":"tags"},{"content":"","date":"30 March 2023","externalUrl":null,"permalink":"/tags/sharpe-ratio/","section":"Tags","summary":"","title":"Sharpe-Ratio","type":"tags"},{"content":" three weeks live = enough data for initial validation # march 15 - march 30 (15 trading days)\ntime to see if reality matches backtest\nthe numbers # live trading results:\ntotal trades: 12 wins: 9 losses: 3 win rate: 75% average win: $387 average loss: $128 net P\u0026amp;L: $2,099 return on $400k account: 0.52% annualized (if sustained): 12.5% sharpe ratio: 2.13 backtest prediction (march 2023):\nexpected trades: 14 expected win rate: 72% expected return: 0.48% expected sharpe: 1.64 performance vs prediction # metric backtest actual difference trades 14 12 -14% win rate 72% 75% +4% monthly return 0.48% 0.52% +8% sharpe ratio 1.64 2.13 +30% beating backtest by decent margin\nprobably luck. 3 weeks isn\u0026rsquo;t enough to validate but it\u0026rsquo;s encouraging\nwhy actual sharpe is higher # sharpe ratio = (return - risk_free_rate) / volatility\nmy returns are slightly higher (0.52% vs 0.48%)\nbut more importantly: volatility is lower\nbacktest assumed 8% monthly volatility based on 2021-2022 data\nactual volatility march 15-30: 5.2%\nlower vol = higher sharpe even with similar returns\ntrade-by-trade breakdown # 9 winners:\nmarch 15: $430 (50% target hit, 9 days) march 16: $395 (50% target hit, 8 days) march 17: $285 (50% target hit, 6 days) march 21: $445 (50% target hit, 7 days) march 22: $380 (50% target hit, 6 days) march 23: $410 (50% target hit, 5 days) march 27: $325 (2 DTE close, 4 days) march 28: $360 (50% target hit, 5 days) march 29: $455 (50% target hit, 8 days) 3 losses:\nmarch 17: -$95 (stopped out, spread widened against me) march 20: -$135 (stopped out, volatility spike) march 24: -$150 (stopped out, tested short strike) average hold time for winners: 6.4 days average hold time for losers: 2.1 days\nlosers get stopped faster (good). winners have time to work\nslippage tracking # total slippage march 15-30: $238\n12 trades × avg $6.40 slippage per spread × 10 contracts = $768 theoretical\nactual was $238\nway better than model predicted\nwhy? i started using limit orders on march 22 instead of market orders\nsaves $3-4 per spread but adds execution risk (sometimes don\u0026rsquo;t get filled)\ngot filled on 8 out of 10 limit orders. 2 times had to cancel and re-submit at market\nnet result: lower slippage without missing too many trades\nposition sizing validation # been risking 2.5% per trade ($1,000 max loss per spread, 10 contracts)\nmax portfolio heat hit: 12.5% (5 positions open simultaneously on march 23)\nwithin my 15% limit. good\nlargest loss was $150 = 0.0375% of account\neven if i hit 5 max losses in a row (unlikely): 0.1875% drawdown\nsurvivable\nwhat\u0026rsquo;s working # 50% profit target - hitting it 75% of the time IV rank \u0026gt; 40 filter - keeping me out of low premium environments 2 DTE exit - prevents holding into risky expiration limit orders - reducing slippage meaningfully position sizing - keeping losses small what needs improvement # stop loss discipline - 3 losses were all near max loss ($150). could\u0026rsquo;ve cut earlier trade frequency - only 12 trades in 15 days. backtest assumed 14. need to be more aggressive when setups appear slippage model - still predicting $6.40 average but actual is $4.80 with limit orders. need to update next week priorities # update slippage model with limit order assumptions tighten stop loss from -200% to -150% (exit when spread doubles, not when it hits max loss) look for more trade opportunities - might be leaving setups on table march isn\u0026rsquo;t over yet (one more day) but this is solid progress\nif i can maintain sharpe \u0026gt; 1.8 over next 3 months that would validate the strategy for real\n-AK\n","date":"30 March 2023","externalUrl":null,"permalink":"/posts/2023-03-30-week-3-performance-review/","section":"Posts","summary":"\u003ch2 class=\"relative group\"\u003ethree weeks live = enough data for initial validation \n    \u003cdiv id=\"three-weeks-live--enough-data-for-initial-validation\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#three-weeks-live--enough-data-for-initial-validation\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003emarch 15 - march 30 (15 trading days)\u003c/p\u003e","title":"week 3 performance: sharpe 2.1 actual vs 1.64 backtest","type":"posts"},{"content":"been avoiding it for 3 months\nmy dad had a workshop in the garage. tools, half-finished projects, his workbench\nbeen closed since december 31st\ntoday i finally opened the door\nwhat i found # his last project was still on the bench. some kind of wooden box he was building. sanded halfway, pencil marks on the sides where he measured cuts\ndrill bits organized by size. hand tools hung on pegboard. everything labeled\nhe was precise about his tools. always put shit back in the right spot. always cleaned them after using\ni\u0026rsquo;m the opposite. my server rack is a fucking mess of cables. monitors everywhere. nothing organized\nwe were different like that\nthe letter # found a letter in his toolbox. dated november 2022. two months before he died\naddressed to me. never sent\nit was about his stock options. he\u0026rsquo;d been at the biotech startup for 8 years. options were about to vest in january 2023\nletter explained the tax implications, when to exercise, how to minimize capital gains\nhe was planning to talk to me about it over christmas\nthey died december 31st. never had that conversation\noptions vested anyway in january. i sold them all in february. used the money to fund my trading account\n$180k of that is gone now. tuition for learning to trade\ndon\u0026rsquo;t know if he\u0026rsquo;d be proud or pissed\nmom\u0026rsquo;s stuff # haven\u0026rsquo;t touched her things yet. still in their bedroom. clothes in the closet. makeup on the bathroom counter\ncan\u0026rsquo;t do it yet\ndad\u0026rsquo;s workshop was easier somehow. tools are just tools. but mom\u0026rsquo;s stuff is different\ntherapist says there\u0026rsquo;s no timeline for this shit. you do it when you\u0026rsquo;re ready\ni\u0026rsquo;m not ready for mom\u0026rsquo;s stuff\nwhat i kept # took his drill. nice dewalt cordless. might actually use it\ntook the wooden box. gonna try to finish it even though i have no idea what i\u0026rsquo;m doing\nleft most of the other tools. gonna donate them or sell them eventually\nthe letter\u0026rsquo;s in my desk drawer now\nback to normal tomorrow # spent most of today in the garage. now it\u0026rsquo;s almost midnight and i haven\u0026rsquo;t checked my positions\nprobably should do that before i sleep\ntrading is easier than grief\nyou know the rules with trading. sell premium when IV rank \u0026gt; 40. close at 50% profit. risk 2.5% per trade\ngrief doesn\u0026rsquo;t have rules. you just feel like shit randomly and can\u0026rsquo;t predict when\ni prefer trading\n-AK\n","date":"28 March 2023","externalUrl":null,"permalink":"/posts/2023-03-28-dads-workshop/","section":"Posts","summary":"\u003cp\u003ebeen avoiding it for 3 months\u003c/p\u003e\n\u003cp\u003emy dad had a workshop in the garage. tools, half-finished projects, his workbench\u003c/p\u003e\n\u003cp\u003ebeen closed since december 31st\u003c/p\u003e\n\u003cp\u003etoday i finally opened the door\u003c/p\u003e","title":"cleaned out dad's workshop today","type":"posts"},{"content":"","date":"28 March 2023","externalUrl":null,"permalink":"/tags/memories/","section":"Tags","summary":"","title":"Memories","type":"tags"},{"content":"","date":"27 March 2023","externalUrl":null,"permalink":"/tags/backtest/","section":"Tags","summary":"","title":"Backtest","type":"tags"},{"content":" the IV rank problem # my original algo only sells premium when IV rank \u0026gt; 40\nIV rank = where current IV sits relative to its 52-week range\nformula: (current_IV - 52_week_low) / (52_week_high - 52_week_low) * 100\nif IV rank is 60, that means current IV is at 60th percentile of its annual range\nproblem: IV rank alone doesn\u0026rsquo;t tell you if premium is actually rich\nexample from last week:\nmarch 20: IV rank was 42, but actual IV was only 14 march 21: IV rank was 41, but actual IV was 22 both trades qualified (IV rank \u0026gt; 40) but march 21 had way better premium despite similar IV rank\ni was leaving money on the table\nthe upgrade # added two more filters on top of IV rank:\nabsolute IV threshold: current IV must be \u0026gt; 18 IV percentile: current IV must be in top 30% vs 90-day rolling average here\u0026rsquo;s the implementation:\nimport pandas as pd import numpy as np from datetime import datetime, timedelta class VolatilityFilter: \u0026#34;\u0026#34;\u0026#34; Enhanced volatility filtering for premium selling Combines IV rank, absolute IV, and IV percentile \u0026#34;\u0026#34;\u0026#34; def __init__(self, min_iv_rank=40, min_absolute_iv=18, min_iv_percentile=70): self.min_iv_rank = min_iv_rank self.min_absolute_iv = min_absolute_iv self.min_iv_percentile = min_iv_percentile # cache for IV history self.iv_history = [] def calculate_iv_rank(self, current_iv, iv_history_52w): \u0026#34;\u0026#34;\u0026#34; Calculate IV rank (52-week) Args: current_iv: Current implied volatility iv_history_52w: Series of IV values over past 52 weeks Returns: IV rank (0-100) \u0026#34;\u0026#34;\u0026#34; iv_min = iv_history_52w.min() iv_max = iv_history_52w.max() if iv_max == iv_min: return 50.0 # neutral if no range iv_rank = ((current_iv - iv_min) / (iv_max - iv_min)) * 100 return iv_rank def calculate_iv_percentile(self, current_iv, iv_history_90d): \u0026#34;\u0026#34;\u0026#34; Calculate what percentile current IV is vs 90-day history Args: current_iv: Current IV iv_history_90d: Series of IV values over past 90 days Returns: Percentile (0-100) \u0026#34;\u0026#34;\u0026#34; below_current = (iv_history_90d \u0026lt; current_iv).sum() total_days = len(iv_history_90d) percentile = (below_current / total_days) * 100 return percentile def should_sell_premium(self, current_iv, iv_52w, iv_90d): \u0026#34;\u0026#34;\u0026#34; Determine if conditions are right to sell premium Args: current_iv: Current IV level iv_52w: 52-week IV history iv_90d: 90-day IV history Returns: tuple: (should_sell: bool, reason: str, metrics: dict) \u0026#34;\u0026#34;\u0026#34; # calculate all metrics iv_rank = self.calculate_iv_rank(current_iv, iv_52w) iv_percentile = self.calculate_iv_percentile(current_iv, iv_90d) metrics = { \u0026#39;current_iv\u0026#39;: current_iv, \u0026#39;iv_rank\u0026#39;: iv_rank, \u0026#39;iv_percentile\u0026#39;: iv_percentile, \u0026#39;52w_min\u0026#39;: iv_52w.min(), \u0026#39;52w_max\u0026#39;: iv_52w.max(), \u0026#39;90d_avg\u0026#39;: iv_90d.mean() } # check all three filters checks = { \u0026#39;iv_rank\u0026#39;: iv_rank \u0026gt;= self.min_iv_rank, \u0026#39;absolute_iv\u0026#39;: current_iv \u0026gt;= self.min_absolute_iv, \u0026#39;iv_percentile\u0026#39;: iv_percentile \u0026gt;= self.min_iv_percentile } # all must pass should_sell = all(checks.values()) # build reason string if should_sell: reason = f\u0026#34;✅ All filters passed - IV rank {iv_rank:.1f}, Absolute IV {current_iv:.1f}, Percentile {iv_percentile:.1f}\u0026#34; else: failed = [k for k, v in checks.items() if not v] reason = f\u0026#34;❌ Failed: {\u0026#39;, \u0026#39;.join(failed)}\u0026#34; return should_sell, reason, metrics def get_premium_quality_score(self, current_iv, iv_52w, iv_90d): \u0026#34;\u0026#34;\u0026#34; Score from 0-100 indicating how attractive premium is Higher = better opportunity \u0026#34;\u0026#34;\u0026#34; iv_rank = self.calculate_iv_rank(current_iv, iv_52w) iv_percentile = self.calculate_iv_percentile(current_iv, iv_90d) # normalize absolute IV (assume 10-40 range, clip extremes) iv_normalized = np.clip((current_iv - 10) / 30, 0, 1) * 100 # weighted average of all three score = ( iv_rank * 0.4 + # 40% weight on IV rank iv_normalized * 0.3 + # 30% weight on absolute IV iv_percentile * 0.3 # 30% weight on IV percentile ) return score # integration with main strategy class SPXCreditSpreadStrategy(bt.Strategy): \u0026#34;\u0026#34;\u0026#34; Credit spread strategy with enhanced volatility filtering \u0026#34;\u0026#34;\u0026#34; params = ( (\u0026#39;min_iv_rank\u0026#39;, 40), (\u0026#39;min_absolute_iv\u0026#39;, 18), (\u0026#39;min_iv_percentile\u0026#39;, 70), (\u0026#39;max_positions\u0026#39;, 5), ) def __init__(self): super().__init__() self.vol_filter = VolatilityFilter( min_iv_rank=self.params.min_iv_rank, min_absolute_iv=self.params.min_absolute_iv, min_iv_percentile=self.params.min_iv_percentile ) def next(self): # get current IV data current_iv = self.get_current_iv(\u0026#39;SPX\u0026#39;) iv_52w = self.get_iv_history(days=365) iv_90d = self.get_iv_history(days=90) # check if we should sell premium should_sell, reason, metrics = self.vol_filter.should_sell_premium( current_iv, iv_52w, iv_90d ) if not should_sell: self.log(f\u0026#34;Skipping - {reason}\u0026#34;) return # get premium quality score quality_score = self.vol_filter.get_premium_quality_score( current_iv, iv_52w, iv_90d ) self.log(f\u0026#34;Premium quality: {quality_score:.1f}/100\u0026#34;) # only trade if quality score \u0026gt; 60 if quality_score \u0026lt; 60: self.log(f\u0026#34;Quality score too low: {quality_score:.1f}\u0026#34;) return # proceed with trade entry self.log(f\u0026#34;✅ Entering trade - {reason}\u0026#34;) # ... rest of entry logic ... backtest comparison # ran 2021-2022 backtest with old vs new filtering:\nold filter (IV rank \u0026gt; 40 only):\ntrades per year: 240 win rate: 72% annual return: 14.3% sharpe: 1.64 new filter (IV rank + absolute IV + percentile):\ntrades per year: 186 win rate: 78% annual return: 15.7% sharpe: 1.81 fewer trades but way better quality\nthe new filter caught 4 periods in 2022 where IV rank was elevated but absolute IV was still low (june, september, november, december)\nthose months i would\u0026rsquo;ve sold premium for shit credits. new filter kept me out\nmarch performance # applied new filter retroactively to march:\nmarch 15: would\u0026rsquo;ve traded (IV rank 48, abs IV 22, percentile 82) ✅ march 17: would NOT have traded (IV rank 42, abs IV 16, percentile 55) ❌ march 20: would NOT have traded (IV rank 41, abs IV 14, percentile 48) ❌ march 21: would\u0026rsquo;ve traded (IV rank 45, abs IV 22, percentile 75) ✅ i actually did trade march 17 and march 20 with old filter. both were mediocre:\nmarch 17: $0.70 credit (low) march 20: $0.65 credit (really low) if i\u0026rsquo;d had new filter running, i would\u0026rsquo;ve skipped those and waited for better setups\ngoing live april 1 # new filter goes into production april 1\nexpecting fewer trades but higher win rate and better returns per trade\nwill track actual results and compare to backtest prediction\n-AK\n","date":"27 March 2023","externalUrl":null,"permalink":"/posts/2023-03-27-iv-rank-filter-upgrade/","section":"Posts","summary":"\u003ch2 class=\"relative group\"\u003ethe IV rank problem \n    \u003cdiv id=\"the-iv-rank-problem\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-iv-rank-problem\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003emy original algo only sells premium when IV rank \u0026gt; 40\u003c/p\u003e\n\u003cp\u003e\u003ca\n  href=\"https://www.tastytrade.com/definitions/iv-rank\"\n    target=\"_blank\"\n  \u003eIV rank\u003c/a\u003e = where current IV sits relative to its 52-week range\u003c/p\u003e","title":"upgraded IV rank filtering","type":"posts"},{"content":"closed my SPX 4300/4310 call spread this morning for 50% profit\nopened march 15 at $0.85 credit. closed today at $0.42 debit\nnet profit: $0.43 per spread = $430 on 10 contracts\nheld for 9 days. that\u0026rsquo;s 4.8% return per day on capital at risk\nthe numbers # entry: march 15, $0.85 credit ($850 collected) max risk: $1,000 - $850 = $150 per spread ($1,500 total on 10 contracts) exit: march 24, $0.42 buyback ($420 paid) profit: $850 - $420 = $430 return on risk: $430 / $1,500 = 28.7% hold time: 9 days daily return: 3.2% compounded fuck yeah\nwhy i closed at 50% # my rule is close at 50% profit or 2 DTE, whichever comes first\nthis spread had 5 DTE left (expires march 29) but hit 50% today so i closed\nlearned this from reading tastyworks research - closing at 50% maximizes win rate and reduces tail risk\ncould\u0026rsquo;ve held for more profit but risk/reward gets worse the longer you hold\nwhat went right # opened when IV rank was 48 (elevated volatility = higher premium) SPX stayed below 4300 entire time (never threatened short strike) theta decay worked exactly as expected slippage on close was only $3 (better than my $6 average) current positions # still have 2 open:\nSPX 4280/4290 put spread (march 24 exp) - up 35%, watching for 50% SPX 4320/4330 call spread (march 29 exp) - up 18%, need more time march stats so far:\ntrades: 5 closed: 3 wins: 2 losses: 1 open: 2 win rate: 66% net profit: $545 on track for +2.5% month if current positions close near targets\n-AK\n","date":"24 March 2023","externalUrl":null,"permalink":"/posts/2023-03-24-closed-first-profitable-spread/","section":"Posts","summary":"\u003cp\u003eclosed my SPX 4300/4310 call spread this morning for 50% profit\u003c/p\u003e\n\u003cp\u003eopened march 15 at $0.85 credit. closed today at $0.42 debit\u003c/p\u003e\n\u003cp\u003enet profit: $0.43 per spread = $430 on 10 contracts\u003c/p\u003e","title":"first 50% profit close","type":"posts"},{"content":"","date":"24 March 2023","externalUrl":null,"permalink":"/tags/profit-target/","section":"Tags","summary":"","title":"Profit-Target","type":"tags"},{"content":"","date":"24 March 2023","externalUrl":null,"permalink":"/tags/win/","section":"Tags","summary":"","title":"Win","type":"tags"},{"content":" the slippage problem is worse than i thought # after 2 weeks live trading (10 total trades), my average slippage is $6.40 per spread\nthat\u0026rsquo;s $640 per 100 trades. at 240 trades per year (20/month avg), that\u0026rsquo;s $1,536 annual drag\non a $400k account that\u0026rsquo;s 0.384% annual slippage cost\nsounds small. but when your gross return is 18% and slippage takes 0.4%, you\u0026rsquo;re down to 17.6% net\nsharpe ratio drops from 1.9 to 1.78\nmore importantly: my backtest didn\u0026rsquo;t model slippage correctly\nwhat i was doing wrong # old backtest assumed fixed $0.05 slippage per option leg\nso on a $10 wide credit spread:\nsell short leg at $2.20 buy long leg at $1.35 net credit: $0.85 backtest slippage: $0.05 backtest fill: $0.80 problem: real slippage varies based on bid-ask spread width and market conditions\non march 21 (yesterday) the bid-ask on my short leg was $0.12 wide. i got filled at bid + $0.03. that\u0026rsquo;s $3 slippage on one leg\nold model would\u0026rsquo;ve assumed $5 slippage total. reality was $8\nthe new model # built a lively slippage estimator based on actual fills\nhere\u0026rsquo;s the code (integrated into my backtrader strategy):\nimport numpy as np import pandas as pd from datetime import datetime class DynamicSlippageModel: \u0026#34;\u0026#34;\u0026#34; Models realistic slippage for SPX credit spreads based on: - Bid-ask spread width - Time of day - VIX level (volatility) - Days to expiration \u0026#34;\u0026#34;\u0026#34; def __init__(self): # historical fill data from live trading self.fill_history = [] self.bid_ask_history = [] def estimate_slippage(self, option_price, dte, vix_level, time_of_day): \u0026#34;\u0026#34;\u0026#34; Estimate slippage for a single option leg Args: option_price: Mid price of option dte: Days to expiration vix_level: Current VIX reading time_of_day: Hour (0-23) Returns: Estimated slippage in dollars \u0026#34;\u0026#34;\u0026#34; # base slippage is function of option price # cheaper options have wider relative spreads if option_price \u0026lt; 0.50: base_slippage = 0.03 elif option_price \u0026lt; 1.00: base_slippage = 0.04 elif option_price \u0026lt; 2.00: base_slippage = 0.05 else: base_slippage = 0.06 # adjust for DTE (closer to expiration = wider spreads) if dte \u0026lt;= 2: dte_multiplier = 1.5 elif dte \u0026lt;= 5: dte_multiplier = 1.2 else: dte_multiplier = 1.0 # adjust for VIX (high vol = wider spreads) if vix_level \u0026gt; 30: vix_multiplier = 1.4 elif vix_level \u0026gt; 20: vix_multiplier = 1.2 else: vix_multiplier = 1.0 # adjust for time of day # 9:30-10:30 AM EST has tightest spreads (high volume) # after 3pm spreads widen if 9 \u0026lt;= time_of_day \u0026lt;= 10: # 9:30-10:30 EST time_multiplier = 1.0 elif 15 \u0026lt;= time_of_day \u0026lt;= 16: # 3pm-4pm EST time_multiplier = 1.3 else: time_multiplier = 1.15 # calculate total slippage slippage = base_slippage * dte_multiplier * vix_multiplier * time_multiplier return slippage def record_fill(self, expected_price, actual_price, bid_ask_width, dte, vix, time_of_day): \u0026#34;\u0026#34;\u0026#34; Record actual fill for model improvement \u0026#34;\u0026#34;\u0026#34; fill_data = { \u0026#39;timestamp\u0026#39;: datetime.now(), \u0026#39;expected\u0026#39;: expected_price, \u0026#39;actual\u0026#39;: actual_price, \u0026#39;slippage\u0026#39;: expected_price - actual_price, \u0026#39;bid_ask_width\u0026#39;: bid_ask_width, \u0026#39;dte\u0026#39;: dte, \u0026#39;vix\u0026#39;: vix, \u0026#39;time\u0026#39;: time_of_day } self.fill_history.append(fill_data) def get_average_slippage(self, lookback_trades=20): \u0026#34;\u0026#34;\u0026#34; Calculate average slippage from recent fills \u0026#34;\u0026#34;\u0026#34; if len(self.fill_history) \u0026lt; lookback_trades: return 0.05 # default assumption recent = self.fill_history[-lookback_trades:] slippages = [f[\u0026#39;slippage\u0026#39;] for f in recent] return np.mean(slippages) def backtest_with_slippage(self, trades_df): \u0026#34;\u0026#34;\u0026#34; Apply slippage model to backtest trades Args: trades_df: DataFrame with columns [entry_price, exit_price, dte_entry, dte_exit, vix_entry, vix_exit, time_entry, time_exit] Returns: DataFrame with slippage-adjusted returns \u0026#34;\u0026#34;\u0026#34; results = [] for idx, trade in trades_df.iterrows(): # entry slippage (we\u0026#39;re selling, so we get worse price) entry_slip = self.estimate_slippage( trade[\u0026#39;entry_price\u0026#39;], trade[\u0026#39;dte_entry\u0026#39;], trade[\u0026#39;vix_entry\u0026#39;], trade[\u0026#39;time_entry\u0026#39;] ) # exit slippage (we\u0026#39;re buying back, so we pay more) exit_slip = self.estimate_slippage( trade[\u0026#39;exit_price\u0026#39;], trade[\u0026#39;dte_exit\u0026#39;], trade[\u0026#39;vix_exit\u0026#39;], trade[\u0026#39;time_exit\u0026#39;] ) # calculate adjusted P\u0026amp;L # for credit spreads: profit = entry_price - exit_price theoretical_pnl = trade[\u0026#39;entry_price\u0026#39;] - trade[\u0026#39;exit_price\u0026#39;] actual_pnl = (trade[\u0026#39;entry_price\u0026#39;] - entry_slip) - (trade[\u0026#39;exit_price\u0026#39;] + exit_slip) results.append({ \u0026#39;trade_id\u0026#39;: idx, \u0026#39;theoretical_pnl\u0026#39;: theoretical_pnl, \u0026#39;actual_pnl\u0026#39;: actual_pnl, \u0026#39;slippage_cost\u0026#39;: theoretical_pnl - actual_pnl, \u0026#39;entry_slip\u0026#39;: entry_slip, \u0026#39;exit_slip\u0026#39;: exit_slip }) return pd.DataFrame(results) # integration with backtrader strategy class SPXCreditSpreadWithSlippage(bt.Strategy): \u0026#34;\u0026#34;\u0026#34; Original strategy with realistic slippage modeling \u0026#34;\u0026#34;\u0026#34; def __init__(self): super().__init__() self.slippage_model = DynamicSlippageModel() def next(self): # ... strategy logic ... # when placing order, estimate slippage current_vix = self.get_vix() current_hour = self.datas[0].datetime.datetime(0).hour dte = self.get_dte_for_target() theoretical_credit = self.calculate_spread_price(short_strike, long_strike) # estimate slippage for both legs short_slippage = self.slippage_model.estimate_slippage( short_price, dte, current_vix, current_hour ) long_slippage = self.slippage_model.estimate_slippage( long_price, dte, current_vix, current_hour ) # adjust expected fill expected_credit = theoretical_credit - short_slippage - long_slippage # place order with adjusted expectations self.sell_spread(short_strike, long_strike, expected_credit) def notify_trade(self, trade): \u0026#34;\u0026#34;\u0026#34; Record actual fills for model improvement \u0026#34;\u0026#34;\u0026#34; if trade.isclosed: # extract actual fill prices and record self.slippage_model.record_fill( expected_price=trade.price, actual_price=trade.executed.price, bid_ask_width=self.get_bid_ask_width(), dte=self.get_current_dte(), vix=self.get_vix(), time_of_day=self.get_hour() ) backtest results with new model # re-ran 2021-2022 backtest with lively slippage:\nold model (fixed $0.05 slippage):\nannual return: 18.2% sharpe ratio: 1.9 max drawdown: 18% total slippage cost: $892/year new model (fluid slippage):\nannual return: 14.3% sharpe ratio: 1.64 max drawdown: 18.5% total slippage cost: $1,547/year that\u0026rsquo;s a 3.9% annual return difference just from realistic slippage modeling\nfucking brutal but at least now i know what to expect\nlive performance validation # comparing march 15-21 live trading to new backtest model:\nactual average slippage: $6.40 per spread new model predicted: $6.10 per spread error: 4.9% way better than old model which predicted $5.00 (28% error)\nwhat this means going forward # adjusted my profit targets:\nold target: 18% annual return new realistic target: 14-15% annual return still good for a sharpe 1.6+ strategy also means i need ~715 subscribers at $19/month to hit $10k MRR if i ever productize this (14% on $400k = $56k annual, need $120k total to make $10k/mo after living expenses)\nmath works but margin is tighter than i thought\nnext steps # run model for another 20 trades to validate track prediction error weekly adjust multipliers if needed maybe switch to limit orders on high-slippage scenarios for now the model is live in my backtest framework and i\u0026rsquo;m using it to set realistic expectations\n-AK\n","date":"22 March 2023","externalUrl":null,"permalink":"/posts/2023-03-22-slippage-model-deep-dive/","section":"Posts","summary":"\u003ch2 class=\"relative group\"\u003ethe slippage problem is worse than i thought \n    \u003cdiv id=\"the-slippage-problem-is-worse-than-i-thought\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#the-slippage-problem-is-worse-than-i-thought\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003eafter 2 weeks live trading (10 total trades), my average slippage is $6.40 per spread\u003c/p\u003e","title":"modeling slippage the right way","type":"posts"},{"content":"so this happened\nbeen seeing my therapist since january. dealing with parents dying and all that shit. sessions are wednesdays at 4pm\nlast wednesday (march 15) i show up early. girl\u0026rsquo;s sitting in waiting room. brunette, maybe 5'6\u0026quot;, great body, yoga pants. mid-20s probably\nshe looks up from her phone. i look at her. she smiles\n\u0026ldquo;you see Dr. R too?\u0026rdquo;\n\u0026ldquo;yeah. 4pm slot\u0026rdquo;\n\u0026ldquo;i\u0026rsquo;m 3pm. running late today i guess\u0026rdquo;\nwe talk for like 10 minutes before my therapist comes out. turns out her name\u0026rsquo;s M. (not posting full name). she\u0026rsquo;s 24, works at a coffee shop in la jolla, sees Dr. R for anxiety stuff\ngot her number. texted that night. went out friday\nthe date # took her to george\u0026rsquo;s at the cove (ocean view, solid food, not trying too hard)\nshe\u0026rsquo;s cool. talks a lot about her barista job and some drama with her roommate. i mostly just listened\nasked about my parents. i gave her the short version - car crash new year\u0026rsquo;s eve, inherited money, trading full time now\nshe got quiet for a bit. then: \u0026ldquo;that\u0026rsquo;s really heavy. are you okay?\u0026rdquo;\n\u0026ldquo;sometimes. therapy helps\u0026rdquo;\n\u0026ldquo;yeah. me too\u0026rdquo;\nwe went back to my apartment after. she saw my trading setup - 6 monitors, server rack in the corner, cables everywhere\n\u0026ldquo;holy shit. you\u0026rsquo;re like actually serious about this\u0026rdquo;\n\u0026ldquo;yeah i\u0026rsquo;m actually serious\u0026rdquo;\nshe stayed over. left saturday morning. been texting since\ntherapy session today # saw Dr. R this afternoon (march 20, my regular monday 6pm slot)\ntold her about M.\nDr. R: \u0026ldquo;how do you feel about dating someone you met in my waiting room?\u0026rdquo;\nme: \u0026ldquo;i mean. it\u0026rsquo;s fine?\u0026rdquo;\nDr. R: \u0026ldquo;do you think you\u0026rsquo;re ready to be dating right now? your parents died 11 weeks ago\u0026rdquo;\nme: \u0026ldquo;i don\u0026rsquo;t know if i\u0026rsquo;m ready. but she\u0026rsquo;s hot and i like her so\u0026rdquo;\nDr. R just looked at me with that therapist look\nwe spent the rest of the session talking about how i use sex and dating to avoid dealing with grief\nprobably true. but also M. is really hot and seems cool so i\u0026rsquo;m gonna keep seeing her\nthe reality # i give it 3 weeks max before i get bored or she realizes i\u0026rsquo;m fucked up from my parents dying\nthat\u0026rsquo;s usually how it goes. meet someone. hook up for 2-4 weeks. lose interest. repeat\nDr. R says i have \u0026ldquo;avoidant attachment patterns\u0026rdquo; or whatever\ni just think most relationships are boring after the first month\nwe\u0026rsquo;ll see. M. seems different but they always seem different at first\nalso her tits are fucking incredible which helps\nback to trading tomorrow # took the weekend off from watching positions. gonna check them tuesday morning\nsometimes i need to just not think about spreads and greeks and slippage for 48 hours\ndating helps with that\n-AK\n","date":"20 March 2023","externalUrl":null,"permalink":"/posts/2023-03-20-met-m-at-therapy/","section":"Posts","summary":"\u003cp\u003eso this happened\u003c/p\u003e\n\u003cp\u003ebeen seeing my therapist since january. dealing with parents dying and all that shit. sessions are wednesdays at 4pm\u003c/p\u003e\n\u003cp\u003elast wednesday (march 15) i show up early. girl\u0026rsquo;s sitting in waiting room. brunette, maybe 5'6\u0026quot;, great body, yoga pants. mid-20s probably\u003c/p\u003e","title":"met M. in the waiting room","type":"posts"},{"content":"","date":"17 March 2023","externalUrl":null,"permalink":"/tags/backtest-vs-live/","section":"Tags","summary":"","title":"Backtest-vs-Live","type":"tags"},{"content":" one week live trading = reality check # algo\u0026rsquo;s been running 7 days. march 15-17. opened 3 positions total\nbacktest said i\u0026rsquo;d make $255 in first week (3 trades, 2 wins, 1 loss)\nactual result: +$140\nthat\u0026rsquo;s 45% less than backtest. wtf\nthe slippage problem # every single fill was worse than backtest assumption. been reading r/options discussions about slippage and everyone says same thing - live fills always worse than theory.\ntrade 1 (march 15):\nbacktest fill: $0.90 credit actual fill: $0.85 credit slippage: $5 per spread ($50 on 10 contracts) trade 2 (march 16):\nbacktest fill: $1.10 credit actual fill: $1.02 credit slippage: $8 per spread ($80 on 10 contracts) trade 3 (march 17):\nbacktest fill: $0.95 credit actual fill: $0.91 credit slippage: $4 per spread ($40 on 10 contracts) total slippage in one week: $170\nthat\u0026rsquo;s more than my entire profit ($140)\nwhy this matters # if slippage averages $6 per spread and i\u0026rsquo;m trading 60 spreads per month, that\u0026rsquo;s $360/month i didn\u0026rsquo;t account for\nat $400k account that\u0026rsquo;s 0.09% monthly drag\ndoesn\u0026rsquo;t sound like much until you realize that\u0026rsquo;s 1.08% annually just from slippage\nmy backtest sharpe was 1.9. subtract 1% annual drag and sharpe drops to maybe 1.6\nstill profitable but way less margin for error\nwhat i\u0026rsquo;m doing about it # adjusted my backtest model to assume $7 slippage per trade (conservative)\nre-ran 2021-2022 data:\nold backtest: 18.2% annual return new backtest with slippage: 14.7% annual return sharpe ratio: 1.9 → 1.65 that\u0026rsquo;s more realistic\nalso looking at limit orders instead of market orders on the short leg. might save $2-3 per fill but adds execution risk if i don\u0026rsquo;t get filled\ncurrent positions # have 2 open positions right now:\nSPX 4300/4310 call spread (march 22 expiration) - up $40 SPX 4280/4290 put spread (march 24 expiration) - up $25 both at ~50% profit target. will close monday if profit holds\nfirst week stats # trades: 3 wins: 2 losses: 1 (stopped out for -$85) gross profit: $310 slippage cost: $170 net profit: $140 win rate: 66% (backtest predicted 72%) not terrible for week 1. but slippage is real and i need to account for it\n-AK\n","date":"17 March 2023","externalUrl":null,"permalink":"/posts/2023-03-17-first-week-slippage-sucks/","section":"Posts","summary":"\u003ch2 class=\"relative group\"\u003eone week live trading = reality check \n    \u003cdiv id=\"one-week-live-trading--reality-check\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#one-week-live-trading--reality-check\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003ealgo\u0026rsquo;s been running 7 days. march 15-17. opened 3 positions total\u003c/p\u003e","title":"first week done. slippage is brutal","type":"posts"},{"content":"","date":"17 March 2023","externalUrl":null,"permalink":"/categories/performance/","section":"Categories","summary":"","title":"Performance","type":"categories"},{"content":" three years of paper trading, finally real money # started learning algo trading april 2020 during COVID lockdown. i was 16, bored af at home, discovered r/algotrading and fell into the rabbit hole\nspent three years building strategies in Python. paper trading. backtesting on two years of data. reading every post on r/options and r/quant. building custom metrics in Plotly because traditional charts felt useless\ntoday, march 15th 2023, my first algo went live with real money\ni\u0026rsquo;m 19. my parents died december 31st 2022 (new year\u0026rsquo;s eve, car crash). inherited $2M. put $400k into Interactive Brokers. lost $180k in the first two months learning with real money\nyeah. $180k gone. February was brutal\nbut i figured some things out. joined NexusFi in january after my parents died because i needed support from people who actually trade. that community is legit - Big Mike runs a tight ship, zero tolerance for BS artists trying to sell courses\ntoday\u0026rsquo;s algo is basic. SPX credit spreads. nothing fancy. but it\u0026rsquo;s profitable in backtest and i\u0026rsquo;m done waiting\nthe strategy (simple on purpose) # selling credit spreads on SPX because:\nEuropean style (no early assignment risk) cash settled (no stock delivery headaches) liquid af (tight spreads, instant fills) tax advantaged (60/40 treatment, hell yeah) the rules i coded:\n# entry logic - sell when IV percentile \u0026gt; 40 (elevated vol) - target 5-7 DTE (days to expiration) - delta 0.20-0.25 on short strike (80% prob OTM) - max 5 concurrent positions - $10 wide spreads ($1000 max loss per) # exit logic - close at 50% profit OR - close at 2 DTE (don\u0026#39;t hold to expiration) - emergency stop if position hits -200% (spread doubles against me) backtested this on 2 years SPX data (2021-2022). sharpe ratio 1.9, win rate 72%, max drawdown 18%\nsolid. not amazing. but repeatable\nthe code (backtrader + ib_insync) # using backtrader for backtesting, ib_insync for live execution\nhere\u0026rsquo;s the core (simplified, real version is 400 lines with error handling):\nimport backtrader as bt from ib_insync import * class SPXCreditSpreadStrategy(bt.Strategy): params = ( (\u0026#39;dte_entry\u0026#39;, 7), (\u0026#39;dte_exit\u0026#39;, 2), (\u0026#39;delta_short\u0026#39;, 0.25), (\u0026#39;profit_target\u0026#39;, 0.50), (\u0026#39;max_positions\u0026#39;, 5), (\u0026#39;spread_width\u0026#39;, 10), (\u0026#39;iv_min\u0026#39;, 40), ) def __init__(self): self.positions = [] self.ib = IB() self.ib.connect(\u0026#39;127.0.0.1\u0026#39;, 4001, clientId=1) def next(self): # position limit check if len(self.positions) \u0026gt;= self.p.max_positions: return # get IV percentile iv_rank = self.get_iv_rank(\u0026#39;SPX\u0026#39;) if iv_rank \u0026lt; self.p.iv_min: return # not elevated enough # find option chain for target DTE chains = self.get_spx_chains(dte=self.p.dte_entry) # find short strike at target delta short_call = self.find_strike_by_delta( chains, delta=self.p.delta_short, option_type=\u0026#39;C\u0026#39; ) # long call 10 points higher (protection) long_call = short_call + self.p.spread_width # calculate premium collected credit = self.get_spread_price(short_call, long_call) # create spread order self.sell_vertical_spread( short_strike=short_call, long_strike=long_call, credit=credit ) def manage_positions(self): \u0026#34;\u0026#34;\u0026#34;check exit conditions on open positions\u0026#34;\u0026#34;\u0026#34; for pos in self.positions: days_left = self.get_dte(pos.expiration) pnl_pct = pos.unrealized_pnl / pos.initial_credit # profit target hit if pnl_pct \u0026gt;= self.p.profit_target: self.close_position(pos) # approaching expiration elif days_left \u0026lt;= self.p.dte_exit: self.close_position(pos) # emergency stop (spread doubled against us) elif pnl_pct \u0026lt;= -2.0: self.close_position(pos) real implementation has way more:\nretry logic for failed orders slippage tracking Greeks monitoring position sizing based on portfolio heat alerts when IV rank spikes but that\u0026rsquo;s the core logic\ntoday\u0026rsquo;s first trade # opened one position this morning at 9:45 AM PST:\nSPX Call Credit Spread:\nsold 4300 call @ $2.20 bought 4310 call @ $1.35 net credit: $0.85 ($85 per spread) max loss: $915 (10 point width - credit) expiration: march 22 (7 DTE) probability OTM: 78% (per IB probability calculator) risking $915 to make $85 sounds terrible. but do it 20 times and win 15 of them and you\u0026rsquo;re profitable\nthat\u0026rsquo;s the math. high win rate, small gains, controlled losses\nwhat i learned in 60 seconds of live trading # whoa backtesting is NOT the same as live\nslippage is real\nbacktested at $0.90 credit actually filled at $0.85 ($5 worse per contract) on a $915 max loss position, $5 matters fills take time\npaper trading = instant fills real money = waited 90 seconds staring at DOM almost cancelled because i got nervous emotions hit different\nhands were shaking hitting submit $915 max loss feels way bigger than it looked in backtest had to walk away from computer for 10 minutes after this is $400k of my inheritance. $180k already gone. every trade matters\nfebruary\u0026rsquo;s $180k lesson # lost $180k in february learning what NOT to do:\nmistake 1: overleveraging\nopened 15 positions at once (way too many) portfolio heat hit 40% (insane) when market moved against me, everything correlated mistake 2: fighting the trend\nkept selling call spreads in a ripping market \u0026ldquo;it HAS to pull back\u0026rdquo; (narrator: it didn\u0026rsquo;t) got assigned on 3 positions, blew through max loss mistake 3: no stop loss discipline\nlet losing positions run to expiration hoping for miracle \u0026ldquo;theta will save me\u0026rdquo; (theta did not save me) several positions went from -100% to -250% mistake 4: ignoring IV rank\nsold premium when IV was at 15th percentile collected $40 per spread risking $960 even with 70% win rate, expectancy was negative those four mistakes cost $180k in 8 weeks\nincredibly painful\nbut i learned. that\u0026rsquo;s worth something. maybe\nwhat changed # talked to traders on NexusFi who\u0026rsquo;ve been through this\nkey advice that stuck:\nmax 5 positions at once (portfolio heat control) only sell when IV rank \u0026gt; 40 (actually elevated) close at 50% profit (don\u0026rsquo;t get greedy) use stops (emergency exit if spread doubles) position size = 2.5% account risk max implemented all of it in the algo\nmarch 1-15: paper trading with new rules. 12 trades, 10 winners, sharpe 2.1\ngood enough. went live today\nthe reality check # i\u0026rsquo;m 19 years old. my parents died 10 weeks ago. i\u0026rsquo;m trading $400k of inheritance money after losing $180k learning\nsome days i\u0026rsquo;m numb. some days i cry random. tonight i\u0026rsquo;ll probably stare at this one open position for 3 hours unable to sleep\nthis is the reality of algorithmic trading when you\u0026rsquo;re young and your parents just died and you\u0026rsquo;re trying to make this work\nnot the YouTube version. the real version\nwhat\u0026rsquo;s next # gonna run this strategy for 90 days and track everything in custom Plotly dashboards:\nmetrics i\u0026rsquo;m tracking:\nactual fills vs theoretical backtest slippage per trade win rate (target: 70%+) sharpe ratio (target: 1.5+) max drawdown (limit: 15%) IV rank at entry (verify \u0026gt; 40) days held per position profit per day-held if sharpe stays above 1.5 and drawdown under 15% after 90 days, i\u0026rsquo;ll scale up to 2 contracts per spread\nif it fails, back to paper trading and figure out what\u0026rsquo;s broken\nwhy i\u0026rsquo;m writing this # accountability\nit\u0026rsquo;s easy to lie to yourself when you\u0026rsquo;re alone in a San Diego apartment trading inheritance money and your parents are dead\nwriting this publicly on the internet keeps me honest\ndocument the wins, the losses, the $180k tuition, the mistakes, the learning\nmaybe it helps someone else who\u0026rsquo;s thinking about algo trading. maybe it just helps me stay disciplined\neither way, here we go\nfirst algo live. one position open. SPX 4300/4310 call spread. march 22 expiration\nlet\u0026rsquo;s see what happens\n-AK\n","date":"15 March 2023","externalUrl":null,"permalink":"/posts/2023-03-15-first-algo-live/","section":"Posts","summary":"\u003ch2 class=\"relative group\"\u003ethree years of paper trading, finally real money \n    \u003cdiv id=\"three-years-of-paper-trading-finally-real-money\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#three-years-of-paper-trading-finally-real-money\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003estarted learning algo trading april 2020 during COVID lockdown. i was 16, bored af at home, discovered r/algotrading and fell into the rabbit hole\u003c/p\u003e","title":"first algo went live today","type":"posts"},{"content":"","date":"15 March 2023","externalUrl":null,"permalink":"/categories/trading-process/","section":"Categories","summary":"","title":"Trading Process","type":"categories"},{"content":" You\u0026rsquo;re Offline # It looks like you\u0026rsquo;ve lost your internet connection. This page has been cached so you can still read it.\nOnce you\u0026rsquo;re back online, you\u0026rsquo;ll have access to all the latest content from AlgoKing.\nRecently Viewed Pages # Check your browser history for pages you\u0026rsquo;ve visited recently - they may be cached and available offline.\nPro Algo Trading | AlgoKing\n","externalUrl":null,"permalink":"/offline/","section":"Pro Algo Trading | AlgoKing","summary":"\u003ch2 class=\"relative group\"\u003eYou\u0026rsquo;re Offline \n    \u003cdiv id=\"youre-offline\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline\" href=\"#youre-offline\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003eIt looks like you\u0026rsquo;ve lost your internet connection. This page has been cached so you can still read it.\u003c/p\u003e","title":"Offline","type":"page"}]