Presentation is loading. Please wait.

Presentation is loading. Please wait.

PARSE SOFTWARE DEVICES © Copyright 2007 PARSE Software Devices, all rights reserved. Getting, Managing, and Analyzing Stock Market Information with FreeBSD.

Similar presentations


Presentation on theme: "PARSE SOFTWARE DEVICES © Copyright 2007 PARSE Software Devices, all rights reserved. Getting, Managing, and Analyzing Stock Market Information with FreeBSD."— Presentation transcript:

1 PARSE SOFTWARE DEVICES © Copyright 2007 PARSE Software Devices, all rights reserved. Getting, Managing, and Analyzing Stock Market Information with FreeBSD Using a combination of open source and custom tools for fun and profit Presented by: Robert Krten

2 PARSE SOFTWARE DEVICES © Copyright 2007 PARSE Software Devices, all rights reserved. 2 Introduction This presentation shows: –how to download a large variety of equity and option data from various sources on the internet, –how to manage the data (parsing, archiving, etc., currently >2 GB), and finally, –how to present the data to applications with a focus on efficiency and access speed.

3 PARSE SOFTWARE DEVICES © Copyright 2007 PARSE Software Devices, all rights reserved. 3 Introduction Public domain / open source tools like curl and lynx are highlighted, as well as my own custom tools. The entire database schema is presented, and then the use of mmap() is shown for complete efficiency.

4 PARSE SOFTWARE DEVICES © Copyright 2007 PARSE Software Devices, all rights reserved. 4 stockproc stockstore lynx | sed htmlparse telenium.ca http m-x.ca lynx americanbulls.com curl eoddata.com curl flat ASCII stock database flat ASCII options database flat ASCII recommendations database regen_stockdb Master binary database Big Picture – Data Gathering / Storage

5 PARSE SOFTWARE DEVICES © Copyright 2007 PARSE Software Devices, all rights reserved. 5 Master binary database Big Picture – Data Consumers opt stockdb library Stock quotes, option chain selection, recommendations printouts autotrader stockdb library Automated trading analysis sfa stockdb library Graphing, trending, filtering, etc., (xgraph output compatible)

6 PARSE SOFTWARE DEVICES © Copyright 2007 PARSE Software Devices, all rights reserved. 6 Data Storage – Top Level Directory Tree / data dynamicgenerated financial binary database (350MB as of Jan 07, 569MB as of Apr 07) americanbullsamexmsetsevse …… Well examine the americanbulls, mse, and all other directories over the next three slides.

7 PARSE SOFTWARE DEVICES © Copyright 2007 PARSE Software Devices, all rights reserved. 7 Data Storage – American Bulls americanbulls a.html.gz a.txt … z.html.gz z.txt a.html.gz a.txt … z-w.html.gz z-w.txt a-w.html.gz a-w.txt z.txt … In the americanbulls directory, I store data based on the day that it was acquired. I store both the raw html file as captured from the website, as well as the processed text file. Notice on , which was a Friday, I stored the weekly data (as identified by a –w suffix). tsenyse … …

8 PARSE SOFTWARE DEVICES © Copyright 2007 PARSE Software Devices, all rights reserved. 8 Data Storage – Options ARCHIVE A html A html A html A html … ZXG html ZXG html ZXG html ZXG html aabxabzace…zxg a/aa.06 a/aa.07 a/ae.07 a/af.07 a/ag.06 a/ag.07 … xf.06 xg.06 xl.06 xn.06 xp.06 mse 2006 … … ………… Individual call/put data files for the given underlying equity backup (source) files The names are based on the standard strike names at the exchange. So, ag.06 is a January call (a indicates January and call), g indicates the price (via a table lookup) and 06 indicates the year.

