How I work
Keep problems small, prototype with real data, iterate. Listen before proposing — most solutions fail by solving the wrong problem. I'm comfortable deciding under uncertainty, and changing course when I'm wrong.
Building quant models, agentic systems, and full-stack tools — one curious question at a time.
“Why? How? What if?”
Taped above my monitor. Applies to a stack trace, a market signal, or an application essay.
Statistics, to make sense of an uncertain world. Code, to put it to use.
Keep problems small, prototype with real data, iterate. Listen before proposing — most solutions fail by solving the wrong problem. I'm comfortable deciding under uncertainty, and changing course when I'm wrong.
Hands-on with data — from understanding the problem to shipping the fix.
Projects that blend statistical intuition, machine learning, and thoughtful product craft.
Ensemble ML signal generation (LightGBM + XGBoost + Random Forest) for the Indonesian Stock Exchange, with triple-barrier labeling and walk-forward CV with embargo (per López de Prado's AFML). Trained on 2020–2024, evaluated out-of-sample on full-year 2025 IDX data. Team project, 4 contributors.
A leakage audit of the undergraduate Indonesian suicide-ideation corpus. A random 80/20 split without deduplication put 36.5% of the validation posts in both halves. Research/educational — not a clinical tool.
Self-hosted coding agent that runs on a cron/systemd schedule: hybrid RAG context retrieval, failure memory, LLM-as-judge output scoring, reversibility classification before destructive ops, and automatic commit/PR workflow.
My quant project reported a 2.70 Sharpe and 195% return. That number had no run artifact behind it, so I rebuilt the evaluation from scratch — purge, embargo, fold-local scaling, sample weights, and baselines under identical costs. With the leakage gone, the strategy stops beating buy-and-hold. That is a more useful thing to have found than the number it replaced, and the write-up, code, manifests and figures are all public.
research/aurum_experiment.py.The undergraduate suicide-ideation corpus is a scraped X sample. A random 80/20 split without deduplication put 739 of 2,026 validation posts (36.5%) in both halves. On the 1,287 genuinely unseen rows, fine-tuned IndoBERT falls from F1 0.910 to 0.877 [0.845, 0.904]. A character n-gram logistic regression reaches 0.787; the remaining transformer advantage is +0.090 [+0.049, +0.131]. The FastText + LSTM thesis arm cannot be recomputed — tokenizer and vectors were never saved — and that is recorded rather than hidden.
eval/si_eval/run.py.Directions I keep returning to. Where one has produced a result, it is a public artifact rather than a post — a leakage audit, an IDX re-evaluation — linked above.
Keeping an agent from drifting over long autonomous runs. I'm testing a self-hosted stack that observes itself and learns from its traces — the hard part is knowing when to trust its judgment.
Most ML systems are tested on data from the same distribution as training. In production — especially markets — that distribution keeps shifting. The real question is detecting it early enough to act.
Most ML tooling assumes English-first data and deep markets. Bahasa Indonesia NLP and the Indonesian equity market mean thin data and constant regime change — constraints that force cleaner thinking.