Quick Start
This page walks through a complete first query that fetches stock data, lists option expirations, and computes Greeks offline.
First Query
rust
use thetadatadx::{ThetaDataDx, Credentials, DirectConfig};
#[tokio::main]
async fn main() -> Result<(), thetadatadx::Error> {
// Load credentials
let creds = Credentials::from_file("creds.txt")?;
// Connect to ThetaData (authenticates automatically)
let client = ThetaDataDx::connect(&creds, DirectConfig::production()).await?;
// Fetch end-of-day stock data
let eod = client.stock_history_eod("AAPL", "20240101", "20240301").await?;
for tick in &eod {
println!("{}: O={} H={} L={} C={} V={}",
tick.date, tick.open_price(), tick.high_price(),
tick.low_price(), tick.close_price(), tick.volume);
}
// List option expirations
let exps = client.option_list_expirations("SPY").await?;
println!("SPY expirations: {:?}", &exps[..5.min(exps.len())]);
// Compute Greeks (offline, no server call)
let greeks = thetadatadx::greeks::all_greeks(
450.0, // spot
455.0, // strike
0.05, // risk-free rate
0.015, // dividend yield
30.0 / 365.0, // time to expiry (years)
8.50, // option market price
true, // is_call
);
println!("IV: {:.4}, Delta: {:.4}, Gamma: {:.6}",
greeks.iv, greeks.delta, greeks.gamma);
Ok(())
}python
from thetadatadx import Credentials, Config, ThetaDataDx
# Authenticate and connect
creds = Credentials.from_file("creds.txt")
client = ThetaDataDx(creds, Config.production())
# Fetch end-of-day stock data
eod = client.stock_history_eod("AAPL", "20240101", "20240301")
for tick in eod:
print(f"{tick['date']}: O={tick['open']:.2f} H={tick['high']:.2f} "
f"L={tick['low']:.2f} C={tick['close']:.2f} V={tick['volume']}")
# List option expirations
exps = client.option_list_expirations("SPY")
print(f"SPY expirations: {exps[:5]}")
# Compute Greeks (offline, no server call)
from thetadatadx import all_greeks
g = all_greeks(
spot=450.0, strike=455.0, rate=0.05,
div_yield=0.015, tte=30/365, option_price=8.50, is_call=True
)
print(f"IV={g['iv']:.4f} Delta={g['delta']:.4f} Gamma={g['gamma']:.6f}")go
package main
import (
"fmt"
"log"
thetadatadx "github.com/userFRM/ThetaDataDx/sdks/go"
)
func main() {
// Load credentials
creds, err := thetadatadx.CredentialsFromFile("creds.txt")
if err != nil {
log.Fatal(err)
}
defer creds.Close()
// Connect
config := thetadatadx.ProductionConfig()
defer config.Close()
client, err := thetadatadx.Connect(creds, config)
if err != nil {
log.Fatal(err)
}
defer client.Close()
// Fetch end-of-day data
eod, err := client.StockHistoryEOD("AAPL", "20240101", "20240301")
if err != nil {
log.Fatal(err)
}
for _, tick := range eod {
fmt.Printf("%d: O=%.2f H=%.2f L=%.2f C=%.2f\n",
tick.Date, tick.Open, tick.High, tick.Low, tick.Close)
}
// Compute Greeks (offline, no server call)
g, err := thetadatadx.AllGreeks(450.0, 455.0, 0.05, 0.015, 30.0/365.0, 8.50, true)
if err != nil {
log.Fatal(err)
}
fmt.Printf("IV=%.4f Delta=%.4f Gamma=%.6f\n", g.IV, g.Delta, g.Gamma)
}cpp
#include "thetadx.hpp"
#include <iostream>
#include <iomanip>
int main() {
// Load credentials
auto creds = tdx::Credentials::from_file("creds.txt");
// Connect
auto client = tdx::Client::connect(creds, tdx::Config::production());
// Fetch end-of-day data
auto eod = client.stock_history_eod("AAPL", "20240101", "20240301");
for (auto& tick : eod) {
std::cout << tick.date << ": O=" << std::fixed << std::setprecision(2)
<< tick.open << " H=" << tick.high
<< " L=" << tick.low << " C=" << tick.close << std::endl;
}
// Compute Greeks (no server connection needed)
auto g = tdx::all_greeks(450.0, 455.0, 0.05, 0.015, 30.0/365.0, 8.50, true);
std::cout << "IV=" << g.iv << " Delta=" << g.delta
<< " Gamma=" << g.gamma << std::endl;
}With pandas DataFrames (Python)
The Python SDK provides convenience methods that return pandas DataFrames directly:
python
from thetadatadx import Credentials, Config, ThetaDataDx, to_dataframe
creds = Credentials.from_file("creds.txt")
client = ThetaDataDx(creds, Config.production())
# Option 1: explicit conversion
eod = client.stock_history_eod("AAPL", "20240101", "20240301")
df = to_dataframe(eod)
print(df.head())
# Option 2: _df convenience methods
df = client.stock_history_eod_df("AAPL", "20240101", "20240301")
df = client.stock_history_ohlc_df("AAPL", "20240315", "60000")Requires pip install thetadatadx[pandas].
What's Next
- Historical Data - all 61 endpoints with examples
- Real-Time Streaming - FPSS subscribe/callback and polling
- Options & Greeks - option chain workflow and local Greeks
- Configuration - timeouts, concurrency, server settings
- API Reference - complete type and method listing