Skip to content

Commit 0985618

Browse files
committed
fix readme issues
1 parent e1fd50d commit 0985618

1 file changed

Lines changed: 32 additions & 9 deletions

File tree

README.md

Lines changed: 32 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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
377391
Quant.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)
389404
Binance: ["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

676700
See [TESTING.md](TESTING.md) for detailed testing documentation.
677701

678702
## License
679703

680-
**Creative Commons Attribution-NonCommercial 4.0 International License**
681-
682704
This 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

698722
This ensures the library remains free for the community while protecting against unauthorized commercial exploitation.
699-

0 commit comments

Comments
 (0)