[{"data":1,"prerenderedAt":5863},["ShallowReactive",2],{"blog-posts":3},[4,715,1198,1651,2359,2729,3120,3250,5303,5671,5840],{"id":5,"title":6,"body":7,"date":700,"description":701,"extension":702,"featured":703,"meta":704,"navigation":705,"path":706,"seo":707,"stem":708,"tags":709,"__hash__":714},"blog\u002Fblog\u002Fquant-markov.md","Regime Detection – The Simple Approach That Works",{"type":8,"value":9,"toc":665},"minimark",[10,22,25,28,35,40,43,51,54,57,63,68,75,78,82,85,89,92,95,101,107,111,114,117,123,129,133,136,143,146,149,153,156,172,178,181,185,188,192,217,220,224,227,233,240,244,247,250,256,260,263,266,273,277,286,289,292,296,299,302,307,311,314,320,323,326,330,333,339,345,351,357,363,369,376,380,383,389,395,401,407,413,417,423,434,437,440,443,446,450,453,459,465,471,474,480,486,492,495,499,502,508,514,520,526,531,535,538,542,545,551,555,558,564,568,571,578,582,585,591,597,603,609,615,619,622,657,660],[11,12,13,14,21],"p",{},"Inspired by ",[15,16,20],"a",{"href":17,"rel":18},"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=CkXljL6eI5A",[19],"nofollow","Roman Paolucci",". Go watch his stuff. It's good.",[11,23,24],{},"Here's something that actually works. Not fancy. Not complicated. Just useful. Regime detection. Figuring out what kind of market you're in before you trade it.",[11,26,27],{},"The idea is simple. Markets exist in different states. Some states favour trend following. Some favour mean reversion. Some want you to stay away entirely.",[11,29,30,31],{},"The trick is knowing which state you're in. ",[32,33,34],"em",{},"That's the whole game.",[36,37,39],"h2",{"id":38},"what-even-is-a-regime","What Even Is A Regime",[11,41,42],{},"Think of it like weather. Sometimes it's sunny. Sometimes it's stormy. Sometimes it's dead calm.",[11,44,45,46,50],{},"You don't wear a raincoat when it's sunny. You don't trade aggressively when the market is volatile. ",[47,48,49],"strong",{},"You adjust based on conditions."," That's regime detection.",[11,52,53],{},"A market regime is just the current state of the market. Is it trending? Is it ranging? Is volatility high or low? These conditions determine what strategies make sense.",[11,55,56],{},"Different strategies work in different conditions. Trend following loves strong trends. It dies in ranging markets. Mean reversion loves calm markets. It gets destroyed in volatile ones.",[11,58,59,62],{},[32,60,61],{},"The strategy has to match the conditions."," That's not optional. That's the foundation.",[64,65,67],"h3",{"id":66},"what-it-might-look-like","What it might look like",[11,69,70],{},[71,72],"img",{"alt":73,"src":74},"Regime detection visualization","\u002Fblog\u002Fmarkov_regime_qt.png",[11,76,77],{},"Just a visual tool forked from Roman's approach. Helps you see whether you're visually capturing various states of the market.",[36,79,81],{"id":80},"the-three-things-that-matter","The Three Things That Matter",[11,83,84],{},"Here's what I learned. Not from textbooks. From losing money. Three things determine the regime:",[64,86,88],{"id":87},"_1-trend-strength","1. Trend Strength",[11,90,91],{},"How strong is the current trend? That's the first question.",[11,93,94],{},"A trending market moves in one direction consistently. A ranging market goes nowhere. The difference determines everything.",[11,96,97,100],{},[32,98,99],{},"There's a standard indicator for this."," It's been around for decades. It measures directional movement. Not up or down. Just how strong the movement is.",[11,102,103,104],{},"When trend strength is high, trends tend to continue. When it's low, they tend to reverse. ",[47,105,106],{},"That's the key insight.",[64,108,110],{"id":109},"_2-return-direction","2. Return Direction",[11,112,113],{},"Where has the market been moving? That's the second question.",[11,115,116],{},"Not predicting. Observing. The recent past tells you the current environment. Positive recent returns = bullish bias. Negative = bearish bias.",[11,118,119,122],{},[32,120,121],{},"This sounds obvious. It is obvious. That's the point."," Don't overcomplicate what works.",[11,124,125,126],{},"The bias matters because trends tend to persist. Bull markets keep going up. Bear markets keep going down. ",[47,127,128],{},"Don't fight the bias.",[64,130,132],{"id":131},"_3-volatility","3. Volatility",[11,134,135],{},"How crazy is the market right now? That's the third question.",[11,137,138,139,142],{},"Not absolute volatility. ",[47,140,141],{},"Relative"," volatility. Is it more volatile than usual, or less? That's what matters.",[11,144,145],{},"High volatility = stressed market = danger = smaller positions. Low volatility = calm market = opportunity = normal positions.",[11,147,148],{},"Volatility regimes matter for risk management. They always have. They always will.",[36,150,152],{"id":151},"the-framework","The Framework",[11,154,155],{},"Here's how it works:",[157,158,159,163,166,169],"ol",{},[160,161,162],"li",{},"Measure the three things at every bar of new information",[160,164,165],{},"Classify the current regime based on those measurements",[160,167,168],{},"Only take trades that match the regime",[160,170,171],{},"Size positions based on regime clarity",[11,173,174,177],{},[32,175,176],{},"That's it."," Four steps. Each testable. Each improveable.",[11,179,180],{},"The regime isn't a prediction. It's a filter. It tells you which trades to take, not which way to trade.",[36,182,184],{"id":183},"statistical-concepts-for-the-real-ones","Statistical Concepts (For The Real Ones)",[11,186,187],{},"Here's the technical stuff. Skip if you just want the practical take.",[64,189,191],{"id":190},"the-markov-property","The Markov Property",[11,193,194,195,198,199,203,204,207,208,203,210,212,213,216],{},"A stochastic process is Markov if the future depends only on the present, not the past. That's the ",[47,196,197],{},"Markov property",". P(X",[200,201,202],"sub",{},"t+1"," | X",[200,205,206],{},"t",") = P(X",[200,209,202],{},[200,211,206],{},", X",[200,214,215],{},"t-1",", ...).",[11,218,219],{},"In markets? Debatable. The assumption doesn't hold perfectly. But it approximates reasonably well on short timeframes.",[64,221,223],{"id":222},"stationarity","Stationarity",[11,225,226],{},"A process is stationary if its statistical properties don't change over time. Mean, variance, autocovariance - constant.",[11,228,229,232],{},[47,230,231],{},"Financial returns aren't stationary."," That's the fundamental problem. The variance changes. The regimes change. The relationships break.",[11,234,235,236,239],{},"What I've built isn't a stationary model. It's a ",[32,237,238],{},"conditional"," classifier. Given these conditions (high directional movement, elevated vol), what's the distribution? The model adapts. That's different from assuming stationarity.",[64,241,243],{"id":242},"hidden-states-vs-observed-states","Hidden States vs Observed States",[11,245,246],{},"The academic approach: assume hidden states with transitions governed by a Markov chain. Observe returns. Infer states via Baum-Welch.",[11,248,249],{},"The problem: convergence isn't guaranteed. Multiple local optima exist. Different initializations = different results. That's not robust.",[11,251,252,253],{},"My approach: observe the states directly. Don't hide them. The regime is what you see, not what you infer. That's simpler. ",[32,254,255],{},"Sometimes simpler is better.",[64,257,259],{"id":258},"likelihood-and-estimation","Likelihood and Estimation",[11,261,262],{},"The ML approach maximizes likelihood: P(data | parameters). Given returns, what's the most likely regime sequence?",[11,264,265],{},"The issue: likelihood rewards complexity. More parameters = higher likelihood. That's overfitting with extra steps.",[11,267,268,269,272],{},"Proper validation uses out-of-sample likelihood. Or walk-forward testing. ",[47,270,271],{},"AIC\u002FBIC penalize complexity."," Simpler models generalize better.",[64,274,276],{"id":275},"state-transitions","State Transitions",[11,278,279,280,282,283,285],{},"Markov chains model transitions: P(s",[200,281,206],{}," = j | s",[200,284,215],{}," = i). The transition matrix captures regime dynamics.",[11,287,288],{},"In practice: the transition matrix drifts. What's true in 2020 isn't true in 2024. The model assumes time-homogeneity. Markets aren't time-homogeneous.",[11,290,291],{},"Rolling windows partially address this. Retraining addresses this. But it adds complexity. At some point, the complexity costs more than it benefits.",[64,293,295],{"id":294},"volatility-clustering","Volatility Clustering",[11,297,298],{},"Moving averages and volatility models capture volatility clustering. High vol leads to more high vol. Low vol follows more low vol.",[11,300,301],{},"That's a stylized fact. It's real. My relative volatility measure captures this indirectly. Not as sophisticated as GARCH, but it works.",[11,303,304],{},[47,305,306],{},"The goal isn't sophistication. The goal is working.",[64,308,310],{"id":309},"why-the-math-matters","Why The Math Matters",[11,312,313],{},"I learned this in my actuarial degree. Stochastic processes. Time series. And more nonsense.",[11,315,316,317],{},"The math prepares you to think about risk. It doesn't prepare you to trade. ",[32,318,319],{},"Those are different skills.",[11,321,322],{},"But understanding the math lets you spot BS. When someone's \"machine learning\" is just overfitting with a neural network, you can explain why it's broken.",[11,324,325],{},"That's valuable. Not for trading. For evaluating claims.",[36,327,329],{"id":328},"why-not-machine-learning","Why Not Machine Learning",[11,331,332],{},"I tried ML approaches. Hidden Markov Models. Gaussian mixtures. Neural networks. Here's what happened:",[11,334,335,338],{},[47,336,337],{},"Inconsistent."," Same data, different results. Run it twice, get different regimes. That's not a feature. That's a problem.",[11,340,341,344],{},[47,342,343],{},"Overfitted."," Backtests looked amazing. Forward tests failed. The model memorized, didn't learn.",[11,346,347,350],{},[47,348,349],{},"Uninterpretable."," Even when it worked, I couldn't explain why. If I can't explain it, I can't trust it.",[11,352,353,356],{},[47,354,355],{},"Drifted."," What worked last year doesn't work this year. Constant retraining. Added complexity without added value.",[11,358,359,362],{},[47,360,361],{},"Black box."," The model gives you a number but not the reasoning. That makes debugging impossible.",[11,364,365,368],{},[47,366,367],{},"Math doesn't hold."," The assumptions behind ML (stationarity, ergodicity, convergence) don't hold in markets.",[11,370,371,372,375],{},"ML is a tool. Not magic. ",[32,373,374],{},"Know when to use it."," Know when not to.",[36,377,379],{"id":378},"what-actually-works","What Actually Works",[11,381,382],{},"Simplicity. That's what.",[11,384,385,388],{},[47,386,387],{},"Deterministic."," Same inputs, same outputs every time. No random seeds, no variation.",[11,390,391,394],{},[47,392,393],{},"Interpretable."," You can see exactly why the regime was classified this way. That's debugging.",[11,396,397,400],{},[47,398,399],{},"Testable."," You can validate regime detection independently. Run on historical data. See if it makes sense.",[11,402,403,406],{},[47,404,405],{},"Robust."," Doesn't drift. Doesn't break. Doesn't need constant retraining.",[11,408,409,410],{},"Sometimes the fancy solution isn't the better solution. ",[32,411,412],{},"Simplicity wins.",[36,414,416],{"id":415},"the-test-that-matters","The Test That Matters",[11,418,419,420],{},"Here's how I validate this. Not backtests. ",[47,421,422],{},"Walk-forward testing.",[157,424,425,428,431],{},[160,426,427],{},"Train on earlier data. Test on later data.",[160,429,430],{},"Roll forward. Repeat.",[160,432,433],{},"Compare filtered vs unfiltered performance.",[11,435,436],{},"That's the only test that matters. If it works forward, it works. If it doesn't, it doesn't.",[11,438,439],{},"Hypothesis: Certain regime conditions favour trend continuation.",[11,441,442],{},"Test: Run with and without filter. Compare.",[11,444,445],{},"Result: Filtered performs better. That's validation.",[36,447,449],{"id":448},"the-math-behind-walk-forward","The Math Behind Walk-Forward",[11,451,452],{},"For the people who want the formal framework:",[11,454,455,458],{},[47,456,457],{},"Train window:"," t to t+N",[11,460,461,464],{},[47,462,463],{},"Test window:"," t+N to t+N+M",[11,466,467,470],{},[47,468,469],{},"Walk:"," Shift by M, repeat. That's the walk-forward.",[11,472,473],{},"You get multiple out-of-sample periods. Multiple performance estimates. The distribution of those estimates tells you robustness.",[11,475,476,479],{},[47,477,478],{},"Mean:"," Expected performance",[11,481,482,485],{},[47,483,484],{},"Std:"," Variance of performance - lower is better",[11,487,488,491],{},[47,489,490],{},"Sharpe ratio:"," Mean \u002F Std. Risk-adjusted. That's the real metric.",[11,493,494],{},"Backtests lie. Walk-forward tells truth.",[36,496,498],{"id":497},"what-this-gives-you","What This Gives You",[11,500,501],{},"Here's what regime detection provides:",[11,503,504,507],{},[47,505,506],{},"Context."," You know what environment you're trading in. That's crucial.",[11,509,510,513],{},[47,511,512],{},"Filtering."," You only take trades that match conditions. That's edge preservation.",[11,515,516,519],{},[47,517,518],{},"Risk management."," You size based on clarity. Ambiguous regimes = smaller trades.",[11,521,522,525],{},[47,523,524],{},"Process."," You're not guessing. You're responding. That's systematic.",[11,527,528],{},[32,529,530],{},"The goal isn't to predict. It's to adapt.",[36,532,534],{"id":533},"limitations","Limitations",[11,536,537],{},"I need to be honest. This approach has issues too.",[64,539,541],{"id":540},"lag","Lag",[11,543,544],{},"Regime detection lags. The market enters a new regime. The indicators catch up. By then, you're one step behind.",[11,546,547,550],{},[32,548,549],{},"All indicators and mathematical approaches that require new info have lag. This one does too."," Accept it. Manage it.",[64,552,554],{"id":553},"parameter-sensitivity","Parameter Sensitivity",[11,556,557],{},"The lookback periods matter. You can overfit them.",[11,559,560,563],{},[47,561,562],{},"Don't tune on in-sample only."," Walk-forward validate. That's how you avoid overfitting.",[64,565,567],{"id":566},"regime-instability","Regime Instability",[11,569,570],{},"Markets can switch regimes instantly. The detection is retrospective. It tells you what was happening. Not what's about to happen.",[11,572,573,574,577],{},"That's not a bug. That's reality. ",[32,575,576],{},"Nobody predicts regime changes."," Nobody.",[36,579,581],{"id":580},"why-gatekeeping","Why Gatekeeping",[11,583,584],{},"I keep the code private. Here's why:",[11,586,587,590],{},[47,588,589],{},"It needs work."," Not finished. Not optimized. Sharing now creates expectations I can't meet.",[11,592,593,596],{},[47,594,595],{},"It needs testing."," More walk-forward validation. More robustness checks. More time.",[11,598,599,602],{},[47,600,601],{},"The concept is enough."," You know the approach. Trend strength + return direction + relative volatility. That's the idea. You can build your own.",[11,604,605,608],{},[47,606,607],{},"It keeps me honest."," Internal improvement > external defense. I'm optimizing, not explaining.",[11,610,611,612],{},"That's gatekeeping. Not to be special. Just to be real. ",[32,613,614],{},"Plus you never know if its a money maker. :)",[36,616,618],{"id":617},"the-takeaway","The Takeaway",[11,620,621],{},"Here's what matters:",[157,623,624,630,636,642,648],{},[160,625,626,629],{},[47,627,628],{},"Markets have regimes."," Understand the state you're trading.",[160,631,632,635],{},[47,633,634],{},"Simple beats complex."," Deterministic > stochastic. Interpretable > impressive.",[160,637,638,641],{},[47,639,640],{},"Test everything."," Walk-forward validates. Backtests lie.",[160,643,644,647],{},[47,645,646],{},"ML isn't magic."," It's a tool. Know when to use it. Know when not to.",[160,649,650,653,654],{},[47,651,652],{},"Gatekeeping works."," Keep it real. Keep improving. ",[32,655,656],{},"Keep your edge.",[11,658,659],{},"That's the quant journey. Not finding perfection. Building process. Testing it. Improving it.",[11,661,662],{},[32,663,664],{},"Now go build something simple. Test it. Break it. Fix it. That's how it's done.",{"title":666,"searchDepth":667,"depth":667,"links":668},"",2,[669,673,678,679,688,689,690,691,692,693,698,699],{"id":38,"depth":667,"text":39,"children":670},[671],{"id":66,"depth":672,"text":67},3,{"id":80,"depth":667,"text":81,"children":674},[675,676,677],{"id":87,"depth":672,"text":88},{"id":109,"depth":672,"text":110},{"id":131,"depth":672,"text":132},{"id":151,"depth":667,"text":152},{"id":183,"depth":667,"text":184,"children":680},[681,682,683,684,685,686,687],{"id":190,"depth":672,"text":191},{"id":222,"depth":672,"text":223},{"id":242,"depth":672,"text":243},{"id":258,"depth":672,"text":259},{"id":275,"depth":672,"text":276},{"id":294,"depth":672,"text":295},{"id":309,"depth":672,"text":310},{"id":328,"depth":667,"text":329},{"id":378,"depth":667,"text":379},{"id":415,"depth":667,"text":416},{"id":448,"depth":667,"text":449},{"id":497,"depth":667,"text":498},{"id":533,"depth":667,"text":534,"children":694},[695,696,697],{"id":540,"depth":672,"text":541},{"id":553,"depth":672,"text":554},{"id":566,"depth":672,"text":567},{"id":580,"depth":667,"text":581},{"id":617,"depth":667,"text":618},"2026-04-17","Why I stopped using HMMs and went back to basics. Trend strength, return direction, and relative volatility. No ML, no black boxes, just testable rules.","md",false,{},true,"\u002Fblog\u002Fquant-markov",{"title":6,"description":701},"blog\u002Fquant-markov",[710,711,712,713],"trading","quant","regime","systematic","UMRDn3B7H3Ew32JO1UJucNHMcSui23_uVdaCxglnLEk",{"id":716,"title":717,"body":718,"date":1187,"description":1188,"extension":702,"featured":705,"meta":1189,"navigation":705,"path":1190,"seo":1191,"stem":1192,"tags":1193,"__hash__":1197},"blog\u002Fblog\u002Fquant-journey.md","My Quant Journey – From 2021 University Trading to Systematic Risk Management",{"type":8,"value":719,"toc":1163},[720,723,727,734,737,740,744,750,754,761,765,772,776,783,787,794,798,805,809,816,826,837,850,854,857,863,870,874,881,885,895,899,906,910,920,924,931,941,947,951,957,964,971,978,992,996,1002,1012,1015,1025,1028,1035,1042,1046,1052,1055,1065,1069,1076,1083,1087,1094,1100,1103,1110,1116,1122,1125,1129,1132,1142,1149,1155],[11,721,722],{},"So let me tell you something interesting about myself... I've been trading since 2021. My first year of university. I had my first allowance, some saved up pocket money, and the kind of confidence you only get when you don't know anything. That was five years ago. I'm graduated now (December 2025), and I'm still at it. Still losing sometimes. Still learning. That's the journey.",[36,724,726],{"id":725},"_2021-to-now-years-of-losing","2021 To Now. Years Of Losing",[11,728,729,730,733],{},"My final year of university wasn't my first year trading. It was actually year four or five. At that point I had already experienced enough to know two things: I could make money sometimes, and I could lose even more of it consistently. The winning was sporadic. The losing was consistent. That's the ",[32,731,732],{},"worst"," kind of relationship with trading. The occasional win keeps you hooked just long enough to lose more.",[11,735,736],{},"Some years I made profit. Some years I broke even. Most years I lost. And every year I told myself next year will be different. It wasn't. It was the same mistakes, different markets. The same overconfidence, different indicators. The same disasters, different excuses.",[11,738,739],{},"I wasn't a trader. I was a gambler with extra steps. And I didn't even know it. That's the worst part. You don't realize you're losing until you've already lost so much you have to make a choice. Stop completely, or figure out what you're actually doing wrong.",[36,741,743],{"id":742},"what-i-learned-in-university","What I Learned In University",[11,745,746,747],{},"Here's where my actuarial background comes in. In university, I learned statistics. Probability theory. Stochastic processes. Time series analysis. Differential equations. All these fancy concepts that sound great in textbooks. And I tried to use them. Of course I did. Because I'm that guy. If I learn something, I want to apply it immediately. Sometimes that works. ",[32,748,749],{},"Sometimes it doesn't.",[64,751,753],{"id":752},"arima-and-time-series-forecasting","ARIMA and Time Series Forecasting",[11,755,756,757,760],{},"I tried forecasting price movements using autoregressive integrated moving averages. Looked amazing on historical data. Completely useless in live markets. The assumptions behind ARIMA don't hold in financial markets. ",[47,758,759],{},"Markets aren't Gaussian. They're not even close."," The stationarity requirement? Forget about it. Markets are non-stationary by nature. They evolve. They adapt. They break your models. And they laugh at your pretty mathematical assumptions.",[64,762,764],{"id":763},"garch-for-volatility-modelling","GARCH for Volatility Modelling",[11,766,767,768,771],{},"GARCH models should capture volatility clustering. And it does capture some of it. But capturing volatility isn't the same as predicting direction. I could know volatility was high and still not know which way the price would go. ",[32,769,770],{},"Useful information? Yes. Tradeable edge? No."," It's like knowing it's going to rain but not knowing if you should bet on the pool filling up or drying out.",[64,773,775],{"id":774},"copula-theory-for-dependency","Copula Theory for Dependency",[11,777,778,779,782],{},"In class I asked my lecturer to go over it in detail, people decided to move on, so I took the time to learn it. I tried using copulas to model the dependency between different currency pairs. Gaussian copula, t-copula, Clayton copula. The theory is decent. The implementation is a nightmare. Correlation between assets changes over time, especially in crisis. The copula assumes a static relationship. ",[47,780,781],{},"Markets don't do static. They do chaos."," And chaos doesn't fit in your copula. It's like trying to use a map from last year to navigate today's city. The roads have changed. The traffic has changed. Your map is useless.",[64,784,786],{"id":785},"jacobian-multipliers-and-continuity","Jacobian Multipliers and Continuity",[11,788,789,790,793],{},"In university, I learned about Jacobian multipliers and continuity conditions for differential equations. The math is beautiful. The application to trading? ",[32,791,792],{},"Limited at best."," These concepts matter for theoretical finance, for pricing derivatives, for understanding the mathematical foundations. But for actually making money in the market? Not directly. It's background knowledge. It's context. It's not a signal. It's like knowing how an engine works but not knowing how to drive.",[64,795,797],{"id":796},"the-brutal-truth-about-academic-statistics","The Brutal Truth About Academic Statistics",[11,799,800,801,804],{},"Most of what I learned in statistics class doesn't apply directly to trading. Not because the concepts are wrong. But because markets are different from the textbook problems. ",[47,802,803],{},"The assumptions don't hold."," The distributions aren't normal. The relationships aren't stable. Academic statistics prepares you to think about risk. It doesn't prepare you to trade it. Those are different skills. It's like being taught to swim in a pool and then dropped in the ocean.",[64,806,808],{"id":807},"what-actually-makes-sense","What Actually Makes Sense",[11,810,811,812,815],{},"But not everything from my degree was useless. Some things actually do translate. ",[47,813,814],{},"Risk management concepts."," Probability of ruin calculations. Expected value thinking. Kelly Criterion for position sizing. These aren't just academic exercises. They're the foundation of systematic trading.",[11,817,818,819,822,823],{},"Monte Carlo simulation. Yeah, that's the one that actually stuck. Not for predicting the future, but for understanding what could happen. Running thousands of simulations to see the distribution of outcomes. Not to know exactly what will happen, but to know what ",[32,820,821],{},"might"," happen. ",[32,824,825],{},"That's the whole point.",[11,827,828,829,832,833,836],{},"Regime detection. Markov chains for state transitions. These are stochastic process concepts that actually work. Not perfectly. Not predictively. But as a way to think about market states. To categorize what's happening ",[32,830,831],{},"now"," rather than guessing what happens ",[32,834,835],{},"next",".",[11,838,839,842,843,846,847],{},[47,840,841],{},"The difference between useful statistics and useless statistics."," Useful statistics help you understand risk and make decisions under uncertainty. ",[47,844,845],{},"The aim of modelling isn't to eliminate uncertainty, that's impossible. It's to make informed decisions in the face of uncertainty."," Useless statistics try to predict the unpredictable. One makes you a better risk manager. The other makes you a dreamer with a spreadsheet. ",[32,848,849],{},"I've been both. I prefer the first one.",[36,851,853],{"id":852},"my-honours-thesis","My Honours Thesis",[11,855,856],{},"My honours thesis was titled \"Teaching Old Models New Tricks: Comparative Analysis of Classical and Machine Learning Models for FX Forward Contract Evaluation Through Future Spot Rate Prediction Across Developed and Emerging Markets.\"",[11,858,859,862],{},[32,860,861],{},"Long title. Complex topic."," What did I learn from it? Machine learning models don't automatically beat classical models. The classical models have economic theory behind them. ML models just optimize for the training data. Sometimes classical wins. Sometimes ML wins. It's not about which is better. It's about understanding when each approach makes sense.",[11,864,865,866,869],{},"The research taught me something important. ",[47,867,868],{},"ML is a tool. Not a magic wand."," You need domain expertise to use it properly. You need to understand what the model is doing and why. Otherwise you're just throwing data at an algorithm and hoping something sticks. That's not research. That's guessing. That's like praying to the RNG gods and hoping they answer.",[36,871,873],{"id":872},"ml-is-a-lie-especially-if-youre-not-an-expert","ML Is A Lie. Especially If You're Not An Expert",[11,875,876,877,880],{},"Let me be direct about this. I tried ML. I tried it hard. And it's a lie. ",[32,878,879],{},"Not completely."," There's real stuff there. But the narrative around ML in trading is completely overblown.",[64,882,884],{"id":883},"overfitting-is-the-default","Overfitting Is The Default",[11,886,887,888,891,892],{},"When you have thousands of features and limited data, your model will find patterns that don't exist. Backtests look incredible. Forward tests fail. ",[47,889,890],{},"The reason is simple."," The model memorised the past instead of learning the future. And the future isn't the past. It never is. It's like memorizing the answers to a test you already took and thinking you'll ace the next one. ",[32,893,894],{},"You won't. The questions are different.",[64,896,898],{"id":897},"data-leakage-is-everywhere","Data Leakage Is Everywhere",[11,900,901,902,905],{},"Look backwards in your training data, accidentally include future information, build a model that seems to predict perfectly. Then deploy it and lose money. ",[32,903,904],{},"It's that easy to fool yourself."," I did it multiple times. Each time I thought I'd found something. Each time I was wrong. It's like looking at a photo of someone after you already know what happened to them and thinking you \"predicted\" it. You didn't. You cheated. And the market doesn't accept cheaters.",[64,907,909],{"id":908},"feature-engineering-is-guesswork","Feature Engineering Is Guesswork",[11,911,912,913,916,917],{},"You don't know what features matter. You try hundreds, keep the ones that work in backtests, and call it research. ",[47,914,915],{},"That's not science."," That's selection bias with extra steps. The features that worked historically might work going forward. Or they might not. You have no way to know. It's like picking lottery numbers based on which ones came up last week. ",[32,918,919],{},"Technically a strategy. Technically useless.",[64,921,923],{"id":922},"you-need-real-expertise","You Need Real Expertise",[11,925,926,927,930],{},"You need domain expertise to do ML properly. And I don't mean \"know some trading.\" I mean deep expertise. Years of experience understanding how markets behave, what features actually capture edge, how to avoid overfitting, how to validate properly. ",[47,928,929],{},"If you're not that person, you're not doing ML. You're doing high-tech gambling with extra steps."," I wasn't that person. Most people who try ML in trading aren't that person either.",[11,932,933,934,937,938],{},"The ML enthusiasts online don't show you their backtests that failed. They don't show you the models that worked in simulation and collapsed in live trading. They show you the one that worked and say \"look, it works!\" ",[32,935,936],{},"That's survivorship bias."," Possibly even selection bias. That's not reality. That's like showing someone your one winning trade and pretending you're a profitable trader. ",[32,939,940],{},"We both know that's not how it works.",[11,942,943,944],{},"So I stopped trying to predict the market with ML. Not because the idea is bad. But because I'm not good enough to do it properly. And neither are most people who try. That's an honest assessment. ",[32,945,946],{},"It took me years to make it.",[36,948,950],{"id":949},"why-i-stopped-discretionary-trading","Why I Stopped Discretionary Trading",[11,952,953,954],{},"Here's what I want to tell you. If you're still trading discretionary, if you're still looking at charts and making decisions based on how you feel, stop. I'm not saying that to be harsh. I'm saying it because I was you. And I lost a lot of money doing it. ",[32,955,956],{},"A lot.",[11,958,959,960,963],{},"Discretionary trading sounds appealing. It feels like you have control. You look at a chart, you see a pattern, you make a call. You feel smart. You feel in control. But that feeling is a trap. ",[47,961,962],{},"The market doesn't care how smart you feel."," The market will take your money just the same whether you feel like a genius or like an idiot.",[11,965,966,967,970],{},"The problem with discretionary trading is consistency. You might make good decisions sometimes. But you also make bad decisions sometimes. And you can't tell the difference between the two until the trade is closed. By then, it's too late. You're either celebrating a win or licking your wounds. ",[32,968,969],{},"There's no system. There's no process."," There's just you, guessing, hoping, praying.",[11,972,973,974,977],{},"And emotions. Don't get me started on emotions. Every discretionary trader says they can control their emotions. They can't. Nobody can. Not really. ",[47,975,976],{},"The moment you see red on your screen, your brain does things you didn't plan for."," It tells you to exit early. It tells you to double down. It tells you to revenge trade. You think you're different. You're not. I'm not. Nobody is.",[11,979,980,981,984,985,988,989],{},"That's why I moved to systematic trading. Not because I'm smarter. But because I know I'm not smart enough to beat the market with feelings and intuition. ",[47,982,983],{},"I know my brain will lie to me."," I know I'll convince myself of things that aren't true. So I built a system that doesn't care what I think. The system doesn't have emotions. The system doesn't second-guess itself. The system follows rules. ",[32,986,987],{},"Unlike me, apparently."," ",[32,990,991],{},"Also invest in your own server it helps.",[36,993,995],{"id":994},"systematic-trading-with-hypothesis-testing","Systematic Trading With Hypothesis Testing",[11,997,998,999],{},"This is the approach I take now. It's not about predicting the market. It's not about being right. It's about testing hypotheses and letting the data decide. ",[32,1000,1001],{},"Wild concept, I know.",[11,1003,1004,1005,1008,1009],{},"Every strategy I build starts with a hypothesis. Not a feeling. Not a pattern I think I see. ",[47,1006,1007],{},"A hypothesis."," Something I can test. Something with clear rules. Something that can be proven wrong. If you can't prove it wrong, it's not a hypothesis. It's just a hope. And hopes don't make money. ",[32,1010,1011],{},"Trust me, I've tried.",[11,1013,1014],{},"Hypothesis: Markets that are ranging will mean revert within a certain time frame. Test: Build a system that trades mean reversion in ranging markets. Run it on historical data. See if it works. If it doesn't, the hypothesis is wrong. Move on. Hypothesis: Trend following works in strong trends. Test: Build a system that trades with the trend when certain conditions are met. Run it. See if it makes money. If it doesn't, the hypothesis is wrong.",[11,1016,1017,1018,1021,1022],{},"This is how proper research works. You form a hypothesis. You test it. You accept the results. ",[47,1019,1020],{},"If the data says your hypothesis is wrong, you don't double down."," You don't tweak the parameters until it works. You accept it and move on. That's the difference between trading and gambling. Gamblers double down when they're wrong. Researchers move on when their hypothesis fails. ",[32,1023,1024],{},"I'm still learning to be a researcher, not a gambler.",[11,1026,1027],{},"The system I run now is built on this approach. It has regime detection. It uses Monte Carlo simulation for stop placement. It has Markov chain filtering for regime transitions. It uses Kelly Criterion for position sizing. It has hard risk limits. 1% max risk per trade. 3% daily limit.",[11,1029,1030,1031,1034],{},"Does it work all the time? ",[32,1032,1033],{},"No."," Nothing works all the time. But it works consistently. It loses less when it's wrong. It survives through drawdowns. And most importantly, it's testable. I can run the same tests again. I can validate the results. I can improve it over time.",[11,1036,1037,1038,1041],{},"That's the point. Systematic trading with hypothesis testing isn't sexy. It's not exciting. You won't feel like a genius when you make a trade. But you also won't feel like an idiot when you lose one. ",[32,1039,1040],{},"Well, you might still feel like an idiot sometimes. But at least it's a systematic idiot with a process."," You'll just follow the system. You'll collect the data. You'll test the hypotheses. And you'll keep improving. That's the process.",[36,1043,1045],{"id":1044},"life-philosophy-why-i-keep-going","Life Philosophy. Why I Keep Going",[11,1047,1048,1049],{},"Here's the thing. Trading without passion is exhausting. When you're only in it for the money, every loss feels like a failure. But when you're in it for the learning too, every loss is just data. Every failure is feedback. Every drawdown is information. ",[47,1050,1051],{},"The emotional weight changes when you're doing research, not just chasing profit.",[11,1053,1054],{},"And honestly. That's the only way I've been able to stick with it. If this was just about money, I would have quit years ago. The losses would have been too discouraging. But because it's also about building something interesting, about understanding markets, about applying what I learned in school in a way that actually works, there's a different kind of motivation there.",[11,1056,1057,1058,1061,1062],{},"This might be one of my longest commitments. ",[32,1059,1060],{},"Right up there with Overlord."," And that's saying something. That show has been my thing for years. But this quant journey? It's become more than just trying to make money from trading. It's become a genuine research interest. A technical challenge. Something I'm actually curious about beyond just the money. ",[47,1063,1064],{},"And that's saying a lot coming from a guy who really likes money.",[36,1066,1068],{"id":1067},"still-learning-long-haul-ahead","Still Learning. Long Haul Ahead",[11,1070,1071,1072,1075],{},"I'm still in the early stages. Still building the system. Still learning what works and what doesn't. Still making mistakes. Still \"losing money\" sometimes. But now I lose less. And now I understand why. ",[32,1073,1074],{},"That's progress."," That's what this journey is about.",[11,1077,1078,1079,1082],{},"The code is private now. Not because it's special. Just because I haven't made it public yet. But the system lives in the quant branch running on my server somewhere ",[32,1080,1081],{},"No more loadshedding",". It's not finished. It might never be. But it's honest. It's systematic. It's mine.",[36,1084,1086],{"id":1085},"what-if-i-started-a-quant-research-firm","What If I Started A Quant Research Firm",[11,1088,1089,1090,1093],{},"Sometimes I think about this. Actually starting a quant research firm. Not a hedge fund. Not a prop trading desk. ",[47,1091,1092],{},"A research firm."," Focused on systematic approaches to trading. Focused on the research itself, not just the trading.",[11,1095,1096,1097],{},"What would that mean. For me. It would mean taking everything I've learned. The failures, the lessons, the system I've built. It would mean committing to this path not as a side project, but as a career. As an identity. As something I actually do for a living, not just something I do in my spare time while answering emails for my day job. ",[32,1098,1099],{},"Not that I have a day job yet. Fingers crossed.",[11,1101,1102],{},"It would mean accepting that I'm not just a trader. I'm a researcher. A systematic thinker. Someone who builds things that try to solve a hard problem. The problem isn't just making money. The problem is understanding how markets work, how risk works, how to survive in an environment that's designed to take your money.",[11,1104,1105,1106,1109],{},"What would it mean to me. ",[47,1107,1108],{},"Everything, honestly."," I've been building toward something like this without naming it. The trading system, the research, the learning, the failures. All of it is preparation for something bigger. Not just profit. But a contribution. A real contribution to how people think about systematic trading, possibly investing and risk management.",[11,1111,1112,1113],{},"There are a lot of people out there selling trading courses. Selling signals. Selling indicators. Selling the dream of quick money. I don't want to be that. I gatekeep and I want to be the person who actually does the research. Who builds something honest. Who shares what's real, not what's profitable to sell. ",[32,1114,1115],{},"There's no money in honesty, but there's definitely money in gatekeeping.",[11,1117,1118,1119],{},"Maybe a quant research firm is the way to do that. Or maybe it's just a fancy way to describe what I'm already doing. Either way, it's on my mind. It's one of the things that keeps me going. ",[47,1120,1121],{},"The idea that this could be more than just trading. This could be a life's work.",[11,1123,1124],{},"I'm not there yet. I don't have clients, I don't have capital, I don't have a team. What I have is a system that's getting better, a way of thinking that's maturing, and a willingness to keep learning. Maybe that's enough to start. Maybe that's where the journey leads next.",[36,1126,1128],{"id":1127},"the-brutal-truth","The Brutal Truth",[11,1130,1131],{},"Let me end with the brutal truth.",[11,1133,1134,1137,1138,1141],{},[47,1135,1136],{},"Algorithmic trading won't make me invincible."," It won't make me rich ",[32,1139,1140],{},"yet",". It won't make the market stop doing what it does.",[11,1143,1144,1145,1148],{},"But it will make me consistent. It will make me survive longer. And most importantly, it will make me lose less when I'm wrong. ",[47,1146,1147],{},"That's the actuarial promise."," Not you won't lose. But you'll lose less than you would have otherwise. And over time. Over time, that's everything.",[11,1150,1151,1152],{},"I'm in it for the long haul. Just like everything else I've ever cared about. ",[32,1153,1154],{},"Including that time I binge watched 8 seasons of Naruto... But that's another story.",[11,1156,1157],{},[47,1158,1159,1160],{},"PS: If I am making money from this I wont tell you. If am earning good money you wont know... ",[32,1161,1162],{},"But you can trust me to smile and gatekeep.",{"title":666,"searchDepth":667,"depth":667,"links":1164},[1165,1166,1174,1175,1181,1182,1183,1184,1185,1186],{"id":725,"depth":667,"text":726},{"id":742,"depth":667,"text":743,"children":1167},[1168,1169,1170,1171,1172,1173],{"id":752,"depth":672,"text":753},{"id":763,"depth":672,"text":764},{"id":774,"depth":672,"text":775},{"id":785,"depth":672,"text":786},{"id":796,"depth":672,"text":797},{"id":807,"depth":672,"text":808},{"id":852,"depth":667,"text":853},{"id":872,"depth":667,"text":873,"children":1176},[1177,1178,1179,1180],{"id":883,"depth":672,"text":884},{"id":897,"depth":672,"text":898},{"id":908,"depth":672,"text":909},{"id":922,"depth":672,"text":923},{"id":949,"depth":667,"text":950},{"id":994,"depth":667,"text":995},{"id":1044,"depth":667,"text":1045},{"id":1067,"depth":667,"text":1068},{"id":1085,"depth":667,"text":1086},{"id":1127,"depth":667,"text":1128},"2026-04-15","Five years of trading since my first year of university. From ARIMA failures to ML lies to system not strategy. Still learning, still losing sometimes, but now losing less.",{},"\u002Fblog\u002Fquant-journey",{"title":717,"description":1188},"blog\u002Fquant-journey",[710,711,1194,1195,1196,713],"actuarial","risk","algorithm","YhNcJVZFwH0HmkNKBEGLMeqKPq6mG_k2XyfOTXTy_oo",{"id":1199,"title":1200,"body":1201,"date":1638,"description":1639,"extension":702,"featured":703,"meta":1640,"navigation":705,"path":1641,"seo":1642,"stem":1643,"tags":1644,"__hash__":1650},"blog\u002Fblog\u002Fv-star-interest.md","In The Interest Of Things — v-star Updates",{"type":8,"value":1202,"toc":1618},[1203,1213,1217,1224,1228,1231,1259,1266,1269,1273,1276,1287,1291,1309,1312,1315,1341,1352,1357,1361,1364,1368,1374,1381,1384,1387,1390,1394,1401,1405,1408,1415,1419,1422,1431,1437,1443,1449,1458,1462,1465,1498,1509,1513,1516,1525,1531,1537,1541,1544,1554,1560,1563,1567,1570,1573,1576,1580,1583,1593,1596,1600,1606,1609],[11,1204,1205,1206,1209,1210,836],{},"It's been one of those weeks where you look back and realize you've spent the weekend doing something deeply specific, and you need to tell someone about it. So yeah let me talk. This is about v-star — my ",[32,1207,1208],{},"high-performance actuarial engine"," in Go — and what happened this week. Some of it is technical. Some of it is philosophical. All of it is ",[32,1211,1212],{},"true enough",[36,1214,1216],{"id":1215},"what-actually-happened-this-week","What Actually Happened This Week",[11,1218,1219,1220,1223],{},"Between March 20 and 23, I made meaningful progress on v-star. Not the ",[32,1221,1222],{},"exceptional"," kind — no viral moments or product launches — just quiet, technical work that moved the project forward. Now here's the breakdown.",[64,1225,1227],{"id":1226},"march-20-building-the-foundation","March 20 — Building the Foundation",[11,1229,1230],{},"I added four core actuarial packages in a single day. That's a lot of work laid at once:",[1232,1233,1234,1241,1247,1253],"ul",{},[160,1235,1236,1240],{},[1237,1238,1239],"code",{},"pkg\u002Frates"," — Handles interest rate calculations, discount factors, and rate conversions. The mathematical backbone of any actuarial calculation.",[160,1242,1243,1246],{},[1237,1244,1245],{},"pkg\u002Fmortality"," — Mortality tables with qx\u002Fpx calculations and CSV loading. Because insurance is fundamentally about measuring how long people live, and the math has to reflect that.",[160,1248,1249,1252],{},[1237,1250,1251],{},"pkg\u002Fannuities"," — Whole life, term, and deferred annuity calculations. Payment streams that go on for years, sometimes decades. Getting the math right matters.",[160,1254,1255,1258],{},[1237,1256,1257],{},"pkg\u002Freserves"," — Net premium, gross premium, and both prospective and retrospective reserve calculations. This is what actuaries actually do — figure out how much money needs to be set aside to pay future claims.",[11,1260,1261,1262,1265],{},"I also wrote ",[1237,1263,1264],{},"AGENTS.md"," — a simple, open format for guiding coding agents, used by over 60k open-source projects.",[11,1267,1268],{},"Think of AGENTS.md as a README for agents: a dedicated, predictable place to provide the context and instructions to help AI coding agents work on your project.",[64,1270,1272],{"id":1271},"march-21-the-cli-gets-better","March 21 — The CLI Gets Better",[11,1274,1275],{},"Fixed a bug in the mortality table CSV parsing where the code wasn't correctly detecting when px (probability of survival) columns were missing. This sounds like a small detail, but parsing errors in actuarial work flow through everything downstream. One bad column means wrong reserves, wrong premiums, wrong everything.",[11,1277,1278,1279,1282,1283,1286],{},"I also added a ",[1237,1280,1281],{},"--table"," flag to the CLI for mortality based policy valuation. Now you can point the tool at a mortality table and get proper valuations. It works. It's ",[32,1284,1285],{},"decent",". That's the goal.",[64,1288,1290],{"id":1289},"march-22-the-performance-story","March 22 — The Performance Story",[11,1292,1293,1294,1297,1298,1301,1302,1305,1306],{},"Here's the big one. I\u002FAI improved CSV parsing throughput by ",[47,1295,1296],{},"6.8x",". Let me say that again because I still don't fully believe it: I went from processing roughly ",[47,1299,1300],{},"1.5 million rows per second"," to about ",[47,1303,1304],{},"10.7 million rows per second",". The parallel version hits 11 million. ",[32,1307,1308],{},"Don't tell anyone but I got a server and it hit 38 million rows per second",[11,1310,1311],{},"For those not familiar with the terminology: a \"row\" is one record in a CSV file. One policy. One customer. One calculation waiting to happen. When you're processing millions of policies, getting from 1.5M to 10.7M rows per second changes everything.",[11,1313,1314],{},"What changed? Four specific optimizations:",[1232,1316,1317,1323,1329,1335],{},[160,1318,1319,1322],{},[47,1320,1321],{},"Streaming processor"," — Instead of loading an entire file into memory before processing it, the new system reads and processes one line at a time. This uses way less RAM and starts returning results faster.",[160,1324,1325,1328],{},[47,1326,1327],{},"Pre-allocated slices"," — Instead of starting with an empty container and repeatedly adding to it (which requires allocating more memory as it grows), the code now counts how many fields exist first, then creates exactly the right-sized container. No wasted memory. No resizing overhead.",[160,1330,1331,1334],{},[47,1332,1333],{},"String interning"," — When converting raw bytes to strings, the old code was creating entirely new copies every time. The new code uses Go's unsafe package to create \"views\" into existing memory. Same data, no copy. Massive savings when processing millions of rows.",[160,1336,1337,1340],{},[47,1338,1339],{},"sync.Pool usage"," — Added proper object pooling for field buffers. Instead of creating new temporary arrays for every single row, the system now reuses memory that's been used before. This reduces garbage collection pressure significantly.",[11,1342,1343,1344,1347,1348,1351],{},"I ran benchmarks comparing the Go implementation against Python with Pandas and Polars. The results were interesting — I beat Pandas of course but Polars is a ",[32,1345,1346],{},"hit or miss"," at times, I win, I lose. ",[32,1349,1350],{},"It's early to say"," This isn't to say Python is bad — no, it's a reminder of what you can achieve when you optimize carefully and leverage Go's strengths.",[11,1353,1354],{},[32,1355,1356],{},"Side note: I used AI to help identify these bottlenecks. More on that below.",[64,1358,1360],{"id":1359},"march-23-release-prep","March 23 — Release Prep",[11,1362,1363],{},"Updated README, ROADMAP, and LICENSE for v0.2.0. Version numbers feel ambitious for something with maybe a dozen users total, but there's something satisfying about formalizing progress. It forces you to look at what you've done and call it \"a release.\" That's useful even if no one else is paying attention.",[36,1365,1367],{"id":1366},"using-ai-to-find-performance-issues","Using AI to Find Performance Issues",[11,1369,1370,1371,836],{},"I'll be honest: I was skeptical about using AI to help with performance optimization. I'd used it for code generation, for explanations, for debugging — but optimization felt like something that required human intuition, profiler data, and countless hours of staring at ",[32,1372,1373],{},"flame graphs",[11,1375,1376,1377,1380],{},"That changed this week. Here's what happened: I fed the CSV parser code to an AI and asked it to find places where memory was being allocated unnecessarily. And it found things. It found ",[32,1378,1379],{},"a lot"," of things.",[11,1382,1383],{},"The AI pattern-matched across my entire codebase and connected dots I would have found eventually but not quickly. It found that I was converting byte slices to strings in tight loops — creating garbage on every iteration. It noticed the sync.Pool was either missing or implemented suboptimally. It saw places where I was appending to slices without capacity pre-allocation.",[11,1385,1386],{},"Is this cheating? its called embracing the times. Using AI to find performance issues is the same as using a profiler — it's a tool that surfaces information you'd find eventually but faster. The expertise is in knowing what to fix and why it matters. The AI just helped me find it.",[11,1388,1389],{},"The best part: after implementing the fixes, the numbers spoke for themselves. 6.8x faster. That's not AI hallucination. That's measurable, reproducible, objective improvement. I'll take that result any day.",[36,1391,1393],{"id":1392},"why-vba-needs-to-die-and-why-it-wont","Why VBA Needs to Die (And Why It Won't)",[11,1395,1396,1397,1400],{},"Let me talk about something that matters to a lot of people but gets swept under the rug: Visual Basic for Applications (VBA) is a ",[32,1398,1399],{},"disaster"," in my opinion. And I mean that with the nuance it deserves — VBA isn't going anywhere, and here's why that's a problem.",[64,1402,1404],{"id":1403},"what-vba-actually-is","What VBA Actually Is",[11,1406,1407],{},"VBA is the programming language embedded in Microsoft Excel. It lets you write macros, automate tasks, and build \"applications\" inside spreadsheets. It's been around since 1993. That's over 30 years of accumulated technical debt in every insurance company, pension fund, and actuarial firm on the planet.",[11,1409,1410,1411,1414],{},"And here's the uncomfortable truth: ",[47,1412,1413],{},"most actuarial work is still done in VBA and Excel."," Not because it's good. Because it's what everyone knows and the solution we'd die on. Because it's what the industry standardizes on. Because switching costs are enormous and the risk of making a mistake during migration is terrifying.",[64,1416,1418],{"id":1417},"why-vba-is-technically-outdated","Why VBA is Technically Outdated",[11,1420,1421],{},"Let me break down the specific problems for those who haven't lived through this:",[11,1423,1424,1427,1428],{},[47,1425,1426],{},"No type safety."," You can pass a string to a function expecting a number and Excel will try its best. Sometimes it works. Sometimes it returns \"type mismatch\" at 2am before a deadline. Sometimes it silently does the wrong thing. There's no compiler catching your mistakes before they reach production. ",[32,1429,1430],{},"I learnt my lesson... stop writing Python without types. If you don't listen to my warning, you'll learn the hard way.",[11,1432,1433,1436],{},[47,1434,1435],{},"No version control."," Excel files don't diff well. VBA code stored in Excel modules is essentially invisible to Git. You can't review changes, branch, or merge. Every \"improvement\" is a new file. Every disaster is a file you can't recover from.",[11,1438,1439,1442],{},[47,1440,1441],{},"Single-threaded by default."," Want to process a million policies in VBA? Hope you like waiting. There's no built-in concurrency. Everything runs on one thread. One CPU core. One calculation at a time.",[11,1444,1445,1448],{},[47,1446,1447],{},"Fragile."," Move a cell? Formula breaks. Rename a sheet? Formula breaks. Change a column order? Formula breaks. The dependencies between different parts of a spreadsheet are invisible and impossible to track. You can break something by accident and never know until a client notices.",[11,1450,1451,1454,1455],{},[47,1452,1453],{},"\"It works on my machine.\""," The classic excuse. Different Excel versions, different regional settings (comma vs. period for decimals), different security settings — code that runs perfectly on your machine fails on your client's. And there's no way to test it until production. ",[32,1456,1457],{},"This is the reason I wrote v-star in Go with no dependencies and not Python.",[64,1459,1461],{"id":1460},"why-it-wont-change","Why It Won't Change",[11,1463,1464],{},"Here's why VBA persists despite all of this:",[1232,1466,1467,1477,1483,1492],{},[160,1468,1469,1472,1473,1476],{},[47,1470,1471],{},"Institutional knowledge."," The actuarial models built over decades are in VBA. ",[32,1474,1475],{},"Nobody fully understands them anymore",", but they work. Replacing them is a massive risk with unclear upside.",[160,1478,1479,1482],{},[47,1480,1481],{},"Regulatory acceptance."," Actuaries can defend Excel calculations to regulators. Can they defend a custom Go tool? Maybe. But it's an uphill battle.",[160,1484,1485,1488,1489],{},[47,1486,1487],{},"Training pipelines."," Universities still teach VBA to actuaries. Students graduate knowing Excel and VBA, not Go or Python. The cycle reinforces itself. ",[32,1490,1491],{},"But apparently this is changing",[160,1493,1494,1497],{},[47,1495,1496],{},"No catastrophic failure."," When VBA breaks, it usually breaks quietly. Wrong numbers get caught in review. Nobody dies. So there's no urgent pressure to fix it.",[11,1499,1500,1501,1504,1505,1508],{},"This is why I'm building v-star. ",[32,1502,1503],{},"Not to replace every spreadsheet in existence"," — that's unrealistic and probably not even desirable for all cases — but to show that ",[32,1506,1507],{},"another way exists",". Code that's version-controlled, typed, concurrent, and fast. It's possible. You just have to choose to do it.",[36,1510,1512],{"id":1511},"who-this-is-for-a-self-reflection","Who This Is For — A Self-Reflection",[11,1514,1515],{},"Here's where I get honest with myself. Who is v-star actually for?",[11,1517,1518,1521,1522],{},[47,1519,1520],{},"Maybe actuaries?"," Those of you who are tired of waiting 20 minutes for a valuation to run. Who want something faster, auditable, and doesn't require a degree in VBA archaeology to understand. The market for this is... small. ",[32,1523,1524],{},"Actuarial science is a niche field. High-performance actuarial software in Go is a niche within a niche.",[11,1526,1527,1530],{},[47,1528,1529],{},"Maybe students?"," People learning actuarial mathematics and concepts who want to see how the formulas translate to actual code. Not Excel magic — real implementations they can read, modify, and learn from. This is probably the most likely audience, honestly.",[11,1532,1533,1536],{},[47,1534,1535],{},"Maybe no one?"," It's possible I'm building this for myself. A personal project that scratches an itch. A way to learn Go deeply by building something real. A portfolio piece that proves I can do this.",[64,1538,1540],{"id":1539},"whats-the-goal","What's The Goal?",[11,1542,1543],{},"I genuinely don't know anymore. When I started, I had a clear story: \"build a fast actuarial engine to replace slow Excel models.\" But as I've worked on it, the goal has shifted.",[11,1545,1546,1547,1550,1551],{},"Now I think the goal is simpler: ",[47,1548,1549],{},"make something that exists."," Something that works. Something that's fast. Something that proves you can build actuarial software without VBA, without Excel, without the traditional ecosystem. Something that demonstrates it's possible, even if nobody ever uses it... ",[32,1552,1553],{},"Something simply to shit on VBA",[11,1555,1556,1559],{},[32,1557,1558],{},"There's a strange satisfaction in that."," In building something just to prove it can be built. In learning things you'd never learn from tutorials because you're solving problems that actually matter. In making something that's yours.",[11,1561,1562],{},"And maybe that's the answer. The goal isn't \"solve a problem the world knows it has.\" The goal is \"learn what you'd never learn otherwise.\" To build something interesting to you, and trust that interesting things are worth building, even if the audience is small.",[64,1564,1566],{"id":1565},"a-note-to-business-owners","A Note to Business Owners",[11,1568,1569],{},"If you're running a business that relies on actuarial calculations — pricing, reserving, risk modeling — and you're doing it in Excel, I understand. It works. Your team knows it. The regulators accept it. Changing is scary.",[11,1571,1572],{},"But consider this: that Excel model was probably built by someone who left five years ago. It's held together by institutional knowledge and hope. It takes 20 minutes to run. It can only process one scenario at a time.",[11,1574,1575],{},"Tools like v-star aren't about replacing everything overnight. They're about having options. About demonstrating what's possible. About starting a conversation about what's worth investing in. The spreadsheet will still be there. But it could be faster, more reliable, and more maintainable if you chose to invest in it.",[64,1577,1579],{"id":1578},"a-note-to-students","A Note to Students",[11,1581,1582],{},"If you're studying actuarial science and learning VBA because it's \"the industry standard\" — learn it, use it, pass your exams. But know that it's not the only way. It's not even the best way. It's just the established way.",[11,1584,1585,1586,1589,1590],{},"Build things. Try different tools. Learn programming languages that force you to think differently about problems. ",[32,1587,1588],{},"The best actuaries I know are the ones who can look at a problem from multiple angles"," — the mathematical angle, the computational angle, the business angle. Don't limit yourself to one. ",[32,1591,1592],{},"Like really... shout out to Mr. Suleman Patel.",[11,1594,1595],{},"And if you're curious about how actuarial math translates to code, check out v-star. It's not perfect. It's not finished. But it's real, and it's working, and it's fast. That's more than most tutorials give you.",[36,1597,1599],{"id":1598},"whats-next","What's Next",[11,1601,1602,1603],{},"More actuarial functions. Better annuity variants. Parallel Monte Carlo with variance reduction techniques (so we can get better statistical results with fewer simulations). A proper bench command. Statistical analysis — percentiles, confidence intervals, the things actuaries actually need to report. ",[32,1604,1605],{},"Honestly I don't know... I'll see how things go and if I'll get any feedback.",[11,1607,1608],{},"The roadmap is long and the user base is small, but that's never stopped anyone from building something they care about. We'll see where this goes.",[11,1610,1611,1612,1617],{},"Repo is at ",[15,1613,1616],{"href":1614,"rel":1615},"https:\u002F\u002Fgithub.com\u002Flubasinkal\u002Fv-star",[19],"github.com\u002Flubasinkal\u002Fv-star",". MIT licensed. Use it if it helps. In the interest of things.",{"title":666,"searchDepth":667,"depth":667,"links":1619},[1620,1626,1627,1632,1637],{"id":1215,"depth":667,"text":1216,"children":1621},[1622,1623,1624,1625],{"id":1226,"depth":672,"text":1227},{"id":1271,"depth":672,"text":1272},{"id":1289,"depth":672,"text":1290},{"id":1359,"depth":672,"text":1360},{"id":1366,"depth":667,"text":1367},{"id":1392,"depth":667,"text":1393,"children":1628},[1629,1630,1631],{"id":1403,"depth":672,"text":1404},{"id":1417,"depth":672,"text":1418},{"id":1460,"depth":672,"text":1461},{"id":1511,"depth":667,"text":1512,"children":1633},[1634,1635,1636],{"id":1539,"depth":672,"text":1540},{"id":1565,"depth":672,"text":1566},{"id":1578,"depth":672,"text":1579},{"id":1598,"depth":667,"text":1599},"2026-03-23","6.8x performance improvement. AI that actually helped. A passionate rant on why VBA is broken. And the honest question: who is this for?",{},"\u002Fblog\u002Fv-star-interest",{"title":1200,"description":1639},"blog\u002Fv-star-interest",[1645,1194,1646,1647,1648,1649],"go","performance","ai","vba","philosophy","OO89aGKFWM3Avt_cbcQ1yfrRKLdCH8sT96nWfcaInmM",{"id":1652,"title":1653,"body":1654,"date":2348,"description":2349,"extension":702,"featured":703,"meta":2350,"navigation":705,"path":2351,"seo":2352,"stem":2353,"tags":2354,"__hash__":2358},"blog\u002Fblog\u002Fnvim-config.md","My Neovim Config (and Why You Should Care)",{"type":8,"value":1655,"toc":2332},[1656,1663,1667,1678,1697,1700,1704,1711,1718,1721,1725,1728,1756,1764,1767,1771,1787,1791,1802,1822,1825,1829,1836,1858,1864,1878,1904,1918,1939,1980,1990,1999,2009,2019,2029,2059,2069,2088,2092,2099,2103,2130,2134,2141,2193,2197,2200,2204,2207,2250,2269,2273,2298,2304,2308],[11,1657,1658,1659,1662],{},"I use Neovim. There, I said it. Before you click away thinking \"oh great, another Vim zealot telling me my IDE is garbage\" — sit down, shut up, and hear me out. I promise I won't say ",[1237,1660,1661],{},"hjkl"," more than... okay, I'll say it a few times. But there's a reason.",[36,1664,1666],{"id":1665},"why-vim-motions-are-actually-insane","Why Vim Motions Are Actually Insane",[11,1668,1669,1670,1673,1674,1677],{},"Here's the thing nobody tells you when you're starting out as a developer: you spend roughly 90% of your time ",[32,1671,1672],{},"reading"," code and ",[32,1675,1676],{},"moving around"," files, not actually typing new code. The bottleneck isn't your typing speed. It's how fast you can navigate, select, delete, rearrange, and manipulate the text that's already there.",[11,1679,1680,1681,1684,1685,1688,1689,1692,1693,1696],{},"Vim motions are like giving your keyboard a PhD in text manipulation. ",[1237,1682,1683],{},"ciw"," — change inner word. ",[1237,1686,1687],{},"da{"," — delete around braces. ",[1237,1690,1691],{},"yap"," — yank a paragraph. You're not pressing keys one at a time anymore; you're ",[32,1694,1695],{},"composing commands",". It's like going from pointing at letters on a whiteboard to writing actual sentences.",[11,1698,1699],{},"Does it feel weird at first? Absolutely. You will open Vim, try to type, and nothing will happen. You will Google \"how to exit Vim\" at 2 AM and question every life decision that led you here. That's normal. That's the initiation ritual. After about a week, something clicks, and suddenly your mouse feels like a steering wheel made of wet spaghetti.",[36,1701,1703],{"id":1702},"but-its-not-for-everyone-and-thats-fine","But It's Not for Everyone (And That's Fine)",[11,1705,1706,1707,1710],{},"Look, I'm not going to pretend Vim motions are the answer to all your problems. If you're happy in VS Code, if your workflow is smooth, if you're shipping code and solving problems — you don't ",[32,1708,1709],{},"need"," Vim. Vim motions won't fix your broken TypeScript types. They won't debug your React re-renders. They won't make your Python script run faster.",[11,1712,1713,1714,1717],{},"But if you've ever felt like your editor is slowing you down — if you find yourself reaching for the mouse every 3 seconds, if you're tired of clicking through menus, if you want to feel like you're actually ",[32,1715,1716],{},"controlling"," your code instead of just editing it — then Vim motions might be worth a look.",[11,1719,1720],{},"The best part? You don't even need to use Neovim to try them.",[36,1722,1724],{"id":1723},"the-try-before-you-commit-starter-pack","The \"Try Before You Commit\" Starter Pack",[11,1726,1727],{},"Before going full Neovim, try Vim motions in your current editor:",[1232,1729,1730,1740,1750],{},[160,1731,1732,1735,1736,1739],{},[47,1733,1734],{},"VS Code"," — Install the ",[1237,1737,1738],{},"vscodevim"," extension. That's it. You get Vim keybindings inside VS Code. Keep your extensions, keep your theme, keep your comfort. Just start moving faster.",[160,1741,1742,1745,1746,1749],{},[47,1743,1744],{},"Zed"," — Has built-in Vim mode. Toggle it on, and you're good. Zed is fast as hell too, so you get Vim motions ",[32,1747,1748],{},"and"," a modern editor.",[160,1751,1752,1755],{},[47,1753,1754],{},"JetBrains"," — The IdeaVim plugin. Same deal. Vim inside your existing IDE.",[11,1757,1758,1759,836],{},"If after a month you're thinking \"okay, this is actually kind of nice\" — then maybe it's time for Neovim. And if you want a starting point that won't make you want to throw your laptop into the sea, use ",[15,1760,1763],{"href":1761,"rel":1762},"https:\u002F\u002Fgithub.com\u002Fnvim-lua\u002Fkickstart.nvim",[19],"kickstart.nvim",[11,1765,1766],{},"Kickstart is a single-file Neovim config maintained by TJ DeVries (the guy who basically built half of the Neovim ecosystem). It's not a distribution — it's a starting point. One file. You read it, you understand it, you customize it. No 400 plugins you'll never configure. No black magic. Just Lua code you can actually read.",[36,1768,1770],{"id":1769},"my-config-where-kickstart-ended-and-opinions-began","My Config: Where Kickstart Ended and Opinions Began",[11,1772,1773,1774,1779,1780,1783,1784],{},"My ",[15,1775,1778],{"href":1776,"rel":1777},"https:\u002F\u002Fgithub.com\u002Flubasinkal\u002Fnvim",[19],"nvim config"," started from kickstart, but it's evolved into something more structured. It's modularized now — not the single-file approach anymore. The config lives in ",[1237,1781,1782],{},"lua\u002Fcustom\u002F"," with separate directories for plugins, LSP, and utilities. The philosophy is still the same though: ",[47,1785,1786],{},"if I don't use it, it's gone. If I can't explain what a line does, it doesn't belong.",[64,1788,1790],{"id":1789},"the-structure","The Structure",[11,1792,1793,1794,1797,1798,1801],{},"The entry point is still one ",[1237,1795,1796],{},"init.lua",", but it's lean. It loads keymaps and options immediately, defers the statusline until the first buffer opens, and lazy-loads utility modules (floating terminal, sessions, tabs) in the background. Then it bootstraps ",[1237,1799,1800],{},"lazy.nvim"," and loads plugins from two directories:",[1232,1803,1804,1810,1816],{},[160,1805,1806,1809],{},[1237,1807,1808],{},"lua\u002Fcustom\u002Fplugins\u002F"," — one file per plugin or plugin group",[160,1811,1812,1815],{},[1237,1813,1814],{},"lua\u002Fcustom\u002Flsp\u002F"," — LSP config, autocomplete, and formatting",[160,1817,1818,1821],{},[1237,1819,1820],{},"lua\u002Fcustom\u002Futil\u002F"," — floating terminal, session management, tabs",[11,1823,1824],{},"Everything is lazy-loaded by default. A plugin only loads when you actually trigger it. Startup is fast because nothing is loaded until you need it.",[64,1826,1828],{"id":1827},"plugins-whats-actually-in-there","Plugins (What's Actually In There)",[11,1830,1831,1832,1835],{},"Let me walk through what I'm running and ",[32,1833,1834],{},"why"," — because every plugin earns its spot.",[11,1837,1838,1841,1842,1845,1846,1849,1850,1853,1854,1857],{},[47,1839,1840],{},"Telescope"," — The fuzzy finder. Files, grep, buffers, git commits, diagnostics, help tags — everything goes through Telescope. It's hooked up with ",[1237,1843,1844],{},"fzf-native"," (compiled with Zig for speed) and ",[1237,1847,1848],{},"ui-select"," so vim's built-in code action menus use the Telescope UI instead of that ugly default popup. Keybindings are all under ",[1237,1851,1852],{},"\u003Cleader>s"," for search and ",[1237,1855,1856],{},"\u003Cleader>g"," for git.",[11,1859,1860,1863],{},[47,1861,1862],{},"Treesitter"," — Syntax highlighting that actually understands your code. Instead of regex (which is like reading a book one letter at a time), Treesitter parses your code into a tree structure. Highlighting, indentation, and code context all make sense now. Auto-installs parsers for whatever language you open.",[11,1865,1866,1869,1870,1873,1874,1877],{},[47,1867,1868],{},"Flash"," — Press ",[1237,1871,1872],{},"s"," and type a few characters — every match on screen gets a label. Type the label, you're there. It's like easymotion but actually good. Works in normal, visual, and operator-pending modes. ",[1237,1875,1876],{},"S"," does the same thing but for Treesitter nodes, so you can jump to specific code structures.",[11,1879,1880,1883,1884,1888,1889,1888,1892,1895,1896,1899,1900,1903],{},[47,1881,1882],{},"Blink.cmp"," — Autocomplete engine. I switched from nvim-cmp to blink because it's faster and the config is cleaner. Sources are LSP, path, snippets, and buffer. Completion menu shows the source (",[1885,1886,1887],"span",{},"lsp",", ",[1885,1890,1891],{},"snip",[1885,1893,1894],{},"buf",") so you know where suggestions come from. Auto-brackets are enabled. ",[1237,1897,1898],{},"Tab"," and ",[1237,1901,1902],{},"Shift-Tab"," cycle through completions and jump snippets.",[11,1905,1906,1909,1910,1913,1914,1917],{},[47,1907,1908],{},"Conform"," — Formatter. Runs on save. ",[1237,1911,1912],{},"stylua"," for Lua, ",[1237,1915,1916],{},"biome"," for JavaScript\u002FTypeScript\u002FVue\u002FHTML\u002FCSS\u002FJSON. No config files to maintain — it just works.",[11,1919,1920,1923,1924,1899,1927,1930,1931,1934,1935,1938],{},[47,1921,1922],{},"Gitsigns"," — Git diff indicators in the gutter. But the real killer feature is inline blame — every line shows who last touched it and when. ",[1237,1925,1926],{},"]c",[1237,1928,1929],{},"[c"," jump between hunks. ",[1237,1932,1933],{},"\u003Cleader>hs"," stages a hunk. ",[1237,1936,1937],{},"\u003Cleader>hp"," previews it. Full git workflow without leaving the buffer.",[11,1940,1941,1944,1945,1948,1949,1952,1953,1956,1957,1956,1960,1963,1964,1967,1968,1971,1972,1975,1976,1979],{},[47,1942,1943],{},"Mini.nvim"," — A bundle of small, focused plugins. I use: ",[1237,1946,1947],{},"mini.pairs"," (auto-close brackets), ",[1237,1950,1951],{},"mini.surround"," (add\u002Fdelete\u002Freplace surrounds with ",[1237,1954,1955],{},"gsa","\u002F",[1237,1958,1959],{},"gsd",[1237,1961,1962],{},"gsr","), ",[1237,1965,1966],{},"mini.ai"," (enhanced text objects), ",[1237,1969,1970],{},"mini.comment"," (toggle comments), ",[1237,1973,1974],{},"mini.indentscope"," (visual indent guides), and ",[1237,1977,1978],{},"mini.notify"," (clean notification popups). One import, six plugins, zero bloat.",[11,1981,1982,1985,1986,1989],{},[47,1983,1984],{},"Which-key"," — Shows available keybindings as you press them. Uses the ",[1237,1987,1988],{},"helix"," preset for a clean popup. This is how you learn your own config without memorizing everything upfront.",[11,1991,1992,1869,1995,1998],{},[47,1993,1994],{},"Oil.nvim",[1237,1996,1997],{},"-"," and you get a file browser that works like a buffer. Rename files by editing text. Create files by typing a new line. Delete by removing the line. It's the most intuitive file manager I've used.",[11,2000,2001,2004,2005,2008],{},[47,2002,2003],{},"Neo-tree"," — Toggle with ",[1237,2006,2007],{},"\u003Cleader>e",". Opens on the right side. I use Oil more, but Neo-tree is there for when I want a visual overview of the project structure.",[11,2010,2011,2014,2015,2018],{},[47,2012,2013],{},"LazyGit"," — ",[1237,2016,2017],{},"\u003Cleader>gg"," opens a full git TUI in a floating window. Commits, branches, stashing, rebasing — all from a proper UI without leaving Neovim.",[11,2020,2021,2024,2025,2028],{},[47,2022,2023],{},"Render-markdown"," — When you open a ",[1237,2026,2027],{},".md"," file, it renders headings, checkboxes, code blocks, and inline formatting with proper styling. Writing markdown in Neovim finally looks good.",[11,2030,2031,2034,2035,1888,2038,1888,2041,1888,2044,2047,2048,1899,2051,2054,2055,2058],{},[47,2032,2033],{},"Todo-comments"," — Highlights ",[1237,2036,2037],{},"TODO",[1237,2039,2040],{},"FIXME",[1237,2042,2043],{},"HACK",[1237,2045,2046],{},"NOTE"," in your code. ",[1237,2049,2050],{},"]t",[1237,2052,2053],{},"[t"," jump between them. ",[1237,2056,2057],{},"\u003Cleader>st"," searches all todos across the project via Telescope.",[11,2060,2061,2064,2065,2068],{},[47,2062,2063],{},"ts-autotag"," — Auto-closes and renames HTML\u002FJSX tags. Type ",[1237,2066,2067],{},"\u003Cdiv>"," and the closing tag appears. Rename the opening tag, the closing tag updates. Small thing, big quality of life.",[11,2070,2071,2014,2074,1913,2077,2080,2081,2083,2084,2087],{},[47,2072,2073],{},"LSP (nvim-lspconfig + Mason)",[1237,2075,2076],{},"lua_ls",[1237,2078,2079],{},"ts_ls"," for TypeScript\u002FJavaScript (with Vue support via the Vue language server plugin), ",[1237,2082,1912],{}," for formatting. Mason auto-installs what's needed. ",[1237,2085,2086],{},"fidget.nvim"," shows LSP progress in the corner so you know when the server is doing something.",[64,2089,2091],{"id":2090},"hand-built-statusline-no-plugin-needed","Hand-Built Statusline (No Plugin Needed)",[11,2093,2094,2095,2098],{},"I don't use lualine or any statusline plugin. It's a hand-written Lua function in ",[1237,2096,2097],{},"statusline.lua"," that renders directly into Neovim's native statusline. Shows the mode (color-coded — violet for normal, blue for insert, cyan for visual), git branch (from gitsigns), diagnostics count, current file, LSP client name, filetype, line\u002Fcolumn, and scroll percentage. About 150 lines of Lua. No dependencies. Loads after the first buffer to save ~5-10ms on startup.",[64,2100,2102],{"id":2101},"custom-utilities","Custom Utilities",[1232,2104,2105,2118,2124],{},[160,2106,2107,2014,2110,2113,2114,2117],{},[47,2108,2109],{},"Floating terminal",[1237,2111,2112],{},"\u003Cleader>tt"," toggles a floating terminal at 80% of the editor size. Reuses the same buffer. Auto-closes when the shell exits. ",[1237,2115,2116],{},"Esc Esc"," exits terminal mode.",[160,2119,2120,2123],{},[47,2121,2122],{},"Sessions"," — Auto-saves and restores your session so you pick up where you left off.",[160,2125,2126,2129],{},[47,2127,2128],{},"Tabs"," — Better tab\u002Fbuffer management.",[64,2131,2133],{"id":2132},"sensible-defaults-the-boring-stuff-that-matters","Sensible Defaults (The Boring Stuff That Matters)",[11,2135,2136,2137,2140],{},"A few things in ",[1237,2138,2139],{},"options.lua"," that make a real difference:",[1232,2142,2143,2146,2152,2155,2165,2168,2171,2181,2187],{},[160,2144,2145],{},"Relative line numbers — you know how far away things are",[160,2147,2148,2151],{},[1237,2149,2150],{},"scrolloff = 10"," — keeps the cursor 10 lines from the edge so context is always visible",[160,2153,2154],{},"Transparent background — the editor background matches your terminal",[160,2156,2157,2160,2161,2164],{},[1237,2158,2159],{},"cmdheight = 0"," — hides the command line until you press ",[1237,2162,2163],{},":",", gives you an extra line of code",[160,2166,2167],{},"Cursorline only in the active window — the focused window has a highlighted line, others don't",[160,2169,2170],{},"Smooth scrolling — because why not",[160,2172,2173,2176,2177,2180],{},[1237,2174,2175],{},"; as :"," — press ",[1237,2178,2179],{},";"," to enter command mode. One less keypress every time.",[160,2182,2183,2186],{},[1237,2184,2185],{},"Alt+j\u002Fk"," to move lines up\u002Fdown — because sometimes you just need to reorder things fast",[160,2188,2189,2192],{},[1237,2190,2191],{},"Ctrl+d\u002Fu"," centers after half-page jump — no more losing your cursor",[64,2194,2196],{"id":2195},"disabled-built-in-plugins","Disabled Built-In Plugins",[11,2198,2199],{},"Neovim ships with plugins most people never use. I disable: gzip, tar, zip, netrw, tohtml, matchit, matchparen, rplugin, editorconfig, man, and spellfile. Each one is a tiny startup cost that adds up. If I need them, I can re-enable them. So far, I haven't.",[64,2201,2203],{"id":2202},"how-it-can-help-you-if-youre-new","How It Can Help You If You're New",[11,2205,2206],{},"If you're just starting to code, here's what this config gives you out of the box:",[1232,2208,2209,2215,2221,2227,2233,2239,2245],{},[160,2210,2211,2214],{},[47,2212,2213],{},"Autocomplete"," that actually works without being annoying",[160,2216,2217,2220],{},[47,2218,2219],{},"Errors highlighted"," in real-time so you catch mistakes before running the code",[160,2222,2223,2226],{},[47,2224,2225],{},"Fast file navigation"," — no more scrolling through a file tree, just fuzzy search",[160,2228,2229,2232],{},[47,2230,2231],{},"Git integration"," built right into the editor — blame, stage, diff, without leaving your code",[160,2234,2235,2238],{},[47,2236,2237],{},"A statusline that tells you everything"," — mode, branch, errors, file, position",[160,2240,2241,2244],{},[47,2242,2243],{},"A floating terminal"," — run commands without leaving Neovim",[160,2246,2247,2249],{},[47,2248,1984],{}," — shows you what keybindings are available as you press keys",[11,2251,2252,2253,2256,2257,2260,2261,2264,2265,2268],{},"You don't need to understand everything on day one. Clone the config, open Neovim, start writing code. Which-key will guide you. Learn the motions as you go. ",[1237,2254,2255],{},"i"," to insert, ",[1237,2258,2259],{},"Esc"," to go back to normal mode, ",[1237,2262,2263],{},":w"," to save, ",[1237,2266,2267],{},":q"," to quit. That's enough to get started. The rest comes naturally.",[36,2270,2272],{"id":2271},"the-how-do-i-exit-vim-section","The \"How Do I Exit Vim\" Section",[11,2274,2275,2276,2278,2279,2282,2283,2286,2287,2290,2291,2294,2295,2297],{},"Just kidding. It's ",[1237,2277,2267],{},". Or ",[1237,2280,2281],{},":wq"," to save and quit. Or ",[1237,2284,2285],{},"ZZ"," if you're feeling fancy. Or ",[1237,2288,2289],{},":qa!"," if you're having a mental breakdown. Or ",[1237,2292,2293],{},"\u003Cleader>x"," in my config because I got tired of typing ",[1237,2296,2281],{}," like a caveman.",[11,2299,2300,2301,836],{},"In all seriousness — the learning curve is real, but it's front-loaded. You struggle for a week, then you're productive, then you're faster than you were before, and you never look back. It's like learning to ride a bike. Except the bike is your text editor, and falling down is accidentally deleting 47 lines with ",[1237,2302,2303],{},"dG",[36,2305,2307],{"id":2306},"links","Links",[1232,2309,2310,2317,2324],{},[160,2311,2312,2313],{},"My config: ",[15,2314,2316],{"href":1776,"rel":2315},[19],"github.com\u002Flubasinkal\u002Fnvim",[160,2318,2319,2320],{},"Kickstart.nvim (the starting point): ",[15,2321,2323],{"href":1761,"rel":2322},[19],"github.com\u002Fnvim-lua\u002Fkickstart.nvim",[160,2325,2326,2327],{},"The video that started it all: ",[15,2328,2331],{"href":2329,"rel":2330},"https:\u002F\u002Fyoutu.be\u002Fm8C0Cq9Uv9o",[19],"The Only Video You Need to Get Started with Neovim",{"title":666,"searchDepth":667,"depth":667,"links":2333},[2334,2335,2336,2337,2346,2347],{"id":1665,"depth":667,"text":1666},{"id":1702,"depth":667,"text":1703},{"id":1723,"depth":667,"text":1724},{"id":1769,"depth":667,"text":1770,"children":2338},[2339,2340,2341,2342,2343,2344,2345],{"id":1789,"depth":672,"text":1790},{"id":1827,"depth":672,"text":1828},{"id":2090,"depth":672,"text":2091},{"id":2101,"depth":672,"text":2102},{"id":2132,"depth":672,"text":2133},{"id":2195,"depth":672,"text":2196},{"id":2202,"depth":672,"text":2203},{"id":2271,"depth":667,"text":2272},{"id":2306,"depth":667,"text":2307},"2026-03-21","Why Vim motions improve your workflow, how to try them in VS Code or Zed, and a walkthrough of my minimal Neovim config.",{},"\u002Fblog\u002Fnvim-config",{"title":1653,"description":2349},"blog\u002Fnvim-config",[2355,2356,2357],"neovim","workflow","editor","qEgkOMIMfkefEavkg8p6-w9nRw16zDSECNfkksyedf0",{"id":2360,"title":2361,"body":2362,"date":2719,"description":2720,"extension":702,"featured":705,"meta":2721,"navigation":705,"path":2722,"seo":2723,"stem":2724,"tags":2725,"__hash__":2728},"blog\u002Fblog\u002Fv-star.md","v-star (v*) – High-Performance Actuarial Engine in Go",{"type":8,"value":2363,"toc":2706},[2364,2371,2375,2388,2397,2400,2404,2407,2433,2437,2440,2444,2447,2451,2454,2458,2461,2574,2577,2580,2606,2609,2613,2616,2636,2639,2643,2646,2672,2674,2677,2695,2702],[11,2365,2366,2367,2370],{},"I've been building ",[47,2368,2369],{},"v-star"," — a high-performance actuarial engine written entirely in Go, with zero dependencies. It handles concurrent financial simulations, mass policy valuations, and Monte Carlo interest rate modeling at speeds that would make a spreadsheet user cry.",[36,2372,2374],{"id":2373},"the-name","The Name",[11,2376,2377,2378,2380,2381,2384,2385,2387],{},"The name ",[47,2379,2369],{}," (v*) comes from actuarial notation. When an annuity's payments compound at rate ",[32,2382,2383],{},"j"," but are discounted at rate ",[32,2386,2255],{},", the adjusted discount factor is:",[2389,2390,2395],"pre",{"className":2391,"code":2393,"language":2394},[2392],"language-text","v* = (1 + j) · v\n","text",[1237,2396,2393],{"__ignoreMap":666},[11,2398,2399],{},"It's an inside joke from university — one my lecturer and my coursemates (brothers and sister deployed to study Actuarial Science) will recognize. I figured if the math is niche enough, the project name should be too.",[36,2401,2403],{"id":2402},"why-build-this","Why Build This?",[11,2405,2406],{},"Most actuarial software is either expensive enterprise tools or fragile Excel models that break when you look at them wrong. I wanted something that:",[1232,2408,2409,2415,2421,2427],{},[160,2410,2411,2414],{},[47,2412,2413],{},"Has zero dependencies"," — just the Go standard library, no third-party packages",[160,2416,2417,2420],{},[47,2418,2419],{},"Is genuinely fast"," — leveraging goroutines for concurrent valuations",[160,2422,2423,2426],{},[47,2424,2425],{},"Is auditable"," — pure, readable math implementations, no black boxes",[160,2428,2429,2432],{},[47,2430,2431],{},"Teaches me Go deeply"," — building real financial systems beats reading tutorials",[36,2434,2436],{"id":2435},"what-it-does","What It Does",[11,2438,2439],{},"v-star has a few core capabilities:",[64,2441,2443],{"id":2442},"policy-valuation","Policy Valuation",[11,2445,2446],{},"Stream-processes CSV files of insurance policies and calculates present values using standard discount factors or the v-star adjusted factor. It handles 1M+ records in under 320ms with minimal memory usage — it streams data rather than loading everything into memory.",[64,2448,2450],{"id":2449},"monte-carlo-simulation","Monte Carlo Simulation",[11,2452,2453],{},"Generates interest rate paths for stochastic modeling. 100,000 paths with 10 time steps? Done in about 100ms. The simulation uses geometric Brownian motion with configurable drift and volatility parameters.",[64,2455,2457],{"id":2456},"cli-first-design","CLI-First Design",[11,2459,2460],{},"Everything runs from the command line. No web dashboard, no config files to edit — just flags and pipes:",[2389,2462,2466],{"className":2463,"code":2464,"language":2465,"meta":666,"style":666},"language-bash shiki shiki-themes vesper","# Calculate discount factors\n.\u002Fv-star -i 0.05 -j 0.02\n\n# Read CSV and benchmark valuation speed\n.\u002Fv-star read policies.csv --benchmark\n\n# Export results as JSON\n.\u002Fv-star read policies.csv --output=json\n\n# Monte Carlo with 100k paths\n.\u002Fv-star montecarlo --paths=100000 --steps=10 --drift=0.02 --volatility=0.15\n","bash",[1237,2467,2468,2476,2495,2500,2506,2520,2525,2531,2543,2548,2554],{"__ignoreMap":666},[1885,2469,2472],{"class":2470,"line":2471},"line",1,[1885,2473,2475],{"class":2474},"ss8vJ","# Calculate discount factors\n",[1885,2477,2478,2482,2486,2489,2492],{"class":2470,"line":667},[1885,2479,2481],{"class":2480},"sNEDb",".\u002Fv-star",[1885,2483,2485],{"class":2484},"sZOz5"," -i",[1885,2487,2488],{"class":2480}," 0.05",[1885,2490,2491],{"class":2484}," -j",[1885,2493,2494],{"class":2480}," 0.02\n",[1885,2496,2497],{"class":2470,"line":672},[1885,2498,2499],{"emptyLinePlaceholder":705},"\n",[1885,2501,2503],{"class":2470,"line":2502},4,[1885,2504,2505],{"class":2474},"# Read CSV and benchmark valuation speed\n",[1885,2507,2509,2511,2514,2517],{"class":2470,"line":2508},5,[1885,2510,2481],{"class":2480},[1885,2512,2513],{"class":2484}," read",[1885,2515,2516],{"class":2484}," policies.csv",[1885,2518,2519],{"class":2484}," --benchmark\n",[1885,2521,2523],{"class":2470,"line":2522},6,[1885,2524,2499],{"emptyLinePlaceholder":705},[1885,2526,2528],{"class":2470,"line":2527},7,[1885,2529,2530],{"class":2474},"# Export results as JSON\n",[1885,2532,2534,2536,2538,2540],{"class":2470,"line":2533},8,[1885,2535,2481],{"class":2480},[1885,2537,2513],{"class":2484},[1885,2539,2516],{"class":2484},[1885,2541,2542],{"class":2484}," --output=json\n",[1885,2544,2546],{"class":2470,"line":2545},9,[1885,2547,2499],{"emptyLinePlaceholder":705},[1885,2549,2551],{"class":2470,"line":2550},10,[1885,2552,2553],{"class":2474},"# Monte Carlo with 100k paths\n",[1885,2555,2557,2559,2562,2565,2568,2571],{"class":2470,"line":2556},11,[1885,2558,2481],{"class":2480},[1885,2560,2561],{"class":2484}," montecarlo",[1885,2563,2564],{"class":2484}," --paths=100000",[1885,2566,2567],{"class":2484}," --steps=10",[1885,2569,2570],{"class":2484}," --drift=0.02",[1885,2572,2573],{"class":2484}," --volatility=0.15\n",[36,2575,2576],{"id":1646},"Performance",[11,2578,2579],{},"The numbers that matter:",[1232,2581,2582,2588,2594,2600],{},[160,2583,2584,2587],{},[47,2585,2586],{},"CSV Parsing:"," ~4.8M rows\u002Fsec — zero-allocation streaming parser",[160,2589,2590,2593],{},[47,2591,2592],{},"Valuation:"," ~3.1M rows\u002Fsec — 1M records in 320ms",[160,2595,2596,2599],{},[47,2597,2598],{},"Monte Carlo:"," ~100k paths\u002Fsec",[160,2601,2602,2605],{},[47,2603,2604],{},"Memory:"," Minimal — streams everything, nothing buffered",[11,2607,2608],{},"I wrote Python benchmarks with both Pandas and Polars for comparison. Go's concurrency model makes a massive difference here — goroutines handle each policy independently, and the runtime schedules them efficiently across cores.",[36,2610,2612],{"id":2611},"architecture","Architecture",[11,2614,2615],{},"The codebase is organized cleanly:",[1232,2617,2618,2624,2630],{},[160,2619,2620,2623],{},[1237,2621,2622],{},"cmd\u002F"," — CLI entry points",[160,2625,2626,2629],{},[1237,2627,2628],{},"pkg\u002F"," — Core packages (CSV parser, valuation engine, Monte Carlo simulator)",[160,2631,2632,2635],{},[1237,2633,2634],{},"docs\u002F"," — Documentation",[11,2637,2638],{},"The CSV parser is a custom streaming parser — no buffering entire files into memory. Records are parsed and processed as they arrive. The valuation engine calculates PVs concurrently using a worker pool pattern. Monte Carlo paths are simulated in parallel using goroutines with a seeded RNG.",[36,2640,2642],{"id":2641},"lessons-learned","Lessons Learned",[11,2644,2645],{},"Building v-star taught me several things about Go and actuarial engineering:",[1232,2647,2648,2654,2660,2666],{},[160,2649,2650,2653],{},[47,2651,2652],{},"Zero dependencies is a feature."," No supply chain risks, no version conflicts, no \"it works on my machine.\" If Go compiles, it runs.",[160,2655,2656,2659],{},[47,2657,2658],{},"Goroutines make concurrency simple."," What would be painful threading in Python or Java is a one-liner in Go.",[160,2661,2662,2665],{},[47,2663,2664],{},"Streaming beats buffering."," For large datasets, processing records one at a time is faster and uses less memory than loading everything first.",[160,2667,2668,2671],{},[47,2669,2670],{},"CLI tools are underrated."," A tool that takes flags, reads stdin, and writes stdout can be composed into any workflow.",[36,2673,1599],{"id":1598},[11,2675,2676],{},"A few things I want to add:",[1232,2678,2679,2682,2685,2692],{},[160,2680,2681],{},"More actuarial functions — annuities, life tables, premium calculations",[160,2683,2684],{},"Parallel Monte Carlo with variance reduction techniques",[160,2686,2687,2688,2691],{},"A ",[1237,2689,2690],{},"bench"," command that runs a full benchmark suite against the included test dataset",[160,2693,2694],{},"Statistical analysis of Monte Carlo results — percentiles, confidence intervals",[11,2696,2697,2698,2701],{},"The repo is at ",[15,2699,1616],{"href":1614,"rel":2700},[19],". It's MIT licensed — feel free to use it, fork it, or break it.",[2703,2704,2705],"style",{},"html pre.shiki code .ss8vJ, html code.shiki .ss8vJ{--shiki-default:#8B8B8B94}html pre.shiki code .sNEDb, html code.shiki .sNEDb{--shiki-default:#FFC799}html pre.shiki code .sZOz5, html code.shiki .sZOz5{--shiki-default:#99FFE4}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":666,"searchDepth":667,"depth":667,"links":2707},[2708,2709,2710,2715,2716,2717,2718],{"id":2373,"depth":667,"text":2374},{"id":2402,"depth":667,"text":2403},{"id":2435,"depth":667,"text":2436,"children":2711},[2712,2713,2714],{"id":2442,"depth":672,"text":2443},{"id":2449,"depth":672,"text":2450},{"id":2456,"depth":672,"text":2457},{"id":1646,"depth":667,"text":2576},{"id":2611,"depth":667,"text":2612},{"id":2641,"depth":667,"text":2642},{"id":1598,"depth":667,"text":1599},"2026-03-20","A zero-dependency actuarial engine for concurrent financial simulations, built entirely in Go.",{},"\u002Fblog\u002Fv-star",{"title":2361,"description":2720},"blog\u002Fv-star",[1645,1194,2726,2727],"simulation","finance","LLG9Vd21tpZr3RvfGqPDYS2jGz1mzeCFkKP8APD-Gcc",{"id":2730,"title":2731,"body":2732,"date":3110,"description":3111,"extension":702,"featured":703,"meta":3112,"navigation":705,"path":3113,"seo":3114,"stem":3115,"tags":3116,"__hash__":3119},"blog\u002Fblog\u002Fwhypython.md","Why Python",{"type":8,"value":2733,"toc":3100},[2734,2755,2759,2762,2843,2847,2850,2904,2908,2970,2978,2997,3021,3025,3058,3062,3093,3097],[11,2735,2736,2737,2742,2743,2746,2747,2750,2751,2754],{},"Right then—I'm a 4th-year actuarial science student, and honestly, Python's been a game-changer for me. I've used it in proper projects, stashed on my GitHub (see ",[15,2738,2741],{"href":2739,"rel":2740},"https:\u002F\u002Fgithub.com\u002Flubasinkal",[19],"github.com\u002Flubasinkal","). Whether it's my repo ",[1237,2744,2745],{},"nvim"," for my Neovim setup, ",[1237,2748,2749],{},"gniphyl"," (a handy file-management tool), or ",[1237,2752,2753],{},"research"," (my data workflows & analysis stuff), Python helped me bridge that gap between statistical modelling, simple automation, and actually writing production-ready code. This page is basically a casual chat about why I reckon Python is worth your time and how I actually put it to use.",[36,2756,2758],{"id":2757},"why-learn-python-the-in-depth-use-cases","Why Learn Python? (The In-Depth Use Cases)",[11,2760,2761],{},"It's not just hype; Python genuinely simplifies your life and provides unmatched productivity in several critical domains. Here are the core reasons why it's the dominant choice for many projects:",[1232,2763,2764,2774,2827,2837],{},[160,2765,2766,2769,2770,2773],{},[47,2767,2768],{},"Low Barrier to Entry & Rapid Prototyping:"," The syntax is clear, using plain English keywords and relying on indentation, which makes it incredibly ",[47,2771,2772],{},"readable"," (adhering to the \"Zen of Python\"). This simplicity means you spend less time debugging syntax errors and more time solving the actual problem, making it perfect for quickly spinning up proof-of-concepts, especially crucial in academic and financial modeling where speed is everything.",[160,2775,2776,2779,2780],{},[47,2777,2778],{},"The Unrivaled Ecosystem (Batteries Included):"," Python's library collection is arguably its single greatest strength, covering three major areas:",[1232,2781,2782,2804,2818],{},[160,2783,2784,2787,2788,2791,2792,2795,2796,2799,2800,2803],{},[47,2785,2786],{},"Data Science & AI:"," It is the default language for ",[47,2789,2790],{},"Machine Learning"," thanks to frameworks like ",[47,2793,2794],{},"TensorFlow, PyTorch, Scikit-learn",", and the core numerical stack: ",[47,2797,2798],{},"NumPy, Pandas",", and ",[47,2801,2802],{},"Matplotlib",". This is indispensable for advanced statistical, actuarial, and quant analysis.",[160,2805,2806,2809,2810,2813,2814,2817],{},[47,2807,2808],{},"Web Backend:"," Frameworks like ",[47,2811,2812],{},"Django"," (robust, full-featured) and ",[47,2815,2816],{},"FastAPI"," (modern, high-performance) enable quick development of scalable APIs and web applications.",[160,2819,2820,2823,2824,2826],{},[47,2821,2822],{},"Scripting & Automation:"," Its standard library includes modules for working with the OS, file systems (like my ",[1237,2825,2749],{}," tool), networking, and testing. It excels at writing glue code between different systems.",[160,2828,2829,2832,2833,2836],{},[47,2830,2831],{},"Reproducibility and Maintainability:"," The mandatory indentation and explicit style guidelines (",[47,2834,2835],{},"PEP 8",") enforce consistency, which drastically reduces cognitive load when maintaining or collaborating on large codebases. This makes handing off research models or production code much simpler for teams.",[160,2838,2839,2842],{},[47,2840,2841],{},"Flexible Career Path:"," Knowing Python keeps your options wide open. Staying in quant, data, dev, or back-end roles means you're not locked into one specific technology, and that Python experience gives you serious leverage.",[36,2844,2846],{"id":2845},"when-not-to-use-python-the-trade-offs-and-constraints","When NOT to use Python (The Trade-Offs and Constraints)",[11,2848,2849],{},"Python is not a silver bullet. Its interpreted nature and core design philosophy impose specific limitations that make other languages a better fit for certain projects.",[1232,2851,2852,2870,2880,2898],{},[160,2853,2854,2857,2858,2861,2862,2865,2866,2869],{},[47,2855,2856],{},"CPU-Bound Performance (The GIL):"," For tasks that require intense number crunching and parallel execution across multiple CPU cores (",[47,2859,2860],{},"CPU-bound"," tasks), Python's Global Interpreter Lock (",[47,2863,2864],{},"GIL",") is a bottleneck. The GIL prevents multiple native threads from executing Python bytecodes simultaneously. While excellent libraries like ",[47,2867,2868],{},"NumPy"," bypass the GIL by offloading work to highly optimized C\u002FFortran code, purely native Python concurrency is limited compared to languages like Go, Rust, or C++.",[160,2871,2872,2875,2876,2879],{},[47,2873,2874],{},"Client-Side Web & Native Mobile Apps:"," Python cannot run natively in a web browser (client-side) like JavaScript. Similarly, while there are frameworks like Kivy and BeeWare, it is generally impractical for building dedicated, high-performance native mobile applications (iOS\u002FAndroid). For these, ",[47,2877,2878],{},"Swift, Kotlin, or React Native"," are the superior choices.",[160,2881,2882,2885,2886,2889,2890,2893,2894,2897],{},[47,2883,2884],{},"Low-Level Systems & Memory Constraints:"," Python is not suitable for operating system kernels, device drivers, or high-reliability, resource-constrained environments like ",[47,2887,2888],{},"embedded systems",". It also carries a larger ",[47,2891,2892],{},"memory footprint"," and a slower initial ",[47,2895,2896],{},"startup time"," compared to compiled languages like C or Rust.",[160,2899,2900,2903],{},[47,2901,2902],{},"Deployment Size (Tiny Binaries):"," When creating standalone, minimal executable files, Python's need to bundle the entire interpreter and necessary dependencies results in larger binaries than those produced by languages designed for single-file deployment (e.g., Go or Rust).",[36,2905,2907],{"id":2906},"what-i-learnt-and-would-pass-on","What I Learnt (and Would Pass On)",[157,2909,2910,2919,2944,2964],{},[160,2911,2912,2915,2916,2918],{},[47,2913,2914],{},"Start Small, Finish Fast:"," For instance, with my ",[1237,2917,2749],{}," repo, I started with a simple file-organisation CLI (Command Line Interface) before adding more complicated modules. Solving one problem at a time is the best way to avoid getting swamped.",[160,2920,2921,2924,2925,1888,2930,2799,2935,1956,2940,2943],{},[47,2922,2923],{},"Get Cosy with the Core Stack:"," You'll be using the same tools over and over. I leaned heavily into ",[15,2926,2929],{"href":2927,"rel":2928},"https:\u002F\u002Fjakevdp.github.io\u002FPythonDataScienceHandbook\u002F03.00-introduction-to-pandas.html",[19],"pandas",[15,2931,2934],{"href":2932,"rel":2933},"https:\u002F\u002Fjakevdp.github.io\u002FPythonDataScienceHandbook\u002F02.00-introduction-to-numpy.html",[19],"numpy",[15,2936,2939],{"href":2937,"rel":2938},"https:\u002F\u002Fjakevdp.github.io\u002FPythonDataScienceHandbook\u002F04.00-introduction-to-matplotlib.html",[19],"matplotlib",[1237,2941,2942],{},"plotly",". They turned up again and again in my research work.",[160,2945,2946,2949,2950,2955,2956,2959,2960,2963],{},[47,2947,2948],{},"Testing & Environments are Crucial:"," I quickly learnt that reproducible scripts (via ",[15,2951,2954],{"href":2952,"rel":2953},"https:\u002F\u002Fpydevtools.com\u002Fhandbook\u002Ftutorial\u002Fsetting-up-testing-with-pytest-and-uv\u002F",[19],"pytest",") and environments like ",[1237,2957,2958],{},"venv"," or ",[1237,2961,2962],{},"poetry"," save you huge headaches down the line. Don't skip testing—it's worth it, even though I rarely run tests.",[160,2965,2966,2969],{},[47,2967,2968],{},"Notebook → Module → Tool:"," This is a solid pipeline. I'd always start with a Jupyter notebook to explore data, then move the key, clean logic into reusable Python modules\u002Fscripts as the idea matured into an actual tool. This enforces better code structure.",[36,2971,2973,2974,2977],{"id":2972},"the-next-evolution-embracing-uv-the-speed-of-rust","The Next Evolution: Embracing ",[47,2975,2976],{},"uv"," (The Speed of Rust)",[11,2979,2980,2981,2983,2984,2987,2988,1888,2991,2799,2994,836],{},"Built by the same team behind the super-fast linter Ruff, ",[1237,2982,2976],{}," is an extremely fast package and project manager written in Rust. It's designed to be an ",[47,2985,2986],{},"all-in-one replacement"," for tools like ",[1237,2989,2990],{},"pip",[1237,2992,2993],{},"pip-tools",[1237,2995,2996],{},"virtualenv",[1232,2998,2999,3005,3015],{},[160,3000,3001,3004],{},[47,3002,3003],{},"Blazing Speed:"," It's often 10x–100x faster than pip.",[160,3006,3007,988,3010,3014],{},[47,3008,3009],{},"Unified Tooling:",[15,3011,2976],{"href":3012,"rel":3013},"https:\u002F\u002Fdocs.astral.sh\u002Fuv",[19]," handles environments and installs with one tool.",[160,3016,3017,3020],{},[47,3018,3019],{},"Reproducibility Solved:"," Generates clean lockfiles for consistent environments everywhere.",[36,3022,3024],{"id":3023},"resources-i-actually-used","Resources I Actually Used",[1232,3026,3027,3034,3041,3048],{},[160,3028,3029],{},[15,3030,3033],{"href":3031,"rel":3032},"https:\u002F\u002Fpython.org",[19],"Official Docs",[160,3035,3036],{},[15,3037,3040],{"href":3038,"rel":3039},"https:\u002F\u002Fautomatetheboringstuff.com\u002F",[19],"Automate the Boring Stuff",[160,3042,3043],{},[15,3044,3047],{"href":3045,"rel":3046},"https:\u002F\u002Fbooks.apple.com\u002Fus\u002Fbook\u002Fpython-for-data-analysis\u002Fid6443278533",[19],"Python for Data Analysis",[160,3049,3050,1899,3053],{},[15,3051,2976],{"href":3012,"rel":3052},[19],[15,3054,3057],{"href":3055,"rel":3056},"https:\u002F\u002Fdocs.astral.sh\u002Fruff\u002F",[19],"ruff",[36,3059,3061],{"id":3060},"short-roadmap-13-months","Short Roadmap (1–3 Months)",[1232,3063,3064,3073,3079,3085],{},[160,3065,3066,3069,3070,3072],{},[47,3067,3068],{},"Weeks 1–2:"," Basics & scripting (e.g. file organiser like ",[1237,3071,2749],{},").",[160,3074,3075,3078],{},[47,3076,3077],{},"Weeks 3–6:"," pandas, numpy, plotting.",[160,3080,3081,3084],{},[47,3082,3083],{},"Month 2:"," Data cleaning + reporting.",[160,3086,3087,3090,3091,836],{},[47,3088,3089],{},"Month 3:"," Packaging, CLI, or API wrapper using ",[47,3092,2976],{},[36,3094,3096],{"id":3095},"final-thoughts","Final Thoughts",[11,3098,3099],{},"Python bridged what I learned in class (stats, actuarial modelling) with what I wanted to build (real tools & workflows). Pick a small project, finish it, iterate—and remember: speed, simplicity, and readability matter most!",{"title":666,"searchDepth":667,"depth":667,"links":3101},[3102,3103,3104,3105,3107,3108,3109],{"id":2757,"depth":667,"text":2758},{"id":2845,"depth":667,"text":2846},{"id":2906,"depth":667,"text":2907},{"id":2972,"depth":667,"text":3106},"The Next Evolution: Embracing uv (The Speed of Rust)",{"id":3023,"depth":667,"text":3024},{"id":3060,"depth":667,"text":3061},{"id":3095,"depth":667,"text":3096},"2025-10-29","Why to learn python in these times and what i learnt",{},"\u002Fblog\u002Fwhypython",{"title":2731,"description":3111},"blog\u002Fwhypython",[1237,1194,3117,3118],"software","python","tQp_A8nKsv_vHhDtnyxDvy8YenDzaonGex83gmgn1gU",{"id":3121,"title":3122,"body":3123,"date":3241,"description":3242,"extension":702,"featured":703,"meta":3243,"navigation":705,"path":3244,"seo":3245,"stem":3246,"tags":3247,"__hash__":3249},"blog\u002Fblog\u002Factuworry.md","Actuworry – My Go-Powered Actuarial Tool",{"type":8,"value":3124,"toc":3232},[3125,3131,3139,3142,3145,3149,3152,3155,3159,3173,3177,3184,3188,3191,3194,3197,3211,3215,3218,3229],[3126,3127,3128],"blockquote",{},[11,3129,3130],{},"What is Actuworry?",[36,3132,3134,3135,3138],{"id":3133},"what-is-actuworry","What ",[32,3136,3137],{},"is"," Actuworry?",[11,3140,3141],{},"Actuworry is a simple actuarial simulation project I built using Go. It models core functions insurers often outsource—like pricing, reserving, and forecasting—in a transparent and extensible way.",[11,3143,3144],{},"It's a starting point for actuaries, students, and developers who want to understand how actuarial logic can be expressed in code without needing large, expensive enterprise tools.",[36,3146,3148],{"id":3147},"why-i-built-it","Why I Built It",[11,3150,3151],{},"As an actuarial science student learning to code, I wanted to build something that bridges both worlds: actuarial thinking and modern programming. Actuworry is that bridge—written in Go, minimal by design, and focused on clarity.",[11,3153,3154],{},"It's also part of my larger journey to build out more actuarial tooling that's fast, open, and educational.",[36,3156,3158],{"id":3157},"what-can-it-do","What Can It Do?",[1232,3160,3161,3164,3167,3170],{},[160,3162,3163],{},"Basic reserving calculations",[160,3165,3166],{},"Pricing models with assumptions",[160,3168,3169],{},"Stochastic simulations (planned)",[160,3171,3172],{},"Actuarial workflows mapped to clean Go modules",[36,3174,3176],{"id":3175},"visit-the-github-repo","Visit the GitHub Repo",[11,3178,3179],{},[15,3180,3183],{"href":3181,"rel":3182},"https:\u002F\u002Fgithub.com\u002Flubasinkal\u002Factuworry",[19],"github.com\u002Flubasinkal\u002Factuworry",[36,3185,3187],{"id":3186},"how-its-structured","How It's Structured",[11,3189,3190],{},"I'm using only the Go standard library—no frameworks. The goal is to stay close to the metal and learn how to manage real actuarial logic with good software design principles.",[11,3192,3193],{},"Right now it's a monorepo, but I plan to modularize pieces like assumptions, claim generation, reserve validation, and policyholder behavior.",[36,3195,3196],{"id":1598},"What's Next?",[1232,3198,3199,3202,3205,3208],{},[160,3200,3201],{},"Adding Monte Carlo simulations",[160,3203,3204],{},"Documentation and examples for new contributors",[160,3206,3207],{},"Web UI for experimentation (maybe with Vue!)",[160,3209,3210],{},"Benchmarking against spreadsheet-based workflows",[36,3212,3214],{"id":3213},"who-should-check-it-out","Who Should Check It Out?",[11,3216,3217],{},"If you're:",[1232,3219,3220,3223,3226],{},[160,3221,3222],{},"Learning actuarial science and want to code real models",[160,3224,3225],{},"A Go developer interested in finance\u002Finsurance",[160,3227,3228],{},"Looking to contribute to something practical and open-source",[11,3230,3231],{},"You're welcome to fork, star, and build with me.",{"title":666,"searchDepth":667,"depth":667,"links":3233},[3234,3235,3236,3237,3238,3239,3240],{"id":3133,"depth":667,"text":3130},{"id":3147,"depth":667,"text":3148},{"id":3157,"depth":667,"text":3158},{"id":3175,"depth":667,"text":3176},{"id":3186,"depth":667,"text":3187},{"id":1598,"depth":667,"text":3196},{"id":3213,"depth":667,"text":3214},"2025-08-06","A lightweight actuarial simulation tool focused on pricing, reserving, and forecasting.",{},"\u002Fblog\u002Factuworry",{"title":3122,"description":3242},"blog\u002Factuworry",[1645,1194,3248,2726],"insurance","eXVTSiAbykiHptnF0LEGO4sziI4KmrtGoXNzFqqWsDA",{"id":3251,"title":3252,"body":3253,"date":3241,"description":5296,"extension":702,"featured":705,"meta":5297,"navigation":705,"path":5298,"seo":5299,"stem":5300,"tags":5301,"__hash__":5302},"blog\u002Fblog\u002Fwhygolang.md","Why I Use Go (Instead of Python, R, or VBA)",{"type":8,"value":3254,"toc":5277},[3255,3268,3272,3312,3345,3349,3353,3374,3590,3609,3613,3641,3748,3767,3771,3784,3848,3857,3861,3876,3966,3988,4001,4005,4047,4304,4314,4318,4480,4484,4556,4560,4576,4648,4652,4690,4694,4739,4743,4746,5085,5089,5139,5141,5156,5198,5212,5227,5245,5252,5256,5274],[3126,3256,3257],{},[11,3258,3259,3262,3263],{},[47,3260,3261],{},"From spreadsheets to simulations"," — a personal take on modern actuarial programming that'll make you question everything you thought you knew about ",[15,3264,3267],{"href":3265,"rel":3266},"https:\u002F\u002Fblog.actuaries.org.uk\u002Freaching-actuary-3-point-0\u002F",[19],"actuarial education",[36,3269,3271],{"id":3270},"backstory-from-formulas-to-functions-and-my-sanity","Backstory: From Formulas to Functions (And My Sanity)",[11,3273,3274,3275,1888,3278,2799,3281,3284,3285,3288,3289,3294,3295,3300,3301,3305,3306,3311],{},"In actuarial science, we're often trained to live in ",[47,3276,3277],{},"spreadsheets",[47,3279,3280],{},"scripting languages",[47,3282,3283],{},"statistical software"," that makes you want to throw your laptop out the window. I've written ",[32,3286,3287],{},"thousands"," of formulas in ",[15,3290,3293],{"href":3291,"rel":3292},"https:\u002F\u002Fsupport.microsoft.com\u002Fen-us\u002Foffice\u002Fexcel-functions-alphabetical-b3944572-255d-4efb-bb96-c6d90033e188",[19],"Excel",", built models in ",[15,3296,3299],{"href":3297,"rel":3298},"https:\u002F\u002Fwww.r-project.org\u002F",[19],"R"," that crashed mysteriously, and debugged ",[15,3302,2868],{"href":3303,"rel":3304},"https:\u002F\u002Fnumpy.org\u002F",[19]," code in ",[15,3307,3310],{"href":3308,"rel":3309},"https:\u002F\u002Fjupyter.org\u002F",[19],"Jupyter notebooks"," until 3 AM. But when I started building actual systems — not just models that work \"most of the time\" — those tools fell short.",[11,3313,3314,3315,3318,3319,1888,3322,1888,3325,3328,3329,3332,3333,3338,3339,3344],{},"That's where I started exploring ",[47,3316,3317],{},"Go"," (aka Golang). A language that's ",[32,3320,3321],{},"blazing fast",[32,3323,3324],{},"beautifully structured",[32,3326,3327],{},"compiled to perfection",", and surprisingly ",[47,3330,3331],{},"simple"," (unlike my relationship with R's error messages). Over time, it became my main tool for building actuarial applications — from ",[15,3334,3337],{"href":3335,"rel":3336},"https:\u002F\u002Factuworry.onrender.com",[19],"Actuworry"," (an open-source reserving simulator that doesn't make you cry) to tools for ",[15,3340,3343],{"href":3341,"rel":3342},"https:\u002F\u002Fwww.investopedia.com\u002Fterms\u002Fl\u002Flifeinsurance.asp",[19],"life insurance pricing"," and strategy modeling.",[36,3346,3348],{"id":3347},"why-go-a-practical-case-for-students-actuaries-quants-data-folks","Why Go? (A Practical Case for Students, Actuaries, Quants & Data Folks)",[64,3350,3352],{"id":3351},"_1-go-is-fast-like-really-fast","1. Go Is Fast — Like, Really Fast",[11,3354,3355,3356,3359,3360,3363,3364,3367,3368,3373],{},"Go compiles to ",[47,3357,3358],{},"native machine code",". That means simulations that take ",[32,3361,3362],{},"minutes"," in Python or ",[32,3365,3366],{},"hours"," in R run in seconds with Go. There's no interpreter overhead, no ",[15,3369,3372],{"href":3370,"rel":3371},"https:\u002F\u002Fdocs.python.org\u002F3\u002Fglossary.html#term-global-interpreter-lock",[19],"GIL bottleneck",", or hidden type coercion surprises that make you question your life choices.",[2389,3375,3378],{"className":3376,"code":3377,"language":1645,"meta":666,"style":666},"language-go shiki shiki-themes vesper","\u002F\u002F Go: Monte Carlo simulation snippet\nfunc runSimulation(policies []Policy, scenarios int) []Result {\n    results := make([]Result, len(policies))\n    var wg sync.WaitGroup\n\n    for i, policy := range policies {\n        wg.Add(1)\n        go func(p Policy, idx int) {\n            defer wg.Done()\n            results[idx] = simulatePolicy(p, scenarios)\n        }(policy, i)\n    }\n\n    wg.Wait()\n    return results\n}\n\u002F\u002F This runs in parallel. Effortlessly. No drama.\n",[1237,3379,3380,3385,3416,3440,3456,3460,3476,3493,3514,3528,3542,3547,3553,3558,3569,3578,3584],{"__ignoreMap":666},[1885,3381,3382],{"class":2470,"line":2471},[1885,3383,3384],{"class":2474},"\u002F\u002F Go: Monte Carlo simulation snippet\n",[1885,3386,3387,3391,3394,3398,3401,3404,3407,3410,3413],{"class":2470,"line":667},[1885,3388,3390],{"class":3389},"sq0yK","func",[1885,3392,3393],{"class":2480}," runSimulation",[1885,3395,3397],{"class":3396},"sU-n2","(policies []",[1885,3399,3400],{"class":2480},"Policy",[1885,3402,3403],{"class":3396},", scenarios ",[1885,3405,3406],{"class":3389},"int",[1885,3408,3409],{"class":3396},") []",[1885,3411,3412],{"class":2480},"Result",[1885,3414,3415],{"class":3396}," {\n",[1885,3417,3418,3421,3424,3427,3430,3432,3434,3437],{"class":2470,"line":672},[1885,3419,3420],{"class":3396},"    results ",[1885,3422,3423],{"class":3389},":=",[1885,3425,3426],{"class":2480}," make",[1885,3428,3429],{"class":3396},"([]",[1885,3431,3412],{"class":2480},[1885,3433,1888],{"class":3396},[1885,3435,3436],{"class":2480},"len",[1885,3438,3439],{"class":3396},"(policies))\n",[1885,3441,3442,3445,3448,3451,3453],{"class":2470,"line":2502},[1885,3443,3444],{"class":3389},"    var",[1885,3446,3447],{"class":3396}," wg ",[1885,3449,3450],{"class":2480},"sync",[1885,3452,836],{"class":3396},[1885,3454,3455],{"class":2480},"WaitGroup\n",[1885,3457,3458],{"class":2470,"line":2508},[1885,3459,2499],{"emptyLinePlaceholder":705},[1885,3461,3462,3465,3468,3470,3473],{"class":2470,"line":2522},[1885,3463,3464],{"class":3389},"    for",[1885,3466,3467],{"class":3396}," i, policy ",[1885,3469,3423],{"class":3389},[1885,3471,3472],{"class":3389}," range",[1885,3474,3475],{"class":3396}," policies {\n",[1885,3477,3478,3481,3484,3487,3490],{"class":2470,"line":2527},[1885,3479,3480],{"class":3396},"        wg.",[1885,3482,3483],{"class":2480},"Add",[1885,3485,3486],{"class":3396},"(",[1885,3488,3489],{"class":2480},"1",[1885,3491,3492],{"class":3396},")\n",[1885,3494,3495,3498,3501,3504,3506,3509,3511],{"class":2470,"line":2533},[1885,3496,3497],{"class":3389},"        go",[1885,3499,3500],{"class":3389}," func",[1885,3502,3503],{"class":3396},"(p ",[1885,3505,3400],{"class":2480},[1885,3507,3508],{"class":3396},", idx ",[1885,3510,3406],{"class":3389},[1885,3512,3513],{"class":3396},") {\n",[1885,3515,3516,3519,3522,3525],{"class":2470,"line":2545},[1885,3517,3518],{"class":3389},"            defer",[1885,3520,3521],{"class":3396}," wg.",[1885,3523,3524],{"class":2480},"Done",[1885,3526,3527],{"class":3396},"()\n",[1885,3529,3530,3533,3536,3539],{"class":2470,"line":2550},[1885,3531,3532],{"class":3396},"            results[idx] ",[1885,3534,3535],{"class":3389},"=",[1885,3537,3538],{"class":2480}," simulatePolicy",[1885,3540,3541],{"class":3396},"(p, scenarios)\n",[1885,3543,3544],{"class":2470,"line":2556},[1885,3545,3546],{"class":3396},"        }(policy, i)\n",[1885,3548,3550],{"class":2470,"line":3549},12,[1885,3551,3552],{"class":3396},"    }\n",[1885,3554,3556],{"class":2470,"line":3555},13,[1885,3557,2499],{"emptyLinePlaceholder":705},[1885,3559,3561,3564,3567],{"class":2470,"line":3560},14,[1885,3562,3563],{"class":3396},"    wg.",[1885,3565,3566],{"class":2480},"Wait",[1885,3568,3527],{"class":3396},[1885,3570,3572,3575],{"class":2470,"line":3571},15,[1885,3573,3574],{"class":3389},"    return",[1885,3576,3577],{"class":3396}," results\n",[1885,3579,3581],{"class":2470,"line":3580},16,[1885,3582,3583],{"class":3396},"}\n",[1885,3585,3587],{"class":2470,"line":3586},17,[1885,3588,3589],{"class":2474},"\u002F\u002F This runs in parallel. Effortlessly. No drama.\n",[11,3591,3592,3593,3596,3597,1899,3601,3604,3605,3608],{},"In one reserving prototype, my Go version ran ",[47,3594,3595],{},"as fast"," as the Python equivalent using ",[15,3598,2929],{"href":3599,"rel":3600},"https:\u002F\u002Fpandas.pydata.org\u002F",[19],[15,3602,2868],{"href":3303,"rel":3603},[19],". NumPy is written in C and C++ so you know it's fast. And it used ",[32,3606,3607],{},"less memory",". And I didn't have to install 47 dependencies. And it didn't break when I looked at it wrong.",[64,3610,3612],{"id":3611},"_2-concurrency-made-simple-finally","2. Concurrency Made Simple (Finally!)",[11,3614,3615,3616,3619,3620,3625,3626,1899,3631,3636,3637,3640],{},"Need to simulate ",[47,3617,3618],{},"10,000 policy paths","? Or run ",[15,3621,3624],{"href":3622,"rel":3623},"https:\u002F\u002Fwww.investopedia.com\u002Fterms\u002Fs\u002Fstresstesting.asp",[19],"stress testing"," across assumption sets that would make a CPU weep? Go's ",[15,3627,3630],{"href":3628,"rel":3629},"https:\u002F\u002Fgo.dev\u002Fdoc\u002Feffective_go#goroutines",[19],"goroutines",[15,3632,3635],{"href":3633,"rel":3634},"https:\u002F\u002Fgo.dev\u002Fdoc\u002Feffective_go#channels",[19],"channels"," make concurrent code readable and ",[32,3638,3639],{},"powerful"," without requiring a degree in computer science.",[2389,3642,3644],{"className":3376,"code":3643,"language":1645,"meta":666,"style":666},"\u002F\u002F Want to run something concurrently in Go?\ngo calculateReserves(policyBatch)\n\n\u002F\u002F That's it. Seriously. That's the whole thing.\n\u002F\u002F Compare this to Python's multiprocessing hell:\n\n# Python concurrent code (prepare for pain)\nfrom multiprocessing import Pool, Queue, Process\nimport threading\n# ... 47 more lines of setup code\n# ... error handling for when it inevitably breaks\n# ... crying\n",[1237,3645,3646,3651,3661,3665,3670,3675,3679,3690,3701,3708,3722,3739],{"__ignoreMap":666},[1885,3647,3648],{"class":2470,"line":2471},[1885,3649,3650],{"class":2474},"\u002F\u002F Want to run something concurrently in Go?\n",[1885,3652,3653,3655,3658],{"class":2470,"line":667},[1885,3654,1645],{"class":3389},[1885,3656,3657],{"class":2480}," calculateReserves",[1885,3659,3660],{"class":3396},"(policyBatch)\n",[1885,3662,3663],{"class":2470,"line":672},[1885,3664,2499],{"emptyLinePlaceholder":705},[1885,3666,3667],{"class":2470,"line":2502},[1885,3668,3669],{"class":2474},"\u002F\u002F That's it. Seriously. That's the whole thing.\n",[1885,3671,3672],{"class":2470,"line":2508},[1885,3673,3674],{"class":2474},"\u002F\u002F Compare this to Python's multiprocessing hell:\n",[1885,3676,3677],{"class":2470,"line":2522},[1885,3678,2499],{"emptyLinePlaceholder":705},[1885,3680,3681,3684,3687],{"class":2470,"line":2527},[1885,3682,3683],{"class":3396},"# Python concurrent code (prepare ",[1885,3685,3686],{"class":3389},"for",[1885,3688,3689],{"class":3396}," pain)\n",[1885,3691,3692,3695,3698],{"class":2470,"line":2533},[1885,3693,3694],{"class":3396},"from multiprocessing ",[1885,3696,3697],{"class":3389},"import",[1885,3699,3700],{"class":3396}," Pool, Queue, Process\n",[1885,3702,3703,3705],{"class":2470,"line":2545},[1885,3704,3697],{"class":3389},[1885,3706,3707],{"class":3396}," threading\n",[1885,3709,3710,3713,3716,3719],{"class":2470,"line":2550},[1885,3711,3712],{"class":3396},"# ",[1885,3714,3715],{"class":3389},"...",[1885,3717,3718],{"class":2480}," 47",[1885,3720,3721],{"class":3396}," more lines of setup code\n",[1885,3723,3724,3726,3728,3731,3734,3736],{"class":2470,"line":2556},[1885,3725,3712],{"class":3396},[1885,3727,3715],{"class":3389},[1885,3729,3730],{"class":3389}," error",[1885,3732,3733],{"class":3396}," handling ",[1885,3735,3686],{"class":3389},[1885,3737,3738],{"class":3396}," when it inevitably breaks\n",[1885,3740,3741,3743,3745],{"class":2470,"line":3549},[1885,3742,3712],{"class":3396},[1885,3744,3715],{"class":3389},[1885,3746,3747],{"class":3396}," crying\n",[11,3749,3750,3751,1888,3754,3757,3758,3761,3762,988,3764],{},"In Python, you'd need ",[1237,3752,3753],{},"multiprocessing",[1237,3755,3756],{},"asyncio",", or a framework. In R, you'd probably give up and go get a coffee. In Go, it's just ",[1237,3759,3760],{},"go someFunc()",". ",[47,3763,176],{},[32,3765,3766],{},"That's the end.",[64,3768,3770],{"id":3769},"_3-one-binary-no-drama-deployment-in-heaven","3. One Binary, No Drama (Deployment in Heaven)",[11,3772,3773,3774,3779,3780,3783],{},"Remember fighting with ",[15,3775,3778],{"href":3776,"rel":3777},"https:\u002F\u002Fdocs.python.org\u002F3\u002Ftutorial\u002Fvenv.html",[19],"virtual environments","? Or ",[1237,3781,3782],{},"pip install"," errors that made you question reality? Or R package version mismatches that sent you into therapy? Or explaining to your boss why the model works on your machine but not theirs?",[2389,3785,3787],{"className":2463,"code":3786,"language":2465,"meta":666,"style":666},"# The Python deployment experience:\npip install -r requirements.txt\n# Error: package X conflicts with Y\n# Error: Python version mismatch\n# Error: your computer is cursed\n# Error: have you tried turning it off and on again?\n\n# The Go deployment experience:\ngo build\n# Done. Ship it.\n",[1237,3788,3789,3794,3807,3812,3817,3822,3827,3831,3836,3843],{"__ignoreMap":666},[1885,3790,3791],{"class":2470,"line":2471},[1885,3792,3793],{"class":2474},"# The Python deployment experience:\n",[1885,3795,3796,3798,3801,3804],{"class":2470,"line":667},[1885,3797,2990],{"class":2480},[1885,3799,3800],{"class":2484}," install",[1885,3802,3803],{"class":2484}," -r",[1885,3805,3806],{"class":2484}," requirements.txt\n",[1885,3808,3809],{"class":2470,"line":672},[1885,3810,3811],{"class":2474},"# Error: package X conflicts with Y\n",[1885,3813,3814],{"class":2470,"line":2502},[1885,3815,3816],{"class":2474},"# Error: Python version mismatch\n",[1885,3818,3819],{"class":2470,"line":2508},[1885,3820,3821],{"class":2474},"# Error: your computer is cursed\n",[1885,3823,3824],{"class":2470,"line":2522},[1885,3825,3826],{"class":2474},"# Error: have you tried turning it off and on again?\n",[1885,3828,3829],{"class":2470,"line":2527},[1885,3830,2499],{"emptyLinePlaceholder":705},[1885,3832,3833],{"class":2470,"line":2533},[1885,3834,3835],{"class":2474},"# The Go deployment experience:\n",[1885,3837,3838,3840],{"class":2470,"line":2545},[1885,3839,1645],{"class":2480},[1885,3841,3842],{"class":2484}," build\n",[1885,3844,3845],{"class":2470,"line":2550},[1885,3846,3847],{"class":2474},"# Done. Ship it.\n",[11,3849,3850,3851,3856],{},"With Go, I compile my app into a single static binary. I can send it to anyone — no runtime needed. No dependencies. No excuses. No \"works on my machine\" syndrome. This makes it perfect for production-grade simulations, internal tools, and even ",[15,3852,3855],{"href":3853,"rel":3854},"https:\u002F\u002Fgithub.com\u002Fgorilla\u002Fmux",[19],"actuarial APIs"," that don't make your Dev team cry.",[64,3858,3860],{"id":3859},"_4-clean-code-strong-types-type-safety-mental-safety","4. Clean Code, Strong Types (Type Safety = Mental Safety)",[11,3862,3863,3864,3871,3872,3875],{},"Go is ",[47,3865,3866],{},[15,3867,3870],{"href":3868,"rel":3869},"https:\u002F\u002Fgo.dev\u002Fdoc\u002Feffective_go#types",[19],"statically typed",", which catches many bugs at ",[32,3873,3874],{},"compile time"," instead of during your 3-hour Monte Carlo simulation. It encourages you to write clear, testable, and maintainable code that doesn't make future-you want to time-travel back and slap present-you.",[2389,3877,3879],{"className":3376,"code":3878,"language":1645,"meta":666,"style":666},"\u002F\u002F Go catches this at compile time:\nfunc calculatePremium(age string, amount float64) float64 {\n    return age * amount \u002F\u002F ERROR: can't multiply string by float64\n}\n\n\u002F\u002F Python lets this explode at runtime:\ndef calculate_premium(age, amount):\n    return age * amount  # Hope and pray age is a number!\n",[1237,3880,3881,3886,3912,3928,3932,3936,3941,3952],{"__ignoreMap":666},[1885,3882,3883],{"class":2470,"line":2471},[1885,3884,3885],{"class":2474},"\u002F\u002F Go catches this at compile time:\n",[1885,3887,3888,3890,3893,3896,3899,3902,3905,3908,3910],{"class":2470,"line":667},[1885,3889,3390],{"class":3389},[1885,3891,3892],{"class":2480}," calculatePremium",[1885,3894,3895],{"class":3396},"(age ",[1885,3897,3898],{"class":3389},"string",[1885,3900,3901],{"class":3396},", amount ",[1885,3903,3904],{"class":3389},"float64",[1885,3906,3907],{"class":3396},") ",[1885,3909,3904],{"class":3389},[1885,3911,3415],{"class":3396},[1885,3913,3914,3916,3919,3922,3925],{"class":2470,"line":672},[1885,3915,3574],{"class":3389},[1885,3917,3918],{"class":3396}," age ",[1885,3920,3921],{"class":3389},"*",[1885,3923,3924],{"class":3396}," amount ",[1885,3926,3927],{"class":2474},"\u002F\u002F ERROR: can't multiply string by float64\n",[1885,3929,3930],{"class":2470,"line":2502},[1885,3931,3583],{"class":3396},[1885,3933,3934],{"class":2470,"line":2508},[1885,3935,2499],{"emptyLinePlaceholder":705},[1885,3937,3938],{"class":2470,"line":2522},[1885,3939,3940],{"class":2474},"\u002F\u002F Python lets this explode at runtime:\n",[1885,3942,3943,3946,3949],{"class":2470,"line":2527},[1885,3944,3945],{"class":3396},"def ",[1885,3947,3948],{"class":2480},"calculate_premium",[1885,3950,3951],{"class":3396},"(age, amount):\n",[1885,3953,3954,3956,3958,3960,3963],{"class":2470,"line":2533},[1885,3955,3574],{"class":3389},[1885,3957,3918],{"class":3396},[1885,3959,3921],{"class":3389},[1885,3961,3962],{"class":3396}," amount  # Hope and pray age is a number",[1885,3964,3965],{"class":3389},"!\n",[11,3967,3968,3969,3974,3975,3978,3979,1888,3982,2799,3985,836],{},"No ",[15,3970,3973],{"href":3971,"rel":3972},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FDuck_typing",[19],"duck typing"," surprises. No ",[1237,3976,3977],{},"undefined"," errors halfway through a 3-hour simulation. It'll tell you you're wrong ",[32,3980,3981],{},"early",[32,3983,3984],{},"loudly",[32,3986,3987],{},"helpfully",[11,3989,3990,3991,1888,3994,2799,3997,4000],{},"And tools like ",[1237,3992,3993],{},"go test",[1237,3995,3996],{},"go fmt",[1237,3998,3999],{},"go mod tidy"," are built in. You don't need to install linters, formatters, or dependency managers. Go handles that out of the box like a responsible adult.",[64,4002,4004],{"id":4003},"_5-strong-standard-library-batteries-actually-included","5. Strong Standard Library (Batteries Actually Included)",[11,4006,4007,4008,4015,4016,1888,4021,1888,4026,1888,4031,1888,4036,1888,4041,4046],{},"Go's ",[47,4009,4010],{},[15,4011,4014],{"href":4012,"rel":4013},"https:\u002F\u002Fpkg.go.dev\u002Fstd",[19],"standard library"," covers almost everything I need: ",[15,4017,4020],{"href":4018,"rel":4019},"https:\u002F\u002Fpkg.go.dev\u002Fmath",[19],"math",[15,4022,4025],{"href":4023,"rel":4024},"https:\u002F\u002Fpkg.go.dev\u002Fos",[19],"file I\u002FO",[15,4027,4030],{"href":4028,"rel":4029},"https:\u002F\u002Fpkg.go.dev\u002Fnet\u002Fhttp",[19],"HTTP servers",[15,4032,4035],{"href":4033,"rel":4034},"https:\u002F\u002Fpkg.go.dev\u002Fencoding\u002Fjson",[19],"JSON encoding",[15,4037,4040],{"href":4038,"rel":4039},"https:\u002F\u002Fpkg.go.dev\u002Fcrypto",[19],"cryptography",[15,4042,4045],{"href":4043,"rel":4044},"https:\u002F\u002Fpkg.go.dev\u002Ftime",[19],"time handling"," — all baked in and ready to rock.",[2389,4048,4050],{"className":3376,"code":4049,"language":1645,"meta":666,"style":666},"\u002F\u002F Need an HTTP server for your actuarial API?\npackage main\n\nimport (\n    \"encoding\u002Fjson\"\n    \"net\u002Fhttp\"\n)\n\ntype Premium struct {\n    Age    int     `json:\"age\"`\n    Amount float64 `json:\"amount\"`\n    Rate   float64 `json:\"rate\"`\n}\n\nfunc calculateHandler(w http.ResponseWriter, r *http.Request) {\n    \u002F\u002F Your actuarial logic here\n    premium := Premium{Age: 35, Amount: 100000, Rate: 0.05}\n    json.NewEncoder(w).Encode(premium)\n}\n\nfunc main() {\n    http.HandleFunc(\"\u002Fcalculate\", calculateHandler)\n    http.ListenAndServe(\":8080\", nil)\n}\n\u002F\u002F That's a working web server. No Flask. No Django. No tears.\n",[1237,4051,4052,4057,4065,4069,4076,4087,4096,4100,4104,4117,4127,4137,4147,4151,4155,4187,4192,4221,4239,4244,4249,4260,4277,4293,4298],{"__ignoreMap":666},[1885,4053,4054],{"class":2470,"line":2471},[1885,4055,4056],{"class":2474},"\u002F\u002F Need an HTTP server for your actuarial API?\n",[1885,4058,4059,4062],{"class":2470,"line":667},[1885,4060,4061],{"class":3389},"package",[1885,4063,4064],{"class":2480}," main\n",[1885,4066,4067],{"class":2470,"line":672},[1885,4068,2499],{"emptyLinePlaceholder":705},[1885,4070,4071,4073],{"class":2470,"line":2502},[1885,4072,3697],{"class":3389},[1885,4074,4075],{"class":3396}," (\n",[1885,4077,4078,4081,4084],{"class":2470,"line":2508},[1885,4079,4080],{"class":2484},"    \"",[1885,4082,4083],{"class":2480},"encoding\u002Fjson",[1885,4085,4086],{"class":2484},"\"\n",[1885,4088,4089,4091,4094],{"class":2470,"line":2522},[1885,4090,4080],{"class":2484},[1885,4092,4093],{"class":2480},"net\u002Fhttp",[1885,4095,4086],{"class":2484},[1885,4097,4098],{"class":2470,"line":2527},[1885,4099,3492],{"class":3396},[1885,4101,4102],{"class":2470,"line":2533},[1885,4103,2499],{"emptyLinePlaceholder":705},[1885,4105,4106,4109,4112,4115],{"class":2470,"line":2545},[1885,4107,4108],{"class":3389},"type",[1885,4110,4111],{"class":2480}," Premium",[1885,4113,4114],{"class":3389}," struct",[1885,4116,3415],{"class":3396},[1885,4118,4119,4122,4124],{"class":2470,"line":2550},[1885,4120,4121],{"class":3396},"    Age    ",[1885,4123,3406],{"class":3389},[1885,4125,4126],{"class":2484},"     `json:\"age\"`\n",[1885,4128,4129,4132,4134],{"class":2470,"line":2556},[1885,4130,4131],{"class":3396},"    Amount ",[1885,4133,3904],{"class":3389},[1885,4135,4136],{"class":2484}," `json:\"amount\"`\n",[1885,4138,4139,4142,4144],{"class":2470,"line":3549},[1885,4140,4141],{"class":3396},"    Rate   ",[1885,4143,3904],{"class":3389},[1885,4145,4146],{"class":2484}," `json:\"rate\"`\n",[1885,4148,4149],{"class":2470,"line":3555},[1885,4150,3583],{"class":3396},[1885,4152,4153],{"class":2470,"line":3560},[1885,4154,2499],{"emptyLinePlaceholder":705},[1885,4156,4157,4159,4162,4165,4168,4170,4173,4176,4178,4180,4182,4185],{"class":2470,"line":3571},[1885,4158,3390],{"class":3389},[1885,4160,4161],{"class":2480}," calculateHandler",[1885,4163,4164],{"class":3396},"(w ",[1885,4166,4167],{"class":2480},"http",[1885,4169,836],{"class":3396},[1885,4171,4172],{"class":2480},"ResponseWriter",[1885,4174,4175],{"class":3396},", r ",[1885,4177,3921],{"class":3389},[1885,4179,4167],{"class":2480},[1885,4181,836],{"class":3396},[1885,4183,4184],{"class":2480},"Request",[1885,4186,3513],{"class":3396},[1885,4188,4189],{"class":2470,"line":3580},[1885,4190,4191],{"class":2474},"    \u002F\u002F Your actuarial logic here\n",[1885,4193,4194,4197,4199,4201,4204,4207,4210,4213,4216,4219],{"class":2470,"line":3586},[1885,4195,4196],{"class":3396},"    premium ",[1885,4198,3423],{"class":3389},[1885,4200,4111],{"class":2480},[1885,4202,4203],{"class":3396},"{Age: ",[1885,4205,4206],{"class":2480},"35",[1885,4208,4209],{"class":3396},", Amount: ",[1885,4211,4212],{"class":2480},"100000",[1885,4214,4215],{"class":3396},", Rate: ",[1885,4217,4218],{"class":2480},"0.05",[1885,4220,3583],{"class":3396},[1885,4222,4224,4227,4230,4233,4236],{"class":2470,"line":4223},18,[1885,4225,4226],{"class":3396},"    json.",[1885,4228,4229],{"class":2480},"NewEncoder",[1885,4231,4232],{"class":3396},"(w).",[1885,4234,4235],{"class":2480},"Encode",[1885,4237,4238],{"class":3396},"(premium)\n",[1885,4240,4242],{"class":2470,"line":4241},19,[1885,4243,3583],{"class":3396},[1885,4245,4247],{"class":2470,"line":4246},20,[1885,4248,2499],{"emptyLinePlaceholder":705},[1885,4250,4252,4254,4257],{"class":2470,"line":4251},21,[1885,4253,3390],{"class":3389},[1885,4255,4256],{"class":2480}," main",[1885,4258,4259],{"class":3396},"() {\n",[1885,4261,4263,4266,4269,4271,4274],{"class":2470,"line":4262},22,[1885,4264,4265],{"class":3396},"    http.",[1885,4267,4268],{"class":2480},"HandleFunc",[1885,4270,3486],{"class":3396},[1885,4272,4273],{"class":2484},"\"\u002Fcalculate\"",[1885,4275,4276],{"class":3396},", calculateHandler)\n",[1885,4278,4280,4282,4285,4287,4290],{"class":2470,"line":4279},23,[1885,4281,4265],{"class":3396},[1885,4283,4284],{"class":2480},"ListenAndServe",[1885,4286,3486],{"class":3396},[1885,4288,4289],{"class":2484},"\":8080\"",[1885,4291,4292],{"class":3396},", nil)\n",[1885,4294,4296],{"class":2470,"line":4295},24,[1885,4297,3583],{"class":3396},[1885,4299,4301],{"class":2470,"line":4300},25,[1885,4302,4303],{"class":2474},"\u002F\u002F That's a working web server. No Flask. No Django. No tears.\n",[11,4305,4306,4307,2959,4310,4313],{},"I rarely need third-party libraries. Compare that to Python or R, where your script starts with 10 lines of imports just to ",[32,4308,4309],{},"plot a graph",[32,4311,4312],{},"load a CSV"," without everything catching fire.",[36,4315,4317],{"id":4316},"technical-comparison-go-vs-python-vs-r","Technical Comparison (Go vs Python vs R)",[4319,4320,4321,4338],"table",{},[4322,4323,4324],"thead",{},[4325,4326,4327,4331,4333,4336],"tr",{},[4328,4329,4330],"th",{},"Feature",[4328,4332,3317],{},[4328,4334,4335],{},"Python",[4328,4337,3299],{},[4339,4340,4341,4361,4381,4403,4419,4440,4461],"tbody",{},[4325,4342,4343,4348,4355,4358],{},[4344,4345,4346],"td",{},[47,4347,2576],{},[4344,4349,4350,4351],{},"Native, compiled, ",[15,4352,3321],{"href":4353,"rel":4354},"https:\u002F\u002Fbenchmarksgame-team.pages.debian.net\u002Fbenchmarksgame\u002F",[19],[4344,4356,4357],{},"Interpreted, slower in loops",[4344,4359,4360],{},"Good for stats, limited elsewhere",[4325,4362,4363,4368,4375,4378],{},[4344,4364,4365],{},[47,4366,4367],{},"Typing",[4344,4369,4370],{},[15,4371,4374],{"href":4372,"rel":4373},"https:\u002F\u002Fgo.dev\u002Fref\u002Fspec#Types",[19],"Static, safe",[4344,4376,4377],{},"Dynamic, flexible",[4344,4379,4380],{},"Dynamic, vectorized",[4325,4382,4383,4388,4394,4400],{},[4344,4384,4385],{},[47,4386,4387],{},"Concurrency",[4344,4389,4390],{},[15,4391,4393],{"href":3628,"rel":4392},[19],"Goroutines & channels",[4344,4395,4396],{},[15,4397,3372],{"href":4398,"rel":4399},"https:\u002F\u002Fwiki.python.org\u002Fmoin\u002FGlobalInterpreterLock",[19],[4344,4401,4402],{},"Limited",[4325,4404,4405,4410,4413,4416],{},[4344,4406,4407],{},[47,4408,4409],{},"Deployment",[4344,4411,4412],{},"Single binary, zero dependencies",[4344,4414,4415],{},"Virtual env, Docker",[4344,4417,4418],{},"RStudio\u002FRscript dependency",[4325,4420,4421,4426,4434,4437],{},[4344,4422,4423],{},[47,4424,4425],{},"Ecosystem",[4344,4427,4428,4429],{},"Small but ",[15,4430,4433],{"href":4431,"rel":4432},"https:\u002F\u002Fpkg.go.dev\u002F",[19],"high-quality",[4344,4435,4436],{},"Massive, inconsistent",[4344,4438,4439],{},"Strong for stats",[4325,4441,4442,4447,4455,4458],{},[4344,4443,4444],{},[47,4445,4446],{},"Learning Curve",[4344,4448,4449,4450],{},"Simple, clean, ",[15,4451,4454],{"href":4452,"rel":4453},"https:\u002F\u002Ftour.golang.org\u002F",[19],"logical",[4344,4456,4457],{},"Easy start, complex later",[4344,4459,4460],{},"Stat-heavy",[4325,4462,4463,4468,4471,4474],{},[4344,4464,4465],{},[47,4466,4467],{},"Error Messages",[4344,4469,4470],{},"Clear, helpful, actionable",[4344,4472,4473],{},"Sometimes cryptic",[4344,4475,4476,4477,4479],{},"\"",[1885,4478,3489],{}," NA\" and mysteries",[36,4481,4483],{"id":4482},"language-roast-no-programming-language-is-safe","Language Roast (No Programming Language is Safe)",[1232,4485,4486,4502,4514,4526,4535,4544],{},[160,4487,4488,988,4491,4494,4495,4498,4499,4501],{},[47,4489,4490],{},"Python:",[32,4492,4493],{},"\"It's fast and simple… if you don't use loops, need concurrency, or care about deployment.\""," The ",[15,4496,2864],{"href":4398,"rel":4497},[19]," and its speed on large-scale projects is a meme for a reason. Also, ",[1237,4500,3782],{}," errors are a form of psychological warfare.",[160,4503,4504,988,4507,4513],{},[47,4505,4506],{},"R:",[32,4508,4509,4510,4512],{},"\"It works until you hit '",[1885,4511,3489],{}," NA' and spend 3 hours debugging what should be a simple calculation.\""," R is like that brilliant professor who explains calculus using interpretive dance — technically correct, practically useless.",[160,4515,4516,988,4519,988,4522,4525],{},[47,4517,4518],{},"Rust:",[32,4520,4521],{},"\"You will write the most memory-safe actuarial tool ever — eventually, after sacrificing your firstborn to the borrow checker.\"",[1237,4523,4524],{},"expected &str, found String"," — thanks, I hate it.",[160,4527,4528,988,4531,4534],{},[47,4529,4530],{},"Zig:",[32,4532,4533],{},"\"The language that makes Go feel like a luxury sedan.\""," Great potential, but too early for production actuarial use.",[160,4536,4537,988,4540,4543],{},[47,4538,4539],{},"VBA:",[32,4541,4542],{},"\"The language equivalent of using a spoon to dig a tunnel.\""," If you're still writing VBA in 2025, I'm calling an abuse hotline. Excel macros are not a career path, they're a cry for help.",[160,4545,4546,988,4549,988,4552,4555],{},[47,4547,4548],{},"Java:",[32,4550,4551],{},"\"Enterprise-grade verbosity for when you want to write 50 lines of code to print 'Hello World'.\"",[1237,4553,4554],{},"AbstractSingletonProxyFactoryBean"," is a real class name, not a joke.",[36,4557,4559],{"id":4558},"modern-language-suggestions-for-actuarial-workflows","Modern Language Suggestions for Actuarial Workflows",[11,4561,4562,4563,1888,4565,1888,4568,4571,4572,4575],{},"If you're still stuck in ",[47,4564,3293],{},[47,4566,4567],{},"R purgatory",[47,4569,4570],{},"Python dependency limbo",", or ",[47,4573,4574],{},"VBA torture chamber",", here's a nudge toward exploring other options:",[1232,4577,4578,4594,4603,4615,4621,4631,4642],{},[160,4579,4580,4583,4584,1888,4589,4593],{},[47,4581,4582],{},"Go:"," For building pricing\u002Freserving engines, ",[15,4585,4588],{"href":4586,"rel":4587},"https:\u002F\u002Fgithub.com\u002Fspf13\u002Fcobra",[19],"CLI tools",[15,4590,4592],{"href":3853,"rel":4591},[19],"APIs",", internal microservices",[160,4595,4596,4598,4599,4602],{},[47,4597,4518],{}," For safe, high-performance actuarial engines when you need ",[32,4600,4601],{},"maximum"," control",[160,4604,4605,4608,4609,4614],{},[47,4606,4607],{},"Julia:"," For numerical analysis, statistical models, and actuarial forecasting (it's like R but ",[15,4610,4613],{"href":4611,"rel":4612},"https:\u002F\u002Fjulialang.org\u002Fbenchmarks\u002F",[19],"actually fast",")",[160,4616,4617,4620],{},[47,4618,4619],{},"Elixir:"," For real-time policy monitoring, data pipelines, and concurrent dashboards",[160,4622,4623,4626,4627,4630],{},[47,4624,4625],{},"TypeScript"," + ",[47,4628,4629],{},"Vue:"," For building modern interfaces for internal actuarial tools",[160,4632,4633,4636,4637],{},[47,4634,4635],{},"Scala:"," If you're in a bank and forced to use ",[15,4638,4641],{"href":4639,"rel":4640},"https:\u002F\u002Fspark.apache.org\u002F",[19],"Spark",[160,4643,4644,4647],{},[47,4645,4646],{},"Haskell:"," For when you want your actuarial models to be mathematically beautiful and completely incomprehensible to your coworkers",[36,4649,4651],{"id":4650},"my-current-stack","My Current Stack",[1232,4653,4654,4659,4670,4675,4684],{},[160,4655,4656,4658],{},[47,4657,4582],{}," Core engine (pricing, simulation, validation)",[160,4660,4661,4663,4664,4669],{},[47,4662,4490],{}," Exploratory data analysis, ",[15,4665,4668],{"href":4666,"rel":4667},"https:\u002F\u002Fmatplotlib.org\u002F",[19],"plotting",", quick prototyping",[160,4671,4672,4674],{},[47,4673,4506],{}," Stats-heavy coursework, historical actuarial studies",[160,4676,4677,4626,4680,4683],{},[47,4678,4679],{},"Vue",[47,4681,4682],{},"Tailwind:"," Frontend blog and internal dashboard UI",[160,4685,4686,4689],{},[47,4687,4688],{},"PostgreSQL:"," Database that works",[36,4691,4693],{"id":4692},"what-im-building-in-go-and-you-should-too","What I'm Building in Go (And You Should Too)",[1232,4695,4696,4702,4717,4723,4729],{},[160,4697,4698,4701],{},[15,4699,3337],{"href":3181,"rel":4700},[19],": A simulation engine for actuarial pricing\u002Freserving",[160,4703,4704,4707,4708,4712,4713,4614],{},[47,4705,4706],{},"Life Pricing Tool:"," Command-line tool for ",[15,4709,4711],{"href":3341,"rel":4710},[19],"life insurance"," pricing\u002Freserves (",[15,4714,4716],{"href":4586,"rel":4715},[19],"built with Cobra CLI",[160,4718,4719,4722],{},[47,4720,4721],{},"Quant Backtesting System:"," Simulations and signal testing (in progress, will be open source)",[160,4724,4725,4728],{},[47,4726,4727],{},"Whatever I Can Get Away With:"," Give me a chance and I'll write it in Go",[160,4730,4731,4734,4735],{},[47,4732,4733],{},"Internal Actuarial API:"," RESTful service using the standard library for policy calculations - ",[15,4736,4738],{"href":4737},"\u002Fwork\u002Fresume","Here's a CV and Resume Link",[36,4740,4742],{"id":4741},"getting-started-your-first-go-actuarial-program","Getting Started: Your First Go Actuarial Program",[11,4744,4745],{},"Want to dip your toes in? Here's a simple actuarial calculation in Go:",[2389,4747,4749],{"className":3376,"code":4748,"language":1645,"meta":666,"style":666},"package main\n\nimport (\n    \"fmt\"\n    \"math\"\n)\n\ntype Policy struct {\n    Age            int\n    CoverageAmount float64\n    Term           int\n}\n\nfunc calculatePremium(p Policy, mortalityRate float64, interestRate float64) float64 {\n    \u002F\u002F Simple net single premium calculation\n    discountFactor := math.Pow(1+interestRate, float64(-p.Term))\n    survivalProb := math.Pow(1-mortalityRate, float64(p.Term))\n\n    return p.CoverageAmount * discountFactor * survivalProb\n}\n\nfunc main() {\n    policy := Policy{\n        Age:            35,\n        CoverageAmount: 100000,\n        Term:           20,\n    }\n\n    premium := calculatePremium(policy, 0.001, 0.05)\n    fmt.Printf(\"Premium for age %d: $%.2f\\n\", policy.Age, premium)\n}\n\n\u002F\u002F Run this with: go run main.go\n\u002F\u002F No dependencies, no virtual environments, no tears\n",[1237,4750,4751,4757,4761,4767,4776,4784,4788,4792,4803,4811,4819,4826,4830,4834,4860,4865,4897,4922,4926,4943,4947,4951,4959,4971,4981,4990,5001,5006,5011,5032,5063,5068,5073,5079],{"__ignoreMap":666},[1885,4752,4753,4755],{"class":2470,"line":2471},[1885,4754,4061],{"class":3389},[1885,4756,4064],{"class":2480},[1885,4758,4759],{"class":2470,"line":667},[1885,4760,2499],{"emptyLinePlaceholder":705},[1885,4762,4763,4765],{"class":2470,"line":672},[1885,4764,3697],{"class":3389},[1885,4766,4075],{"class":3396},[1885,4768,4769,4771,4774],{"class":2470,"line":2502},[1885,4770,4080],{"class":2484},[1885,4772,4773],{"class":2480},"fmt",[1885,4775,4086],{"class":2484},[1885,4777,4778,4780,4782],{"class":2470,"line":2508},[1885,4779,4080],{"class":2484},[1885,4781,4020],{"class":2480},[1885,4783,4086],{"class":2484},[1885,4785,4786],{"class":2470,"line":2522},[1885,4787,3492],{"class":3396},[1885,4789,4790],{"class":2470,"line":2527},[1885,4791,2499],{"emptyLinePlaceholder":705},[1885,4793,4794,4796,4799,4801],{"class":2470,"line":2533},[1885,4795,4108],{"class":3389},[1885,4797,4798],{"class":2480}," Policy",[1885,4800,4114],{"class":3389},[1885,4802,3415],{"class":3396},[1885,4804,4805,4808],{"class":2470,"line":2545},[1885,4806,4807],{"class":3396},"    Age            ",[1885,4809,4810],{"class":3389},"int\n",[1885,4812,4813,4816],{"class":2470,"line":2550},[1885,4814,4815],{"class":3396},"    CoverageAmount ",[1885,4817,4818],{"class":3389},"float64\n",[1885,4820,4821,4824],{"class":2470,"line":2556},[1885,4822,4823],{"class":3396},"    Term           ",[1885,4825,4810],{"class":3389},[1885,4827,4828],{"class":2470,"line":3549},[1885,4829,3583],{"class":3396},[1885,4831,4832],{"class":2470,"line":3555},[1885,4833,2499],{"emptyLinePlaceholder":705},[1885,4835,4836,4838,4840,4842,4844,4847,4849,4852,4854,4856,4858],{"class":2470,"line":3560},[1885,4837,3390],{"class":3389},[1885,4839,3892],{"class":2480},[1885,4841,3503],{"class":3396},[1885,4843,3400],{"class":2480},[1885,4845,4846],{"class":3396},", mortalityRate ",[1885,4848,3904],{"class":3389},[1885,4850,4851],{"class":3396},", interestRate ",[1885,4853,3904],{"class":3389},[1885,4855,3907],{"class":3396},[1885,4857,3904],{"class":3389},[1885,4859,3415],{"class":3396},[1885,4861,4862],{"class":2470,"line":3571},[1885,4863,4864],{"class":2474},"    \u002F\u002F Simple net single premium calculation\n",[1885,4866,4867,4870,4872,4875,4878,4880,4882,4885,4888,4890,4892,4894],{"class":2470,"line":3580},[1885,4868,4869],{"class":3396},"    discountFactor ",[1885,4871,3423],{"class":3389},[1885,4873,4874],{"class":3396}," math.",[1885,4876,4877],{"class":2480},"Pow",[1885,4879,3486],{"class":3396},[1885,4881,3489],{"class":2480},[1885,4883,4884],{"class":3389},"+",[1885,4886,4887],{"class":3396},"interestRate, ",[1885,4889,3904],{"class":3389},[1885,4891,3486],{"class":3396},[1885,4893,1997],{"class":3389},[1885,4895,4896],{"class":3396},"p.Term))\n",[1885,4898,4899,4902,4904,4906,4908,4910,4912,4914,4917,4919],{"class":2470,"line":3586},[1885,4900,4901],{"class":3396},"    survivalProb ",[1885,4903,3423],{"class":3389},[1885,4905,4874],{"class":3396},[1885,4907,4877],{"class":2480},[1885,4909,3486],{"class":3396},[1885,4911,3489],{"class":2480},[1885,4913,1997],{"class":3389},[1885,4915,4916],{"class":3396},"mortalityRate, ",[1885,4918,3904],{"class":3389},[1885,4920,4921],{"class":3396},"(p.Term))\n",[1885,4923,4924],{"class":2470,"line":4223},[1885,4925,2499],{"emptyLinePlaceholder":705},[1885,4927,4928,4930,4933,4935,4938,4940],{"class":2470,"line":4241},[1885,4929,3574],{"class":3389},[1885,4931,4932],{"class":3396}," p.CoverageAmount ",[1885,4934,3921],{"class":3389},[1885,4936,4937],{"class":3396}," discountFactor ",[1885,4939,3921],{"class":3389},[1885,4941,4942],{"class":3396}," survivalProb\n",[1885,4944,4945],{"class":2470,"line":4246},[1885,4946,3583],{"class":3396},[1885,4948,4949],{"class":2470,"line":4251},[1885,4950,2499],{"emptyLinePlaceholder":705},[1885,4952,4953,4955,4957],{"class":2470,"line":4262},[1885,4954,3390],{"class":3389},[1885,4956,4256],{"class":2480},[1885,4958,4259],{"class":3396},[1885,4960,4961,4964,4966,4968],{"class":2470,"line":4279},[1885,4962,4963],{"class":3396},"    policy ",[1885,4965,3423],{"class":3389},[1885,4967,4798],{"class":2480},[1885,4969,4970],{"class":3396},"{\n",[1885,4972,4973,4976,4978],{"class":2470,"line":4295},[1885,4974,4975],{"class":3396},"        Age:            ",[1885,4977,4206],{"class":2480},[1885,4979,4980],{"class":3396},",\n",[1885,4982,4983,4986,4988],{"class":2470,"line":4300},[1885,4984,4985],{"class":3396},"        CoverageAmount: ",[1885,4987,4212],{"class":2480},[1885,4989,4980],{"class":3396},[1885,4991,4993,4996,4999],{"class":2470,"line":4992},26,[1885,4994,4995],{"class":3396},"        Term:           ",[1885,4997,4998],{"class":2480},"20",[1885,5000,4980],{"class":3396},[1885,5002,5004],{"class":2470,"line":5003},27,[1885,5005,3552],{"class":3396},[1885,5007,5009],{"class":2470,"line":5008},28,[1885,5010,2499],{"emptyLinePlaceholder":705},[1885,5012,5014,5016,5018,5020,5023,5026,5028,5030],{"class":2470,"line":5013},29,[1885,5015,4196],{"class":3396},[1885,5017,3423],{"class":3389},[1885,5019,3892],{"class":2480},[1885,5021,5022],{"class":3396},"(policy, ",[1885,5024,5025],{"class":2480},"0.001",[1885,5027,1888],{"class":3396},[1885,5029,4218],{"class":2480},[1885,5031,3492],{"class":3396},[1885,5033,5035,5038,5041,5043,5046,5049,5052,5055,5058,5060],{"class":2470,"line":5034},30,[1885,5036,5037],{"class":3396},"    fmt.",[1885,5039,5040],{"class":2480},"Printf",[1885,5042,3486],{"class":3396},[1885,5044,5045],{"class":2484},"\"Premium for age ",[1885,5047,5048],{"class":3396},"%d",[1885,5050,5051],{"class":2484},": $",[1885,5053,5054],{"class":3396},"%.2f",[1885,5056,5057],{"class":3389},"\\n",[1885,5059,4476],{"class":2484},[1885,5061,5062],{"class":3396},", policy.Age, premium)\n",[1885,5064,5066],{"class":2470,"line":5065},31,[1885,5067,3583],{"class":3396},[1885,5069,5071],{"class":2470,"line":5070},32,[1885,5072,2499],{"emptyLinePlaceholder":705},[1885,5074,5076],{"class":2470,"line":5075},33,[1885,5077,5078],{"class":2474},"\u002F\u002F Run this with: go run main.go\n",[1885,5080,5082],{"class":2470,"line":5081},34,[1885,5083,5084],{"class":2474},"\u002F\u002F No dependencies, no virtual environments, no tears\n",[36,5086,5088],{"id":5087},"resources-to-get-you-started","Resources to Get You Started",[1232,5090,5091,5100,5110,5120,5129],{},[160,5092,5093,5099],{},[47,5094,5095,2163],{},[15,5096,5098],{"href":4452,"rel":5097},[19],"A Tour of Go"," Interactive tutorial",[160,5101,5102,5109],{},[47,5103,5104,2163],{},[15,5105,5108],{"href":5106,"rel":5107},"https:\u002F\u002Fgo.dev\u002Fdoc\u002Feffective_go",[19],"Effective Go"," Best practices from the source",[160,5111,5112,5119],{},[47,5113,5114,2163],{},[15,5115,5118],{"href":5116,"rel":5117},"https:\u002F\u002Fgithub.com\u002Favelino\u002Fawesome-go",[19],"Awesome Go"," Curated list of Go packages",[160,5121,5122,5128],{},[47,5123,5124,2163],{},[15,5125,5127],{"href":4431,"rel":5126},[19],"pkg.go.dev"," Go package documentation",[160,5130,5131,5138],{},[47,5132,5133,2163],{},[15,5134,5137],{"href":5135,"rel":5136},"https:\u002F\u002Fgobyexample.com\u002F",[19],"Go by Example"," Practical examples",[36,5140,3096],{"id":3095},[11,5142,5143,5144,5147,5148,5151,5152,5155],{},"Go may not be as ",[47,5145,5146],{},"statistically rich"," as R or as ",[47,5149,5150],{},"instantly approachable"," as Python — and it certainly won't replace Excel's role as the world's ",[47,5153,5154],{},"unofficial actuarial dashboard"," — but when your work moves beyond ad-hoc analysis into systems, scalable pipelines, and production-grade tools, Go starts to look like the missing piece.",[11,5157,5158,5159,1888,5162,5165,5166,1888,5168,4571,5170,5173,5174,1888,5177,2799,5180,5183,5184,1888,5187,2799,5190,5193,5194,5197],{},"Python shines when you need ",[47,5160,5161],{},"quick prototyping",[47,5163,5164],{},"data wrangling",", or leveraging massive libraries like ",[32,5167,2929],{},[32,5169,2868],{},[32,5171,5172],{},"scikit-learn",". R dominates in ",[47,5175,5176],{},"statistical modelling",[47,5178,5179],{},"rapid exploratory analysis",[47,5181,5182],{},"academic-style reporting",". Excel is unbeatable for ",[47,5185,5186],{},"instant visualization",[47,5188,5189],{},"business-friendly presentation",[47,5191,5192],{},"light-weight scenario work",". But, let's be honest: if you're using Excel or CSVs as a ",[47,5195,5196],{},"database",", it's time for an intervention.",[11,5199,5200,5201,5204,5205,1899,5208,5211],{},"And if you find yourself trapped in the dark abyss of ",[47,5202,5203],{},"VBA debugging",", asking, \"Is there more to life than ",[32,5206,5207],{},"Subs",[32,5209,5210],{},"Dim"," statements?\" — you're not alone. VBA is that friend you call only when all else fails.",[11,5213,5214,5215,5218,5219,5222,5223,5226],{},"But here's where Python, R, and Excel all start showing cracks: Excel ",[47,5216,5217],{},"crashes under big data",", Python ",[47,5220,5221],{},"slows down in CPU-heavy loops"," without C glue, and R can turn ",[47,5224,5225],{},"fragile in deployment",". Go swoops in with speed, memory safety, and easy concurrency, letting you run hefty actuarial simulations, stream real-time data, and build services that won't throw a tantrum under pressure.",[11,5228,5229,5232,5233,5236,5237,5240,5241,5244],{},[47,5230,5231],{},"Worst case?"," You build a CLI or backend tool running ",[47,5234,5235],{},"10x faster"," than your current Python\u002FR script. ",[47,5238,5239],{},"Best case?"," You become the ",[47,5242,5243],{},"hero"," who rescues coworkers from 2 AM Excel macro meltdowns and Monte Carlo waiting games.",[3126,5246,5247],{},[11,5248,5249],{},[32,5250,5251],{},"\"Give a person a Python script, and they'll struggle with dependencies for an hour, give a person R and they'll need glasses, give a person VBA after the 4th hour they will become philosophers\" — Anonymous Actuarial Programmer",[36,5253,5255],{"id":5254},"quick-reads","Quick Reads",[1232,5257,5258,5266],{},[160,5259,5260,5265],{},[15,5261,5264],{"href":5262,"rel":5263},"https:\u002F\u002Fblog.actuaries.org.uk\u002Fthe-rise-of-the-citizen-developer\u002F",[19],"Empowering actuaries with data science",": For actuaries venturing into the realm of programming",[160,5267,5268,5273],{},[15,5269,5272],{"href":5270,"rel":5271},"https:\u002F\u002Fblog.actuaries.org.uk\u002F2019\u002F5-key-skills-for-graduating-actuaries\u002F",[19],"Skills for graduating actuaries",": The actuary from 50 years ago, writing out calculations by hand, would have found it difficult to imagine today's actuary having such immense data and computing power at their disposal.",[2703,5275,5276],{},"html pre.shiki code .ss8vJ, html code.shiki .ss8vJ{--shiki-default:#8B8B8B94}html pre.shiki code .sq0yK, html code.shiki .sq0yK{--shiki-default:#A0A0A0}html pre.shiki code .sNEDb, html code.shiki .sNEDb{--shiki-default:#FFC799}html pre.shiki code .sU-n2, html code.shiki .sU-n2{--shiki-default:#FFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sZOz5, html code.shiki .sZOz5{--shiki-default:#99FFE4}",{"title":666,"searchDepth":667,"depth":667,"links":5278},[5279,5280,5287,5288,5289,5290,5291,5292,5293,5294,5295],{"id":3270,"depth":667,"text":3271},{"id":3347,"depth":667,"text":3348,"children":5281},[5282,5283,5284,5285,5286],{"id":3351,"depth":672,"text":3352},{"id":3611,"depth":672,"text":3612},{"id":3769,"depth":672,"text":3770},{"id":3859,"depth":672,"text":3860},{"id":4003,"depth":672,"text":4004},{"id":4316,"depth":667,"text":4317},{"id":4482,"depth":667,"text":4483},{"id":4558,"depth":667,"text":4559},{"id":4650,"depth":667,"text":4651},{"id":4692,"depth":667,"text":4693},{"id":4741,"depth":667,"text":4742},{"id":5087,"depth":667,"text":5088},{"id":3095,"depth":667,"text":3096},{"id":5254,"depth":667,"text":5255},"From spreadsheets to simulations — a personal take on modern actuarial programming that'll make you question everything you thought you knew about actuarial education",{},"\u002Fblog\u002Fwhygolang",{"title":3252,"description":5296},"blog\u002Fwhygolang",[1645,1194,3248,2726,3117],"PBIBz6QrL2mtPMp2A-m_5QGQf-06TizrnOw-3_gykYg",{"id":5304,"title":5305,"body":5306,"date":5662,"description":5663,"extension":702,"featured":703,"meta":5664,"navigation":705,"path":5665,"seo":5666,"stem":5667,"tags":5668,"__hash__":5670},"blog\u002Fblog\u002Fneovim.md","Neovim for Beginners",{"type":8,"value":5307,"toc":5654},[5308,5313,5319,5326,5329,5334,5370,5374,5377,5414,5420,5424,5427,5479,5483,5486,5564,5568,5610,5612,5615],[3126,5309,5310],{},[11,5311,5312],{},"What is Neovim?",[36,5314,3134,5316,5318],{"id":5315},"what-is-neovim",[32,5317,3137],{}," Neovim?",[11,5320,5321,5322,5325],{},"Neovim is a highly configurable, extensible, and powerful text editor. But that description can be a little intimidating! Let's break it down. It's often described as a \"modal editor,\" which means it operates in different ",[32,5323,5324],{},"modes",". Think of it like a camera: it has different modes for taking pictures, recording video, etc. Neovim has modes for inserting text, navigating the file, and executing commands.",[11,5327,5328],{},"It's a fork of Vim (that's V-I-M), a text editor that's been around for decades and is famous for its efficiency and power. Neovim was created to improve upon Vim, making it more modern, easier to extend, and better suited for collaboration.",[11,5330,5331],{},[47,5332,5333],{},"Why choose Neovim?",[1232,5335,5336,5346,5352,5358,5364],{},[160,5337,5338,5341,5342,5345],{},[47,5339,5340],{},"Efficiency:"," Once you learn the keybindings, you can edit text ",[32,5343,5344],{},"very"," quickly without taking your hands off the keyboard.",[160,5347,5348,5351],{},[47,5349,5350],{},"Customization:"," Neovim is incredibly customizable. You can tailor it to your exact needs and preferences.",[160,5353,5354,5357],{},[47,5355,5356],{},"Extensibility:"," Plugins allow you to add features like code completion, linting, debugging, and much more. It can truly become a full-fledged IDE.",[160,5359,5360,5363],{},[47,5361,5362],{},"Lightweight:"," Neovim is generally very fast and doesn't consume a lot of system resources.",[160,5365,5366,5369],{},[47,5367,5368],{},"Cross-Platform:"," It runs on Linux, macOS, and Windows.",[36,5371,5373],{"id":5372},"getting-started-installation","Getting Started: Installation",[11,5375,5376],{},"Before you can start using Neovim, you need to install it. The installation process varies depending on your operating system:",[1232,5378,5379,5388,5397],{},[160,5380,5381,5384,5385],{},[47,5382,5383],{},"Linux:"," Most distributions have Neovim in their package repositories. For example, on Debian\u002FUbuntu: ",[1237,5386,5387],{},"sudo apt install neovim",[160,5389,5390,5393,5394],{},[47,5391,5392],{},"macOS:"," The easiest way is to use a package manager like Homebrew: ",[1237,5395,5396],{},"brew install neovim",[160,5398,5399,5402,5403,5408,5409],{},[47,5400,5401],{},"Windows:"," You can download a pre-built binary from the ",[15,5404,5407],{"href":5405,"rel":5406},"https:\u002F\u002Fgithub.com\u002Fneovim\u002Fneovim\u002Freleases",[19],"Neovim releases page",". You might also consider using a package manager like Winget, Chocolatey or my favourite ",[15,5410,5413],{"href":5411,"rel":5412},"https:\u002F\u002Fscoop.sh\u002F",[19],"Scoop",[11,5415,5416,5417,5419],{},"After installation, you can launch Neovim by typing ",[1237,5418,2745],{}," in your terminal.",[36,5421,5423],{"id":5422},"basic-concepts-modes","Basic Concepts: Modes",[11,5425,5426],{},"Understanding Neovim's modes is crucial. Here are the most important ones:",[1232,5428,5429,5438,5452,5470],{},[160,5430,5431,5434,5435,836],{},[47,5432,5433],{},"Normal Mode:"," This is the default mode. You use it for navigating the file, deleting text, copying, pasting, and executing commands. You enter this mode when you open a file or press ",[1237,5436,5437],{},"\u003CEsc>",[160,5439,5440,5443,5444,1888,5446,1888,5448,5451],{},[47,5441,5442],{},"Insert Mode:"," This is where you actually type text. You enter this mode by pressing ",[1237,5445,2255],{},[1237,5447,15],{},[1237,5449,5450],{},"o",", or other insert commands.",[160,5453,5454,5457,5458,5461,5462,5465,5466,5469],{},[47,5455,5456],{},"Visual Mode:"," This mode allows you to select text. You enter this mode by pressing ",[1237,5459,5460],{},"v"," (character-wise), ",[1237,5463,5464],{},"V"," (line-wise), or ",[1237,5467,5468],{},"\u003CCtrl-v>"," (block-wise).",[160,5471,5472,5475,5476,5478],{},[47,5473,5474],{},"Command Mode:"," You enter this mode by pressing ",[1237,5477,2163],{},". You use it to execute commands like saving the file, searching, or running shell commands.",[36,5480,5482],{"id":5481},"essential-keybindings","Essential Keybindings",[11,5484,5485],{},"Here are a few keybindings to get you started:",[1232,5487,5488,5494,5499,5505,5511,5516,5521,5526,5531,5536,5541,5547,5553,5559],{},[160,5489,5490,5493],{},[1237,5491,5492],{},"h",": Move cursor left",[160,5495,5496,5498],{},[1237,5497,2383],{},": Move cursor down",[160,5500,5501,5504],{},[1237,5502,5503],{},"k",": Move cursor up",[160,5506,5507,5510],{},[1237,5508,5509],{},"l",": Move cursor right",[160,5512,5513,5515],{},[1237,5514,2255],{},": Enter Insert Mode (before the cursor)",[160,5517,5518,5520],{},[1237,5519,15],{},": Enter Insert Mode (after the cursor)",[160,5522,5523,5525],{},[1237,5524,5450],{},": Enter Insert Mode (on a new line below)",[160,5527,5528,5530],{},[1237,5529,5437],{},": Return to Normal Mode",[160,5532,5533,5535],{},[1237,5534,2263],{},": Save the file",[160,5537,5538,5540],{},[1237,5539,2267],{},": Quit Neovim",[160,5542,5543,5546],{},[1237,5544,5545],{},":q!",": Quit without saving",[160,5548,5549,5552],{},[1237,5550,5551],{},"dd",": Delete the current line",[160,5554,5555,5558],{},[1237,5556,5557],{},"yy",": Yank (copy) the current line",[160,5560,5561,5563],{},[1237,5562,11],{},": Paste",[36,5565,5567],{"id":5566},"resources-for-learning-more","Resources for Learning More",[1232,5569,5570,5580,5590,5600],{},[160,5571,5572,988,5575,5579],{},[47,5573,5574],{},"Neovim Documentation:",[15,5576,5577],{"href":5577,"rel":5578},"https:\u002F\u002Fneovim.io\u002Fdoc\u002F",[19]," - The official documentation is comprehensive.",[160,5581,5582,988,5585,5589],{},[47,5583,5584],{},"Neovim Crash Course:",[15,5586,5587],{"href":5587,"rel":5588},"https:\u002F\u002Fnvimcrashcourse.com\u002F",[19]," - A great interactive tutorial.",[160,5591,5592,988,5595,5599],{},[47,5593,5594],{},"Awesome Neovim:",[15,5596,5597],{"href":5597,"rel":5598},"https:\u002F\u002Fgithub.com\u002FrockerBOO\u002Fawesome-neovim",[19]," - A curated list of Neovim plugins and resources.",[160,5601,5602,988,5605,5609],{},[47,5603,5604],{},"Vim Adventures:",[15,5606,5607],{"href":5607,"rel":5608},"https:\u002F\u002Fvim-adventures.com\u002F",[19]," - A fun game to learn Vim keybindings (many apply to Neovim).",[36,5611,3196],{"id":1598},[11,5613,5614],{},"This is just the beginning! Neovim has a steep learning curve, but the rewards are well worth the effort. In future posts, I'll be covering:",[1232,5616,5617,5630,5636,5642,5648],{},[160,5618,5619,5622,5623,5626,5627,5629],{},[47,5620,5621],{},"Configuration:"," How to customize your ",[1237,5624,5625],{},"init.vim"," (or ",[1237,5628,1796],{},") file.",[160,5631,5632,5635],{},[47,5633,5634],{},"Plugins:"," Exploring some essential plugins to enhance your workflow.",[160,5637,5638,5641],{},[47,5639,5640],{},"Lua Configuration:"," Diving into using Lua for more advanced configuration.",[160,5643,5644,5647],{},[47,5645,5646],{},"Keymaps:"," Creating your own custom keybindings.",[160,5649,5650,5653],{},[47,5651,5652],{},"Troubleshooting:"," Common problems and how to solve them.",{"title":666,"searchDepth":667,"depth":667,"links":5655},[5656,5657,5658,5659,5660,5661],{"id":5315,"depth":667,"text":5312},{"id":5372,"depth":667,"text":5373},{"id":5422,"depth":667,"text":5423},{"id":5481,"depth":667,"text":5482},{"id":5566,"depth":667,"text":5567},{"id":1598,"depth":667,"text":3196},"2025-07-10","A beginner's take on Neovim",{},"\u002Fblog\u002Fneovim",{"title":5305,"description":5663},"blog\u002Fneovim",[2745,5669,2357],"development","yhOE98jdx-uQAdszu2Sf6Pt7u0UYTrMIH0SfdpT5R5Q",{"id":5672,"title":5673,"body":5674,"date":5829,"description":5830,"extension":702,"featured":703,"meta":5831,"navigation":705,"path":5832,"seo":5833,"stem":5834,"tags":5835,"__hash__":5839},"blog\u002Fblog\u002Fgetting-started-with-nuxt.md","Getting Started with Nuxt 3",{"type":8,"value":5675,"toc":5818},[5676,5679,5683,5686,5712,5716,5720,5727,5731,5734,5738,5744,5748,5751,5755,5758,5802,5805,5809,5812,5815],[11,5677,5678],{},"Nuxt 3 is a powerful framework for building modern web applications with Vue.js. In this post, I'll walk you through the key features and benefits of using Nuxt 3 for your next project.",[36,5680,5682],{"id":5681},"why-choose-nuxt-3","Why Choose Nuxt 3?",[11,5684,5685],{},"Nuxt 3 brings several improvements over its predecessor:",[1232,5687,5688,5694,5700,5706],{},[160,5689,5690,5693],{},[47,5691,5692],{},"Better Performance",": Built on Vite for faster development",[160,5695,5696,5699],{},[47,5697,5698],{},"TypeScript Support",": First-class TypeScript support out of the box",[160,5701,5702,5705],{},[47,5703,5704],{},"Auto-imports",": Automatic imports for components, composables, and utilities",[160,5707,5708,5711],{},[47,5709,5710],{},"Server-Side Rendering",": Built-in SSR capabilities for better SEO",[36,5713,5715],{"id":5714},"key-features","Key Features",[64,5717,5719],{"id":5718},"_1-file-based-routing","1. File-based Routing",[11,5721,5722,5723,5726],{},"Nuxt automatically generates routes based on your file structure in the ",[1237,5724,5725],{},"pages\u002F"," directory.",[64,5728,5730],{"id":5729},"_2-auto-imports","2. Auto-imports",[11,5732,5733],{},"No need to manually import Vue composables or Nuxt utilities - they're available globally.",[64,5735,5737],{"id":5736},"_3-server-api-routes","3. Server API Routes",[11,5739,5740,5741,5726],{},"Create API endpoints easily with the ",[1237,5742,5743],{},"server\u002Fapi\u002F",[64,5745,5747],{"id":5746},"_4-modules-ecosystem","4. Modules Ecosystem",[11,5749,5750],{},"Leverage the rich ecosystem of Nuxt modules to extend functionality.",[36,5752,5754],{"id":5753},"getting-started","Getting Started",[11,5756,5757],{},"To create a new Nuxt 3 project:",[2389,5759,5761],{"className":2463,"code":5760,"language":2465,"meta":666,"style":666},"npx nuxi@latest init my-nuxt-app\ncd my-nuxt-app\nnpm install\nnpm run dev\n",[1237,5762,5763,5777,5784,5792],{"__ignoreMap":666},[1885,5764,5765,5768,5771,5774],{"class":2470,"line":2471},[1885,5766,5767],{"class":2480},"npx",[1885,5769,5770],{"class":2484}," nuxi@latest",[1885,5772,5773],{"class":2484}," init",[1885,5775,5776],{"class":2484}," my-nuxt-app\n",[1885,5778,5779,5782],{"class":2470,"line":667},[1885,5780,5781],{"class":2480},"cd",[1885,5783,5776],{"class":2484},[1885,5785,5786,5789],{"class":2470,"line":672},[1885,5787,5788],{"class":2480},"npm",[1885,5790,5791],{"class":2484}," install\n",[1885,5793,5794,5796,5799],{"class":2470,"line":2502},[1885,5795,5788],{"class":2480},[1885,5797,5798],{"class":2484}," run",[1885,5800,5801],{"class":2484}," dev\n",[11,5803,5804],{},"That's it! You now have a running Nuxt 3 application.",[36,5806,5808],{"id":5807},"conclusion","Conclusion",[11,5810,5811],{},"Nuxt 3 provides an excellent developer experience with powerful features for building modern web applications. Whether you're building a simple website or a complex application, Nuxt 3 has the tools you need.",[11,5813,5814],{},"Happy coding!",[2703,5816,5817],{},"html pre.shiki code .sNEDb, html code.shiki .sNEDb{--shiki-default:#FFC799}html pre.shiki code .sZOz5, html code.shiki .sZOz5{--shiki-default:#99FFE4}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":666,"searchDepth":667,"depth":667,"links":5819},[5820,5821,5827,5828],{"id":5681,"depth":667,"text":5682},{"id":5714,"depth":667,"text":5715,"children":5822},[5823,5824,5825,5826],{"id":5718,"depth":672,"text":5719},{"id":5729,"depth":672,"text":5730},{"id":5736,"depth":672,"text":5737},{"id":5746,"depth":672,"text":5747},{"id":5753,"depth":667,"text":5754},{"id":5807,"depth":667,"text":5808},"2025-06-24","A comprehensive guide to building modern web applications with Nuxt 3.",{},"\u002Fblog\u002Fgetting-started-with-nuxt",{"title":5673,"description":5830},"blog\u002Fgetting-started-with-nuxt",[5836,5837,5838],"nuxt","vue","web-development","oWMRx9uyf2-y-usxijffwr5GMoU7wxazfgkCLR8ZwWU",{"id":5841,"title":5842,"body":5843,"date":5853,"description":5854,"extension":702,"featured":703,"meta":5855,"navigation":705,"path":5856,"seo":5857,"stem":5858,"tags":5859,"__hash__":5862},"blog\u002Fblog\u002Fwelcome.md","Welcome to My Blog!",{"type":8,"value":5844,"toc":5851},[5845,5848],[11,5846,5847],{},"Welcome to my new blog! This is where I'll be sharing my thoughts, experiences, and insights on various topics, both professional and personal.",[11,5849,5850],{},"Stay tuned for more updates!",{"title":666,"searchDepth":667,"depth":667,"links":5852},[],"2025-06-23","My first post on this new personal website.",{},"\u002Fblog\u002Fwelcome",{"title":5842,"description":5854},"blog\u002Fwelcome",[5860,5861],"welcome","personal","843QyF2CsTQoNJlP06MhcskasYL9c96O8sVPDuMzCHE",1779304900054]