Examples
This page provides comprehensive examples of how to use the forex_data package for various common tasks.
Historical Data Examples
Example 1: Basic Data Retrieval
Get historical data for a specific currency pair and date range:
from forex_data import HistoricalManagerDB
from forex_data.config import APPCONFIG_FILE_YAML
# Create manager for NZD/USD
manager = HistoricalManagerDB(
config=APPCONFIG_FILE_YAML
)
# Get hourly data for 2 months
data = manager.get_data(
ticker='NZDUSD',
timeframe='1h',
start='2009-10-04',
end='2009-12-03'
)
print(f"Retrieved {len(data)} rows of data")
print(data.head())
Expected Output (with Polars):
Retrieved 1421 rows of data
┌─────────────────────┬─────────┬─────────┬─────────┬─────────┐
│ timestamp ┆ open ┆ high ┆ low ┆ close │
│ --- ┆ --- ┆ --- ┆ --- ┆ --- │
│ datetime[ms] ┆ f32 ┆ f32 ┆ f32 ┆ f32 │
╞═════════════════════╪═════════╪═════════╪═════════╪═════════╡
│ 2009-10-04 17:00:00 ┆ 0.7172 ┆ 0.71735 ┆ 0.7165 ┆ 0.71665 │
│ 2009-10-04 18:00:00 ┆ 0.71655 ┆ 0.7168 ┆ 0.71555 ┆ 0.71635 │
│ 2009-10-04 19:00:00 ┆ 0.7164 ┆ 0.71665 ┆ 0.71385 ┆ 0.71445 │
└─────────────────────┴─────────┴─────────┴─────────┴─────────┘
Example 2: Working with Multiple Timeframes
Aggregate data into different timeframes:
from forex_data import HistoricalManagerDB
manager = HistoricalManagerDB(
config='appconfig.yaml'
)
# Get 1-minute data
minute_data = manager.get_data(
ticker='EURUSD',
timeframe='1m',
start='2020-01-01 00:00:00',
end='2020-01-01 23:59:59'
)
# Add and cache a 15-minute timeframe
manager.add_timeframe('15m')
# Get 15-minute data
fifteen_min_data = manager.get_data(
ticker='EURUSD',
timeframe='15m',
start='2020-01-01',
end='2020-01-07'
)
# Add daily timeframe
manager.add_timeframe('1D')
# Get daily data
daily_data = manager.get_data(
ticker='EURUSD',
timeframe='1D',
start='2020-01-01',
end='2020-12-31'
)
print(f"1-minute candles: {len(minute_data)}")
print(f"15-minute candles: {len(fifteen_min_data)}")
print(f"Daily candles: {len(daily_data)}")
Example 3: Visualizing Historical Data
Create candlestick charts from historical data:
from forex_data import HistoricalManagerDB
manager = HistoricalManagerDB(
config='appconfig.yaml'
)
# Plot 5 months of daily data
manager.plot(
ticker='NZDUSD',
timeframe='1D',
start_date='2013-02-02',
end_date='2013-06-23'
)
This generates an interactive candlestick chart showing price movements.
Example 4: Multi-Year Analysis
Analyze data across multiple years:
from forex_data import HistoricalManagerDB
manager = HistoricalManagerDB(
config='appconfig.yaml'
)
# Get 5 years of weekly data
weekly_data = manager.get_data(
ticker='GBPUSD',
timeframe='1W',
start='2015-01-01',
end='2019-12-31'
)
# Calculate some basic statistics
if hasattr(weekly_data, 'describe'): # Polars
print(weekly_data.describe())
else: # Pandas
print(weekly_data.describe())
# Find highest and lowest weekly close
max_close = weekly_data['close'].max()
min_close = weekly_data['close'].min()
print(f"Highest weekly close: {max_close}")
print(f"Lowest weekly close: {min_close}")
Example 5: Conditional Data Filtering
Filter data based on price conditions directly during retrieval:
from forex_data import (
HistoricalManagerDB,
BASE_DATA_COLUMN_NAME,
SQL_COMPARISON_OPERATORS,
SQL_CONDITION_AGGREGATION_MODES
)
manager = HistoricalManagerDB(config='appconfig.yaml')
# 1. Simple Filter: Get days where Close >= 1.12
high_close_data = manager.get_data(
ticker='EURUSD',
timeframe='1D',
start='2020-06-01',
end='2020-06-30',
comparison_column_name=BASE_DATA_COLUMN_NAME.CLOSE,
check_level=1.12,
comparison_operator=SQL_COMPARISON_OPERATORS.GREATER_THAN_OR_EQUAL
)
print(f"Days with Close >= 1.12: {len(high_close_data)}")
# 2. Complex Filter: Get days where High > 1.145 OR Low < 1.12
volatile_days = manager.get_data(
ticker='EURUSD',
timeframe='1D',
start='2019-01-01',
end='2019-12-31',
comparison_column_name=[
BASE_DATA_COLUMN_NAME.HIGH,
BASE_DATA_COLUMN_NAME.LOW
],
check_level=[1.145, 1.12],
comparison_operator=[
SQL_COMPARISON_OPERATORS.GREATER_THAN,
SQL_COMPARISON_OPERATORS.LESS_THAN
],
aggregation_mode=SQL_CONDITION_AGGREGATION_MODES.OR
)
print(f"Volatile days found: {len(volatile_days)}")
Real-time Data Examples
Example 5: Get Latest Market Price
Retrieve the most recent closing price:
from forex_data import RealtimeManager
rt_manager = RealtimeManager(
config='appconfig.yaml'
)
# Get the latest daily close
latest_close = rt_manager.get_daily_close(ticker='NZDUSD', last_close=True)
print("Latest close:")
print(latest_close)
Expected Output:
Latest close:
┌─────────────────────┬─────────┬─────────┬─────────┬────────┐
│ timestamp ┆ open ┆ high ┆ low ┆ close │
│ --- ┆ --- ┆ --- ┆ --- ┆ --- │
│ datetime[ms] ┆ f32 ┆ f32 ┆ f32 ┆ f32 │
╞═════════════════════╪═════════╪═════════╪═════════╪════════╡
│ 2024-04-19 00:00:00 ┆ 0.59022 ┆ 0.59062 ┆ 0.58516 ┆ 0.5886 │
└─────────────────────┴─────────┴─────────┴─────────┴────────┘
Example 6: Recent Price History
Get the last N days of market data:
from forex_data import RealtimeManager
rt_manager = RealtimeManager(
config='appconfig.yaml'
)
# Get last 10 days
recent_data = rt_manager.get_daily_close(ticker='EURUSD', recent_days_window=10)
print("Last 10 days of trading:")
print(recent_data)
Example 7: Specific Date Range (Real-time)
Query real-time data for a specific date range:
from forex_data import RealtimeManager
rt_manager = RealtimeManager(
config='appconfig.yaml'
)
# Get daily closes for March 2024
march_data = rt_manager.get_daily_close(
ticker='GBPUSD',
day_start='2024-03-01',
day_end='2024-03-31'
)
print(f"Retrieved {len(march_data)} trading days")
print(march_data)
Example 8: Intraday Real-time Data
Get intraday data with specific timeframes:
from forex_data import RealtimeManager
rt_manager = RealtimeManager(
config='appconfig.yaml'
)
# Get hourly data for a week
hourly_data = rt_manager.get_data(
ticker='USDJPY',
timeframe='1h',
start='2024-04-10',
end='2024-04-15'
)
print(f"Hourly candles: {len(hourly_data)}")
print(hourly_data.head())
Combined Examples
Example 9: Historical + Real-time Combination
Combine historical data with recent real-time updates:
from forex_data import HistoricalManagerDB, RealtimeManager
import polars as pl # or pandas as pd
ticker = 'NZDUSD'
config = 'appconfig.yaml'
# Get historical data up to last month
hist_manager = HistoricalManagerDB(config=config)
historical = hist_manager.get_data(
ticker=ticker,
timeframe='1D',
start='2020-01-01',
end='2023-12-31'
)
# Get recent data
rt_manager = RealtimeManager(config=config)
recent = rt_manager.get_daily_close(
ticker=ticker,
day_start='2024-01-01',
day_end='2024-12-31'
)
# Combine datasets (Polars example)
if isinstance(historical, pl.DataFrame):
combined = pl.concat([historical, recent])
else: # Pandas
combined = pd.concat([historical, recent])
print(f"Total data points: {len(combined)}")
print(f"Date range: {combined['timestamp'].min()} to {combined['timestamp'].max()}")
Example 10: Multi-Currency Analysis
Analyze multiple currency pairs:
from forex_data import HistoricalManagerDB
pairs = ['EURUSD', 'GBPUSD', 'USDJPY', 'AUDUSD']
data_dict = {}
for pair in pairs:
manager = HistoricalManagerDB(
config='appconfig.yaml'
)
data = manager.get_data(
ticker=pair,
timeframe='1D',
start='2023-01-01',
end='2023-12-31'
)
data_dict[pair] = data
print(f"{pair}: {len(data)} days of data")
# You can now analyze correlations, etc.
for pair, data in data_dict.items():
avg_close = data['close'].mean()
print(f"{pair} average close price: {avg_close:.5f}")
Advanced Examples
Example 11: Custom Data Processing Pipeline
Build a custom processing pipeline:
from forex_data import HistoricalManagerDB
import polars as pl
manager = HistoricalManagerDB(
config='appconfig.yaml'
)
# Get raw data
data = manager.get_data(
ticker='EURUSD',
timeframe='1h',
start='2023-01-01',
end='2023-12-31'
)
# Add custom calculations (Polars example)
if isinstance(data, pl.DataFrame):
processed = data.with_columns([
# Calculate price range
(pl.col('high') - pl.col('low')).alias('range'),
# Calculate percentage change
((pl.col('close') - pl.col('open')) / pl.col('open') * 100).alias('pct_change'),
# Moving average (7-hour)
pl.col('close').rolling_mean(window_size=7).alias('ma_7')
])
print(processed.head())
Example 12: Error Handling and Validation
Robust data retrieval with error handling:
from forex_data import HistoricalManagerDB
from loguru import logger
def get_forex_data_safely(ticker, timeframe, start, end):
"""Safely retrieve forex data with error handling."""
try:
manager = HistoricalManagerDB(
config='appconfig.yaml'
)
data = manager.get_data(
ticker=ticker,
timeframe=timeframe,
start=start,
end=end
)
# Validate data
if len(data) == 0:
logger.warning(f"No data retrieved for {ticker}")
return None
logger.info(f"Successfully retrieved {len(data)} rows for {ticker}")
return data
except FileNotFoundError:
logger.error("Configuration file not found")
return None
except Exception as e:
logger.error(f"Error retrieving data: {e}")
return None
# Use the function
data = get_forex_data_safely(
ticker='EURUSD',
timeframe='1D',
start='2023-01-01',
end='2023-12-31'
)
if data is not None:
print("Data retrieved successfully")
Example 13: Performance Optimization
Optimize for large datasets:
from forex_data import HistoricalManagerDB
# Use Polars for best performance
manager = HistoricalManagerDB(
config='appconfig.yaml',
engine='polars', # Explicitly use Polars
filetype='parquet' # Use Parquet for speed
)
# Get large dataset
import time
start_time = time.time()
data = manager.get_data(
ticker='EURUSD',
timeframe='1m',
start='2020-01-01',
end='2023-12-31'
)
elapsed = time.time() - start_time
print(f"Retrieved {len(data)} rows in {elapsed:.2f} seconds")
print(f"Rate: {len(data)/elapsed:.0f} rows/second")
Example 14: Export to Different Formats
Export data for use in other tools:
from forex_data import HistoricalManagerDB
manager = HistoricalManagerDB(
config='appconfig.yaml'
)
data = manager.get_data(
ticker='GBPUSD',
timeframe='1D',
start='2023-01-01',
end='2023-12-31'
)
# Export to CSV
if hasattr(data, 'write_csv'): # Polars
data.write_csv('gbpusd_2023.csv')
else: # Pandas
data.to_csv('gbpusd_2023.csv', index=False)
# Export to Parquet
if hasattr(data, 'write_parquet'): # Polars
data.write_parquet('gbpusd_2023.parquet')
else: # Pandas
data.to_parquet('gbpusd_2023.parquet', index=False)
print("Data exported successfully")
Testing Examples
Example 15: Running the Test Suite
The package includes comprehensive tests. Run them with:
poetry run pytest
Run specific test files:
poetry run pytest tests/test_hist_data_manager.py
poetry run pytest tests/test_realtime_data_manager.py
Run with verbose output:
poetry run pytest -v
Tips and Best Practices
Use Polars for Performance
# In your appconfig.yaml ENGINE: polars
Cache Timeframes
# Add common timeframes once manager.add_timeframe('15m') manager.add_timeframe('1h') manager.add_timeframe('1D')
Handle Time Zones
# Forex data is typically in UTC # Be explicit about timezones in your date strings data = manager.get_data( timeframe='1h', start='2023-01-01 00:00:00', # UTC end='2023-01-31 23:59:59' )
Monitor API Rate Limits
from time import sleep # Add delays between API calls for pair in ['EURUSD', 'GBPUSD', 'USDJPY']: rt_manager = RealtimeManager(config='appconfig.yaml') data = rt_manager.get_daily_close(ticker=pair, recent_days_window=10) sleep(1) # Respect rate limits
Validate Data Quality
# Check for missing data expected_rows = 365 # For daily data in a year if len(data) < expected_rows: print(f"Warning: Expected {expected_rows} rows, got {len(data)}")
Next Steps
Review the API reference for detailed method documentation
Check Configuration for all available options
Visit the GitHub repository for more examples