Try Astrologer API

Subscribe to support and grow the project.

Solar Arc Directions #

The SolarArcFactory computes solar arc directions – a predictive technique that applies the Sun’s progressed arc uniformly to every natal point. Every directed point advances at roughly 1 degree per year, preserving the natal chart’s inter-point geometry while revealing yearly themes through contacts to natal positions.

Basic Usage #

from kerykeion import AstrologicalSubjectFactory, SolarArcFactory

natal = AstrologicalSubjectFactory.from_birth_data(
    "John", 1990, 6, 15, 14, 30,
    lng=12.5, lat=41.9, tz_str="Europe/Rome", online=False,
)

result = SolarArcFactory.compute(
    natal,
    target_iso_utc_datetime="2026-04-25T00:00:00Z",
)

print(f"Solar arc: {result.solar_arc:.2f} degrees")

for dp in result.directed_points:
    print(f"{dp.name}: {dp.natal_sign} -> {dp.directed_sign} ({dp.directed_position:.2f})")
    if dp.sign_changed:
        print(f"  ** Sign change!")

for asp in result.directed_to_natal_aspects:
    print(f"D.{asp.directed_point} {asp.aspect} N.{asp.natal_point} (orb: {asp.orb:.2f})")

Methods #

compute(natal_subject, *, ...) #

Returns a SolarArcSubjectModel with the solar arc, directed points, and directed-to-natal aspects.

Parameter Type Default Description
natal_subject AstrologicalSubjectModel The natal chart
target_iso_utc_datetime str or None None Target moment in ISO UTC format
target_year int or None None Shorthand: direct to January 1 of this year
active_points Sequence[str] or None None Points to include in the directed picture
compute_aspects bool True Whether to compute directed-to-natal aspects
aspect_orb float 3.0 Orb in degrees for aspect detection
aspects Sequence[str] or None None Whitelist of aspect names
point_orb_adjustments Mapping[str, float or Mapping[str, float]] or None None Finite additive per-point orb adjustments; entries may be aspect-keyed with a "*" default
point_orb_adjustment_strategy str “max_explicit” max_explicit, min_explicit, sum, or none

compute_directed_subject(natal_subject, *, target_iso_utc_datetime=None, target_year=None) #

Returns a copy of natal_subject with every directable point advanced by the solar arc – including the four angles (Asc/MC/Desc/IC), which are directed like the planets – while only the house cusps stay on the natal frame. This is the form you want for a biwheel rendering: inner ring = natal, outer ring = directed.

directed = SolarArcFactory.compute_directed_subject(natal, target_year=2030)
print(directed.name)            # "<name> (directed)"
print(directed.sun.sign, f"{directed.sun.abs_pos:.2f}°")
Parameter Type Default Description
natal_subject AstrologicalSubjectModel The natal chart
target_iso_utc_datetime str or None None Target moment in ISO UTC format
target_year int or None None Shorthand: direct to January 1 of this year

Returns: AstrologicalSubjectModel (the directed chart, named "<name> (directed)").

Data Models #

SolarArcSubjectModel #

Field Type Description
natal_name str Name of the natal subject
target_iso_utc_datetime str The target real-world date
solar_arc float Solar arc in degrees (0-360)
directed_points List[SolarArcDirectedPointModel] All directed positions
directed_to_natal_aspects List[SolarArcDirectedAspectModel] Active directed-to-natal aspects

SolarArcDirectedPointModel #

Field Type Description
name str Name of the natal point
natal_abs_pos float Natal longitude (0-360)
directed_abs_pos float Directed longitude after applying the solar arc
natal_sign str Natal sign code
directed_sign str Directed sign code
directed_position float Position within the directed sign (0-30)
sign_changed bool True if the directed position is in a different sign

SolarArcDirectedAspectModel #

Field Type Description
directed_point str Name of the directed (moving) point
natal_point str Name of the natal (receiving) point
directed_abs_pos float Directed absolute longitude
natal_abs_pos float Natal absolute longitude
aspect str Aspect name
aspect_degrees int Exact aspect angle in degrees
orb float Orb in degrees