| # ArtaModel — the study |
|
|
| *Named by Arash, 2026-08-18. Third-edition gendered data (dad/mom from P21; both births to the day, both |
| birthplaces; the wedding date; sidereal phases from Kerykeion at 09:00 local). 250 fits in |
| `artamodel_study.py`; every number below is held out on couples born after 1900 unless marked "inner", every |
| choice made on the inner temporal split, and every experiment on a FIXED population.* |
|
|
| ## The model |
|
|
| ``` |
| y = | b + Σᵢ aᵢ ·e^{i(θmᵢ − θdᵢ)} synastry, mom − dad |
| + mᵢ ·e^{i(θtᵢ − θmᵢ)} the wedding sky transiting mom |
| + dᵢ ·e^{i(θtᵢ − θdᵢ)} the wedding sky transiting dad |
| + mnᵢ·e^{i θmᵢ} mom's own natal phase |
| + dnᵢ·e^{i θdᵢ} dad's own natal phase |
| + tnᵢ·e^{i θtᵢ} the wedding sky's own phase |
| + cᵢ ·e^{i θcᵢ} the composite (shorter-arc midpoint of the two natal longitudes) |
| + tcᵢ·e^{i(θtᵢ − θcᵢ)} |² the wedding sky transiting the composite |
| ``` |
|
|
| Fourteen bodies (Sun … Pluto, true node = Rāhu, true south node = Ketu, Chiron, mean Lilith), Ascendant/MC |
| optional. Every term exists only when both of its phases exist ("if wedding is not known, drop the last two |
| terms"; "if dob of either is not known, drop the natal term of it") — a missing phase contributes exactly zero. |
| Complex weights as (Re, Im), |·|², a logistic head for the loss, Adam with L2, early-stopped on the inner |
| temporal split; F copies of the formula combined by the head, F = 1 being the formula literally. |
|
|
| **Populations.** FULL — both natal charts complete and the wedding day known: 6,258 train / 2,635 held out. |
| CHARTS — both charts, wedding may be year-only: 9,716 / 7,428. ANY — any row with one phasor: up to 76,081 / 7,428. |
| **Plain reference on the same rows** (boosted trees on the two ages at the start, the gap and the start year): |
| FULL 0.6371 · CHARTS 0.6083 · ANY 0.6171. Dad's age at the start alone: 0.6264 on FULL. |
|
|
| ## 1 · Which terms (all 63 subsets of the six + the composite rungs, FULL, F = 1) |
|
|
| | terms | phasors | inner | held out | |
| |---|---|---|---| |
| | **m + d** (the two wedding-transit terms) — *selected by inner* | 28 | 0.6426 | **0.6304** | |
| | a + m + d (Arash's first formula) | 42 | 0.6416 | 0.6258 | |
| | a + d | 28 | 0.6280 | 0.6318 | |
| | d alone | 14 | 0.6235 | 0.6223 | |
| | a alone (synastry) | 14 | 0.5965 | 0.5755 | |
| | mn + dn (the natal phases) | 28 | 0.5507 | 0.5235 | |
| | tn (the wedding sky alone) | 14 | 0.5201 | 0.4551 | |
| | c (the composite alone) | 14 | 0.5069 | 0.4563 | |
| | c + tc | 28 | 0.6149 | 0.5828 | |
| | a + m + d + mn + dn | 70 | 0.6113 | 0.6098 | |
| | a + m + d + mn + dn + tn | 84 | 0.6021 | 0.5931 | |
| | a + m + d + c + tc | 70 | 0.6162 | 0.6104 | |
| | all eight | 112 | 0.5634 | 0.5740 | |
|
|
| Across the 70 configurations the inner split picks m+d; the best held-out anywhere is 0.6318, so the optimism of |
| selecting on the test set would have been only +0.0014 here. Every **absolute-phase** term (mn, dn, tn, c) makes |
| the model worse out of time; every **difference** term (a, m, d, tc) helps or is neutral. |
|
|
| ## 2 · Which bodies (3-term a+m+d, FULL) |
|
|
| **One body at a time:** Uranus alone **0.6419** · the three outer 0.6302 · Neptune 0.6260 · Pluto 0.6203 · Chiron |
| 0.6118 · Saturn 0.5913 · the nodes 0.5670 · Jupiter 0.5136 · Moon 0.5026 · Lilith 0.5003 · Mars 0.4938 · Venus |
| 0.4796 · Mercury 0.4784 · **Sun 0.4728**. Sets: modern10 0.6202 · slow5 0.6204 · classical7 0.5889 · fast5 0.4827. |
|
|
| **Dropping one body from all fourteen** changes held-out by −0.0012 (Chiron) to **+0.0062** (either node) — dropping |
| any *fast* body improves the model, dropping any *slow* body barely moves it (they are redundant with each other). |
|
|
| ## 3 · Invariances that prove what it reads |
|
|
| | convention (recomputed through Kerykeion) | 3-term held out | 6-term held out | |
| |---|---|---| |
| | Lahiri 09:00 local (baseline) | 0.6258 | 0.5931 | |
| | Raman · Fagan-Bradley · Krishnamurti | 0.6258 · 0.6258 · 0.6258 | 0.5931 · 0.5931 · 0.5931 | |
| | **tropical** | 0.6258 | 0.5941 | |
| | birth hour 06:00 · 12:00 · 18:00 local | 0.6258 · 0.6259 · 0.6259 | 0.5931 | |
| | 12:00 UT, **place ignored** | 0.6259 | 0.5933 | |
| | wedding at 00:00 UT | 0.6260 | 0.5934 | |
|
|
| The three-term model is **exactly invariant** to the ayanāṁśa and to the zodiac (a constant offset cancels in a |
| difference of two phases), and invariant to four decimals to the birth hour and the birthplace (a common shift of |
| both charts moves a slow body by nothing). It therefore cannot be reading anything sidereal, local, or angular. |
|
|
| ## 4 · What it reads |
|
|
| **The two ages at the wedding, and the age gap, through the slow bodies as clocks.** Uranus moves 4.3°/yr and |
| completes a cycle in 84 years, so `θt − θm` for Uranus is mom's age at the wedding, unwrapped for anyone under |
| 84; Neptune (2.2°/yr) and Pluto (1.5°/yr) the same at lower resolution; `θm − θd` for the same bodies is the age |
| gap. The fitted anatomy says so directly — the largest weights of the 3-term model are `d_pluto 1.27, m_pluto |
| 1.16, a_pluto 1.11, d_uranus 0.99, a_neptune 0.90, d_neptune 0.90` — and the controls confirm it: |
|
|
| | 3-term, FULL | AUC | |
| |---|---| |
| | held out | 0.6269 | |
| | **held out within 3-year cells of (dad's age, mom's age)** | **0.4955** | |
| | within 2-year age-gap bands | 0.5635 | |
| | plain reference (two ages + gap + start year, boosted) | 0.6371 | |
| | reference + ArtaModel score (combiner fitted on train, out-of-fold) | 0.6361 | |
|
|
| Hold the two ages flat and the model is at chance. Add its score to the plain reference and nothing is gained. |
| The 6-, 3+composite- and 8-term variants read 0.4765, 0.5080 and 0.5058 age-cell-matched; the reference gains at |
| most +0.0024 from any of them (noise). |
|
|
| ## 5 · The rest |
|
|
| - **Populations** (same formula): a+m+d FULL 0.6258 → CHARTS 0.6047 → ANY 0.6086; the six-term formula FULL |
| 0.5931 → CHARTS 0.5719 → **ANY 0.4877** — on ANY, ~50,000 rows carrying only a wedding sky (an era clock) join |
| the fit and drag the shared weights toward era, which reverses across the 1900 split. |
| - **Angles** (ASC/MC in the synastry/natal terms): 0.6194 vs 0.6258 without — worse. |
| - **Harmonics** (phases × h): h=2 0.6284, h=3 0.6203, h=4 0.6069 for a+m+d — a clock survives doubling. |
| - **Fields × L2** (3-term): held-out 0.616–0.6365 across 28 settings; the inner split picks F=64, L2=0.01 |
| → 0.6163 (optimism of picking on the test set would be +0.020). Ten seeds at F=1: 0.6252 ± 0.0030. |
| - **Temporal folds inside the training half** rank the ladder the way the held-out set does here (a+m+d 0.63 on |
| the folds vs 0.626 held out; six-term 0.58–0.63 vs 0.593) — unlike the tropical stacks of the first edition. |
| - **Composite (Davison-style)**: alone at chance (0.4563); with its transit, 0.5828; added to a+m+d, worse (0.6104). |
|
|
| ## 6 · Verdict |
|
|
| ArtaModel is a well-behaved, fully specified, honestly fitted model — and every point of held-out AUC it earns is |
| the two partners' ages at the wedding and the gap between their births, measured by the outer planets as clocks. |
| That is why it is invariant to the zodiac, the hour and the place; why Uranus alone equals the whole thing; why |
| the fast bodies are pure noise; and why it vanishes when the ages are held flat. Its ceiling on this data is the |
| plain reference (0.6371 on FULL), which it does not reach (0.6304 at best, m+d) and does not add to. |
|
|
| What would move it: information that is not a function of the three dates — birth **times** (the angles would |
| then be real), or a wedding **place** (a real electional lagna). Both are absent from Wikidata for these couples. |
|
|
| ## 7 · Ensembles, boosting, and split single-sum models (`artamodel_ensemble.py`) |
| |
| Arash, 2026-08-18: "use ensembles and boosting techniques and split multiple single sum model". FULL population; |
| the plain reference on the same rows is 0.6353. |
| |
| | construction | 3-term | 6-term | |
| |---|---|---| |
| | single ArtaModel F=1 | 0.6251 | 0.5820 | |
| | BAG, 25 bootstraps rank-averaged | 0.6339 | 0.6031 | |
| | BOOST, single-sum fields on residuals | 0.6318 | 0.5933–0.5969 | |
| | SPLIT per body (14 single sums), linear head | 0.6339 | 0.6251 | |
| | SPLIT per term / per phasor, linear head | 0.6291 / 0.6297 | 0.6195 / 0.6070 | |
| | SPLIT → LightGBM on the intensities | 0.6220–0.6293 | 0.6097–0.6269 | |
| | **BOOST over SPLIT, per phasor** | **0.6373** | **0.6388** | |
| |
| Splitting rescues the six-term formula (each absolute-phase term in its own sum can be weighted down); boosting |
| over the split sums reaches the reference but does not cross it; the age-cell-matched control stays at 0.50–0.52 |
| for every construction — better instruments for the same two quantities. Inner-selected picks: 3-term BOOST |
| 0.6318, 6-term BOOST-over-SPLIT-per-body 0.6293 (the top held-out numbers carry about +0.007 of optimism). |
| |
| ## 8 · Midpoints, per-body models, sums, aspect grids — every model on every row it has (`artamodel_split_models.py`, `artamodel_full_stack.py`, `artamodel_blend.py`) |
|
|
| Arash, 2026-08-19: three midpoint terms (the natal composite **c** = mid(θm, θd), **mw** = mid(θm, θt), **dw** = |
| mid(θd, θt) → `TERMS9`); every model trained on the rows it has (the dad-natal model on almost everything, a |
| day-missing row on the outer planets only — the precision-aware phases do this by themselves); per-body models |
| |b + aᵢ e^{i(θmᵢ−θdᵢ)}|² **in addition to** the sum models; and the aspects. Marriages-only edition III: |
| 89,465 train rows, 7,249 test rows, most dates year-only. Every member is a coherent field with a logistic head, |
| early-stopped on the inner temporal split of its **own** population; train scores are out-of-fold over two |
| temporal halves; test scores from a fit on all its rows; the stacker is LightGBM over the member scores (NaN where |
| a member has nothing for the couple). |
|
|
| **Members (144).** 126 per-phasor models (9 terms × 14 bodies, each on its own rows); 9 per-term sums over the |
| 14 bodies — inside the square the cross terms cos(φᵢ−φⱼ) ARE the aspects between that term's phasors; the |
| 3-/6-/9-term whole-formula sums; three explicit inter-body aspect grids (synastry θmᵢ−θdⱼ, wedding→mom θtᵢ−θmⱼ, |
| wedding→dad θtᵢ−θdⱼ, all i≠j, 182 phasors each); and three boosted split sums — the deployed construction on |
| the 9,553 full-chart rows, and the 6- and 9-term constructions on all 75,852 rows with any phasor. |
|
|
| | member (held out, on the rows it scores) | rows | AUC | |
| |---|---|---| |
| | phasor **d_neptune** (wedding→dad) | 16,622 | **0.6312** | |
| | phasor d_pluto / d_uranus / a_uranus | 16,622 / 16,622 / 11,255 | 0.6231 / 0.6177 / 0.6031 | |
| | SUM term d over 14 bodies | 16,622 | 0.6267 | |
| | SUM 3-term (a+m+d) over all bodies | 22,426 | 0.6097 | |
| | SUM term a / m | 11,255 / 8,787 | 0.5825 / 0.5924 | |
| | SUM term c / mw / dw (the three midpoints) | 11,255 / 8,787 / 16,622 | 0.4763 / 0.4545 / 0.3938 | |
| | SUM term mn / dn / tn (absolute phases) | 13,669 / 24,332 / 67,396 | 0.4851 / 0.5154 / 0.4713 | |
| | SUM 6-term / 9-term over all bodies | 75,852 | 0.4821 / 0.5345 | |
| | ASPECTS synastry / wedding→mom / wedding→dad grids | 11,255 / 8,787 / 16,622 | 0.5205 / 0.5044 / 0.5200 | |
| | BOOST6 on full-chart rows (deployed construction) | 9,553 | 0.6235 | |
| | BOOST6 / BOOST9 on every any-phasor row | 75,852 | 0.5665 / 0.5656 | |
| |
| | stack / blend (all 7,249 test rows) | held | age-cell-matched | board | |
| |---|---|---|---| |
| | REFERENCE plain columns alone | 0.5971 | 0.5078 | 0.61055 | |
| | STACK 126 per-phasor only | 0.5880 | 0.5119 | | |
| | STACK 12 sum models only / 3 aspect grids only | 0.5521 / 0.5195 | 0.4759 / 0.5257 | | |
| | STACK all 144 members, no plain | 0.5812 | 0.5010 | | |
| | STACK all 144 + plain (regularised / loose / tight) | 0.6059 / 0.6018 / 0.6100 | 0.5112 / 0.4977 / 0.5205 | **0.61149** (selector-picked: loose) | |
| | RANK-BLEND top-3 members by train OOF (d_uranus, 3-term sum, a_uranus) | 0.6183 | 0.5558 | | |
| | deployed 6-term boosted (train-only fit) | 0.6235 | 0.5701 | 0.63 | |
| | 0.7·deployed + 0.3·stack | 0.6263 | 0.5592 | | |
|
|
| **What it says.** (1) The new midpoint terms are below chance as sums (0.39–0.48) and add nothing in the stack: |
| a midpoint of two slow clocks is a third clock with the information of neither. (2) The per-body models confirm the |
| anatomy to the body: the strongest single model on the whole dataset is **Neptune at the wedding relative to |
| Neptune at the groom's birth** — Neptune moves 2.2°/yr, so that phase IS the groom's age at the wedding, and |
| Pluto/Uranus are the next-best clocks. (3) The explicit aspect grids (182 inter-body separations each) are |
| 0.50–0.52: the classical synastry and transit aspects carry nothing once each body's own clock is a separate |
| term. (4) Fitting on every available row HURTS the boosted sum (0.5665 on 75,852 rows vs 0.6235 on 9,553 full |
| charts): the year-only rows hand the field only the outer planets, and the stage picker then spends its stages |
| on the clocks that least separate within a year. (5) **The train-OOF of every clock-reading member is below |
| chance across temporal halves (BOOST6 0.47–0.53, held 0.62)** — a clock fitted on one era is anti-predictive on |
| the next, and it scores on the leaderboard only because test shares train's eras. (6) Nothing here beats the |
| deployed 6-term boosted split (0.631 on the board): the 144-member stack lands at 0.61149 beside the plain columns |
| (0.61055), and every age-cell-matched read stays at 0.50–0.57. The deployed model and its explanation stand. |
|
|
| **Correction (2026-08-19, `artamodel_stack_forward.py`).** The OOF above was built over two temporal halves, |
| which includes the BACKWARDS direction (fit late, score early); clock members are anti-predictive that way |
| (d_neptune 0.66 forward, 0.51 mixed), so the stacker was taught its best members were noise. Rebuilt with |
| forward-chaining OOF (fit on all rows before a cut, score the next block; cuts 1823/1847/1867/1883), member OOF |
| now tracks held-out (d_neptune 0.658→0.631, SUM 3-term 0.663→0.610). Fitted stackers still land at 0.60–0.62 |
| held because the last train block (1883–1900) ranks models differently from the test era (SUM 3-term 0.681 there / |
| 0.610 held; the deployed member 0.509 / 0.624) — internal temporal CV does not rank for the test era. The |
| selection-free read, equal-weight rank averages of fixed pools: deployed+plain 0.6323; + the six strongest |
| forward members 0.6283; existing ensemble + those members 0.6260–0.6294; existing ensemble alone 0.6299. The |
| decisive fact: on the 2,627 test rows where d_neptune exists the existing ensemble already scores **0.6425** |
| (deployed 0.6410) against d_neptune's 0.6312 on the same rows — the per-body members are a weaker reading of the |
| same two ages, not added information, so an equal-weight blend with them adds noise. No leaderboard gain exists here. |
|
|
| **The monotone ensemble (2026-08-19, `artamodel_nonneg_stack.py`, `artamodel_nonneg_final.py`).** Arash: "a bigger |
| ensemble must always be better than its subset of members." With NON-NEGATIVE weights over rank-transformed member |
| scores and a convex loss, every subset is a feasible point of the full problem, so on the data the weights are fitted |
| on the full pool cannot lose to a subset — monotone by construction (asserted in the subset table). Three defects |
| had to go first: (1) the backwards OOF direction (above); (2) the train OOF was 76% wedding-sky-only rows and the |
| test has NONE (test = post-1900 couples, all with both charts), so one weight vector was tuned to a group absent |
| from the test — weights are now fitted per availability group (dad+wedding clocks / synastry only / sky only); |
| (3) the greedy boosted member changes its phasor set between folds (≤1823 picks only d_neptune), so a fixed-cycle |
| twin of the deployed six phasors was added (BOOST6-FIXED, held 0.6217). Result on the board: the ALL-147 grouped |
| stack **0.62263** (was 0.61149 broken), plain 0.61055, the small equal-weight ensemble 0.63068. Held-out on all |
| 7,249: full 0.6202 vs its best subset 0.6262 — half a standard error; the public board is 2,180 rows (SE ±0.012). |
| What remains is the era itself: inside the dad+wedding group the 1867–1900 train block has plain 0.670 vs the |
| clocks 0.618, the test era has the clocks 0.641 vs plain 0.632 — a reversal no train-fitted weight can anticipate, |
| the same fact the ensemble competition recorded. Equal weights over a small strong pool land well on this test by |
| luck, not by a rule a stacker could learn. |
| |