7 Underrated Python Functions Every Quant Should Know
Posted on Sat 19 April 2025 in Quant Development
When you're writing backtesters, handling tick data, or running live trading bots, performance and clarity matter. Python has a ton of powerful built-in tools, but many of them fly under the radar. These underrated functions can make your quant code cleaner, faster, and easier to maintain.
Whether you're optimizing indicator pipelines or building real-time trading engines, these gems deserve a spot in your toolbox.
1. functools.lru_cache
: Free Speedup for Expensive Lookups
You don't always want to recalculate indicators or read from disk. This built-in decorator adds transparent memoization.
from functools import lru_cache
@lru_cache(maxsize=512)
def get_symbol_metadata(symbol):
# Simulate an expensive lookup
return fetch_metadata_from_db(symbol)
Use it to cache:
- Strategy param lookups
- Instrument metadata
- Expensive indicator values (if the input is hashable)
2. contextlib.suppress
: Cleaner Exception Handling in Pipelines
During backtests or live runs, sometimes you just want to ignore known, non-critical errors—like a missing file or a key that occasionally doesn't exist.
from contextlib import suppress
with suppress(KeyError):
del strategy_state["position"]
Great for:
- Backtest cleanup
- Retry loops
- Suppressing annoying but expected edge cases
3. itertools.pairwise
: Clean Adjacent Iteration
Useful when you need to compare adjacent ticks, deltas, or price bars.
from itertools import pairwise
for prev_bar, curr_bar in pairwise(bars):
if curr_bar["high"] > prev_bar["high"]:
print("New high")
You'll never write zip(bars, bars[1:])
again.
4. operator.itemgetter
: Fast, Clean Sorts and Lookups
A cleaner, faster way to sort or find max PnL, drawdown, etc.
from operator import itemgetter
trades = [{"id": 1, "pnl": -20}, {"id": 2, "pnl": 75}]
best = max(trades, key=itemgetter("pnl"))
Why it's great:
- Works with dicts, lists, tuples
- More readable and faster than lambda for many use cases
- Handy for ranking strategies, trades, or asset performance
5. heapq
: Efficient Priority Queues and Top-N Elements
Need to find the top N trades by PnL, or maintain a rolling best/worst list? heapq gives you fast, memory-efficient tools.
import heapq
top_trades = heapq.nlargest(5, all_trades, key=lambda t: t["pnl"])
You can also build a real-time priority queue:
heap = []
heapq.heappush(heap, (trade["timestamp"], trade))
next_trade = heapq.heappop(heap)
Perfect for:
- Order book simulation
- Event queue processing
- Ranking trade candidates
6. bisect
: Fast Binary Search on Sorted Lists
If you're working with sorted timestamps, price levels, or indicators, bisect
gives you fast binary search and insert:
import bisect
levels = [1000, 1020, 1050]
index = bisect.bisect_left(levels, 1030)
Use cases:
- Inserting into sorted order book levels
- Finding nearest key levels (e.g. VPOC, high/low)
- Efficient real-time strategy logic without linear scans
7. tempfile
: Safe Temporary File and Directory Management
Especially handy in backtests, bot testing, or when handling market data transforms.
import tempfile
with tempfile.TemporaryDirectory() as tmpdir:
file_path = f"{tmpdir}/output.csv"
with open(file_path, "w") as f:
f.write("timestamp,price\n")
Why it's underrated:
- Auto-cleans scratch data
- Useful in test environments or batch processing
- Avoids hardcoded file paths during experiments
Final Thoughts
These tools aren't flashy, but they're the kind of things that make your codebase tighter, cleaner, and faster. When you're juggling 50M rows of tick data or running strategy evaluations across hundreds of symbols, little efficiencies like these add up.
If you found this useful, feel free to share. Happy coding !