Real-time trading in MATLAB
Yair Altman
Undocumented Matlab.com altmany@gmail.com
Yair Altman
UndocumentedMatlab.com
A common algo-trading challenge
Trading platforms are relatively closed
o Difficult to develop automated trading platforms
o Vendor lock-in algos are often un-portable o Internal algo customizability usually limited
Common solutions:
o Use Excel with trading-platform plugin o Use limited internal programmability (MT4, TS) o Develop custom C++/Java applications
Yair Altman
UndocumentedMatlab.com
Why use MATLAB?
Numerous out-of-the-box analysis functionality
o Much more functionality than Excel or C++/Java
Dedicated toolboxes for specific uses
o Financial, Data-feed, Statistics, Econometrics, Optimization, Trading,
Tried-and-tested
o Prevents risk of losses due to computational bugs o Most functions have editable source code no secrets o Reduces total cost of ownership (develop/test/maintain)
Easy learning curve engineering power without needing to be a software developer
Excellent at exactly the task taking most time/cost to develop: the algo strategy/model
o All other components are usually far easier to develop
mathworks.com/discovery/algorithmic-trading.html
Yair Altman UndocumentedMatlab.com 3
However
MATLAB could not until recently complete the trading loop
Send automated trade orders to broker Modify/cancel open orders Track trade executions Receive portfolio/account info
UndocumentedMatlab.com 4
Yair Altman
Solutions
MATLAB 8.1 (R2013a): new Trading Toolbox
o Windows only o Bloomberg EMSX o Trading Technologies X_TRADER o R2013b: Added CQG + IB interfaces o mathworks.com/products/trading
MATLAB 7.1 (R14 SP3) onward: IB-MATLAB
o Windows, Mac, Linux o Interactive Brokers only o UndocumentedMatlab.com/ib-matlab
Yair Altman UndocumentedMatlab.com 5
General trading application design
Yair Altman
UndocumentedMatlab.com
Deployment in large institutions
FIX or API
Deployment server
Compiled code (MCC, Linux); Java, or .NET MATLAB Production Server client; .C or HDL (FPGA) via MATLAB Code Generator
Order Management System, Crossing Network
Trading Strategy Development & Automated Back-Testing
Yair Altman UndocumentedMatlab.com
Data feed server
7
Todays demo
Trade orders
Market data Portfolio Executions
Yair Altman
UndocumentedMatlab.com
Live demo
Yair Altman
UndocumentedMatlab.com
Interactive Brokers (IB)
Low-cost online broker Consistently ranked Best Online Broker by Barron's
o o o o o commissions execution prices features exchanges reports
Widely used worldwide
Fully documented API
interactivebrokers.com/en/software/ibapi.php
Yair Altman UndocumentedMatlab.com 10
IB-MATLAB
Connects MATLAB to IB
o o o o o o o o Receive account data (portfolio, cash, limits) Receive market data feed (historic, snapshot, streaming quotes) Send trade orders to market Modify/cancel open orders Track executions (MATLAB callback functions) Synchronous + asynchronous modes Fully supports IBs API 5-10 mS latency for IB events
Works on all MATLAB platforms, Java-based API Hundreds of installations, trades $100M/day
Yair Altman UndocumentedMatlab.com 11
IB-MATLAB: getting portfolio data
>> data = IBMatlab('action','PORTFOLIO') data = 1x12 struct array with fields: symbol localSymbol ... >> data(1) ans = symbol: localSymbol: exchange: secType: currency: right: expiry: strike: position: marketValue: marketPrice: averageCost: contract:
Yair Altman
'AMZN' 'AMZN' 'NASDAQ' 'STK' 'USD' '0' '' 0 9200 1715800 186.5 169.03183335 [1x1 struct]
UndocumentedMatlab.com 12
IB-MATLAB: getting market data
>> data = IBMatlab('action','QUERY', 'symbol','GOOG') data = reqId: reqTime: dataTime: dataTimestamp: ticker: bidPrice: askPrice: open: close: low: high: lastPrice: volume: tick: bidSize: askSize: lastSize: contractDetails:
Yair Altman
22209874 '02-Dec-2010 00:47:23' '02-Dec-2010 00:47:23' 734474.032914491 'GOOG' 563.68 564.47 562.82 555.71 562.4 571.57 -1 36891 0.01 3 3 0 [1x1 struct]
UndocumentedMatlab.com 13
IB-MATLAB: getting historical data
>> data = IBMatlab('action','HISTORY', 'symbol','IBM', ... 'barSize','1 hour', 'useRTH',1) data = dateNum: [1x7 double] dateTime: {1x7 cell} open: [161.08 160.95 161.66 161.17 161.57 161.75 162.07] high: [161.35 161.65 161.70 161.60 161.98 162.09 162.34] low: [160.86 160.89 161.00 161.13 161.53 161.61 161.89] close: [160.93 161.65 161.18 161.60 161.74 162.07 162.29] volume: [5384 6332 4580 2963 4728 4465 10173] count: [2776 4387 2990 1921 2949 2981 6187] WAP: [161.07 161.25 161.35 161.31 161.79 161.92 162.14] hasGaps: [0 0 0 0 0 0 0]
>> data.dateTime ans = '20110225 16:30:00' '20110225 17:00:00' '20110225 18:00:00' '20110225 19:00:00' '20110225 20:00:00' '20110225 21:00:00' '20110225 22:00:00'
Yair Altman UndocumentedMatlab.com 14
IB-MATLAB: sending orders to market
% Alternative #1: using a MATLAB struct paramsStruct = []; paramsStruct.action = 'BUY'; paramsStruct.symbol = 'GOOG'; paramsStruct.quantity = 100; paramsStruct.limitPrice = 850; orderId = IBMatlab(paramsStruct); % Alternative #2: using name/value pairs orderId = IBMatlab('action','BUY', 'symbol','GOOG', ... 'quantity',100, 'limitPrice',850);
Yair Altman
UndocumentedMatlab.com
15
IB-MATLAB: processing execution events
% Set the callback function for IB trade execution events orderId = IBMatlab('action','BUY', 'symbol','GOOG', ... 'quantity',1, 'limitPrice',850, ... 'CallbackExecDetails',@myExecDetailsFcn);
% Sample event callback function function myExecDetailsFcn(hObject, eventData)
% Extract the basic event data components contractData = eventData.contract; executionData = eventData.execution; % Now do something useful with this information... end
Yair Altman
UndocumentedMatlab.com
16
Some design considerations
(in no particular order)
Build or buy Data feed provider (IB / IQFeed / eSignal / ) Synchronous (periodic) or asynchronous (reactive) Latency/frequency
streaming quotes or periodic historical data requests perhaps we need to use C / FPGA code (for S latency)
Level of robustness, failsafe mechanisms GUI or GUI-less Semi or fully automated
Yair Altman UndocumentedMatlab.com 17
Example for a very simple application design
% Main application entry point function tradingApplication() tradeSymbol('CLX3', 15*60, @timerCallbackFunction); tradeSymbol('GOOG', 10*60, @timerCallbackFunction); tradeSymbol('DAX', 5*60, @timerCallbackFunction); tradeSymbol('FTSE', 1*60, @timerCallbackFunction); end %@15 %@10 % @5 % @1 mins mins mins min
% Start an endless timer at the specified frequency that will % run the specified callbackFunc upon each invocation function hTimer = tradeSymbol(symbolName, period, callbackFunc)
% Create the timer object hTimer = timer('ExecutionMode','fixedRate', ... 'Period',period, ... 'TimerFcn',{callbackFunc,symbolName}); % Start the timer start(hTimer); end % tradeSymbol
UndocumentedMatlab.com 18
Yair Altman
Example for a very simple application design
function timerCallbackFunction(hTimer, eventData, symbolName) try % Load previously-stored data for the specified contract persistentData = load(symbolName); % Get the latest data for this contract latestData = getLatestData(symbolName); % Process the data (secret sauce algo strategy) [tradeParams, persistentData] = processData(latestData, ... persistentData); % Process trade signals (send orders to IB) IBMatlab(tradeParams{:}); % Save decision-making data for next timer invocation save(symbolName,'persistentData'); catch processError(lasterror); end
end
Yair Altman UndocumentedMatlab.com 19
Some additional bells & whistles
Main engine (non-GUI)
o o o o Risk (open positions) management Asynchronous trade execution tracking FIX connection (rather than API) Alerts via email/SMS (text-message)
Graphical User Interface (GUI)
o Open positions o Real-time market graph
TA indicators/bands, OHLC bars/candles, trade signals
o Trades/executions log o P&L updates o Manual overrides (panic button)
Yair Altman UndocumentedMatlab.com 20
Sample advanced MATLAB GUI
Yair Altman
www.UndocumentedMatlab.com
21
Sample PDF report
Yair Altman
www.UndocumentedMatlab.com
22
Backtesting in MATLAB
tadeveloper.com
Yair Altman
UndocumentedMatlab.com
23
Conclusion
Technology is no longer a barrier to developing a relatively low-cost algorithmic trading engine We no longer need to handle connectivity plumbing We no longer need to prototype in MATLAB, deploy in C
o MATLAB can handle entire investment management lifecycle o Simpler development, reduced cost & time-to-market
The only major thing left to do is just to devise a winning strategy
o With the analysis tools available in MATLAB this should be easier than ever
Yair Altman UndocumentedMatlab.com 24
Resources
mathworks.com/products/trading
undocumentedmatlab.com/ib-matlab
interactivebrokers.com/en/software/ibapi.php
altmany@gmail.com
Yair Altman
UndocumentedMatlab.com
25