9 PARSE SOFTWARE DEVICES © Copyright 2007 PARSE Software Devices, all rights reserved. 9 Data Storage – Stocks tse ab … yz …… BA.UA BA.UN BAA BAC.UA BAC.UN … Individual stocks are stored in an uppercase filename corresponding to the stock symbol. One line of text per day, containing the stock trading data ABX Barrick Gold Cp Date Symbol Open High Low Last Change Volume #trades Date Full Name

10 PARSE SOFTWARE DEVICES © Copyright 2007 PARSE Software Devices, all rights reserved. 10 Data Sources I get data from the following: –www.telenium.ca (free) end of day data for TSE and VSE (not any more) –www.eoddata.com (subscription) end of day data for most exchanges not used any more, unreliable splits –www.americanbulls.com (subscription) recommendations for AMEX, NASDAQ, NYSE, TSE, and VSE –www.m-x.ca (free) options for TSE-traded equities

11 PARSE SOFTWARE DEVICES © Copyright 2007 PARSE Software Devices, all rights reserved. 11 Data Timing Each data source is ready at a different time: –telenium.ca – 18:00 CST –eoddata.com – 21:00 EST –m-x.ca – no specified time, but after 18:00 EST works –americanbulls.ca – no specified time, but after 21:30 EST works So, the first tool I needed is waituntil, which just waits until the specified time. E.g., waituntil 21:00

12 PARSE SOFTWARE DEVICES © Copyright 2007 PARSE Software Devices, all rights reserved. 12 telenium.ca These guys have a fairly straightforward data format: Which we can parse easily with a custom C program (this is for historical reasons)

13 PARSE SOFTWARE DEVICES © Copyright 2007 PARSE Software Devices, all rights reserved. 13 eoddata.com Dead simple. It stores it in CSV format! NA, ,63.93,64.46,63.77,63.98, NA.NT.J, ,9.75,9.75,9.75,9.75,500 NA.NT.K, ,11.6,11.6,11.6,11.6,1800 NA.PR.K, ,27.69,27.69,27.45,27.45,5900 NA.PR.L, ,25.82,25.9,25.8,25.9,9800 NAC, ,1.54,1.55,1.54,1.55,22000 NAE.UN, ,11.72,12.13,11.7,11.91, NAL.UN, ,25.85,26,25.8,25.85,72903 Unfortunately, their splits information is not reliable, so I dont use them any more. Symbol,Date,Open,High,Low,Close,Volume

14 PARSE SOFTWARE DEVICES © Copyright 2007 PARSE Software Devices, all rights reserved. 14 eoddata.com FTP can be easily accessed with curl : (this is all one line): curl -s -S -u $eoduser:$eodpass -O ftp://ftp.eoddata.com/"$I"_"$year2$month$day.txt The variables are: $eoduser – the username $eodpass – the password $I – the single character uppercase root symbol $year2 – a two digit year (07 for 2007) $month – a two digit month (05 for May) $day – a two digit day (22 for the 22 nd ) This is wrapped in a for-loop in the shell…

15 PARSE SOFTWARE DEVICES © Copyright 2007 PARSE Software Devices, all rights reserved. 15 eoddata.com exchanges=(amex cbot nasd nymex nyse tse vse) ftpcmd="curl -s -S -u $eoduser:$eodpass " for i in do I=`echo $i | tr "[:lower:]" "[:upper:]"` ftpcmd=$ftpcmd" –O \ ftp://ftp.eoddata.com/"$I"_"$year2$month$day.txt done $ftpcmd This simply iterates across all the exchanges, and constructs a large string which is executed at the end. I concatenate all the FTP commands into one string to make it more efficient. (Well look at the curl command line options shortly.)

16 PARSE SOFTWARE DEVICES © Copyright 2007 PARSE Software Devices, all rights reserved. 16 americanbulls.com Theres a fair bit of data here:

17 PARSE SOFTWARE DEVICES © Copyright 2007 PARSE Software Devices, all rights reserved. 17 americanbulls.com I want just the analysis data: –symbol name –number of stars (strength of recommendation) –recommendation (buy, sell, buy-if, etc) –front page recommendations (top stocks) (note added ): I now get the stock data from here as well, as eoddata.com has proved unreliable in their TSE/VSE split info.

