@@ -15,6 +15,7 @@ Fetch financial data from multiple providers with **universal parameters** and *
1515## ✨ ** Key Features**
1616
1717### 🎯 ** Universal API Design**
18+
1819- ** Standardized Interface** : Same parameters work across ALL providers
1920- ** Identical Schemas** : Every DataFrame has exactly 12 columns regardless of provider
2021- ** Cross-Asset Ready** : Stocks, crypto, forex all use unified structure
@@ -32,6 +33,7 @@ Fetch financial data from multiple providers with **universal parameters** and *
3233| ** WMA** | Weighted Moving Average | 100% (0.0% diff) | Linear weight distribution |
3334
3435### 🎯 ** Trading Strategies & Backtesting**
36+
3537- ** Strategy Framework** : Modular strategy composition with indicators
3638- ** Backtesting Engine** : Portfolio performance analysis with metrics
3739- ** Signal Generation** : Buy/sell signals from multiple indicators
@@ -59,6 +61,7 @@ Fetch financial data from multiple providers with **universal parameters** and *
5961| ** Twelve Data** | Stocks, Forex, Crypto | ✅ Required | 💰 Premium | High-frequency data, global markets |
6062
6163### ⚡ ** Performance & Reliability**
64+
6265- ** Explorer/Polars Backend** : Optimized for high-throughput analysis
6366- ** NX Mathematical Computing** : High-performance numerical operations
6467- ** Zero External HTTP Deps** : Uses built-in Erlang ` :httpc `
@@ -67,6 +70,7 @@ Fetch financial data from multiple providers with **universal parameters** and *
6770- ** Comprehensive Test Coverage** : Full validation suite with cross-language verification
6871
6972### 🛡️ ** Production Ready**
73+
7074- ** Type Safety** : Full Dialyzer specifications
7175- ** Error Handling** : Comprehensive error types and graceful degradation
7276- ** Flexible Configuration** : Environment variables, runtime config, inline API keys
@@ -107,6 +111,7 @@ DataFrame.concat_rows(yahoo_df, binance_df)
107111** Problem Solved:** Financial data providers return inconsistent schemas, making cross-provider analysis painful.
108112
109113** Before Quant.Explorer:**
114+
110115``` elixir
111116# Binance: 16 inconsistent columns
112117[\" symbol\" , \" open_time\" , \" close_time\" , \" quote_volume\" , \" taker_buy_volume\" , ...]
@@ -118,6 +123,7 @@ DataFrame.concat_rows(yahoo_df, binance_df)
118123```
119124
120125**After Quant.Explorer:**
126+
121127```elixir
122128# ALL providers: Identical 12-column schema
123129[\" symbol\" , \" timestamp\" , \" open\" , \" high\" , \" low\" , \" close\" , \" volume\" ,
@@ -128,6 +134,7 @@ combined_df = DataFrame.concat_rows([binance_btc, yahoo_aapl, alpha_msft])
128134```
129135
130136**📊 Standardization Stats:**
137+
131138- ✅ **5 Providers Standardized**: Yahoo Finance, Binance, Alpha Vantage, CoinGecko, Twelve Data
132139- ✅ **100% Schema Consistency**: Every DataFrame has identical structure
133140- ✅ **50+ Parameter Translations**: Universal parameters work with all providers
@@ -285,21 +292,24 @@ currencies = ["usd", "eur", "btc", "eth"]
285292{:ok, df} = Quant.Explorer.history(" AAPL " , provider: :yahoo_finance, interval: " 1d" , period: " 1y" )
286293```
287294
295+ ```elixir
288296# Multiple symbols at once
289297{:ok, df} = Quant.Explorer.fetch([" AAPL " , " MSFT " , " GOOGL " ], provider: :yahoo_finance, period: " 1mo" )
298+ ```
290299
300+ ```elixir
291301# Real-time quotes
302+
292303{:ok, df} = Quant.Explorer.quote([" AAPL " , " MSFT " ], provider: :yahoo_finance)
293304{:ok, df} = Quant.Explorer.quote([" BTCUSDT " , " ETHUSDT " ], provider: :binance)
294305{:ok, df} = Quant.Explorer.quote([" bitcoin" , " ethereum" ], provider: :coin_gecko)
295306{:ok, df} = Quant.Explorer.quote(" AAPL " , provider: :alpha_vantage)
296307{:ok, df} = Quant.Explorer.quote(" AAPL " , provider: :twelve_data)
308+ ```
297309
298- # Company info
299- {:ok, info} = Quant.Explorer.info(" AAPL " , provider: :yahoo_finance)
300- {:ok, info} = Quant.Explorer.info(" bitcoin" , provider: :coin_gecko)
310+ ```elixir
311+ # Symbol search
301312
302- # Search symbols
303313{:ok, df} = Quant.Explorer.search(" Apple " , provider: :yahoo_finance)
304314{:ok, df} = Quant.Explorer.search(" BTC " , provider: :binance)
305315{:ok, df} = Quant.Explorer.search(" bitcoin" , provider: :coin_gecko)
@@ -342,6 +352,7 @@ currencies = ["usd", "eur", "btc", "eth"]
342352**Every provider returns these exact schemas - no exceptions:**
343353
344354### Historical Data (**12 columns exactly**)
355+
345356```elixir
346357[" symbol" , " timestamp" , " open" , " high" , " low" , " close" , " volume" ,
347358 " adj_close" , " market_cap" , " provider" , " currency" , " timezone" ]
@@ -358,12 +369,14 @@ currencies = ["usd", "eur", "btc", "eth"]
358369```
359370
360371### Quote Data (**12 columns exactly**)
372+
361373```elixir
362374[" symbol" , " price" , " change" , " change_percent" , " volume" , " high_24h" ,
363375 " low_24h" , " market_cap" , " timestamp" , " provider" , " currency" , " market_state" ]
364376```
365377
366378### Search Results (**11 columns exactly**)
379+
367380```elixir
368381[" symbol" , " name" , " type" , " exchange" , " currency" , " country" ,
369382 " sector" , " industry" , " market_cap" , " provider" , " match_score" ]
@@ -372,6 +385,7 @@ currencies = ["usd", "eur", "btc", "eth"]
372385## **How Standardization Works** 🔧
373386
374387### **Parameter Translation Engine**
388+
375389```elixir
376390# Your input: Universal parameters
377391Quant.Explorer.history(" AAPL " , provider: :alpha_vantage, interval: " 1h" )
@@ -384,6 +398,7 @@ Quant.Explorer.history("AAPL", provider: :alpha_vantage, interval: "1h")
384398```
385399
386400### **Schema Standardization Pipeline**
401+
387402```elixir
388403# 1. Raw provider data (varies by provider)
389404Binance: [" symbol" , " open_time" , " close_time" , " quote_volume" , ...] # 16 columns
@@ -401,6 +416,7 @@ Yahoo: ["Date", "Open", "High", "Adj Close", ...] # 7 columns
401416```
402417
403418### **Cross-Asset Consistency**
419+
404420```elixir
405421# Stocks: market_cap from company data, adj_close properly calculated
406422# Crypto: market_cap = nil (honest about availability), adj_close = close
@@ -495,6 +511,7 @@ config :quant_explorer,
495511```
496512
497513**⚠️ Alpha Vantage Free Tier Limitations:**
514+
498515- 5 requests per minute, 500 requests per day
499516- Some symbols may not be available in free tier
500517- Premium endpoints require paid subscription
@@ -581,6 +598,7 @@ Explorer.DataFrame.describe(aapl)
581598```
582599
583600**Benefits of inline API keys:**
601+
584602- ✅ No global configuration needed
585603- ✅ Perfect for Livebook notebooks
586604- ✅ Support multiple clients/keys
@@ -592,26 +610,31 @@ Explorer.DataFrame.describe(aapl)
592610### Common API Issues
593611
594612**Alpha Vantage `{:error, :symbol_not_found}`:**
613+
595614- Free tier has limited symbol coverage
596615- Try popular symbols: " AAPL " , " MSFT " , " GOOGL " , " TSLA "
597616- Verify your API key is valid (not " demo" key)
598617- Check rate limits (5 requests/minute for free tier)
599618
600619**Alpha Vantage `{:error, {:api_key_error, " Demo API key detected.. ." }}`:**
620+
601621- You're using the default " demo" API key
602- - Get a free API key at https://www.alphavantage.co/support/#api-key
622+ - Get a free API key at < https://www.alphavantage.co/support/#api-key>
603623- Set `ALPHA_VANTAGE_API_KEY` environment variable
604624- Or configure in your application config
605625
606626**Twelve Data `RuntimeError: API key is required`:**
627+
607628- Set `TWELVE_DATA_API_KEY` environment variable
608629- Or configure in `config/config.exs` with your API key
609630
610631**CoinGecko slow responses:**
632+
611633- Free tier has 10-30 calls/minute limit
612634- Consider upgrading to Pro tier for higher limits
613635
614636**Rate limiting errors:**
637+
615638- Each provider has different rate limits
616639- Free tiers are more restrictive than paid plans
617640- Wait between requests or implement backoff logic
@@ -670,30 +693,30 @@ mix test --only integration # Only real API tests
670693```
671694
672695** Default behavior:**
696+
673697- ✅ ** Mocked tests run by default** - Fast, reliable, no external dependencies
674698- ❌ ** Integration tests excluded by default** - Require API keys and internet
675699
676700See [ TESTING.md] ( TESTING.md ) for detailed testing documentation.
677701
678702## License
679703
680- ** Creative Commons Attribution-NonCommercial 4.0 International License**
681-
682704This project is licensed under CC BY-NC 4.0, which means:
683705
684706✅ ** You can:**
707+
685708- Use for personal projects, research, and education
686709- Share, copy, and redistribute the code
687710- Modify and build upon the code
688711- Use in academic and non-profit contexts
689712
690713❌ ** You cannot:**
714+
691715- Use for commercial purposes without permission
692716- Sell products or services based on this code
693717- Use in commercial trading systems or financial products
694718
695719📧 ** Commercial licensing available separately**
696- For commercial use, enterprise licensing, or white-label solutions, please contact: guillaume@the-nerd-company.com
720+ For commercial use, enterprise licensing, or white-label solutions, please contact: < guillaume@the-nerd-company.com >
697721
698722This ensures the library remains free for the community while protecting against unauthorized commercial exploitation.
699-
0 commit comments