From 61c8fac08cacdb0a507a9860f58ae923ad8c3f38 Mon Sep 17 00:00:00 2001 From: jaketothepast Date: Thu, 28 Dec 2017 20:09:26 -0500 Subject: [PATCH] Publishing data analysis post --- .../day-trading-generating-training-data.md | 92 +++++++++++++----- static/img/post/threedaysma.png | Bin 0 -> 20985 bytes 2 files changed, 69 insertions(+), 23 deletions(-) create mode 100644 static/img/post/threedaysma.png diff --git a/content/post/day-trading-generating-training-data.md b/content/post/day-trading-generating-training-data.md index 3623f95..faf0f4e 100644 --- a/content/post/day-trading-generating-training-data.md +++ b/content/post/day-trading-generating-training-data.md @@ -1,38 +1,84 @@ --- title: "Getting Into Day Trading: Analyzing The Moving Average" date: 2017-11-04T14:11:54-04:00 -draft: true -tags: ["day trading", "data analysis", "julia"] +draft: false +tags: ["day trading", "data analysis", "python"] --- -Now that we have a Julia environment good to go, and a dataset available, time to start doing some real analysis. - I know that I have this bit of data for the WLTW symbol, and what would be helpful is to see that data completely -plotted in all of it's glory. Let's take a look at the closing costs (y) plotted against the date(x). +plotted in all of it's glory. Let's take a look at the closing costs (y) plotted against the date (x). ![Image](/img/post/WLTW_CLOSING_COSTS.png) -Not bad, we can see an ok trend going from January to December 2016. This data isn't very useful yet but I can -showcase some awesome Julia packages, and how I generated the graph. +This is a good start, but how good are the SMA's at tracking this close cost? Let's first write a little Python that will grab +the SMA for a given window, and the end of the window it was calculated for the X-axis. -I used DataFrames.jl to store the data, Query.jl to grab a subset of the data, and Gadfly.jl to plot the data. -All of these are excellent libraries for doing your thing when analyzing. +```python +import numpy as np -```julia -data = readtable("prices.csv", header=True) -q = @from i in data begin - @where i.symbol == "WLTW" - @select {i.date, i.close} - @collect DataFrame -end - -p = (q, y=:close, Geom.Point, Guide.Title("Closing Costs: WLTW - 2016")) -draw(PNG("wltw_closing_costs.png", 6inch, 4inch), p) +def moving_avs(col, window): + moving_avs = {} + for i in range(0, len(col), window): + moving_avs[i] = np.mean(col[i:i+window]) + return moving_avs ``` -Now I'd like to add the plots for the 3-day SMA, and the 5-day SMA to the plot of WLTW closing costs. What these -are, are the average of either the last 3 days or the last 5 days for a single datapoint. I believe that -by doing so, we may be able to visualize if either datapoint is adequate in predicting trends in this data. I'll be looking for -how close any given moving average is to the actual trend of the close costs for the WLTW security. +Using Numpy for analysis, and Pandas for Series to hold my values, I can use this function to create a dictionary tracking exactly what +day I am ending an SMA calculation on, as well as the SMA for that range. Window becomes the step size in the range call, and `np.mean` does +the work calculating simple moving averages for slices of the data array. +Now I can plug in my values to the function to generate some simple moving averages. + +```python +data = pd.read_csv("prices.csv") +wltw = data[data["symbol"] == "WLTW"] + +threedaysma = moving_avs(wltw, 3) +fivedaysma = moving_avs(wltw, 5) +``` + +Back to the orignal question, how well do the SMAs track against the closing cost? Well let's find out. + +```python +import matplotlib.pyplot as plt +plt.plot(wltw["close"]) +plt.plot(list(threedaysma.keys()), list(threedaysma.values())) +plt.show() +``` + +The resulting graph is here for the three day SMA: + +![Image](/img/post/threedaysma.png) + +That looks very very promising for this small timerange. The three day SMA follows the closing cost very closely. +Now I don't know about you, but I'd like to see just how closely the three day SMA follows the closing cost. I learned +in statistics of a little measure called correlation. From the interwebs: + +> Correlation is a statistical measure for how two or more variables fluctuate together. + +Now, I won't go into too many details here, as I have mammoth libraries at my disposal. However, I can explain the basics of +the measure of correlation. Correlation is between the values of -1 and 1, inclusive. A value of 1 means that the two datasets are positively +correlated (fluctuate together), while a value of -1 means that the two datasets are negatively correlated (fluctuate inversely). Any number in-between +represents how strongly correlated datasets are positively or negatively, and 0 means that the data is not correlated whatsoever. + +To calculate correlation, I use the Numpy method for the Pearson product-moment correlation given two array-like inputs. First, I clean the data. +I'll do this by dropping close cost values that don't correspond to the end of SMA windows for the 3-day SMA. + +```python +cleaned = wltw.iloc[list(threedaysma.keys()),:] +``` + +And now, to calculate our Pearson product-moment correlation coefficients + +```python +threedaysma_array = np.array(list(threedaysma.values())) +print(np.corrcoef(cleaned["close"], threedaysma_array)) + +#[[ 1. 0.96788571] +# [ 0.96788571 1. ]] + +``` + +What this output 2D array tells us, is that the data are very strongly correlated! For the points we cleaned, the correlation coefficient is almost 1. That +is great news, and we can most likely use this moving forward for forecasting and short-term trading. diff --git a/static/img/post/threedaysma.png b/static/img/post/threedaysma.png new file mode 100644 index 0000000000000000000000000000000000000000..27bb9d50770adddd3dae5290426a21d8ebd29598 GIT binary patch literal 20985 zcmd3O19xOm*JjL)lZtJtW81cEcWhf7bZjRb+eXJ$$F}XMe!rPDGi$ydFj?#7-l|mH zd-gf|Y&`qfiBy!AK!C%60|5a+kdhQt1_1%B1zxYfKmmV8ssF12h)_Jz4kLp3!*OotN z02rE}j;h6q2zcW&wX>?`p1*7Q4r^;e6Bx4fs_TlPqv3jZTO$hrb>b)Ns^(Cwu-`~{rko+xpMEnyRa}M zfKdQHnCKMw|Hm!*w!pFIcXxLsWn}K2nEoS+lD4+AuWwgR_zs#yRX}lZaYAP1*_F|M z#4(;N5c?zunwG>Y`0vFU)#8C(!j&&gii(2!ySDbhhdv6DCQG5LtjvTH`$-TbN&>4$ zksP3=s)|fNAg`^B6IJl+&6&ursP-!?42p(^Mp8lH>B*7ov&dQ?WKc-8qDO)RR*)hY zzOJh)du2tFS|2p7fNF4fSXxF4jL|NDqvz~ONfIm>)+`WIxpNry_KOU(S08>7V`d5B z(9%C%9Mw>k3VvcslMe8Co7&^j{rS8X-*!7jJK}?fsp}Xxk&pzzKjr4w95ezsvibC6 zNd_8$Udz1i0(ythvc?Bjm>>z3{w|@5lZ8y5HLcU)<`-${(AWuHghy2}N|s=;AZ`w({~wd>*%2*E99% z_EQ?Si@!qxpEpRrNtV^uC*b1Z>dN8Z;qmtP0vTNmr7&!h;;217zEaA4!Kv7cLgf+@ zrIe=NoddgLl}Vu^CMSo?mY0y1M+EMM>@)k;9VkIft6cw2uC4b&j?vN4ovqJ{t+MKB zsOPP6y@<&K(; zZht0Uget0^zGc0?VVXaB$k^!Vazoc`)r>C=8wDkB)O1&8>lIMb{YpbjOq_l8Pa1Tw zoh;`mqq!m};EC(lg}c7Ko_ou{;pmrSd&BQ-P7s0d_~JiI!J@?p;IIbas~Uo?{H=O^ z1o?wovYPOf0y0)~u!xA4KGn--PHpXe$@%&DARfE~1qB7%^evabE4Qo7*j3xhC*Cfx zhhNFb*K1p!DP7)AsQCDkVFOFN-yP zizb(2(Hr)qZEfk}j6GQ+1m2a)caLKJ!1)6~RR4}91rHK^WSVE{pTxI(zWZ}>f?!0o zF2RLV-s9i4udA!ea^Liv$mVHbjTq1XKD9qdfq%5q^X|{s*lsMxCdl^92q7g0N9y^x zEek8_YNORW_S>fK)5gk$TYW>r%cO(fKq9#eNE(L&!QIg`B`s}qEH1~7P0yo;6^D=4 z2jGws)6+eNneEtdHS|5nfrg+`yD3WGz3)ltA#jQ|0bP|1t$OxEEfNQ#&tC!Xgdxr1$CeNCROFw- zj9|@9d*Z05sA)VcHeipG0xz&Yk@olZYuzriD=I2Ln78gWuKZF@=1Y@+_N&|X?VWia zc0|L#cW5e`#~T9ZdrX9?nzFq*f;~jeu)$IQm}B)ZnxBjL%w$q6>L*l�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 literal 0 HcmV?d00001