18 PARSE SOFTWARE DEVICES © Copyright 2007 PARSE Software Devices, all rights reserved. 18 americanbulls.com Much harder to work with: –since its subscription based, need to log in –need to suck up 6 exchanges with 26 (a-z) data sets (156 total) –Need to get the weekly recommendations, but only on Friday (doubles the amount of data from normal weekday to 312) –Data format needs massaging –Its not quite a stock nor is it an option, its a third type…

19 PARSE SOFTWARE DEVICES © Copyright 2007 PARSE Software Devices, all rights reserved. 19 americanbulls.com Logging in – with curl (all one line): curl -s -S -L -c $root/americanbulls/cookies.txt -d "zUserID= USERNAME &zPassword= PASSWORD &Co okieAtayimmi=1&submit1" This logs us in for the session. Lets look at the -s, -S, -L, -c, and -d options (we used some of them in the eoddata.com example too)…

20 PARSE SOFTWARE DEVICES © Copyright 2007 PARSE Software Devices, all rights reserved. 20 americanbulls.com OptionMeaning -s silent operation (I dont want all the verbosity cluttering up my cron logfile) -S show errors (overrides -s, but only if there is something wrong) -L let curl follow pages to different servers -c location of cookie jar -d send data as if user had sent it via POST

21 PARSE SOFTWARE DEVICES © Copyright 2007 PARSE Software Devices, all rights reserved. 21 americanbulls.com Fetch one set of data from one exchange: curl -s -S -m 120 -L -b $root/americanbulls/cookies.txt "http://www.americanbulls.com/members/Stock List.asp?MarketTicker=$I&Tick=$J" >$base.html $I is the exchange name, e.g. TSE $J is the starting letter, e.g., N $root is the financial information directory base $base is the name of the html file

22 PARSE SOFTWARE DEVICES © Copyright 2007 PARSE Software Devices, all rights reserved. 22 americanbulls.com Finally, we convert the HTML to clean text: lynx -dump -width=200 $base.html | sed -n "/Ticker.*Description/,/^$/s/ *\[[0-9][0- 9]*]//p" >$base.txt The result of this is (e.g., n.txt file): NA NATIONAL BANK OF CANADA [Star4.gif] % 353,106 BUY-IF NAC NORTH ATLANTIC RESOURCES LTD [Star2.gif] % 22,000 BUY-IF NAEu NAL OIL AND GAS TRUST TR.. [Star3.gif] % 515,736 BUY-IF NALu NEWALTA CORP INCOME FUND T.. [Star4.gif] % 72,903 BUY-IF NApK NATIONAL BANK OF CANADA N % 5,900 WAIT NApL NATIONAL BANK OF CANADA N % 9,800 WAIT NAS NORTHSTAR AEROSPACE INC [Star2.gif] % - SELL-IF NB NORTHBRIDGE FINANCIAL CP [Star2.gif] % 49,036 HOLD NBD NORBORD INC [Star3.gif] % 1,020,875 HOLD NCFu NORCAST INCOME FUND UTS [Star3.gif] % 4,175 WAIT NCS NUCRYST PHARMACEUTICALS CP % 1,320 SELL CONF This gives me all the information I need; the ticker, the number of stars, and the recommendation.

23 PARSE SOFTWARE DEVICES © Copyright 2007 PARSE Software Devices, all rights reserved. 23 americanbulls.com Also, I get the front page recommendations: This information is parsed using the htmlparse utility (discussed later) and stored as a text file alongside the other American Bulls data as fp.txt and fp-w.txt (for weekly data).

24 PARSE SOFTWARE DEVICES © Copyright 2007 PARSE Software Devices, all rights reserved. 24 m-x.ca Finally, the options data from the Montreal Exchange:

