IEOR 215: Final Presentation Dynamically Accessible Portfolio Management Database Florent Robineau...

13
IEOR 215: Final Presentation IEOR 215: Final Presentation Dynamically Accessible Dynamically Accessible Portfolio Management Portfolio Management Database Database Florent Robineau Florent Robineau Ching-Yu Hu Ching-Yu Hu
  • date post

    21-Dec-2015
  • Category

    Documents

  • view

    218
  • download

    2

Transcript of IEOR 215: Final Presentation Dynamically Accessible Portfolio Management Database Florent Robineau...

Page 1: IEOR 215: Final Presentation Dynamically Accessible Portfolio Management Database Florent Robineau Ching-Yu Hu.

IEOR 215: Final PresentationIEOR 215: Final Presentation

Dynamically Accessible Portfolio Dynamically Accessible Portfolio Management DatabaseManagement Database

Florent RobineauFlorent Robineau

Ching-Yu HuChing-Yu Hu

Page 2: IEOR 215: Final Presentation Dynamically Accessible Portfolio Management Database Florent Robineau Ching-Yu Hu.

Design ProcessDesign Process

EER modificationEER modification Relation SchemaRelation Schema Four sample queriesFour sample queries Implementation in PHP/MySQLImplementation in PHP/MySQL DemonstrationDemonstration

Page 3: IEOR 215: Final Presentation Dynamically Accessible Portfolio Management Database Florent Robineau Ching-Yu Hu.

EER RevisitedEER Revisited

Page 4: IEOR 215: Final Presentation Dynamically Accessible Portfolio Management Database Florent Robineau Ching-Yu Hu.

Relation Schema in 3NFRelation Schema in 3NF1.1. User User ((idid, firstName, middleName, lastName, credit), firstName, middleName, lastName, credit)2.2. PortfolioPortfolio ((idid, creation_date, user_id, creation_date, user_id11))3.3. Orders Orders ((portfolio_idportfolio_id, , equity_idequity_id, date), date)4.4. Transactions Transactions ((order_dateorder_date, , portfolio_idportfolio_id, , equity_idequity_id, date), date)5.5. Watchlist Watchlist ((watch_idwatch_id, user_id), user_id)6.6. Equity Equity ((idid, sector, name, instant_price, market_capital, avail_qty), sector, name, instant_price, market_capital, avail_qty)7.7. EquityIndex EquityIndex (n(nameame))8.8. AssetAsset ((asset_idasset_id, type), type)9.9. AddressAddress (i(idd11, a, addressddress))10.10. Management Management ((idid66, n, nameame, f, functionunction))11.11. EquityHistoryEquityHistory ( (equity_idequity_id66, d, dateate, price, volume, revenue, debt, profit), price, volume, revenue, debt, profit)12.12. AssetHistoryAssetHistory ( (asset_idasset_id, , datedate, interestrate), interestrate)13.13. WatchlistEquityWatchlistEquity ( (equity_idequity_id55, t, tickerIdickerId66))14.14. EquityEquityIndexEquityEquityIndex ( (idid66, n, nameame77))15.15. PortfolioEquity PortfolioEquity ((portIdportId22, , ticker_idticker_id66, type, quantity, date, price), type, quantity, date, price)16.16. PortfolioAsset PortfolioAsset ((portIdportId22, , assetIdassetId88, type, quantity, date, price), type, quantity, date, price)

Page 5: IEOR 215: Final Presentation Dynamically Accessible Portfolio Management Database Florent Robineau Ching-Yu Hu.

Relation GraphRelation Graph

Page 6: IEOR 215: Final Presentation Dynamically Accessible Portfolio Management Database Florent Robineau Ching-Yu Hu.

Historical price paths of a certain equity before Historical price paths of a certain equity before a given datea given date

• select * from histories h where equity_id = ‘GOOG' and hdate select * from histories h where equity_id = ‘GOOG' and hdate <= '2001-10-23‘ order by hdate desc;<= '2001-10-23‘ order by hdate desc;

Comparison of volatility across equitiesComparison of volatility across equities

• select select e.ide.id, , e.namee.name, stddev(h.price) from equities e inner join , stddev(h.price) from equities e inner join histories h on histories h on e.ide.id = h.equity_id group by = h.equity_id group by e.ide.id, , e.namee.name having having stddev(h.price) between 0 and "$input"; stddev(h.price) between 0 and "$input";

Sample QueriesSample Queries

Page 7: IEOR 215: Final Presentation Dynamically Accessible Portfolio Management Database Florent Robineau Ching-Yu Hu.

Summary statistics of order Summary statistics of order activityactivity

select select u.idu.id, , u.nameu.name, sum(o.price*o.qty) as , sum(o.price*o.qty) as total, avg(o.price) as avgprice from total, avg(o.price) as avgprice from orders o inner join portfolios p on orders o inner join portfolios p on p.idp.id = = o.portfolio_id inner join users u on o.portfolio_id inner join users u on u.idu.id = = p.user_id group by p.user_id group by u.idu.id, , u.nameu.name order by order bytotal desc, avgprice asc;total desc, avgprice asc;

Queries continued (2)Queries continued (2)

Page 8: IEOR 215: Final Presentation Dynamically Accessible Portfolio Management Database Florent Robineau Ching-Yu Hu.

Portfolio weights across equities (in 1 plain query)Portfolio weights across equities (in 1 plain query)

