diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..a95a4f4
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+.vscode
+**.pdf
\ No newline at end of file
diff --git a/courses/sec2_chap1_deciphering_the_markets_with_technical_analysis.md b/courses/sec2_chap1_deciphering_the_markets_with_technical_analysis.md
deleted file mode 100644
index e69de29..0000000
diff --git a/courses/sec2_chap2_deciphering_the_markets_with_technical_analysis.md b/courses/sec2_chap2_deciphering_the_markets_with_technical_analysis.md
new file mode 100644
index 0000000..aa0d779
--- /dev/null
+++ b/courses/sec2_chap2_deciphering_the_markets_with_technical_analysis.md
@@ -0,0 +1,280 @@
+# Chap 2. Deciphering the Markets with Technical Analysis (使用技术分析来解密市场)
+
+本章目标:
+
+* 介绍流行的技术分析方法
+* 展示如何用来分析市场数据
+
+创造交易策略的基础:我们假设市场会不断重复自身。通过分析过往记录,市场数据的技术分析可分为两块:
+
+* chart pattern (图表): 此类技术分析通过识别交易的模式并预测他们何时会重复。比较应用于算法交易
+* technical indicator (技术指标): 使用数学来预测金融市场走向。指标有很多但可被归纳为
+ * trend (趋势)
+ * momentum (动量)
+ * volume (体量)
+ * volatility (波动)
+ * support and resistance (支撑与阻力)
+
+## 1. Designing a trading strategy based on trend- and momentum-based indicator (设计一个基于趋势和动能的指标)
+
+“趋势交易策略关注速度,动能交易策略关注加速度”
+
+* 趋势交易:
+ * 在分析历史价格数据时,如果价格不断上涨一定时间(天),我们就开多头仓位
+* 动能交易:
+ * 基于过往行为的强度来挂单
+ * price momentum 是一个价格动作的量
+ * 逻辑:an asset price with a strong movement in a given direction will keep going in the same direction in the future.
+
+### 1.1 Support and resistance indicators (支撑线、阻力线)
+
+* 当价格下跌到一定程度时,会有集中的需求导致下跌停止。当价格上涨到一定程度时,会有集中性的供给导致价格无法上升
+* Support line = 价格下跌的下限
+* Resistance line = 价格上涨的上限
+* 利用了买低卖高的市场心理
+
+![](sources/sec2/supportresistanceline.png)
+
+* 获取2015-07-01 至2018-01-01的GOOGLE的股票价格。
+* 画出了 support line (红线), resistence line (绿线)
+* 蓝线表示数据积累点 (200天)
+
+基于这个简单的技术分析,我们可以定出策略,在200天的数据积累后(蓝色虚线):
+
+* 股价高至 resistence line 后,挂空头仓位 (short the stock).
+* 股价低至 support line 后,挂多头仓位 (long the stock).
+
+实际效果:
+
+* 2016-08 后,GOOG 股价触发 resistance line, 算法开始持续做空 GOOGLE, 损失惨重。
+
+分析:
+
+* 即便 support & resistance indicator 有经济学逻辑,实际中需要对其进行矫正。例如:移动 support/resistance line.
+
+改进(增加特性):
+
+* 使用 rolling window 滚动窗口
+* 数股价触及支撑线或阻力线的数量
+* 加入 tolerance margin, 从而把支撑/阻力线的空间缩小(如下图)
+
+![](../img/2_1.jpg)
+
+方案选择(增加两种参数):
+
+* 价格触及 supporting/resistance line 的最少次数
+* 定一个 tolorance margine
+
+```
+ price sup_tolerance res_tolerance sup_count res_count sup res position signal
+Date
+2013-12-31 558.262512 NaN NaN NaN NaN NaN NaN NaN NaN
+2014-01-02 554.481689 NaN NaN NaN NaN NaN NaN NaN NaN
+2014-01-03 550.436829 NaN NaN NaN NaN NaN NaN NaN NaN
+2014-01-06 556.573853 NaN NaN NaN NaN NaN NaN NaN NaN
+2014-01-07 567.303589 NaN NaN NaN NaN NaN NaN NaN NaN
+... ... ... ... ... ... ... ... ... ...
+2017-12-22 1060.119995 1014.371997 1061.44801 NaN NaN 998.679993 1077.140015 0.0 1.0
+2017-12-26 1056.739990 1014.371997 1061.44801 NaN NaN 998.679993 1077.140015 0.0 1.0
+2017-12-27 1049.369995 1014.371997 1061.44801 NaN NaN 998.679993 1077.140015 0.0 1.0
+2017-12-28 1048.140015 1014.371997 1061.44801 NaN NaN 998.679993 1077.140015 0.0 1.0
+2017-12-29 1046.400024 1014.371997 1061.44801 NaN NaN 998.679993 1077.140015 0.0 1.0
+```
+
+代码完成:
+
+1. 在规定的滚动时间窗口内(默认20天)基于过去的数据计算支撑线、阻力线。
+2. 基于支撑线、阻力线,计算了20%的区域。
+3. 用diff()计算了下单的时间
+4. 当价格低于支撑线,到达支撑区间后(或者高于阻力线,到达阻力区间),我们会挂多头仓位(空头仓位)
+
+![](sources/sec2/supportresistanceline_improved.png)
+
+交易策略:
+
+* 当价格进入支撑线区域后连续两天,就可以买多仓
+* 价格进入阻力线区域后连续两天,买空仓
+
+## 2. Creating trading signals based on fundamental technical analysis (基于基本技术分析的交易算法)
+
+常用技术分析方法(指标):
+
+* Simple Moving Average (SMA) 简单移动平均线
+* Exponential Moving Average (EMA) 指数移动平均线
+* Absolute Price Oscillator (APO) 绝对价格震荡器
+* Moving Average Convergence Divergence (MACD) 指数平滑移动平均线
+* Bollinger Bands (BBANDS) 布林线指标
+* Relative Strength Indicator (RSI) 相对强弱和是
+
+* EMA是非常常用的时间序列技术指标
+* 类似于SMA,但是对价格的权重不是平均的
+* 背后的概念:
+ * 若模型使用“时间约近,权重越高”:追求更新的信息
+ * 若模型使用“时间越远,权重越高”:认为 longer-term trends 含有更多信息
+* 时间窗口:
+ * 越短:EMA 对新数据的反映越大; i.e. **Fast EMA**
+ * 越长:EMA 对新数据的反映月满; i.e. **Slow EMA**
+
+#### 基于旧EMA计算新EMA
+
+$$EMA = (P - EMA_{old})\times \mu + EMA_{old}$$
+
+or
+
+$$EMA = P \times \mu + (1-\mu) \times EMA_{old}$$
+
+where:
+
+* $P$ = 新的(当今)价格
+* $/pu$ = **smoothing factor**; 新的价格数据的 weight factor (权重), 经常被设置为 $\frac{2}{(n+1)}$
+* $N$ = 时间
+* $EMA_{old}$ = 之前的EMA数值
+
+![](sources/sec2/ema.png)
+
+* EMA 和 SMA 一样具有平滑作用,因此减少了噪音
+* EMA 中具有的 $\mu$ & $N$,可以让我们控制新进数据的权重。可以让我们通过不同的 $\mu$ & $N$ 建立不同的EMA
+
+### 2.3 绝对价格震荡器 (APO)
+
+* APO 为一种技术指标:通过价格的移动平均数值来捕捉价格在短期内的背离
+* 计算方法:计算 Fast EMA 和 Slow EMA 时间的价差。
+* 背后的逻辑:试图衡量 $EMA_{fast}$ 背离 $EMA_{slow}$ 多远。更大的背离标志着两种情况
+ * 金融资产价格开始出现趋势或者准备爆发
+ * 金融资产价格已经偏离平衡,要么是被低估或者高估
+
+$$APO = EMA_{fast} - EMA_{slow}$$
+
+下面案例使用了 $N=2/11$ 和 $N=2/41$ 的 APO
+
+![](sources/sec2/apo.png)
+
+* $EMA_{fast}$ 对新价格的的波动性更敏感,而 $SMA_{slow}$ 衰退得更加慢
+* 当股价价格向上爆发的时候 APO 为正;而且爆发程度越强 APO 绝对值越高
+
+这个信号可以用来做交易策略
+
+### 2.4 指数平滑移动平均线 (MACD)
+
+* MACD 是一种基于APO的指标
+* 计算方法:
+ * 在计算 APO 后,我们对其再做一次 EMA,从而得到一个MACD信号 ($MACD_{Signal}$)
+ * 或者,在$MACD_{Signal}$基础上生成histogram
+
+$$MACD = EMA_{Fast} - EMA_{Slow}$$
+$$MACD_{Signal} = EMA_{MACD}$$
+$$MACD_{Histogram} = MACD-MACD_{Signal}$$
+
+一个成功的 $MACD_{signal}$ 可以捕获金融产品的方向、趋势和时间长度
+
+![](sources/sec2/macd.png)
+
+* $EMA_{MACD}$ 在 MACD(APO)上在加了一层平滑。
+* $MACD_{Histogram}$ 捕获了两个点:
+ * 趋势开始或者回归的时间
+ * 当$MACD_{Histogram}$值在反转正负以后,趋势持续的强度 (magnitude of lasting trends when $MACD_{Histogram}$ values stay positive or negative after reversing signs)
+
+### 2.5 布林线指标 (BBANDS)
+
+Bollinger Bands:
+
+* 一种著名的技术分析指标,由 John Bollinger 发明
+* 计算方式(类似 6-sigma):
+ * 1. 使用一个时间窗口,计算 moving average (SMA, EMA 都可)
+ * 2. 计算这个时间窗口的 standard deviation
+ * 3. Upper Band = moving average 加上 standard deviation 的倍数
+ * 4. Lower Band = moving average 减去 standard deviation 的倍数
+* BBAND 代表了对价格波动性的预估。若价格到了BBAND之外,那就是一个交易信号。
+
+$$BBAND_{Middle} = SMA_{n-periods}$$
+
+* Lower Bollinger band $BBAND_{Middle}$ 是前n个时段的SMA (.e.g. 过去n天)
+
+$$BBAND_{Upper} = BBAND_{Middle} + (\beta * \delta)$$
+$$BBAND_{Lower} = BBAND_{Middle} - (\beta * \delta)$$
+
+* $\delta$ 是standard deviation
+* $\beta$ 是 standard deviation factor,由我们选择; $\beta$ 越大,BBAND越大
+
+![](../bbands.png)
+
+### 2.6 相对强弱指标 (RSI)
+
+* RSI通过比较一段时期内的平均收盘涨数和平均收盘跌数来分析市场买沽盘的意向和实力,从而作出未来市场的走势
+* RSI在1978年6月由Wells Wider创制的一种通过特定时期内股价的变动情况计算市场买卖力量对比,来判断股票价格内部本质强弱、推测价格未来的变动方向的技术指标。
+
+> RSI=[上升平均数÷(上升平均数+下跌平均数)]×100;
+> 上升平均数是在某一段日子里升幅数的平均而下跌平均数则是在同一段日子里跌幅数的平均。
+
+计算方法, 在lookback时间段内:
+
+1. 计算magnitude of average of gains/losses over the period
+
+$$AbsoluteGainOverPeriod = Price - PreviousPrice$$
+
+$$AbsoluteLossOverPeriod = PreviousPrice - Price$$
+
+$$RelativeStrength(RS) = \frac{\frac{\sum AbsoluteGainsOverLastNPeriods}{n}}{\frac{\sum AbsoluteLossesOverLastNPeriods}{n}}$$
+
+可被简化为:
+
+$$RelativeStrength(RS) = \frac{\sum AbsoluteGainsOverLastNPeriods}{\sum AbsoluteLossesOverLastNPeriods}$$
+
+$$RelativeStrengthIndicator(RSI) = 100 - \frac{100}{(1+RS)}$$
+
+![](sources/sec2/rsi.png)
+
+* 上图使用了20天作为时间区域来计算上升平均数与下降平均数
+* 上图说明了上升平均数基本上高于下降平均数,这与GOOG成功的股价直接相关
+
+### 2.7 标准差 (STDEV)
+
+**Standard deviation** = **STDEV**, 是金融资产价格波动性的体现,可被用于结合其他的指标。
+
+计算方法:
+
+1. 先计算 variance:
+
+$$\sigma ^2 = \frac{\sum^n_{i=1}(P_i - SMA)^2}{n}$$
+
+SMA = simple moving average over n time periods
+
+2. 计算标准差:
+
+$$\sigma = \sqrt{\sigma^2}$$
+
+![](sources/sec2/stdev.png)
+
+### 2.8 动量指标 (MOM)
+
+MOM 为一个对价格移动的速度和量的衡量指标。可用作 trend/breakout-based trading algorithms.
+
+$$MOM = Price_i - Price_{t-n}$$
+
+* $Price_t$ 为在t时间的价格
+* $Price_{t-n}$ 在t时间之前n个时间片段的价格
+
+MOM的含义:
+
+* 持续为正的MOM表示上升趋势
+
+![](sources/sec2/momentum.png)
+
+上图所示:
+
+* MOM揭示了相比于20天前的股价,股价何时会有大幅变动
+
+## 3. Implementing advanced concepts in trading instruments
+
+### 3.1 季节性
+
+金融产品价格会有季节性(周期性):每周,每月,每个假期, 例如下图
+
+![](sources/sec2/seasonality.png)
+
+* GOOG的从2001到2018的每月平均股价在10月有明显偏高
+
+### 3.2 Time Series analysis
+
+时间序列分析因为较为advanced,因此这里暂时略过
+
diff --git a/courses/sources/chap2.ipynb b/courses/sources/chap2.ipynb
new file mode 100644
index 0000000..470aeca
--- /dev/null
+++ b/courses/sources/chap2.ipynb
@@ -0,0 +1,407 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Chap 2. Deciphering the Markets with Technical Analysis\n",
+ "\n",
+ "### 1.1 Support and Resistance Line"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import pandas as pd\n",
+ "from pandas_datareader import data\n",
+ "\n",
+ "start_date = '2014-01-01'\n",
+ "end_date = '2018-01-01'\n",
+ "SRC_DATA_FILENAME = 'goog_data.pkl'\n",
+ "\n",
+ "try:\n",
+ " goog_data2 = pd.read_pickle(SRC_DATA_FILENAME)\n",
+ "except FileNotFoundError:\n",
+ " goog_data2 = data.DataReader('GOOG', 'yahoo', start_date, end_date)\n",
+ " goog_data2.to_pickle(SRC_DATA_FILENAME)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "把GOOGLE数据下载下来"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": " High Low Open Close Volume \\\nDate \n2015-07-17 674.468018 645.000000 649.000000 672.929993 11164900.0 \n2015-07-20 668.880005 653.010010 659.239990 663.020020 5860900.0 \n2015-07-21 673.000000 654.299988 655.210022 662.299988 3377200.0 \n2015-07-22 678.640015 659.000000 660.890015 662.099976 3929300.0 \n2015-07-23 663.630005 641.000000 661.270020 644.280029 3029100.0 \n... ... ... ... ... ... \n2017-12-22 1064.199951 1059.439941 1061.109985 1060.119995 755100.0 \n2017-12-26 1060.119995 1050.199951 1058.069946 1056.739990 760600.0 \n2017-12-27 1058.369995 1048.050049 1057.390015 1049.369995 1271900.0 \n2017-12-28 1054.750000 1044.770020 1051.599976 1048.140015 837100.0 \n2017-12-29 1049.699951 1044.900024 1046.719971 1046.400024 887500.0 \n\n Adj Close \nDate \n2015-07-17 672.929993 \n2015-07-20 663.020020 \n2015-07-21 662.299988 \n2015-07-22 662.099976 \n2015-07-23 644.280029 \n... ... \n2017-12-22 1060.119995 \n2017-12-26 1056.739990 \n2017-12-27 1049.369995 \n2017-12-28 1048.140015 \n2017-12-29 1046.400024 \n\n[620 rows x 6 columns]",
+ "text/html": "
\n\n
\n \n \n \n High \n Low \n Open \n Close \n Volume \n Adj Close \n \n \n Date \n \n \n \n \n \n \n \n \n \n \n 2015-07-17 \n 674.468018 \n 645.000000 \n 649.000000 \n 672.929993 \n 11164900.0 \n 672.929993 \n \n \n 2015-07-20 \n 668.880005 \n 653.010010 \n 659.239990 \n 663.020020 \n 5860900.0 \n 663.020020 \n \n \n 2015-07-21 \n 673.000000 \n 654.299988 \n 655.210022 \n 662.299988 \n 3377200.0 \n 662.299988 \n \n \n 2015-07-22 \n 678.640015 \n 659.000000 \n 660.890015 \n 662.099976 \n 3929300.0 \n 662.099976 \n \n \n 2015-07-23 \n 663.630005 \n 641.000000 \n 661.270020 \n 644.280029 \n 3029100.0 \n 644.280029 \n \n \n ... \n ... \n ... \n ... \n ... \n ... \n ... \n \n \n 2017-12-22 \n 1064.199951 \n 1059.439941 \n 1061.109985 \n 1060.119995 \n 755100.0 \n 1060.119995 \n \n \n 2017-12-26 \n 1060.119995 \n 1050.199951 \n 1058.069946 \n 1056.739990 \n 760600.0 \n 1056.739990 \n \n \n 2017-12-27 \n 1058.369995 \n 1048.050049 \n 1057.390015 \n 1049.369995 \n 1271900.0 \n 1049.369995 \n \n \n 2017-12-28 \n 1054.750000 \n 1044.770020 \n 1051.599976 \n 1048.140015 \n 837100.0 \n 1048.140015 \n \n \n 2017-12-29 \n 1049.699951 \n 1044.900024 \n 1046.719971 \n 1046.400024 \n 887500.0 \n 1046.400024 \n \n \n
\n
620 rows × 6 columns
\n
"
+ },
+ "metadata": {},
+ "execution_count": 2
+ }
+ ],
+ "source": [
+ "goog_data = goog_data2.tail(620)\n",
+ "lows = goog_data['Low']\n",
+ "highs = goog_data['High']\n",
+ "goog_data"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "display_data",
+ "data": {
+ "text/plain": "",
+ "image/svg+xml": "\n\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n",
+ "image/png": "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\n"
+ },
+ "metadata": {
+ "needs_background": "light"
+ }
+ }
+ ],
+ "source": [
+ "import matplotlib.pyplot as plt\n",
+ "fig = plt.figure()\n",
+ "ax1 = fig.add_subplot(111, ylabel='Google price in $')\n",
+ "highs.plot(ax=ax1, color='c', lw=2.)\n",
+ "lows.plot(ax=ax1, color='y', lw=2.)\n",
+ "\n",
+ "# Return the first 200 rows using pandas.DataFrame.head(200)\n",
+ "plt.hlines(highs.head(200).max(), lows.index.values[0], lows.index.values[-1], linewidth=2, color='g') \n",
+ "plt.hlines(lows.head(200).min(), lows.index.values[0], lows.index.values[-1], linewidth=2, color='r')\n",
+ "plt.axvline(linewidth=2, color='b', x=lows.index.values[200], linestyle=':')\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "* 获取2015-07-01 至2018-01-01的GOOGLE的股票价格。\n",
+ "* 画出了 support line (红线), resistence line (绿线)\n",
+ "* 蓝线表示数据积累点 (200天)\n",
+ "\n",
+ "基于这个简单的技术分析,我们可以定出策略,在200天的数据积累后(蓝色虚线):\n",
+ "\n",
+ "* 股价高至 resistence line 后,挂空头仓位 (short the stock).\n",
+ "* 股价低至 support line 后,挂多头仓位 (long the stock).\n",
+ "\n",
+ "实际效果:\n",
+ "\n",
+ "* 2016-08 后,GOOG 股价触发 resistance line, 算法开始持续做空 GOOGLE, 损失惨重。\n",
+ "\n",
+ "分析: \n",
+ "\n",
+ "* 即便 support & resistance indicator 有经济学逻辑,实际中需要对其进行矫正。例如:移动 support/resistance line.\n",
+ "\n",
+ "改进(增加特性):\n",
+ "\n",
+ "* 使用 rolling window 滚动窗口\n",
+ "* 数股价触及支撑线或阻力线的数量\n",
+ "* 加入 tolerance margin, 从而把支撑/阻力线的空间缩小(如下图)\n",
+ "\n",
+ "![](../../img/2_1.jpg)\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "方案选择(增加两种参数):\n",
+ "\n",
+ "* 价格触及 supporting/resistance line 的最少次数\n",
+ "* 定一个 tolorance margine"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": "File data found...reading GOOG data\n"
+ }
+ ],
+ "source": [
+ "import pandas as pd\n",
+ "import numpy as np\n",
+ "from pandas_datareader import data\n",
+ "\n",
+ "start_date = '2014-01-01'\n",
+ "end_date = '2018-01-01'\n",
+ "SRC_DATA_FILENAME = 'goog_data.pkl'\n",
+ "\n",
+ "try:\n",
+ " goog_data = pd.read_pickle(SRC_DATA_FILENAME)\n",
+ " print('File data found...reading GOOG data')\n",
+ "except FileNotFoundError:\n",
+ " print('File not found...downloading the GOOG data')\n",
+ " goog_data = data.DataReader('GOOG', 'yahoo', start_date, end_date)\n",
+ " goog_data.to_pickle(SRC_DATA_FILENAME)\n",
+ "\n",
+ "goog_data_signal = pd.DataFrame(index=goog_data.index)\n",
+ "goog_data_signal['price'] = goog_data['Adj Close']"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import numpy as np\n",
+ "def trading_support_resistance(data, bin_width=20):\n",
+ "\n",
+ " data['sup_tolerance'] = pd.Series(np.zeros(len(data))) # tolerance of support line\n",
+ " data['res_tolerance'] = pd.Series(np.zeros(len(data))) # tolerance of resistance line\n",
+ "\n",
+ " data['sup_count'] = pd.Series(np.zeros(len(data))) # number of hitting support line\n",
+ " data['res_count'] = pd.Series(np.zeros(len(data)))\n",
+ "\n",
+ " data['sup'] = pd.Series(np.zeros(len(data))) # support line value (constant)\n",
+ " data['res'] = pd.Series(np.zeros(len(data)))\n",
+ "\n",
+ " data['position'] = pd.Series(np.zeros(len(data)))\n",
+ " data['signal'] = pd.Series(np.zeros(len(data)))\n",
+ "\n",
+ " in_support = 0\n",
+ " in_resistance = 0\n",
+ "\n",
+ " for x in range((bin_width-1) + bin_width, len(data)):\n",
+ " data_section = data[x-bin_width : x+1] # get data within rolling window\n",
+ " \n",
+ " support_level = min(data_section['price'])\n",
+ " resistance_level = max(data_section['price'])\n",
+ " range_level = resistance_level - support_level\n",
+ "\n",
+ " data['res'][x] = resistance_level\n",
+ " data['sup'][x] = support_level\n",
+ "\n",
+ " data['sup_tolerance'][x] = support_level + 0.2*range_level # 20% tolorance\n",
+ " data['res_tolerance'][x] = resistance_level - 0.2*range_level\n",
+ "\n",
+ " if (data['price'][x] >= data['res_tolerance'][x]) and (data['price'][x] <= data['res'][x]):\n",
+ " # if price is within resistance tolerance region\n",
+ " in_resistance += 1\n",
+ " data['res_count'][x] = in_resistance\n",
+ " elif (data['price'][x] <= data['sup_tolerance'][x]) and (data['price'][x] >= data['sup'][x]):\n",
+ " # price is within support tolerance region\n",
+ " in_support += 1\n",
+ " data['sup_count'][x] = in_support\n",
+ " else:\n",
+ " # if not within any region, clear count\n",
+ " in_support = 0\n",
+ " in_resistance = 0\n",
+ "\n",
+ " if in_resistance > 2:\n",
+ " # If enter resistance region twice\n",
+ " data['signal'][x] = 1\n",
+ " elif in_support > 2:\n",
+ " data['signal'][x] = 0\n",
+ " else:\n",
+ " data['signal'][x] = data['signal'][x-1]\n",
+ " \n",
+ " data['position'] = data['signal'].diff()\n",
+ "\n",
+ "trading_support_resistance(goog_data_signal)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "上述代码完成了\n",
+ "\n",
+ "* 在规定的滚动时间窗口内(默认20天)基于过去的数据计算支撑线、阻力线。\n",
+ "* 基于支撑线、阻力线,计算了20%的区域。\n",
+ "* 用diff()计算了下单的时间\n",
+ "* 当价格低于支撑线,到达支撑区间后(或者高于阻力线,到达阻力区间),我们会挂多头仓位(空头仓位)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": " price sup_tolerance res_tolerance sup_count res_count \\\nDate \n2013-12-31 558.262512 NaN NaN NaN NaN \n2014-01-02 554.481689 NaN NaN NaN NaN \n2014-01-03 550.436829 NaN NaN NaN NaN \n2014-01-06 556.573853 NaN NaN NaN NaN \n2014-01-07 567.303589 NaN NaN NaN NaN \n... ... ... ... ... ... \n2017-12-22 1060.119995 1014.371997 1061.44801 NaN NaN \n2017-12-26 1056.739990 1014.371997 1061.44801 NaN NaN \n2017-12-27 1049.369995 1014.371997 1061.44801 NaN NaN \n2017-12-28 1048.140015 1014.371997 1061.44801 NaN NaN \n2017-12-29 1046.400024 1014.371997 1061.44801 NaN NaN \n\n sup res position signal \nDate \n2013-12-31 NaN NaN NaN NaN \n2014-01-02 NaN NaN NaN NaN \n2014-01-03 NaN NaN NaN NaN \n2014-01-06 NaN NaN NaN NaN \n2014-01-07 NaN NaN NaN NaN \n... ... ... ... ... \n2017-12-22 998.679993 1077.140015 0.0 1.0 \n2017-12-26 998.679993 1077.140015 0.0 1.0 \n2017-12-27 998.679993 1077.140015 0.0 1.0 \n2017-12-28 998.679993 1077.140015 0.0 1.0 \n2017-12-29 998.679993 1077.140015 0.0 1.0 \n\n[1008 rows x 9 columns]",
+ "text/html": "\n\n
\n \n \n \n price \n sup_tolerance \n res_tolerance \n sup_count \n res_count \n sup \n res \n position \n signal \n \n \n Date \n \n \n \n \n \n \n \n \n \n \n \n \n \n 2013-12-31 \n 558.262512 \n NaN \n NaN \n NaN \n NaN \n NaN \n NaN \n NaN \n NaN \n \n \n 2014-01-02 \n 554.481689 \n NaN \n NaN \n NaN \n NaN \n NaN \n NaN \n NaN \n NaN \n \n \n 2014-01-03 \n 550.436829 \n NaN \n NaN \n NaN \n NaN \n NaN \n NaN \n NaN \n NaN \n \n \n 2014-01-06 \n 556.573853 \n NaN \n NaN \n NaN \n NaN \n NaN \n NaN \n NaN \n NaN \n \n \n 2014-01-07 \n 567.303589 \n NaN \n NaN \n NaN \n NaN \n NaN \n NaN \n NaN \n NaN \n \n \n ... \n ... \n ... \n ... \n ... \n ... \n ... \n ... \n ... \n ... \n \n \n 2017-12-22 \n 1060.119995 \n 1014.371997 \n 1061.44801 \n NaN \n NaN \n 998.679993 \n 1077.140015 \n 0.0 \n 1.0 \n \n \n 2017-12-26 \n 1056.739990 \n 1014.371997 \n 1061.44801 \n NaN \n NaN \n 998.679993 \n 1077.140015 \n 0.0 \n 1.0 \n \n \n 2017-12-27 \n 1049.369995 \n 1014.371997 \n 1061.44801 \n NaN \n NaN \n 998.679993 \n 1077.140015 \n 0.0 \n 1.0 \n \n \n 2017-12-28 \n 1048.140015 \n 1014.371997 \n 1061.44801 \n NaN \n NaN \n 998.679993 \n 1077.140015 \n 0.0 \n 1.0 \n \n \n 2017-12-29 \n 1046.400024 \n 1014.371997 \n 1061.44801 \n NaN \n NaN \n 998.679993 \n 1077.140015 \n 0.0 \n 1.0 \n \n \n
\n
1008 rows × 9 columns
\n
"
+ },
+ "metadata": {},
+ "execution_count": 6
+ }
+ ],
+ "source": [
+ "goog_data_signal"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": " price sup_tolerance res_tolerance sup_count res_count \\\nDate \n2013-12-31 558.262512 NaN NaN NaN NaN \n2014-01-02 554.481689 NaN NaN NaN NaN \n2014-01-03 550.436829 NaN NaN NaN NaN \n2014-01-06 556.573853 NaN NaN NaN NaN \n2014-01-07 567.303589 NaN NaN NaN NaN \n... ... ... ... ... ... \n2017-12-22 1060.119995 1014.371997 1061.44801 NaN NaN \n2017-12-26 1056.739990 1014.371997 1061.44801 NaN NaN \n2017-12-27 1049.369995 1014.371997 1061.44801 NaN NaN \n2017-12-28 1048.140015 1014.371997 1061.44801 NaN NaN \n2017-12-29 1046.400024 1014.371997 1061.44801 NaN NaN \n\n sup res position signal \nDate \n2013-12-31 NaN NaN NaN NaN \n2014-01-02 NaN NaN NaN NaN \n2014-01-03 NaN NaN NaN NaN \n2014-01-06 NaN NaN NaN NaN \n2014-01-07 NaN NaN NaN NaN \n... ... ... ... ... \n2017-12-22 998.679993 1077.140015 0.0 1.0 \n2017-12-26 998.679993 1077.140015 0.0 1.0 \n2017-12-27 998.679993 1077.140015 0.0 1.0 \n2017-12-28 998.679993 1077.140015 0.0 1.0 \n2017-12-29 998.679993 1077.140015 0.0 1.0 \n\n[1008 rows x 9 columns]",
+ "text/html": "\n\n
\n \n \n \n price \n sup_tolerance \n res_tolerance \n sup_count \n res_count \n sup \n res \n position \n signal \n \n \n Date \n \n \n \n \n \n \n \n \n \n \n \n \n \n 2013-12-31 \n 558.262512 \n NaN \n NaN \n NaN \n NaN \n NaN \n NaN \n NaN \n NaN \n \n \n 2014-01-02 \n 554.481689 \n NaN \n NaN \n NaN \n NaN \n NaN \n NaN \n NaN \n NaN \n \n \n 2014-01-03 \n 550.436829 \n NaN \n NaN \n NaN \n NaN \n NaN \n NaN \n NaN \n NaN \n \n \n 2014-01-06 \n 556.573853 \n NaN \n NaN \n NaN \n NaN \n NaN \n NaN \n NaN \n NaN \n \n \n 2014-01-07 \n 567.303589 \n NaN \n NaN \n NaN \n NaN \n NaN \n NaN \n NaN \n NaN \n \n \n ... \n ... \n ... \n ... \n ... \n ... \n ... \n ... \n ... \n ... \n \n \n 2017-12-22 \n 1060.119995 \n 1014.371997 \n 1061.44801 \n NaN \n NaN \n 998.679993 \n 1077.140015 \n 0.0 \n 1.0 \n \n \n 2017-12-26 \n 1056.739990 \n 1014.371997 \n 1061.44801 \n NaN \n NaN \n 998.679993 \n 1077.140015 \n 0.0 \n 1.0 \n \n \n 2017-12-27 \n 1049.369995 \n 1014.371997 \n 1061.44801 \n NaN \n NaN \n 998.679993 \n 1077.140015 \n 0.0 \n 1.0 \n \n \n 2017-12-28 \n 1048.140015 \n 1014.371997 \n 1061.44801 \n NaN \n NaN \n 998.679993 \n 1077.140015 \n 0.0 \n 1.0 \n \n \n 2017-12-29 \n 1046.400024 \n 1014.371997 \n 1061.44801 \n NaN \n NaN \n 998.679993 \n 1077.140015 \n 0.0 \n 1.0 \n \n \n
\n
1008 rows × 9 columns
\n
"
+ },
+ "metadata": {},
+ "execution_count": 7
+ }
+ ],
+ "source": [
+ "goog_data_signal"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "display_data",
+ "data": {
+ "text/plain": "",
+ "image/svg+xml": "\n\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n",
+ "image/png": "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\n"
+ },
+ "metadata": {
+ "needs_background": "light"
+ }
+ }
+ ],
+ "source": [
+ "import matplotlib.pyplot as plt\n",
+ "\n",
+ "fig = plt.figure()\n",
+ "ax1 = fig.add_subplot(111, ylabel='Google price in $')\n",
+ "goog_data_signal['sup'].plot(ax=ax1, color='g', lw=2.)\n",
+ "goog_data_signal['res'].plot(ax=ax1, color='b', lw=2.)\n",
+ "goog_data_signal['price'].plot(ax=ax1, color='r', lw=2.)\n",
+ "\n",
+ "ax1.plot(goog_data_signal.loc[goog_data_signal.position == 1.0].index,\n",
+ " goog_data_signal.price[goog_data_signal.position == 1.0], '^', markersize=7, color='k', label='buy')\n",
+ "ax1.plot(goog_data_signal.loc[goog_data_signal.position == -1.0].index,\n",
+ " goog_data_signal.price[goog_data_signal.position == -1.0], 'v', markersize=7, color='k', label='sell')\n",
+ "\n",
+ "plt.legend()\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "交易策略:\n",
+ "\n",
+ "* 当价格进入支撑线区域后连续两天,就可以买多仓\n",
+ "* 价格进入阻力线区域后连续两天,买空仓"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## 2. Creating trading signals based on fundamental technical analysis\n",
+ "\n",
+ "## SMA"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "display_data",
+ "data": {
+ "text/plain": "",
+ "image/svg+xml": "\n\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n",
+ "image/png": "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\n"
+ },
+ "metadata": {
+ "needs_background": "light"
+ }
+ }
+ ],
+ "source": [
+ "import statistics as stats\n",
+ "\n",
+ "time_period = 20 # number of days over which to average\n",
+ "history = [] # to track a history of prices\n",
+ "sma_values = [] \n",
+ "\n",
+ "for close_price in goog_data['Adj Close']:\n",
+ " history.append(close_price)\n",
+ " if len(history) > time_period:\n",
+ " del(history[0])\n",
+ " sma_values.append(stats.mean(history))\n",
+ "\n",
+ "goog_data = goog_data.assign(ClosePrice=pd.Series(goog_data['Adj Close'], index=goog_data.index))\n",
+ "goog_data = goog_data.assign(Simple20DayMovingAverage=pd.Series(sma_values, index=goog_data.index))\n",
+ "close_price = goog_data['ClosePrice']\n",
+ "sma = goog_data['Simple20DayMovingAverage']\n",
+ "\n",
+ "import matplotlib.pyplot as plt\n",
+ "\n",
+ "fig = plt.figure()\n",
+ "ax1 = fig.add_subplot(111, ylabel='Google price in $')\n",
+ "close_price.plot(ax=ax1, color='g', lw=2., legend=True)\n",
+ "sma.plot(ax=ax1, color='r', lw=2., legend=True)\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "20日SMA线消除了部分噪音"
+ ]
+ }
+ ],
+ "metadata": {
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.8.3-final"
+ },
+ "orig_nbformat": 2,
+ "kernelspec": {
+ "name": "python3",
+ "display_name": "Python 3"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
\ No newline at end of file
diff --git a/courses/sources/sec2/apo.png b/courses/sources/sec2/apo.png
new file mode 100644
index 0000000..eb6a06d
Binary files /dev/null and b/courses/sources/sec2/apo.png differ
diff --git a/courses/sources/sec2/apo.py b/courses/sources/sec2/apo.py
new file mode 100644
index 0000000..450b9ca
--- /dev/null
+++ b/courses/sources/sec2/apo.py
@@ -0,0 +1,75 @@
+import os
+import time
+import statistics
+from matplotlib.pyplot import legend, ylabel
+import pandas as pd
+import numpy as np
+from pandas_datareader import data
+
+dir_path = os.path.dirname(os.path.realpath(__file__))
+
+start_date = '2014-01-01'
+end_date = '2018-01-01'
+SRC_DATA_FILENAME = dir_path+'/goog_data.pkl'
+
+try:
+ goog_data = pd.read_pickle(SRC_DATA_FILENAME)
+ print('File data found...reading GOOG data')
+except FileNotFoundError:
+ print('File not found...downloading the GOOG data')
+ goog_data = data.DataReader('GOOG', 'yahoo', start_date, end_date)
+ goog_data.to_pickle(SRC_DATA_FILENAME)
+
+goog_data_signal = pd.DataFrame(index=goog_data.index)
+goog_data_signal['price'] = goog_data['Adj Close']
+close = goog_data_signal['price']
+
+exe_start_time = time.time()
+
+""" Calculate APO """
+
+num_periods_fast = 10 # time period for the fast EMA
+K_fast = 2/(num_periods_fast + 1)
+ema_fast = 0
+
+num_periods_slow = 40
+K_slow = 2/(num_periods_slow + 1)
+ema_slow = 0
+
+ema_fast_values = [] # Hold fast EMA values for visualization purposes
+ema_slow_values = [] # Hold slow EMA values for visualization purposes
+apo_values = []
+
+for close_price in close:
+ if (ema_fast == 0):
+ ema_fast = close_price
+ ema_slow = close_price
+ else:
+ ema_fast = (close_price - ema_fast) * K_fast + ema_fast
+ ema_slow = (close_price - ema_slow) * K_slow + ema_slow
+
+ ema_fast_values.append(ema_fast)
+ ema_slow_values.append(ema_slow)
+ apo_values.append(ema_fast - ema_slow)
+
+""" Visualizing """
+goog_data = goog_data.assign(ClosePrice=pd.Series(close, index=goog_data.index))
+goog_data = goog_data.assign(FastExponential10DayMovingAverage=pd.Series(ema_fast_values, index=goog_data.index))
+goog_data = goog_data.assign(SlowExponential140DayMovingAverage=pd.Series(ema_slow_values, index=goog_data.index))
+goog_data = goog_data.assign(AbsolutePriceOscillator=pd.Series(apo_values, index=goog_data.index))
+close_price = goog_data['ClosePrice']
+ema_f = goog_data['FastExponential10DayMovingAverage']
+ema_s = goog_data['SlowExponential140DayMovingAverage']
+apo = goog_data['AbsolutePriceOscillator']
+
+import matplotlib.pyplot as plt
+fig = plt.figure()
+ax1 = fig.add_subplot(211, ylabel='Google price in $')
+close_price.plot(ax=ax1, color='g', lw=2., legend=True)
+ema_f.plot(ax=ax1, color='b', lw=2., legend=True)
+ema_s.plot(ax=ax1, color='r', lw=2., legend=True)
+ax2 = fig.add_subplot(212, ylabel='APO')
+apo.plot(ax=ax2, color='black', lw=2., legend=True)
+plt.savefig(dir_path + "/apo.png")
+plt.show()
+
diff --git a/courses/sources/sec2/bbands.png b/courses/sources/sec2/bbands.png
new file mode 100644
index 0000000..d00181c
Binary files /dev/null and b/courses/sources/sec2/bbands.png differ
diff --git a/courses/sources/sec2/bbands.py b/courses/sources/sec2/bbands.py
new file mode 100644
index 0000000..9032814
--- /dev/null
+++ b/courses/sources/sec2/bbands.py
@@ -0,0 +1,73 @@
+import os
+import time
+import statistics
+import pandas as pd
+import numpy as np
+from pandas_datareader import data
+
+dir_path = os.path.dirname(os.path.realpath(__file__))
+
+start_date = '2014-01-01'
+end_date = '2018-01-01'
+SRC_DATA_FILENAME = dir_path + '/goog_data.pkl'
+
+try:
+ goog_data = pd.read_pickle(SRC_DATA_FILENAME)
+ print('File data found...reading GOOG data')
+except FileNotFoundError:
+ print('File not found...downloading the GOOG data')
+ goog_data = data.DataReader('GOOG', 'yahoo', start_date, end_date)
+ goog_data.to_pickle(SRC_DATA_FILENAME)
+
+goog_data_signal = pd.DataFrame(index=goog_data.index)
+goog_data_signal['price'] = goog_data['Adj Close']
+close = goog_data_signal['price']
+exe_start_time = time.time()
+
+import statistics as stats
+import math as math
+
+time_period = 20 # history length for Simple Moving Average for middle band
+stdev_factor = 2 # Standard Deviation Scaling factor for the upper and lower bands
+
+history = []
+sma_values = []
+upper_band = []
+lower_band = []
+
+""" Calculate BBAND """
+
+for close_price in close:
+ history.append(close_price)
+ if len(history) > time_period:
+ del(history[0])
+
+ sma = stats.mean(history) # BBAND_Middle
+ sma_values.append(sma)
+
+ variance = 0
+
+ # Calculate variance using pure python
+ for hist_price in history:
+ variance = variance + ((hist_price - sma) ** 2)
+
+ stdev = math.sqrt(variance / len(history))
+ upper_band.append(sma + stdev_factor * stdev)
+ lower_band.append(sma - stdev_factor * stdev)
+
+""" Draw Gragh """
+goog_data = goog_data.assign(ClosePrice=pd.Series(close, index=goog_data.index))
+goog_data = goog_data.assign(MiddleBollingerBand20DaySMA=pd.Series(sma_values, index=goog_data.index))
+goog_data = goog_data.assign(UpperBollingerBand20DaysSMA2StddevFactor=pd.Series(upper_band, index=goog_data.index))
+goog_data = goog_data.assign(LowerBollingerBand20DaysSMA2StddevFactor=pd.Series(lower_band, index=goog_data.index))
+
+import matplotlib.pyplot as plt
+
+fig = plt.figure()
+ax1 = fig.add_subplot(111, ylabel='Google price in $')
+goog_data['ClosePrice'].plot(ax=ax1, color='g', lw=2., legend=True)
+goog_data['MiddleBollingerBand20DaySMA'].plot(ax=ax1, color='b', lw=2., legend=True)
+goog_data['UpperBollingerBand20DaysSMA2StddevFactor'].plot(ax=ax1, color='y', lw=2., legend=True)
+goog_data['LowerBollingerBand20DaysSMA2StddevFactor'].plot(ax=ax1, color='r', lw=2., legend=True)
+plt.savefig(dir_path + '/bbands.png')
+plt.show()
\ No newline at end of file
diff --git a/courses/sources/sec2/ema.png b/courses/sources/sec2/ema.png
new file mode 100644
index 0000000..0cc8da2
Binary files /dev/null and b/courses/sources/sec2/ema.png differ
diff --git a/courses/sources/sec2/ema.py b/courses/sources/sec2/ema.py
new file mode 100644
index 0000000..e91290e
--- /dev/null
+++ b/courses/sources/sec2/ema.py
@@ -0,0 +1,58 @@
+import os
+import time
+import statistics
+from matplotlib.pyplot import ylabel
+import pandas as pd
+import numpy as np
+from pandas_datareader import data
+
+dir_path = os.path.dirname(os.path.realpath(__file__))
+
+start_date = '2014-01-01'
+end_date = '2018-01-01'
+SRC_DATA_FILENAME = dir_path + '/goog_data.pkl'
+
+try:
+ goog_data = pd.read_pickle(SRC_DATA_FILENAME)
+ print('File data found...reading GOOG data')
+except FileNotFoundError:
+ print('File not found...downloading the GOOG data')
+ goog_data = data.DataReader('GOOG', 'yahoo', start_date, end_date)
+ goog_data.to_pickle(SRC_DATA_FILENAME)
+
+goog_data_signal = pd.DataFrame(index=goog_data.index)
+goog_data_signal['price'] = goog_data['Adj Close']
+close = goog_data_signal['price']
+
+exe_start_time = time.time()
+
+""" Calculate EMA """
+
+num_periods = 20 # number of days over which to average
+K = 2/(num_periods + 1) # smoothing constant
+ema_p = 0
+ema_values = []
+
+for close_price in close:
+ if (ema_p == 0):
+ # first observation, EMA = current price
+ ema_p = close_price
+ else:
+ ema_p = (close_price - ema_p) * K + ema_p
+
+ ema_values.append(ema_p)
+
+goog_data = goog_data.assign(ClosePrice=pd.Series(close, index=goog_data.index))
+goog_data = goog_data.assign(Exponential120DayMovingAverage=pd.Series(ema_values, index=goog_data.index))
+close_price = goog_data['ClosePrice']
+ema = goog_data['Exponential120DayMovingAverage']
+
+""" Draw plot """
+import matplotlib.pyplot as plt
+
+fig = plt.figure()
+ax1 = fig.add_subplot(111, ylabel='Google price in $')
+close_price.plot(ax=ax1, color='g', lw=2., legend=True)
+ema.plot(ax=ax1, color='b', lw=2., legend=True)
+plt.savefig(dir_path + '/ema.png')
+plt.show()
\ No newline at end of file
diff --git a/courses/sources/sec2/goog_data.pkl b/courses/sources/sec2/goog_data.pkl
new file mode 100644
index 0000000..5aef72a
Binary files /dev/null and b/courses/sources/sec2/goog_data.pkl differ
diff --git a/courses/sources/sec2/goog_data_large.pkl b/courses/sources/sec2/goog_data_large.pkl
new file mode 100644
index 0000000..8c9b877
Binary files /dev/null and b/courses/sources/sec2/goog_data_large.pkl differ
diff --git a/courses/sources/sec2/macd.png b/courses/sources/sec2/macd.png
new file mode 100644
index 0000000..1a62c8a
Binary files /dev/null and b/courses/sources/sec2/macd.png differ
diff --git a/courses/sources/sec2/macd.py b/courses/sources/sec2/macd.py
new file mode 100644
index 0000000..d593651
--- /dev/null
+++ b/courses/sources/sec2/macd.py
@@ -0,0 +1,97 @@
+import os
+import time
+import statistics
+from matplotlib.pyplot import legend, ylabel
+import pandas as pd
+import numpy as np
+from pandas_datareader import data
+
+
+dir_path = os.path.dirname(os.path.realpath(__file__))
+
+start_date = '2014-01-01'
+end_date = '2018-01-01'
+SRC_DATA_FILENAME = dir_path + '/goog_data.pkl'
+
+try:
+ goog_data = pd.read_pickle(SRC_DATA_FILENAME)
+ print('File data found...reading GOOG data')
+except FileNotFoundError:
+ print('File not found...downloading the GOOG data')
+ goog_data = data.DataReader('GOOG', 'yahoo', start_date, end_date)
+ goog_data.to_pickle(SRC_DATA_FILENAME)
+
+goog_data_signal = pd.DataFrame(index=goog_data.index)
+goog_data_signal['price'] = goog_data['Adj Close']
+close = goog_data_signal['price']
+
+exe_start_time = time.time()
+
+""" Calculate MACD """
+
+num_periods_fast = 10 # fast EMA time period
+K_fast = 2/(num_periods_fast+1)
+ema_fast = 0
+
+num_periods_slow = 40 # slow EMA time period
+K_slow = 2/(num_periods_slow+1)
+ema_slow = 0
+
+num_periods_macd = 20 # MACD EMA time period
+K_macd = 2/(num_periods_macd+1)
+ema_macd=0
+
+ema_fast_values = []
+ema_slow_values = []
+macd_values = []
+macd_signal_values = []
+
+macd_histogram_values = []
+
+for close_price in close:
+ if (ema_fast == 0):
+ ema_fast = close_price
+ ema_slow = close_price
+ else:
+ ema_fast = (close_price - ema_fast) * K_fast + ema_fast
+ ema_slow = (close_price - ema_slow) * K_slow + ema_slow
+
+ ema_fast_values.append(ema_fast)
+ ema_slow_values.append(ema_slow)
+ macd = ema_fast - ema_slow # calculate MACD
+
+ # Based on APO(MACD), calculate EMA_MACD
+ if ema_macd == 0:
+ ema_macd = macd
+ else:
+ ema_macd = (macd - ema_macd) * K_slow + ema_macd
+ macd_values.append(macd)
+
+ macd_signal_values.append(ema_macd)
+ macd_histogram_values.append(macd - ema_macd)
+
+""" Visualization """
+# assign data back to goog_data to get index and aligned
+goog_data = goog_data.assign(ClosePrice=pd.Series(close, index=goog_data.index))
+goog_data = goog_data.assign(Fast_EMA_110Days=pd.Series(ema_fast_values, index=goog_data.index))
+goog_data = goog_data.assign(Slow_EMA_140Days=pd.Series(ema_slow_values, index=goog_data.index))
+goog_data = goog_data.assign(MACD=pd.Series(macd_values, index=goog_data.index))
+goog_data = goog_data.assign(EMA_of_MACD_120Days=pd.Series(macd_signal_values, index=goog_data.index))
+goog_data = goog_data.assign(MACDHistogram=pd.Series(macd_histogram_values, index=goog_data.index))
+print(goog_data['MACDHistogram'])
+
+import matplotlib.pyplot as plt
+
+fig = plt.figure()
+ax1 = fig.add_subplot(311, ylabel='Google price in $')
+goog_data['ClosePrice'].plot(ax=ax1, color='g', lw=2., legend=True)
+goog_data['Fast_EMA_110Days'].plot(ax=ax1, color='b', lw=2., legend=True)
+goog_data['Slow_EMA_140Days'].plot(ax=ax1, color='r', lw=2., legend=True)
+ax2 = fig.add_subplot(312, ylabel='MACD')
+goog_data['MACD'].plot(ax=ax2, color='black', lw=2., legend=True)
+goog_data['EMA_of_MACD_120Days'].plot(ax=ax2, color='g', lw=2., legend=True)
+ax3 = fig.add_subplot(313, ylabel='MACD')
+goog_data['MACDHistogram'].plot(ax=ax3, color='r', kind='bar', legend=True, use_index=False)
+
+plt.savefig(dir_path + "/macd.png")
+plt.show()
\ No newline at end of file
diff --git a/courses/sources/sec2/momentum.png b/courses/sources/sec2/momentum.png
new file mode 100644
index 0000000..4c4264c
Binary files /dev/null and b/courses/sources/sec2/momentum.png differ
diff --git a/courses/sources/sec2/momentum.py b/courses/sources/sec2/momentum.py
new file mode 100644
index 0000000..b1b2fa8
--- /dev/null
+++ b/courses/sources/sec2/momentum.py
@@ -0,0 +1,54 @@
+import os
+import time
+import statistics
+import pandas as pd
+import numpy as np
+from pandas_datareader import data
+
+dir_path = os.path.dirname(os.path.realpath(__file__))
+
+start_date = '2014-01-01'
+end_date = '2018-01-01'
+SRC_DATA_FILENAME = dir_path + '/goog_data.pkl'
+
+try:
+ goog_data = pd.read_pickle(SRC_DATA_FILENAME)
+ print('File data found...reading GOOG data')
+except FileNotFoundError:
+ print('File not found...downloading the GOOG data')
+ goog_data = data.DataReader('GOOG', 'yahoo', start_date, end_date)
+ goog_data.to_pickle(SRC_DATA_FILENAME)
+
+goog_data_signal = pd.DataFrame(index=goog_data.index)
+goog_data_signal['price'] = goog_data['Adj Close']
+close = goog_data_signal['price']
+exe_start_time = time.time()
+
+""" Calculate momentum """
+
+time_period = 20 # lookback period
+history = [] # history of observed prices to use in momentum calculation
+mom_values = [] # track momentum values for visualization purposes
+
+for close_price in close:
+ history.append(close_price)
+ if len(history) > time_period:
+ del(history[0])
+
+ mom = close_price - history[0]
+ mom_values.append(mom)
+
+goog_data = goog_data.assign(ClosePrice=pd.Series(close, index=goog_data.index))
+goog_data = goog_data.assign(MomentumFromPrice20DaysAgo=pd.Series(mom_values, index=goog_data.index))
+
+""" Visualization """
+
+import matplotlib.pyplot as plt
+
+fig = plt.figure()
+ax1 = fig.add_subplot(211, ylabel='Google price in $')
+goog_data['ClosePrice'].plot(ax=ax1, color='g', lw=2., legend=True)
+ax2 = fig.add_subplot(212, ylabel='Momentum in $')
+goog_data['MomentumFromPrice20DaysAgo'].plot(ax=ax2, color='b', lw=2., legend=True)
+plt.savefig(dir_path + '/momentum.png')
+plt.show()
\ No newline at end of file
diff --git a/courses/sources/sec2/rsi.png b/courses/sources/sec2/rsi.png
new file mode 100644
index 0000000..09a6b80
Binary files /dev/null and b/courses/sources/sec2/rsi.png differ
diff --git a/courses/sources/sec2/rsi.py b/courses/sources/sec2/rsi.py
new file mode 100644
index 0000000..d896b2b
--- /dev/null
+++ b/courses/sources/sec2/rsi.py
@@ -0,0 +1,81 @@
+import os
+import time
+import statistics
+import pandas as pd
+import numpy as np
+from pandas_datareader import data
+
+dir_path = os.path.dirname(os.path.realpath(__file__))
+
+start_date = '2014-01-01'
+end_date = '2018-01-01'
+SRC_DATA_FILENAME = dir_path + '/goog_data.pkl'
+
+try:
+ goog_data = pd.read_pickle(SRC_DATA_FILENAME)
+ print('File data found...reading GOOG data')
+except FileNotFoundError:
+ print('File not found...downloading the GOOG data')
+ goog_data = data.DataReader('GOOG', 'yahoo', start_date, end_date)
+ goog_data.to_pickle(SRC_DATA_FILENAME)
+
+goog_data_signal = pd.DataFrame(index=goog_data.index)
+goog_data_signal['price'] = goog_data['Adj Close']
+close = goog_data_signal['price']
+exe_start_time = time.time()
+
+import statistics as stats
+
+time_period = 20 # look back period to compute gains & losses
+
+gain_history = [] # history of gains over look back period (0 if no gain, magnitude of gain if gain)
+loss_history = [] # history of losses over look back period (0 if no loss, magnitude of loss if loss)
+avg_gain_values = [] # track avg gains for visualization purposes
+avg_loss_values = []
+
+rsi_values = [] # track computed RSI values
+
+last_price = 0 # current_price - last_price > 0 => gain ; current_price - last_price < 0 => loss.
+
+for close_price in close:
+ if last_price == 0:
+ last_price = close_price
+
+ gain_history.append(max(0, close_price - last_price))
+ loss_history.append(max(0, last_price - close_price))
+ last_price = close_price
+
+ if len(gain_history) > time_period:
+ del(gain_history[0])
+ del(loss_history[0])
+
+ avg_gain = stats.mean(gain_history) # average gain over lookback period
+ avg_loss = stats.mean(loss_history) # average loss over lookback period
+ avg_gain_values.append(avg_gain)
+ avg_loss_values.append(avg_loss)
+
+ rs = 0
+ if avg_loss > 0: # to avoid division by 0, which is undefined
+ rs = avg_gain /avg_loss
+ rsi = 100 - (100/(1+rs))
+ rsi_values.append(rsi)
+
+""" Data Visualization """
+
+goog_data = goog_data.assign(ClosePrice=pd.Series(close,index=goog_data.index))
+goog_data = goog_data.assign(RelativeStrengthAvgGainOver20Days=pd.Series(avg_gain_values, index=goog_data.index))
+goog_data = goog_data.assign(RelativeStrengthAvgLossOver20Days=pd.Series(avg_loss_values, index=goog_data.index))
+goog_data = goog_data.assign(RelativeStrengthIndicatorOver20Days=pd.Series(rsi_values, index=goog_data.index))
+
+import matplotlib.pyplot as plt
+
+fig = plt.figure()
+ax1 = fig.add_subplot(311, ylabel='Google price in $')
+goog_data['ClosePrice'].plot(ax=ax1, color='black', lw=2., legend=True)
+ax2 = fig.add_subplot(312, ylabel='RS')
+goog_data['RelativeStrengthAvgGainOver20Days'].plot(ax=ax2, color='g', lw=2., legend=True)
+goog_data['RelativeStrengthAvgLossOver20Days'].plot(ax=ax2, color='r', lw=2., legend=True)
+ax3 = fig.add_subplot(313, ylabel='RSI')
+goog_data['RelativeStrengthIndicatorOver20Days'].plot(ax=ax3, color='b', lw=2., legend=True)
+plt.savefig(dir_path + '/rsi.png')
+plt.show()
\ No newline at end of file
diff --git a/courses/sources/sec2/seasonality.png b/courses/sources/sec2/seasonality.png
new file mode 100644
index 0000000..1725cb3
Binary files /dev/null and b/courses/sources/sec2/seasonality.png differ
diff --git a/courses/sources/sec2/seasonality.py b/courses/sources/sec2/seasonality.py
new file mode 100644
index 0000000..8c86303
--- /dev/null
+++ b/courses/sources/sec2/seasonality.py
@@ -0,0 +1,58 @@
+import os
+import time
+import statistics
+import pandas as pd
+import numpy as np
+from pandas_datareader import data
+
+dir_path = os.path.dirname(os.path.realpath(__file__))
+
+start_date = '2001-01-01'
+end_date = '2018-01-01'
+SRC_DATA_FILENAME = dir_path + '/goog_data_large.pkl'
+
+try:
+ goog_data = pd.read_pickle(SRC_DATA_FILENAME)
+ print('File data found...reading GOOG data')
+except FileNotFoundError:
+ print('File not found...downloading the GOOG data')
+ goog_data = data.DataReader('GOOG', 'yahoo', start_date, end_date)
+ goog_data.to_pickle(SRC_DATA_FILENAME)
+
+goog_data_signal = pd.DataFrame(index=goog_data.index)
+goog_data_signal['price'] = goog_data['Adj Close']
+close = goog_data_signal['price']
+exe_start_time = time.time()
+
+""" Calculate mean of each month's return """
+
+goog_monthly_return = goog_data['Adj Close'].pct_change().groupby(
+ [goog_data['Adj Close'].index.year, goog_data['Adj Close'].index.month]).mean()
+print(goog_monthly_return)
+
+goog_monthly_return_list = []
+
+for i in range(len(goog_monthly_return)):
+ goog_monthly_return_list.append({'month':goog_monthly_return.index[i][1],'monthly_return': goog_monthly_return[i]})
+
+goog_monthly_return_list=pd.DataFrame(goog_monthly_return_list,\
+ columns=('month','monthly_return'))
+print(goog_monthly_return_list)
+
+goog_monthly_return_list.boxplot(column='monthly_return', by='month')
+
+""" Visulization """
+
+import matplotlib.pyplot as plt
+
+ax = plt.gca()
+labels = [item.get_text() for item in ax.get_xticklabels()]
+print(labels)
+labels = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']
+ax.set_xticklabels(labels)
+ax.set_ylabel('GOOG return')
+plt.tick_params(axis='both', which='major', labelsize=7)
+plt.title("GOOG Monthly return 2001-2018")
+plt.suptitle("")
+plt.savefig(dir_path + '/seasonality.png')
+plt.show()
\ No newline at end of file
diff --git a/courses/sources/sec2/sma.png b/courses/sources/sec2/sma.png
new file mode 100644
index 0000000..c966f91
Binary files /dev/null and b/courses/sources/sec2/sma.png differ
diff --git a/courses/sources/sec2/sma.py b/courses/sources/sec2/sma.py
new file mode 100644
index 0000000..58c0570
--- /dev/null
+++ b/courses/sources/sec2/sma.py
@@ -0,0 +1,64 @@
+import os
+import time
+import statistics
+import pandas as pd
+import numpy as np
+from pandas_datareader import data
+
+dir_path = os.path.dirname(os.path.realpath(__file__))
+
+start_date = '2014-01-01'
+end_date = '2018-01-01'
+SRC_DATA_FILENAME = 'goog_data.pkl'
+
+try:
+ goog_data = pd.read_pickle(SRC_DATA_FILENAME)
+ print('File data found...reading GOOG data')
+except FileNotFoundError:
+ print('File not found...downloading the GOOG data')
+ goog_data = data.DataReader('GOOG', 'yahoo', start_date, end_date)
+ goog_data.to_pickle(SRC_DATA_FILENAME)
+
+goog_data_signal = pd.DataFrame(index=goog_data.index)
+goog_data_signal['price'] = goog_data['Adj Close']
+
+exe_start_time = time.time()
+
+import statistics as stats
+
+time_period = 20 # number of days over which to average
+history = [] # to track a history of prices
+sma_values = [] # to track simple moving average values
+
+for close_price in goog_data_signal['price']:
+ history.append(close_price)
+ if len(history) > time_period:
+ # we remove oldest price because we only average over last 'time_period' prices
+ # i.e. keep the latest 20 day window
+ del(history[0])
+ sma_values.append(stats.mean(history))
+ # The first 20 sma of this data will not be mean of 20 values
+
+print("--- algo1: %s seconds ---" % (time.time() - exe_start_time))
+
+exe_start_time = time.time()
+
+sma_values_improved = goog_data_signal.rolling(window=20, win_type='boxcar').mean()
+
+print("--- algo2: %s seconds ---" % (time.time() - exe_start_time))
+
+goog_data = goog_data.assign(ClosePrice=pd.Series(goog_data_signal['price'], index=goog_data.index))
+goog_data = goog_data.assign(Simple20DayMovingAverage=pd.Series(sma_values, index=goog_data.index))
+goog_data = goog_data.assign(Simple20DayMovingAverage_pd = sma_values_improved)
+close_price = goog_data['ClosePrice']
+sma = goog_data['Simple20DayMovingAverage']
+
+import matplotlib.pyplot as plt
+
+fig = plt.figure()
+ax1 = fig.add_subplot(111, ylabel='Google price in $')
+close_price.plot(ax=ax1, color='g', lw=2., legend=True)
+sma.plot(ax=ax1, color='r', lw=2., legend=True)
+goog_data['Simple20DayMovingAverage_pd'].plot(ax=ax1, color='b', lw=1., legend=True)
+plt.savefig(dir_path+'/sma.png')
+plt.show()
diff --git a/courses/sources/sec2/sma_improved.py b/courses/sources/sec2/sma_improved.py
new file mode 100644
index 0000000..7f2a4d1
--- /dev/null
+++ b/courses/sources/sec2/sma_improved.py
@@ -0,0 +1,58 @@
+# Same method as in sma.py, used pandas.DataFrame.rolling for faster calculation
+
+import time
+import statistics
+import pandas as pd
+import numpy as np
+from pandas_datareader import data
+
+exe_start_time = time.time()
+
+start_date = '2014-01-01'
+end_date = '2018-01-01'
+SRC_DATA_FILENAME = 'goog_data.pkl'
+
+try:
+ goog_data = pd.read_pickle(SRC_DATA_FILENAME)
+ print('File data found...reading GOOG data')
+except FileNotFoundError:
+ print('File not found...downloading the GOOG data')
+ goog_data = data.DataReader('GOOG', 'yahoo', start_date, end_date)
+ goog_data.to_pickle(SRC_DATA_FILENAME)
+
+goog_data_signal = pd.DataFrame(index=goog_data.index)
+goog_data_signal['price'] = goog_data['Adj Close']
+
+import statistics as stats
+
+time_period = 20 # number of days over which to average
+history = [] # to track a history of prices
+sma_values = [] # to track simple moving average values
+
+
+
+goog_data = goog_data.assign(ClosePrice=pd.Series(close, index=goog_data.index))
+goog_data = goog_data.assign(Simple20DayMovinigAverage=pd.Series(result, index=goog_data.index))
+print(result)
+
+
+# for close_price in close:
+# history.append(close_price)
+# if len(history) > time_period: # we remove oldest price because we only average over last 'time_period' prices
+# del(history[0])
+# sma_values.append(stats.mean(history))
+
+# goog_data = goog_data.assign(ClosePrice=pd.Series(close, index=goog_data.index))
+# goog_data = goog_data.assign(Simple20DayMovingAverage=pd.Series(sma_values, index=goog_data.index))
+# close_price = goog_data['ClosePrice']
+# sma = goog_data['Simple20DayMovingAverage']
+
+# print("--- %s seconds ---" % (time.time() - exe_start_time))
+
+# import matplotlib.pyplot as plt
+
+# fig = plt.figure()
+# ax1 = fig.add_subplot(111, ylabel='Google price in $')
+# close_price.plot(ax=ax1, color='g', lw=2., legend=True)
+# sma.plot(ax=ax1, color='r', lw=2., legend=True)
+# plt.savefig('sma.png')
diff --git a/courses/sources/sec2/stdev.png b/courses/sources/sec2/stdev.png
new file mode 100644
index 0000000..1cda7fa
Binary files /dev/null and b/courses/sources/sec2/stdev.png differ
diff --git a/courses/sources/sec2/stdev.py b/courses/sources/sec2/stdev.py
new file mode 100644
index 0000000..d870662
--- /dev/null
+++ b/courses/sources/sec2/stdev.py
@@ -0,0 +1,65 @@
+import os
+import time
+import statistics
+import pandas as pd
+import numpy as np
+from pandas_datareader import data
+
+dir_path = os.path.dirname(os.path.realpath(__file__))
+
+start_date = '2014-01-01'
+end_date = '2018-01-01'
+SRC_DATA_FILENAME = 'goog_data.pkl'
+
+try:
+ goog_data = pd.read_pickle(SRC_DATA_FILENAME)
+ print('File data found...reading GOOG data')
+except FileNotFoundError:
+ print('File not found...downloading the GOOG data')
+ goog_data = data.DataReader('GOOG', 'yahoo', start_date, end_date)
+ goog_data.to_pickle(SRC_DATA_FILENAME)
+
+goog_data_signal = pd.DataFrame(index=goog_data.index)
+goog_data_signal['price'] = goog_data['Adj Close']
+close = goog_data_signal['price']
+exe_start_time = time.time()
+
+import statistics as stats
+import math as math
+
+time_period = 20
+
+history = [] # history of prices
+sma_values = [] # to tracking sma
+stddev_values = [] # history of computed stdev values
+
+for close_price in close:
+ history.append(close_price)
+ if len(history) > time_period: # track at most 20 prices
+ del(history[0])
+
+ sma = stats.mean(history)
+ sma_values.append(sma)
+
+ variance = 0
+ for hist_price in history:
+ variance = variance + ((hist_price - sma) ** 2)
+
+ stdev = math.sqrt(variance / len(history))
+ stddev_values.append(stdev)
+
+
+goog_data = goog_data.assign(ClosePrice=pd.Series(close, index=goog_data.index))
+goog_data = goog_data.assign(StandardDeviationOver20Days=pd.Series(stddev_values, index=goog_data.index))
+
+""" Visualization """
+
+import matplotlib.pyplot as plt
+
+fig = plt.figure()
+ax1 = fig.add_subplot(211, ylabel='Google price in $')
+goog_data['ClosePrice'].plot(ax=ax1, color='g', lw=2., legend=True)
+ax2 = fig.add_subplot(212, ylabel='Stddev in $')
+goog_data['StandardDeviationOver20Days'].plot(ax=ax2, color='b', lw=2., legend=True)
+plt.savefig(dir_path + '/stdev.png')
+plt.show()
\ No newline at end of file
diff --git a/courses/sources/sec2/supportresistanceline.png b/courses/sources/sec2/supportresistanceline.png
new file mode 100644
index 0000000..79b3899
Binary files /dev/null and b/courses/sources/sec2/supportresistanceline.png differ
diff --git a/courses/sources/sec2/supportresistanceline.py b/courses/sources/sec2/supportresistanceline.py
new file mode 100644
index 0000000..9a4890c
--- /dev/null
+++ b/courses/sources/sec2/supportresistanceline.py
@@ -0,0 +1,29 @@
+import pandas as pd
+from pandas_datareader import data
+
+start_date = '2014-01-01'
+end_date = '2018-01-01'
+SRC_DATA_FILENAME = 'goog_data.pkl'
+
+try:
+ goog_data2 = pd.read_pickle(SRC_DATA_FILENAME)
+except FileNotFoundError:
+ goog_data2 = data.DataReader('GOOG', 'yahoo', start_date, end_date)
+ goog_data2.to_pickle(SRC_DATA_FILENAME)
+
+goog_data = goog_data2.tail(620)
+lows = goog_data['Low']
+highs = goog_data['High']
+print(goog_data)
+
+import matplotlib.pyplot as plt
+fig = plt.figure()
+ax1 = fig.add_subplot(111, ylabel='Google price in $')
+highs.plot(ax=ax1, color='c', lw=2.)
+lows.plot(ax=ax1, color='y', lw=2.)
+
+# Return the first 200 rows using pandas.DataFrame.head(200)
+plt.hlines(highs.head(200).max(), lows.index.values[0], lows.index.values[-1], linewidth=2, color='g')
+plt.hlines(lows.head(200).min(), lows.index.values[0], lows.index.values[-1], linewidth=2, color='r')
+plt.axvline(linewidth=2, color='b', x=lows.index.values[200], linestyle=':')
+plt.savefig("supportresistanceline.png")
\ No newline at end of file
diff --git a/courses/sources/sec2/supportresistanceline_improved.png b/courses/sources/sec2/supportresistanceline_improved.png
new file mode 100644
index 0000000..d9c6fb5
Binary files /dev/null and b/courses/sources/sec2/supportresistanceline_improved.png differ
diff --git a/courses/sources/sec2/supportresistanceline_improved.py b/courses/sources/sec2/supportresistanceline_improved.py
new file mode 100644
index 0000000..cb562a8
--- /dev/null
+++ b/courses/sources/sec2/supportresistanceline_improved.py
@@ -0,0 +1,94 @@
+import pandas as pd
+import numpy as np
+from pandas_datareader import data
+
+start_date = '2014-01-01'
+end_date = '2018-01-01'
+SRC_DATA_FILENAME = 'goog_data.pkl'
+
+try:
+ goog_data = pd.read_pickle(SRC_DATA_FILENAME)
+ print('File data found...reading GOOG data')
+except FileNotFoundError:
+ print('File not found...downloading the GOOG data')
+ goog_data = data.DataReader('GOOG', 'yahoo', start_date, end_date)
+ goog_data.to_pickle(SRC_DATA_FILENAME)
+
+goog_data_signal = pd.DataFrame(index=goog_data.index)
+goog_data_signal['price'] = goog_data['Adj Close']
+
+
+import numpy as np
+def trading_support_resistance(data, bin_width=20):
+
+ data['sup_tolerance'] = pd.Series(np.zeros(len(data))) # tolerance of support line
+ data['res_tolerance'] = pd.Series(np.zeros(len(data))) # tolerance of resistance line
+
+ data['sup_count'] = pd.Series(np.zeros(len(data))) # number of hitting support line
+ data['res_count'] = pd.Series(np.zeros(len(data)))
+
+ data['sup'] = pd.Series(np.zeros(len(data))) # support line value (constant)
+ data['res'] = pd.Series(np.zeros(len(data)))
+
+ data['position'] = pd.Series(np.zeros(len(data)))
+ data['signal'] = pd.Series(np.zeros(len(data)))
+
+ in_support = 0
+ in_resistance = 0
+
+ for x in range((bin_width-1) + bin_width, len(data)):
+ data_section = data[x-bin_width : x+1] # get data within rolling window
+
+ support_level = min(data_section['price'])
+ resistance_level = max(data_section['price'])
+ range_level = resistance_level - support_level
+
+ data['res'][x] = resistance_level
+ data['sup'][x] = support_level
+
+ data['sup_tolerance'][x] = support_level + 0.2*range_level # 20% tolorance
+ data['res_tolerance'][x] = resistance_level - 0.2*range_level
+
+ if (data['price'][x] >= data['res_tolerance'][x]) and (data['price'][x] <= data['res'][x]):
+ # if price is within resistance tolerance region
+ in_resistance += 1
+ data['res_count'][x] = in_resistance
+ elif (data['price'][x] <= data['sup_tolerance'][x]) and (data['price'][x] >= data['sup'][x]):
+ # price is within support tolerance region
+ in_support += 1
+ data['sup_count'][x] = in_support
+ else:
+ # if not within any region, clear count
+ in_support = 0
+ in_resistance = 0
+
+ if in_resistance > 2:
+ # If enter resistance region twice
+ data['signal'][x] = 1
+ elif in_support > 2:
+ data['signal'][x] = 0
+ else:
+ data['signal'][x] = data['signal'][x-1]
+
+ data['position'] = data['signal'].diff()
+
+trading_support_resistance(goog_data_signal)
+
+print(goog_data_signal)
+
+import matplotlib.pyplot as plt
+
+fig = plt.figure()
+ax1 = fig.add_subplot(111, ylabel='Google price in $')
+goog_data_signal['sup'].plot(ax=ax1, color='g', lw=2.)
+goog_data_signal['res'].plot(ax=ax1, color='b', lw=2.)
+goog_data_signal['price'].plot(ax=ax1, color='r', lw=2.)
+
+ax1.plot(goog_data_signal.loc[goog_data_signal.position == 1.0].index,
+ goog_data_signal.price[goog_data_signal.position == 1.0], '^', markersize=7, color='k', label='buy')
+ax1.plot(goog_data_signal.loc[goog_data_signal.position == -1.0].index,
+ goog_data_signal.price[goog_data_signal.position == -1.0], 'v', markersize=7, color='k', label='sell')
+
+plt.legend()
+plt.savefig("supportresistanceline_improved")
+plt.show()
\ No newline at end of file
diff --git a/img/2_1.jpg b/img/2_1.jpg
new file mode 100644
index 0000000..09bb608
Binary files /dev/null and b/img/2_1.jpg differ