25 PARSE SOFTWARE DEVICES © Copyright 2007 PARSE Software Devices, all rights reserved. 25 m-x.ca Unfortunately, the HTML that contains the information is frightfully ugly – the instrument name is buried! + 07 JA

26 PARSE SOFTWARE DEVICES © Copyright 2007 PARSE Software Devices, all rights reserved. 26 m-x.ca So, the solution was a custom HTML parser (called htmlparse ), which constructs an internal tree representation of the HTML document. Then I just walk along the document, picking out items of interest. 1,600 lines of C, not outrageous, but not trivial either

27 PARSE SOFTWARE DEVICES © Copyright 2007 PARSE Software Devices, all rights reserved. 27 So what? Well, at this point, weve: –fetched all the data –stored all the data in text files –archived all the temporary raw (html) data files So now were ready to convert it to binary for the master database. If we didnt convert it to binary, it would take well over 10 minutes to load the entire database each time! (AMD )

28 PARSE SOFTWARE DEVICES © Copyright 2007 PARSE Software Devices, all rights reserved. 28 The binary database After all the data is loaded, I run regen_stockdb as the final executable. Its responsible for parsing all the text files and loading them into the binary database. It takes about 10 minutes. flat ASCII stock database flat ASCII options database flat ASCII recommendations database regen_stockdb Master binary database

29 PARSE SOFTWARE DEVICES © Copyright 2007 PARSE Software Devices, all rights reserved. 29 Why Flat ASCII? I get asked this a lot. Heres a bunch of answers: –you cant grep a database –you cant vi/sed a database to repair it –regenerating my databases is trivial from ASCII –ASCII is much more portable than a given databases representation of the data and… –I dont like databases (we can discuss that one over beer after the conference)

30 PARSE SOFTWARE DEVICES © Copyright 2007 PARSE Software Devices, all rights reserved. 30 The Binary Database In spite of all those fine reasons, I need my data in a binary database for speed of access. The next set of slides cover the schema for the database, and then Ill talk about the implementation (making it fast).

31 PARSE SOFTWARE DEVICES © Copyright 2007 PARSE Software Devices, all rights reserved. 31 Database Schema – Top Level The topmost entity is the stock database: typedef struct { exchange_t*exchanges; intnexchanges; intmap_fd; void*map_ptr; intmap_size; } stockdb_t; Ignoring the map information, this basically is a container that tells us how many exchanges worth of information are contained in the entire database (the nexchanges member) and gives us a pointer to the data (the exchanges member).

32 PARSE SOFTWARE DEVICES © Copyright 2007 PARSE Software Devices, all rights reserved. 32 Database Schema – Exchange Level The next topmost entity is an exchange: typedef struct { charname [EXCHANGE_NAME_SIZE + 1]; intninstruments; intninstrumentsalloc; instrument_t*instruments; } exchange_t; In each exchange, we store the name (e.g., tse, nasdaq) and the number of instruments (the ninstruments member) as well as a pointer to their data (the instruments member). The ninstrumentsalloc is there to allow more efficient allocation/reallocate of the instruments array.

33 PARSE SOFTWARE DEVICES © Copyright 2007 PARSE Software Devices, all rights reserved. 33 Database Schema – Instrument Level typedef struct { charname [SYMBOL_NAME_SIZE + 1]; intnoptions [2]; intnoptionsalloc [2]; strike_t*options [2]; intntrades; intntradesalloc; one_trading_datum_t*trades; } instrument_t; An instrument can have an equity flavour (the trades and ntrades members) and/or an options flavour (the noptions and options members). They are stored together because the root symbol is the same.

34 PARSE SOFTWARE DEVICES © Copyright 2007 PARSE Software Devices, all rights reserved. 34 Database Schema – Trading Datum Level typedef struct { time_tdate; floatopen; floathigh; floatlow; floatclose; floatchange; intvolume; intntrades; intabflags; intabstars; } one_trading_datum_t; This is the record for one days worth of trade data. To simplify storage and lookup, the American Bulls recommendations are stored as two members, the abflags and abstars, directly in-line with the trading data (this stores both the daily and weekly information in different bit positions).