SELECT u.name AS user_name, spent_by_equity.portfolio_id, e.name AS equity_name, (100 * SELECT u.name AS user_name, spent_by_equity.portfolio_id, e.name AS equity_name, (100 * spent_by_equity.sum_spent_equity / (( SELECT sum(s.sum_spent_equity) AS sumspent_by_equity.sum_spent_equity / (( SELECT sum(s.sum_spent_equity) AS sum

FROM spent_by_equity sFROM spent_by_equity s WHERE s.portfolio_id = spent_by_equity.portfolio_id)))::numeric(5,2) AS percentageWHERE s.portfolio_id = spent_by_equity.portfolio_id)))::numeric(5,2) AS percentage FROM ( SELECT portfolio_id, equity_id, sum(FROM ( SELECT portfolio_id, equity_id, sum( CASECASE WHEN otype::text = 'BUY' THEN - sum_spent_orderWHEN otype::text = 'BUY' THEN - sum_spent_order ELSE sum_spent_orderELSE sum_spent_order END) AS sum_spent_equityEND) AS sum_spent_equity FROM ( SELECT t.portfolio_id, t.equity_id, t.order_date AS odate, sum(t.price * t.qty) AS FROM ( SELECT t.portfolio_id, t.equity_id, t.order_date AS odate, sum(t.price * t.qty) AS

sum_spent_ordersum_spent_order FROM transactions tFROM transactions t GROUP BY t.portfolio_id, t.equity_id, t.order_date) spentGROUP BY t.portfolio_id, t.equity_id, t.order_date) spent NATURAL JOIN orders oNATURAL JOIN orders o GROUP BY portfolio_id, equity_idGROUP BY portfolio_id, equity_id ORDER BY portfolio_id) spent_by_equityORDER BY portfolio_id) spent_by_equity JOIN portfolios p ON p.id = spent_by_equity.portfolio_idJOIN portfolios p ON p.id = spent_by_equity.portfolio_id JOIN users u ON u.id = p.user_idJOIN users u ON u.id = p.user_id JOIN equities e ON e.id = spent_by_equity.equity_idJOIN equities e ON e.id = spent_by_equity.equity_id GROUP BY spent_by_equity.equity_id, spent_by_equity.portfolio_id, spent_by_equity.sum_spent_equity, GROUP BY spent_by_equity.equity_id, spent_by_equity.portfolio_id, spent_by_equity.sum_spent_equity,

u.name, e.name order by u.name, spent_by_equity.portfolio_id, e.name;u.name, e.name order by u.name, spent_by_equity.portfolio_id, e.name;

Queries continued (3)Queries continued (3)

Page 9: IEOR 215: Final Presentation Dynamically Accessible Portfolio Management Database Florent Robineau Ching-Yu Hu.

Portfolio weights across equities (using views)Portfolio weights across equities (using views)

create view spent as select t.portfolio_id, t.equity_id, t.order_date as create view spent as select t.portfolio_id, t.equity_id, t.order_date as odate, sum(t.price*t.qty) as sum_spent from transactions t group odate, sum(t.price*t.qty) as sum_spent from transactions t group by t.portfolio_id, t.equity_id, t.order_date;by t.portfolio_id, t.equity_id, t.order_date;

create view spent_by_equity as select portfolio_id, equity_id, create view spent_by_equity as select portfolio_id, equity_id, sum(case when otype = 'BUY' THEN - sum_spent ELSE sum_spent sum(case when otype = 'BUY' THEN - sum_spent ELSE sum_spent END) as sum_spent_equity from spent natural inner join orders o END) as sum_spent_equity from spent natural inner join orders o group by portfolio_id, equity_id order by portfolio_id;group by portfolio_id, equity_id order by portfolio_id;

select u.name, s.portfolio_id, e.name, (100 * s.sum_spent_equity / select u.name, s.portfolio_id, e.name, (100 * s.sum_spent_equity / (select sum(sum_spent_equity) from spent_by_equity where (select sum(sum_spent_equity) from spent_by_equity where portfolio_id = s.portfolio_id))::numeric(5,2) from spent_by_equity s portfolio_id = s.portfolio_id))::numeric(5,2) from spent_by_equity s inner join portfolios p on p.id = s.portfolio_id inner join users u on inner join portfolios p on p.id = s.portfolio_id inner join users u on u.id = p.user_id inner join equities e on e.id = s.equity_id group by u.id = p.user_id inner join equities e on e.id = s.equity_id group by s.equity_id, s.portfolio_id, s.sum_spent_equity, u.name, e.name s.equity_id, s.portfolio_id, s.sum_spent_equity, u.name, e.name order by u.name, s.portfolio_id, e.name;order by u.name, s.portfolio_id, e.name;

Queries continued (4)Queries continued (4)

Page 10: IEOR 215: Final Presentation Dynamically Accessible Portfolio Management Database Florent Robineau Ching-Yu Hu.

Implementation in PHP/MySQLImplementation in PHP/MySQL

Software usedSoftware used Query demonstrationQuery demonstration Query analyzer (provided by Query analyzer (provided by

Postgresql through the “explain” Postgresql through the “explain” command, easily readable with the command, easily readable with the GUI)GUI)

Page 11: IEOR 215: Final Presentation Dynamically Accessible Portfolio Management Database Florent Robineau Ching-Yu Hu.

Query AnalyzerQuery Analyzer

Page 12: IEOR 215: Final Presentation Dynamically Accessible Portfolio Management Database Florent Robineau Ching-Yu Hu.

Results of the query analyzerResults of the query analyzer

The last query requires a lot of The last query requires a lot of elementary operationselementary operations

Efficiency issues:Efficiency issues:• Use of viewsUse of views• Denormalization of the database + use Denormalization of the database + use

of triggers to maintain some calculated of triggers to maintain some calculated fieldsfields

Supposes that « select » commands occur Supposes that « select » commands occur more frequently than « insert » or more frequently than « insert » or « update » commands« update » commands

Page 13: IEOR 215: Final Presentation Dynamically Accessible Portfolio Management Database Florent Robineau Ching-Yu Hu.

Questions!