Sunday, May 1, 2011

dependency graph weaved into a mkt risk engine (secDB?)

Imagine 2 objects in your risk engine's memory space. If Object A2 depends on Object I3, then I3 modifications automatically triggers a change in A2 -- The defining feature of dependency graph system. All Spreadsheet implementations meet this requirement.

By the way, Disk-based OODB are unsuitable. Instead, both objects must be "loaded" from OODB into memory for this to work. Similarly,
spreadsheet must be loaded from disk to memory.

For automatic chain reaction, every dependent part of A2 object state (say, the volatility attribute) should be implemented as something other than a
member variable.

Q3a: How is this attribute implemented physically? In fact, this attribute is serializable and can be "stored" to disk-based OODB. You can imagine a hidden object holding this volatility value.
A: There's an alternative to a regular field -- Whenever anyone requests the vol value, just recomputed from the upstream objects I3 etc. May hit many nodes/cells/objects every time. Performance-wise, A2 object gets a hidden field to hold the cached-function-result of the vol() method call.

Q3b: so in our example is the vol a method or a field?
A: Probably a method + hidden field to hold cached-result.  Q3c: In many dependency graph systems, the syntax looks like vol is a field of the A2 object. Why?
A: C++ allows you to overload "operator()", so a call to "vol()" can get and set a field. Likewise in python, you can also have a vol() method to get and set a field. The field is the cached-function-return-value. In python, the vol attribute may look like both a field variable and a method but it's a method.

Q: how does the downstream object A2 get triggered when upstream object I3 changes value? Async Cache trigger?
A: I feel spreadsheet drives the chain reaction in one thread.  chatter class --
I've looked at Slang a bit. It's an interpreted _dataflow_ language running on an in-memory database called SecDB. Untyped, Pascal-ish, __single-threaded__. Like a spreadsheet, it only needs to recompute the subgraph that has changed.

"like a spreadsheet, it only needs to recompute the subgraph that has changed." Yes that's right - and that is a key feature for GS - they need to be able to revalue huge trading books ~ real time. (Most other banks estimate impact of intraday moves, and do a re-price overnight in batch)

In one implementation of dependency-graph, "Assigning to a cell method {like our volatility()} will execute a setValue. This will propagate the changes to any other methods/cells/nodes that are dependent upon it."

To facilitate spreadsheet-like programming,

* dependency relationships between functions and intermediate results
** I guess dependency among objects, functions (are objects in python), methods
* Python language feature of decorators to define the nodes (aka: cells) in the graph
* Cells know how to serialize and deserialize themselves into and from the object DB
* When a given cell is tweaked, dependents change accordingly, including the UI
* framework is lazy and caches intermediate values to increase performance

No comments:

Total Pageviews

my favorite topics (labels)

_fuxi (302) _misLabel (13) _orig? (3) _rm (2) _vague (2) clarified (58) cpp (39) cpp_const (22) cpp_real (76) cpp/java/c# (101) cppBig4 (54) cppSmartPtr (35) cppSTL (33) cppSTL_itr (27) cppSTL_real (26) cppTemplate (28) creditMkt (14) db (65) db_sybase (43) deepUnder (31) dotnet (20) ECN (27) econ/bank` (36) fin/sys_misc (43) finGreek (34) finReal (45) finRisk (30) finTechDesign (46) finTechMisc (32) finVol (66) FixedIncom (28) fMath (7) fMathOption (33) fMathStoch (67) forex (39) gr8IV_Q (46) GTD_skill (15) GUI_event (30) inMemDB (42) intuit_math (41) intuitFinance (57) javaMisc (68) javaServerSide (13) lambda/delegate (22) marketData (28) math (10) mathStat (55) memIssue (8) memMgmt (66) metaProgram` (6) OO_Design (84) original_content (749) polymorphic/vptr (40) productive (21) ptr/ref (48) py (28) reflect (8) script`/unix (82) socket/stream (39) subquery/join (30) subvert (13) swing/wpf (9) sysProgram` (16) thread (164) thread_CAS (15) thread_cpp (28) Thread* (22) timeSaver (80) transactional (23) tune (24) tuneDB (40) tuneLatency (30) z_ajax (9) z_algoDataStruct (41) z_arch (26) z_arch_job (27) z_automateTest (17) z_autoTrad` (19) z_bestPractice (39) z_bold (83) z_bondMath (35) z_book (18) z_boost (19) z_byRef^Val (32) z_c#GUI (43) z_c#misc (80) z_cast/convert (28) z_container (67) z_cStr/arr (39) z_Favorite* (8) z_FIX (15) z_forex (48) z_fwd_Deal (18) z_gz=job (33) z_gzBig20 (13) z_gzMgr (13) z_gzPain (20) z_gzThreat (19) z_hib (19) z_IDE (52) z_ikm (5) z_IR_misc (36) z_IRS (26) z_javaWeb (28) z_jdbc (10) z_jobFinTech (46) z_jobHunt (20) z_jobRealXp (10) z_jobStrength (15) z_jobUS^asia (27) z_letter (42) z_linq (10) z_memberHid` (11) z_MOM (54) z_nestedClass (5) z_oq (24) z_PCP (12) z_pearl (1) z_php (20) z_prodSupport (7) z_py (31) z_quant (14) z_regex (8) z_rv (38) z_skillist (48) z_slic`Problem (6) z_SOA (14) z_spring (25) z_src_code (8) z_swingMisc (50) z_swingTable (26) z_unpublish (2) z_VBA/Excel (8) z_windoz (17) z_wpfCommand (9)

About Me

New York (Time Square), NY, United States