35 PARSE SOFTWARE DEVICES © Copyright 2007 PARSE Software Devices, all rights reserved. 35 American Bulls Data abflags weeklydailyweeklydaily abstars AB_UNKNOWN 0 (no data available) AB_BUY_IF 1 (watch this stock in preparation to buying) AB_BUY_CONF 2 (buy this stock) AB_SELL_IF 3 (watch this stock in preparation to selling) AB_SELL_CONF 4 (sell this stock) AB_HOLD 5 (hold this stock) AB_WAIT 6 (do nothing) AB_FRONTPAGE 0x80 (bitflag, appears on the front page) We use 16 bits of the integer; the top 8 bits of that are the weekly data, and the bottom 8 bits are the daily data. Weekly data is only available on Fridays. Valid values are 0 through 5, inclusive

36 PARSE SOFTWARE DEVICES © Copyright 2007 PARSE Software Devices, all rights reserved. 36 Database Schema – Strike Level typedef struct { charname [STRIKE_NAME_SIZE + 1]; time_texpiration; floatstrike; intndatums; intndatumsalloc; one_strike_datum_t*datums; } strike_t; Finally, this is the root datum for a strike. It consists of the name of the strike, its expiration, the strike price, and then an array of strike data (the datums array)…

37 PARSE SOFTWARE DEVICES © Copyright 2007 PARSE Software Devices, all rights reserved. 37 Database Schema – Strike Datum Level typedef struct { time_tdate; intbid_size; floatbid; floatask; intask_size; floatlast; floatchange; intvolume; floatclose; intopen_interest; floatvolatility; } one_strike_datum_t; And this is the data as it pertains to one strike on one day.

38 PARSE SOFTWARE DEVICES © Copyright 2007 PARSE Software Devices, all rights reserved. 38 stockdb_t exchanges Database Schema – Big Picture nexchanges instruments ninstruments ntrades noptions [0] noptions [1] name options [TYPE_CALL] options [TYPE_PUT] trades date open high low last change volume abflags abstars (same as above) datums nameexpirationstrike ndatums date bid_size bid ask ask_size last change volume close open_interest volatility Options, Equities, Recommendations tse bns jj

39 PARSE SOFTWARE DEVICES © Copyright 2007 PARSE Software Devices, all rights reserved. 39 Database – In-Memory View nexchanges exchanges [0] exchanges [1] … 0x8e7bf000 name ninstruments instruments [0] … 0x8e7cd8e0 instruments [1] name ninstruments instruments [0] … 0x8e7fa930 instruments [1] name noptions [0] options [0][0] 0x8f00d8e0 options [0][1] … options [1][0] options [1][1] … trades [0] trades [1] … noptions [1] ntrades

40 PARSE SOFTWARE DEVICES © Copyright 2007 PARSE Software Devices, all rights reserved. 40 Database – In-Memory View This is what the process address space looks like after weve read the entire text- based database into memory. The fragmentation has resulted from the fact that we are constantly realloc()ing and malloc()ing memory to grow our dynamic arrays. This swiss-cheese effect is really not what you want to write to disk for other applications to use. So, we need to convert the data…

41 PARSE SOFTWARE DEVICES © Copyright 2007 PARSE Software Devices, all rights reserved. 41 Database – Coalesced (Disk) View header stock_db_t exchange_t one_trading_datum_t instrument_t one_strike_datum_t By counting up all of the individual pieces of data, and allocating one contiguous memory region (and then subdividing it internally) we can coalesce all the data into one linear chunk. This is great, because it means that we can then simply write() this to disk, and, even better, we can mmap() it back into the address space of the process that needs to use the data. Yes, we are writing data with pointers to disk. The header contains administrative info (date compiled).

