Predictive Charts: Solar and Lunar Returns
Return charts mark the moment when a planet returns to the same ecliptic longitude it occupied at birth. Ketu provides two return functions — solar_return for the Sun’s annual return, and lunar_return for the Moon’s monthly return.
Both functions return a full CHART_DTYPE structured array (same as compute_chart), with the complete natal house system, body positions, and aspect matrix computed for the exact moment of return.
Important API Asymmetry
Function |
Target parameter |
Type |
Meaning |
|---|---|---|---|
|
|
|
Calendar year in which to find the return |
|
|
|
Julian Day to start searching from |
This distinction matters: solar_return(natal_jd, ..., target_year=2026) finds the return that falls in the year 2026 (there is exactly one). lunar_return(natal_jd, ..., target_jd=jd_now) finds the next lunar return at or after target_jd (there are ~13 per year).
solar_return
solar_return(
natal_jd,
natal_lat,
natal_lon,
target_year,
return_lat=None,
return_lon=None,
system="placidus",
)
Parameters
natal_jd— Julian Day of the natal chartnatal_lat,natal_lon— natal location (used as default return location)target_year— calendar year (int) in which to find the solar returnreturn_lat,return_lon— relocation coordinates (see below); defaultNone= natal locationsystem— house system for the return chart (default"placidus")
Example — solar return for 2026, natal location
from ketu.returns import solar_return
natal_jd = 2451545.0 # natal chart: J2000 (2000-01-01 12:00 UTC)
natal_lat = 48.8566 # Paris
natal_lon = 2.3522
sr = solar_return(natal_jd, natal_lat, natal_lon, target_year=2026)
print(f"Solar return JD: {sr['jd']:.4f}")
print(f"Solar return ASC: {sr['asc']:.2f} deg")
print(f"Sun longitude: {sr['body_lons'][0]:.4f} deg") # Should match natal Sun
lunar_return
lunar_return(
natal_jd,
natal_lat,
natal_lon,
target_jd,
return_lat=None,
return_lon=None,
system="placidus",
)
Parameters
natal_jd— Julian Day of the natal chartnatal_lat,natal_lon— natal locationtarget_jd— Julian Day to start the search from (float); the function returns the first lunar return at or after this JDreturn_lat,return_lon— relocation coordinates; defaultNone= natal locationsystem— house system for the return chart
Example — next lunar return from J2000
from ketu.returns import lunar_return
natal_jd = 2451545.0 # natal chart: J2000
natal_lat = 48.8566 # Paris
natal_lon = 2.3522
# Find the lunar return starting from approximately the same date
lr = lunar_return(natal_jd, natal_lat, natal_lon, target_jd=natal_jd)
print(f"Lunar return JD: {lr['jd']:.4f}")
print(f"Lunar return ASC: {lr['asc']:.2f} deg")
print(f"Moon longitude: {lr['body_lons'][1]:.4f} deg") # Should match natal Moon
Relocation
Both functions accept optional return_lat / return_lon parameters. When provided, the house cusps and angles in the return chart are calculated for the relocation coordinates instead of the natal location. This is used in relocated return chart analysis.
from ketu.returns import solar_return
natal_jd = 2451545.0
natal_lat = 48.8566 # natal: Paris
natal_lon = 2.3522
# Relocated solar return: body positions are for the exact return moment,
# but houses are cast for New York
sr_relocated = solar_return(
natal_jd, natal_lat, natal_lon,
target_year=2026,
return_lat=40.7128, # New York
return_lon=-74.0060,
)
print(f"Relocated ASC: {sr_relocated['asc']:.2f} deg")
When return_lat=None and return_lon=None (the defaults), the natal coordinates are used for both the return moment search and the house calculation.
UTC Contract
All Julian Day values (natal_jd, target_jd) must be in UTC. The functions do not perform any timezone conversion internally.
from ketu.ephemeris.time import utc_to_julian
from datetime import datetime, timezone
natal_dt = datetime(2000, 1, 1, 12, 0, 0, tzinfo=timezone.utc)
natal_jd = utc_to_julian(natal_dt)
Next Steps
Relational charts — synastry and composite charts
API reference — full signatures for
ketu.returns