API Reference¶
Full runnable example:
examples/17_python_bindings/python_bindings_demo.pyDemonstrates Python APIs for all core modules.
This document provides quick reference tables and key API code examples for AXON quantitative trading framework's top-level modules, helping developers quickly locate required functionality.
1. Top-Level Module Quick Reference¶
| Module | Crate | Core Functionality | Main Types |
|---|---|---|---|
| rl | axon-rl | Gymnasium-compatible trading environment, action/observation space, reward functions | TradingEnv, ActionSpace, ObservationSpace, RewardFn |
| llm | axon-llm | LLM backend abstraction, ReAct Agent, tool calling | LLMBackend, ReActAgent, ToolDefinition, Message |
| hpo | axon-hpo | Hyperparameter optimization (Optuna integration), Study/Trial management | HPOConfig, StudyConfig, TrialResult, SearchSpaceDef |
| walk_forward | axon-walk-forward | Rolling/expanding window cross-validation, stability analysis | WalkForwardConfig, FoldResult, AggregatedMetrics |
| tracker | axon-tracker | Experiment tracking (MLflow/memory backend), metric logging | ExperimentTracker, ParamValue, RunStatus |
| registry | axon-registry | Model version management, stage transitions, rollback | ModelRegistry, ModelVersion, ModelStage, SemVer |
| distributed | axon-distributed | Ray distributed training, parameter server, checkpoint | DistributedConfig, ClusterConfig, AlgorithmConfig |
| exchange | axon-exchange | Exchange adapters, WebSocket, rate limiting | ExchangeAdapter, ExchangeConfig, RateLimitConfig |
| explain | axon-explain | Explainability: SHAP, counterfactual, report generation | KernelSHAP, CounterfactualGenerator, ReportGenerator |
| ensemble | axon-ensemble | Model ensemble: voting, weighted, dynamic weighting, stacking | DynamicWeightedEnsemble, EnsembleManager, StackingEnsemble |
| inference | axon-inference | Model inference engine, hot update, multi-backend support | InferenceEngine, ModelHotReloader, OnnxBackend, CandleBackend |
| backtest | axon-backtest | Event-driven backtesting engine, matching, impact model | BacktestEngine, MatchingEngine, RunResult |
2. Key API Code Examples¶
2.1 TradingEnv — Trading Environment¶
TradingEnv is AXON's core RL environment, fully compatible with Gymnasium interface.
from axon_quant import (
TradingEnv, EnvConfig,
DefaultObservationSpace, FeatureConfig, FeatureSource, NormalizerType,
DiscreteActionSpace, TradingDirection,
PnLReward, SharpeReward, MultiObjectiveReward,
MarketBar,
)
# 1. Configure environment
config = EnvConfig(
initial_capital=100_000.0, # Initial capital 100k USDT
transaction_cost=0.001, # Transaction cost 10 bps
slippage=0.0005, # Slippage 5 bps
max_position_ratio=1.0, # Maximum full position
max_steps=1000, # Maximum steps per episode
seed=None, # Random seed
symbol="BTCUSDT", # Trading symbol
return_window=252, # Return history window (for Sharpe calculation)
)
# 2. Define observation space (feature engineering)
obs_space = DefaultObservationSpace.new(
window_size=20, # Keep last 20 time steps
features=[
FeatureConfig(
name="close",
source=FeatureSource.PriceField("close"),
normalizer=NormalizerType.ZScore, # Z-Score normalization
clip_range=(-5.0, 5.0), # Clip outliers
),
FeatureConfig(
name="volume",
source=FeatureSource.VolumeField("volume"),
normalizer=NormalizerType.ZScore,
),
FeatureConfig(
name="rsi",
source=FeatureSource.RSI(14), # Built-in RSI calculation
normalizer=NormalizerType.MinMax, # Map to [0, 1]
),
],
)
# 3. Define action space (discrete)
action_space = DiscreteActionSpace.new(
n_quantity_bins=5, # 5 position levels: 20%/40%/60%/80%/100%
direction=TradingDirection.Both, # Allow both long and short
)
# 4. Define reward function (multi-objective)
reward_fn = MultiObjectiveReward([
PnLReward(relative=True, scale=1.0), # Relative return
SharpeReward(risk_free_rate=0.02, window=20), # Rolling Sharpe ratio
])
# 5. Load market data
market_data = load_bars("BTCUSDT", "1h", start="2024-01-01", end="2024-06-01")
# 6. Create environment
env = TradingEnv.new(
config=config,
action_space=action_space,
observation_space=obs_space,
reward_fn=reward_fn,
market_data=market_data,
)
# 7. Standard Gymnasium interaction loop
obs = env.reset()
done = False
total_reward = 0.0
while not done:
# Can integrate RL model or rule-based strategy here
action = model.predict(obs) if model else env.action_space.sample()
obs, reward, done, info = env.step(action)
total_reward += reward
print(env.render()) # Output: step=123/5000 | value=$102340.50 | pos=0.5000
print(f"Episode total reward: {total_reward:.2f}")
print(f"Final portfolio value: {env.portfolio().portfolio_value:.2f}")
2.2 LLMBackend — LLM Backend¶
LLMBackend is the unified LLM interface, supporting OpenAI, DeepSeek, local inference services, etc.
from axon_quant import LLMBackend, Message, ToolDefinition, LLMResponse
# Create OpenAI backend
llm = OpenAIBackend(
api_key="YOUR_API_KEY",
model="deepseek-chat", # or "gpt-4", "claude-3-opus"
base_url="https://api.deepseek.com",
)
# Basic conversation
messages = [
Message(role="system", content="You are a professional quantitative trading analyst."),
Message(role="user", content="Analyze BTC's current technical indicators."),
]
response = await llm.complete(messages)
print(response.content)
# Function Calling (tool use)
tools = [
ToolDefinition(
name="get_price",
description="Get current price for specified trading pair",
parameters={
"type": "object",
"properties": {
"symbol": {"type": "string", "description": "Trading pair, e.g. BTCUSDT"},
},
"required": ["symbol"],
},
),
ToolDefinition(
name="get_rsi",
description="Calculate RSI indicator for specified trading pair",
parameters={
"type": "object",
"properties": {
"symbol": {"type": "string"},
"period": {"type": "integer", "default": 14},
},
"required": ["symbol"],
},
),
]
response = await llm.complete_with_tools(messages, tools)
# Parse tool calls
if response.tool_calls:
for call in response.tool_calls:
print(f"Calling tool: {call.name}, arguments: {call.arguments}")
# Execute tool and return result...
# Error handling
from axon_quant import LLMError
try:
response = await llm.complete(messages)
except LLMError.RateLimited as e:
print(f"Rate limited, recommended wait {e.retry_after} seconds")
await asyncio.sleep(e.retry_after or 60)
except LLMError.ContextOverflow as e:
print(f"Context overflow: {e.needed} > {e.limit}")
# Truncate history messages or switch to long-context model
2.3 Tracker — Experiment Tracking¶
ExperimentTracker provides unified experiment recording interface, supporting MLflow and memory backends.
from axon_quant import ExperimentTracker, MLflowTracker, MemoryTracker, ParamValue, RunStatus
# Create MLflow tracker (production)
tracker = MLflowTracker(
tracking_uri="http://localhost:5000",
experiment_name="ppo_btc_trading",
run_name="run_2024_06_18_v1",
)
# Or create memory tracker (testing/fast iteration)
# tracker = MemoryTracker.new()
# Log hyperparameters
tracker.log_param("learning_rate", ParamValue.Float(3e-4))
tracker.log_param("batch_size", ParamValue.Int(128))
tracker.log_param("hidden_size", ParamValue.Int(256))
tracker.log_param("env_symbol", ParamValue.String("BTCUSDT"))
# Batch log parameters
tracker.log_params([
("gamma", ParamValue.Float(0.99)),
("gae_lambda", ParamValue.Float(0.95)),
("clip_range", ParamValue.Float(0.2)),
])
# Log metrics (supports step-based logging)
for step in range(1000):
loss = train_step()
tracker.log_metric("loss", loss, step=step)
if step % 100 == 0:
sharpe = evaluate_sharpe()
tracker.log_metric("sharpe_ratio", sharpe, step=step)
tracker.log_metric("portfolio_value", env.portfolio().portfolio_value, step=step)
# Log histogram (e.g., weight distribution)
tracker.log_histogram("actor_weights", weights_flattened, step=1000)
# Log image (e.g., PnL curve)
tracker.log_image("pnl_curve", png_bytes, format=ImageFormat.PNG, step=1000)
# Upload model artifact
tracker.log_artifact("model.onnx", Path("./models/model.onnx"))
# Set tags
tracker.set_tag("model_type", "PPO")
tracker.set_tag("data_source", "binance_1h")
# Finish run
tracker.finish(RunStatus.Success)
# Flush buffer (ensure data is written)
tracker.flush()
2.4 Registry — Model Registry¶
ModelRegistry manages model's full lifecycle: registration, stage transitions, rollback.
from axon_quant import (
ModelRegistry, LocalStorage,
ModelMetadata, ModelStage, SemVer, ModelSignature,
VersionFilter,
)
from pathlib import Path
# Create registry (local file storage)
storage = LocalStorage.new(base_dir="./model_registry")
registry = ModelRegistry.new(storage)
# Register new model version
metadata = ModelMetadata(
tags={
"algorithm": "PPO",
"env": "BTCUSDT_1h",
"sharpe": "1.85",
},
description="PPO model v3, optimized Sharpe ratio",
)
signature = ModelSignature(
inputs=["observation: float32[1,64,128]"],
outputs=["action_probs: float32[1,3]"],
)
model_version = await registry.register(
name="ppo_btc_trading",
artifact_path=Path("./models/ppo_v3.onnx"),
metadata=metadata,
signature=signature,
)
print(f"Registration successful: {model_version.name}@{model_version.version}")
# Output: ppo_btc_trading@1.0.0
# Get latest version
latest = await registry.get("ppo_btc_trading", version=None)
print(f"Latest version: {latest.version}, stage: {latest.stage}")
# Get Production version
prod = await registry.get_production("ppo_btc_trading")
# Stage transition: Staging -> Production
await registry.transition_stage(
name="ppo_btc_trading",
version=SemVer.parse("1.0.0"),
new_stage=ModelStage.Production,
)
# Note: When promoting to Production, old Production version automatically demotes to Archived
# Query version list
versions = await registry.list_versions(
name="ppo_btc_trading",
filter=VersionFilter(
stage=ModelStage.Production,
min_version=SemVer.parse("1.0.0"),
limit=10,
),
)
# Rollback to previous Production version
rolled_back = await registry.rollback("ppo_btc_trading")
print(f"Rolled back to: {rolled_back.version}")
# Download model artifact
await registry.download_artifact(
name="ppo_btc_trading",
version=SemVer.parse("1.0.0"),
dest=Path("./downloads/ppo_v1.onnx"),
)
# List all models
models = registry.list_models()
print(f"Registered models: {models}")
2.5 InferenceEngine — Inference Engine¶
InferenceEngine provides unified model inference interface, supporting ONNX, tch, Candle backends.
from axon_quant import (
InferenceEngine, OnnxBackend, CandleBackend, TchBackend,
ModelConfig, Device, InferenceBackend,
Observation, Action,
)
from pathlib import Path
# Common configuration
config = ModelConfig(
path="models/trading_model.onnx",
backend=InferenceBackend.ONNX,
device=Device.CUDA(0), # Use GPU 0
input_shape=[1, 64, 128], # [batch, seq_len, features]
output_dim=3, # Buy / Sell / Hold
fp16=True, # Enable FP16
num_threads=4, # CPU threads
)
# ONNX backend
engine = OnnxBackend(config)
engine.load(Path(config.path))
# Candle backend (pure Rust, no Python dependency)
candle_config = ModelConfig(
path="models/trading_model.safetensors",
backend=InferenceBackend.CANDLE,
device=Device.CPU,
input_shape=[1, 4, 1], # input_dim = 1*4*1 = 4
output_dim=3,
fp16=False,
num_threads=4,
)
candle_engine = CandleBackend(candle_config)
candle_engine.load(Path(candle_config.path))
# Single inference
obs = Observation(
features=[0.5, -0.2, 1.1, 0.0, ...], # 64*128=8192 dimensions
feature_names=[...],
timestamp=1234567890,
)
action = engine.infer(obs)
print(f"Predicted action: {action}")
# Batch inference (recommended for production)
observations = [obs1, obs2, obs3, obs4]
actions = engine.infer_batch(observations)
print(f"Batch prediction: {len(actions)} actions")
# Hot update (atomic session replacement)
from axon_quant import ModelHotReloader
reloader = ModelHotReloader(engine, config)
reloader.spawn_watcher() # Start file watcher
# Manual trigger reload
new_version = await reloader.reload()
print(f"Model updated to version {new_version}")
# Subscribe to version changes
version_rx = reloader.subscribe()
await version_rx.changed()
print(f"New version detected: {version_rx.borrow()}")
2.6 ExchangeAdapter — Exchange Adapter¶
ExchangeAdapter provides unified exchange interface, currently supporting Binance and OKX.
from axon_quant import (
BinanceAdapter, OkxAdapter,
ExchangeConfig, ExchangeId,
Symbol, Order, OrderId, OrderType, Side, TimeInForce,
RateLimitConfig, ReconnectConfig,
MarginType, PositionMode,
)
from decimal import Decimal
# Binance configuration
config = ExchangeConfig(
exchange_id=ExchangeId.Binance,
api_key="YOUR_API_KEY",
api_secret="YOUR_API_SECRET",
passphrase=None,
testnet=True,
rest_base_url="https://testnet.binance.vision",
ws_url="wss://testnet.binance.vision/ws",
rate_limit=RateLimitConfig(
requests_per_second=10,
orders_per_minute=60,
ws_messages_per_second=50,
),
reconnect=ReconnectConfig(
max_retries=10,
initial_backoff_ms=500,
max_backoff_ms=30000,
backoff_multiplier=2.0,
circuit_breaker_threshold=5,
circuit_breaker_reset_sec=60,
),
position_endpoint="/fapi/v2/positionRisk",
fapi_base_url="https://testnet.binancefuture.com",
)
# Create and connect
adapter = BinanceAdapter(config)
await adapter.connect()
# Subscribe to market data
await adapter.subscribe([Symbol("BTCUSDT"), Symbol("ETHUSDT")])
# Get market data channel
market_rx = adapter.market_data_rx()
while True:
msg = await market_rx.recv()
match msg.type:
case "Ticker":
print(f"[{msg.data.symbol}] Bid {msg.data.bid} / Ask {msg.data.ask}")
case "Trade":
print(f"Trade: {msg.data.price} x {msg.data.quantity}")
# Place order
order = Order(
client_order_id=OrderId.new(),
symbol=Symbol("BTCUSDT"),
side=Side.Buy,
order_type=OrderType.Market,
price=None,
quantity=Decimal("0.001"),
time_in_force=TimeInForce.Gtc,
exchange=ExchangeId.Binance,
meta={"strategy": "momentum_v1"},
)
order_id = await adapter.send_order(order)
# Cancel order
await adapter.cancel_order(order_id)
# Futures operations
await adapter.set_leverage("BTCUSDT", leverage=10)
await adapter.set_margin_type("BTCUSDT", MarginType.Isolated)
await adapter.set_position_mode(hedge_mode=True)
# Query account
account = await adapter.get_account_info()
print(f"Total balance: {account.total_balance}, Available: {account.available_balance}")
# Query funding rate
funding = await adapter.get_funding_rate("BTCUSDT")
print(f"Funding rate: {funding.rate}, Next settlement: {funding.next_funding_ms}")
3. Configuration Parameters Reference¶
3.1 EnvConfig (Trading Environment)¶
| Parameter | Type | Default | Description |
|---|---|---|---|
initial_capital | f64 | 100_000.0 | Initial capital |
transaction_cost | f64 | 0.001 | Transaction cost ratio (10 bps) |
slippage | f64 | 0.0005 | Slippage ratio (5 bps) |
max_position_ratio | f64 | 1.0 | Maximum position ratio (0.0 ~ 1.0) |
max_steps | usize | 1000 | Maximum steps per episode |
seed | Option<u64> | None | Random seed |
symbol | String | "BTCUSDT" | Trading symbol code |
return_window | usize | 252 | Return history window size |
3.2 ExchangeConfig (Exchange)¶
| Parameter | Type | Default | Description |
|---|---|---|---|
exchange_id | ExchangeId | - | Exchange identifier (Binance / OKX) |
api_key | String | - | API key |
api_secret | String | - | API secret |
passphrase | Option<String> | None | OKX-specific passphrase |
testnet | bool | true | Use testnet |
rest_base_url | String | - | REST API base URL |
ws_url | String | - | WebSocket URL |
rate_limit | RateLimitConfig | - | Rate limit configuration |
reconnect | ReconnectConfig | - | Reconnection configuration |
position_endpoint | String | "/fapi/v2/positionRisk" | Position query endpoint |
fapi_base_url | Option<String> | None | Futures API base URL |
3.3 HPOConfig (Hyperparameter Optimization)¶
| Parameter | Type | Default | Description |
|---|---|---|---|
study.study_name | String | - | Study name |
study.direction | StudyDirection | Maximize | Optimization direction |
study.sampler | SamplerConfig | Tpe | Sampler type |
study.pruner | PrunerConfig | MedianPruner | Pruner type |
study.storage | Option<String> | None | Optuna storage URL |
search_space | HashMap | - | Parameter search space definition |
hpo.n_trials | usize | 50 | Total trials |
hpo.n_jobs | usize | 1 | Parallel trials |
hpo.timeout_seconds | Option<u64> | None | Total timeout |
hpo.early_stopping | bool | false | Enable early stopping |
3.4 WalkForwardConfig (Rolling Validation)¶
| Parameter | Type | Default | Description |
|---|---|---|---|
train_size | usize | - | Training window size |
validation_size | usize | 0 | Validation window size |
test_size | usize | - | Test window size |
step_size | usize | - | Rolling step size |
window_type | WindowType | Expanding | Window type (Rolling / Expanding) |
purge_gap | usize | 0 | Train-test leakage prevention gap |
embargo_pct | f64 | 0.01 | Embargo percentage |
3.5 DistributedConfig (Distributed Training)¶
| Parameter | Type | Default | Description |
|---|---|---|---|
cluster.num_workers | usize | - | Number of workers |
cluster.num_cpus_per_worker | usize | 1 | CPUs per worker |
cluster.num_gpus_per_worker | f64 | 0.0 | GPUs per worker |
cluster.cluster_address | Option<String> | None | Ray cluster address |
algorithm.algorithm | String | - | Algorithm name (PPO / SAC / DQN / IMPALA / APE_X) |
algorithm.framework | String | "torch" | Framework (torch / tensorflow) |
resources.num_envs_per_worker | usize | - | Environments per worker |
resources.train_batch_size | usize | - | Training batch size |
resources.sgd_minibatch_size | usize | - | SGD minibatch size |
fault_tolerance.checkpoint_interval_s | u64 | - | Checkpoint interval (seconds) |
fault_tolerance.checkpoint_dir | String | - | Checkpoint save directory |
3.6 ModelConfig (Inference Engine)¶
| Parameter | Type | Default | Description |
|---|---|---|---|
path | String | - | Model file path |
backend | InferenceBackend | - | Backend type (ONNX / TCH / CANDLE) |
device | Device | - | Device (CPU / CUDA(n)) |
input_shape | [usize; 3] | - | Input shape [batch, seq, features] |
output_dim | usize | - | Output dimension |
fp16 | bool | false | Enable FP16 |
num_threads | usize | 4 | CPU inference threads |
4. Common Enums Quick Reference¶
4.1 ActionSpace (Action Space)¶
from axon_quant import ActionSpace, DiscreteActionSpace, ContinuousActionSpace, TradingDirection
# Discrete action space
discrete = ActionSpace.Discrete(
DiscreteActionSpace.new(n_quantity_bins=5, direction=TradingDirection.Both)
)
# Action indices: 0=Hold, 1-5=Buy(20%-100%), 6-10=Sell(20%-100%)
# Continuous action space
continuous = ActionSpace.Continuous(
ContinuousActionSpace.new(min=-1.0, max=1.0)
)
# -1.0 = Full short, 0.0 = No position, 1.0 = Full long
4.2 NormalizerType (Normalization Strategy)¶
from axon_quant import NormalizerType
NormalizerType.ZScore # (x - mean) / std, preserves historical statistics
NormalizerType.MinMax # (x - min) / (max - min) -> [0, 1]
NormalizerType.Robust # (x - median) / IQR, outlier resistant
NormalizerType.None # No normalization
4.3 ModelStage (Model Stage)¶
from axon_quant import ModelStage
ModelStage.Staging # Newly registered, awaiting validation
ModelStage.Production # Running in production
ModelStage.Archived # Old version archived
ModelStage.RolledBack # Rolled back
4.4 OrderType / TimeInForce (Order Types)¶
from axon_quant import OrderType, TimeInForce
OrderType.Limit # Limit order
OrderType.Market # Market order
OrderType.StopLoss # Stop loss order
OrderType.StopLimit # Stop limit order
TimeInForce.Gtc # Good Till Cancelled
TimeInForce.Ioc # Immediate Or Cancel
TimeInForce.Fok # Fill Or Kill
5. Module Dependencies¶
┌─────────────────┐
│ Application │
└────────┬────────┘
│
┌────────────────────┼────────────────────┐
│ │ │
▼ ▼ ▼
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ backtest │ │ exchange │ │ ensemble │
└──────────────┘ └──────────────┘ └──────────────┘
│ │ │
└────────────────────┼────────────────────┘
│
┌────────┴────────┐
│ rl │
│ (TradingEnv) │
└────────┬────────┘
│
┌────────────────────┼────────────────────┐
│ │ │
▼ ▼ ▼
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ inference │ │ llm │ │ explain │
└──────────────┘ └──────────────┘ └──────────────┘
│
┌────────┴────────┐
│ core types │
└─────────────────┘
6. Version Compatibility¶
AXON current version is 0.2.0, all crate versions unified:
| Crate | Version | Minimum Rust Version |
|---|---|---|
| axon-core | 0.2.0 | 1.96.0 |
| axon-rl | 0.2.0 | 1.96.0 |
| axon-llm | 0.2.0 | 1.96.0 |
| axon-inference | 0.2.0 | 1.96.0 |
| axon-exchange | 0.2.0 | 1.96.0 |
| axon-ensemble | 0.2.0 | 1.96.0 |
| axon-explain | 0.2.0 | 1.96.0 |
| axon-backtest | 0.2.0 | 1.96.0 |
| axon-hpo | 0.2.0 | 1.96.0 |
| axon-walk-forward | 0.2.0 | 1.96.0 |
| axon-tracker | 0.2.0 | 1.96.0 |
| axon-registry | 0.2.0 | 1.96.0 |
| axon-distributed | 0.2.0 | 1.96.0 |
| axon-monitor | 0.2.0 | 1.96.0 |
| axon-risk | 0.2.0 | 1.96.0 |
| axon-compliance | 0.2.0 | 1.96.0 |