42 PARSE SOFTWARE DEVICES © Copyright 2007 PARSE Software Devices, all rights reserved bits vs 64 bits 32-bit VA is dead! –I already have 2 applications that are at the limit of 32-bit virtual address space, and are expected to exceed that shortly.

43 PARSE SOFTWARE DEVICES © Copyright 2007 PARSE Software Devices, all rights reserved. 43 Loading the Database So, how do we get the data? We stored the data at a special location: 0x bit processors are great! Theres infinite address space available, so you can just pick an address and go with it. (Ok, I have thought about this a little more than just that )

44 PARSE SOFTWARE DEVICES © Copyright 2007 PARSE Software Devices, all rights reserved. 44 Loading the Database So, to load the database: –calculate size (use stat() to get the file size) –mmap() the file at the magic address of 0x –initialize a pointer to point to the mmap()d file –and youre off to the races!

45 PARSE SOFTWARE DEVICES © Copyright 2007 PARSE Software Devices, all rights reserved. 45 Loading the Database void stockdb_open_database (stockdb_t *db) { binary_database_header_t *header; calculate_database_size (db); map_database (db, PROT_READ, MAP_NOCORE | MAP_NOSYNC | MAP_PRIVATE); header = (binary_database_header_t *) db -> map_ptr; // actual data starts after the header db -> exchanges = (exchange_t *) ((uint8_t *) header + BINARY_DATABASE_HEADER_SIZE); db -> nexchanges = header -> nexchanges; } This is the client API call; you pass it a stockdb_t and it fills it in, giving you access to the database.

46 PARSE SOFTWARE DEVICES © Copyright 2007 PARSE Software Devices, all rights reserved. 46 Loading the Database static void calculate_database_size (stockdb_t *db) { struct stat s; if (stat (DATABASE_PATH, &s) == -1) { // squack an error out and exit (EXIT_FAILURE); } db -> map_size = s.st_size; } This is really just an error checking cover function for the stat() function.

47 PARSE SOFTWARE DEVICES © Copyright 2007 PARSE Software Devices, all rights reserved. 47 Loading the Database static void map_database (stockdb_t *db, int prot, int flags) { if ((db -> map_fd = open (DATABASE_PATH, O_RDWR)) == -1) { exit (EXIT_FAILURE); // prints an error too… } if ((db -> map_ptr = mmap (MAP_ADDRESS, db -> map_size, prot, flags, db -> map_fd, 0)) == MAP_FAILED) { exit (EXIT_FAILURE); // prints an error too… } if (db -> map_ptr != MAP_ADDRESS) { // for now, just exit. In the future, do a fixup exit (EXIT_FAILURE); // prints an error too… }

48 PARSE SOFTWARE DEVICES © Copyright 2007 PARSE Software Devices, all rights reserved. 48 Client Example Heres how simple it is to use: #include stockdb_tdb;// THE database int main (int argc, char **argv) { inti; stockdb_open_database (&db); printf (There are %d exchanges:, db.nexchanges); for (i = 0; i < db.nexchanges; i++) { printf (%s, db.exchanges [i].name); } printf (\n); }

49 PARSE SOFTWARE DEVICES © Copyright 2007 PARSE Software Devices, all rights reserved. 49 Clients There are three main clients for the database: –opt retrieves quotes, selects options ( xgraph or text) shows americanbulls data –autotrader analyzes historical data picks stocks based on that data performs simulated trades (with very conservative requirements; only uses open/close information) functions daily or weekly –sfa massages stock data and outputs to xgraph

50 PARSE SOFTWARE DEVICES © Copyright 2007 PARSE Software Devices, all rights reserved. 50 opt Here are some examples of using opt: –Get last value of Bank of Nova Scotia on TSE: opt -xtse -q -sbns bns –Get last 3: opt -xtse -Q3 -sbns bns bns bns –If you add -a, it also prints out the americanbulls recommendations on the side (data omitted to fit): opt -xtse -Q3 -sbns -a bns …omitted… WAIT (3 star) bns …omitted… WAIT (3 star) bns …omitted… BUY-IF (3 star), WK WAIT (3 star) Daily occupancy 0 days out of 3 (0.00%), weekly 0 out of 1 (0.00%) –But wait, thats not all

51 PARSE SOFTWARE DEVICES © Copyright 2007 PARSE Software Devices, all rights reserved. 51 opt Find all call options 180 days and a leverage of > 2000%: opt -o -D+180 -P S L+2000 tse:bmo:gd [EXP (188 days) STRIKE $76.00 CALL] close $69.00: YYMMDD CLOSE DELTA BID ASK AVERG DELTA CORR % NSAMP (up down 669) 1113 SUM (up down ) corr (up 15.07% down 26.03%) = 21.66% leverage % tse:cm:gd [EXP (188 days) STRIKE $ CALL] close $98.41: YYMMDD CLOSE DELTA BID ASK AVERG DELTA CORR % NSAMP (up down 271) 559 SUM (up down ) corr (up 4.31% down 6.39%) = 5.32% leverage %... lots more were found...

52 PARSE SOFTWARE DEVICES © Copyright 2007 PARSE Software Devices, all rights reserved. 52 autotrader Some sample output: BACKTEST (weekly) Backtesting for a period of 365 days, using a depth of 120 days Analyzing up to 10 top rated stocks Holding a maximum of 50 stocks Stock dollar volume during last 10 days must average $ > and up Stock price during last 10 days must average $10 -> and up Investing $30000 at a time Stop loss set at 0 of initial purchase price Maximum gain set at 9.99 of initial purchase price Ratchet set at 0 Pop factor set to 1.1 Only stocks with a return between 1.01 and 9.99 over the depth period are considered The 10-th stock in the list must have a return of at least 0, otherwise we scrub that day Recommended stocks must have between 4 and 5 stars We skip 0 stocks in the recommended list before processing (items in red are configurable parameters)

53 PARSE SOFTWARE DEVICES © Copyright 2007 PARSE Software Devices, all rights reserved. 53 autotrader Our story begins with $ in cash... DATE COST AMOUNT,CASHLFT NETWRTH GAIN/LOSS BUY , 70262, #1, BUY , 40212, #2, BUY , 11095, #3, SELL , 40151, #2, (-2.10%) BUY , 10224, #3, SELL , 47377, #2, (27.83%) SELL , 78385, #1, ( 3.65%) BUY , 49431, #2, SELL , 84804, #1, (18.65%) BUY , 54876, #2, SELL , 89097, #1, (18.41%) BUY , 59108, #2, BUY , 29095, #3, SELL , 58501, #2, (-1.40%) BUY , 28451, #3, Still holding the following: 2500 cux 11.99) -> GAIN 0.00 ( 0.00%) 1990 sxr 14.30) -> GAIN (-4.92%) 2260 lim 12.99) -> GAIN (-1.96%) cash left , #active 3, net worth (change 16.24% over 135 days or 50.21% APR) Total commissions $ over 15 trades (avg $49.32/trade)

54 PARSE SOFTWARE DEVICES © Copyright 2007 PARSE Software Devices, all rights reserved. 54 Conclusion This is an ongoing, multi-year project. I use open source / public domain tools where I can (and when I know about them ) I write my own tools when I need to or want to. Suggestions welcome!

55 PARSE SOFTWARE DEVICES © Copyright 2007 PARSE Software Devices, all rights reserved. 55 Contact Info Check out my other projects and website: –www.parse.com/~rk –www.parse.com/~museum Slides available at: for 2 months after presentation.


Download ppt "PARSE SOFTWARE DEVICES © Copyright 2007 PARSE Software Devices, all rights reserved. Getting, Managing, and Analyzing Stock Market Information with FreeBSD."

Similar presentations


Ads by Google