commit 34cbbddc20eb60783252788aed23d5bc39dc19c5 Author: JasonHomeWorkstationUbuntu Date: Sun Jul 12 11:03:39 2020 +1000 Finished chap1 diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..57a33dd --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "Learn-Algorithmic-Trading---Fundamentals-of-Algorithmic-Trading"] + path = Learn-Algorithmic-Trading---Fundamentals-of-Algorithmic-Trading + url = git@github.com:PacktPublishing/Learn-Algorithmic-Trading---Fundamentals-of-Algorithmic-Trading.git diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..c288c13 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "python.pythonPath": "/home/jason/miniconda3/envs/quants/bin/python" +} \ No newline at end of file diff --git a/Learn-Algorithmic-Trading---Fundamentals-of-Algorithmic-Trading b/Learn-Algorithmic-Trading---Fundamentals-of-Algorithmic-Trading new file mode 160000 index 0000000..08161f2 --- /dev/null +++ b/Learn-Algorithmic-Trading---Fundamentals-of-Algorithmic-Trading @@ -0,0 +1 @@ +Subproject commit 08161f2bd7ae94ad26e7e2b6ec9b088eff50583b diff --git a/courses/sec1_chap1.html b/courses/sec1_chap1.html new file mode 100644 index 0000000..d16e8d7 --- /dev/null +++ b/courses/sec1_chap1.html @@ -0,0 +1,377 @@ +

Chap 1: Algorithmic Trading Fundamentals

+ +

1. 我们为何交易?

+ + + +

2. 现代交易的基本概念

+ + + +

2.1 market sector

+ +

vs asset classes: 基于标的的不同

+ + + +

2.2 Asset classes

+ +

vs market sectors: 基于金融产品的不同

+ + + +

3. 现代交易系统

+ +

+ +

3.1 Exchange market data protocol

+ +

沟通交易中心和参与者的通讯协议。可基于通讯协议来设计,编写交易软件

+ +

3.2 Market data feed handlers

+ +

让参与者与指定的exchange market data protocol交互的程序. 可以:

+ + + +

3.3 Exchange order book

+ +

Exchange order book记录、维护所有的买卖信息,包括:

+ + + +

Buy order (bids) 根据价格从到到低排列 (价高者先被匹配), 相同价格的由匹配算法决定。

+ +

匹配算法包括:

+ + + +

3.4 Limit order book

+ +

类似Exchange order book,但由参与者创建,因此只有部分信息。

+ +

目标:收集并安排买卖来获取市场信息。

+ +

3.5 Order types

+ +

大多数交易中心支持多种下单类型:

+ + + +

3.6 Exchange order entry protocols

+ +

发出交易请求时用的通讯协议。交易中心同样用它来回复交易者

+ +

3.7 Order entry gateway

+ + + +

Drop-copy gateways:

+ + + +

3.8 Positions (仓位) and PnL (profit and loss) management

+ +

3.8.1 Position

+ +

下单后交易者就得到了 position (仓位\头寸) in the instruments that they got executed, for 执行时的 数量 & 价格

+ + + +

3.8.2 VWAP (Volume Weighted Average Price)

+ +

在不同价位、数量不同的多头或空头,组合为 Volume Weighted Average Price (成交量加权平均价)

+ +

3.8.3 Profit and Loss (PoL) of position

+ +

通过比较当前市场价格和 open position (未平仓头寸/持仓头寸,即尚未交割的头寸) 的价格,可以得到 unrealized PoL:

+ + + +

4. 从直觉到程序交易

+ + + +

No trading idea is right all the time.

+ +

4.1 为何要自动交易?

+ +

手动交易的进化:对人大叫手动挂单 -> 打电话(broker)来挂单 -> 在程序里手动输入来挂单

+ +

缺点:

+ +
    +
  1. +
  2. 容易错过信息
  3. +
  4. 容易犯错
  5. +
  6. 容易分心
  7. +
+ +

4.2 算法交易的进化: rule-based to AI

+ +

以趋势跟踪来做案例,分析算法交易的进化:

+ + + +

5. 算法交易的部件

+ +

实际应用中,算法交易系统可以分为两部分:

+ + + +

+ +

5.1 Market Data subscription 订阅市场数据

+ +

负责与 feed handler components 沟通来传播标准化数据。数据在内部网络或本机上通过 Inter-Process Communication (IPC) 来进行传播。

+ +

5.2 Limit order books

+ +

当交易策略得到标准化后的数据,它能为目标金融工具构建出一个limit order book。

+ + + +

5.3 Signals(交易信号)

+ +

limit order book构建完成后,每次数据更新都能激发交易信号

+ +

signals 又可被称为 indicators, predictors, calculators, features, alpha, etc.

+ + + +

5.4 Signal aggregators (信号整合)

+ + + +

5.5 Execution logic 执行逻辑

+ +

好的交易策略要达到 快速&复杂/富有经验两个目标,二者往往互相冲突。因此,execution logic 需要在二者之间取得平衡,同时尽量隐藏自己的意图。

+ +

市场是双向透明的,其他参与者可以得到所有挂单的信息,并且推测影响。同时slippage(滑点)fee(交易费)也不能忽视。

+ +

slippage

+ + + +

当交易算法的仓位数量变大时,滑点会更加显著

+ +

fee

+ +

exchange fees & broker feed 往往与交易量正相关

+ +

有时一个优异的交易策略会因为滑点和交易费而赚不到钱

+ +

5.6 Position and PnL management (盈亏管理)

+ +

不同的交易策略会导致不同复杂程度的盈亏管理。

+ +

e.g.:

+ + + +

5.7 风险管理

+ +

风控是算法交易的基石(cornerstone):

+ + + +

5.8 Backtesting 回测

+ +

研究交易算法需要回测。回测能够模拟交易系统的行为并且得到 expected PnL, expected risk exposure, other matrices.

+ +

高精度的回测系统非常复杂。

+ +

回测系统可以提供:

+ + + +

Why Python?

+ +

此处会实现一个简单的基于趋势跟踪的交易策略(买低卖高)。算法的大致步骤是:

+ +
    +
  1. 得到GOOGLE从2014-01-01到2018-01-01的股票数据,包括当日高位、低位、开盘价、收盘价、交易量
  2. +
  3. 生成交易信号: +
      +
    1. 使用GOOGLE股票的修正后收盘价作为基础,计算每日价格变动
    2. +
    3. 假如价格变动为正(价格上涨),那就卖出,反之买入(基于自身所拥有仓位的数量上)
    4. +
  4. +
  5. 生成交易数量的图表,向上箭头表示买入,向下箭头表示卖出
  6. +
  7. 回测: +
      +
    1. 假设拥有$1000作为启动资金,计算3年来 cash (initial amount of money) 和 holding (invest this money) +
        +
      1. 若股票价格上涨,value of holding 上涨
      2. +
      3. 卖出后,这只股票value of the holding 被转移至 cash amount中。
      4. +
      5. 总资产价格 (sum total of the assets) = cash + holding
      6. +
    2. +
  8. +
diff --git a/courses/sec1_chap1_introduction_and_environment_setup-zh_cn.md b/courses/sec1_chap1_introduction_and_environment_setup-zh_cn.md new file mode 100644 index 0000000..ef48c8c --- /dev/null +++ b/courses/sec1_chap1_introduction_and_environment_setup-zh_cn.md @@ -0,0 +1,290 @@ +# Chap 1: Algorithmic Trading Fundamentals + +## 1. 我们为何交易? + +* 交易是人类天性 +* 交易的历史 + * 在古罗马广场上,有钱人交易货币、债券 + * 在14世纪威尼斯,交易国债 + * 1531年,比利时出现了最早的股票交易市场 + * 在1602(航海时代),荷兰东印度公司公募 + * 17世纪,法国为探索路易斯安娜公募 +* 上述案例共同点: + * 有钱人想变得更有钱; + * 最终都失败 +* 交易听起来有利可图,但并非一直如此 + +## 2. 现代交易的基本概念 + +* 市场基本因素:供需(从古至今) +* 现代交易:高效的市场价格发现(技术因素) + * 竞争点: + * 精细程度 + * 洞察力 + +### 2.1 market sector + +vs asset classes: 基于标的的不同 + +* 商品(金属,农产品) +* 能源(油,气) +* 股票 +* 债权 +* 外汇 + +### 2.2 Asset classes + +vs market sectors: 基于金融产品的不同 + +* 债券,外汇,股票 +* 基于上述标的的衍生品 + * future contract (期货合约) + * 必须交割 + * option contract (期权合约) + * 可不交割,但要付premium(权利金) + * call option + * put option + +## 3. 现代交易系统 + +![](../img/1_2.jpg) + +### 3.1 Exchange market data protocol + +沟通交易中心和参与者的通讯协议。可基于通讯协议来设计,编写交易软件 + +### 3.2 Market data feed handlers + +让参与者与指定的exchange market data protocol交互的**程序**. 可以: + +* subscribe +* receive +* decode +* 检查错误,断网 + +### 3.3 Exchange order book + +Exchange order book记录、维护所有的买卖信息,包括: + +* 价格 +* 数量 +* order types +* ID + +Buy order (bids) 根据价格从到到低排列 (价高者先被匹配), 相同价格的由匹配算法决定。 + +匹配算法包括: + +* FIFO +* Pro-rata (按比例) + +### 3.4 Limit order book + +类似Exchange order book,但由参与者创建,因此只有部分信息。 + +目标:收集并安排买卖来获取市场信息。 + +### 3.5 Order types + +大多数交易中心支持多种下单类型: + +* **IOC (Immediate Or Cancel)**: 从不加入book,要么被全部执行,要不被取消 + * 优点:避免由于 order management 带来的麻烦 +* **GTD (Good Till Day)**: 被记入book,如果匹配成功,则交易可执行部分,剩余则加入book,直到能被完全匹配 +* **Stop orders**: 等到stop price (a specific price),orders 才会被加入 book,并成为GTD + * 优点:可被用来止损,或者获利 + +### 3.6 Exchange order entry protocols + +发出交易请求时用的通讯协议。交易中心同样用它来回复交易者 + +### 3.7 Order entry gateway + +* 交易者的 client app +* 通过 order entry protocols 来与交易中心的匹配引擎进行交流(下单,更改价格...) + +Drop-copy gateways: + +* 第二套gateway来确定交易的真实性 + +### 3.8 Positions (仓位) and PnL (profit and loss) management + +#### 3.8.1 Position + +下单后交易者就得到了 **position (仓位\头寸)** in the instruments that they got executed, for 执行时的 数量 & 价格 + +* **Long position (多头头寸)** = buy side execution + * 多头赚钱:market price > position price (i.e. buy low) +* **Short position (空头头寸)** = sell sid execution + * 空头赚钱:market price < position price (sell high) +* **Being flat** = no position + +* **Open position (未平仓头寸)** = 指尚未对冲或交割的头寸,即持仓者承诺要买入或卖出某些未履约的商品,或买入或卖出没有相反方向相配的商品。 +* **Close position (平仓)** = 期货交易者买入或卖出与其所持期货合约的品种、数量及交割月份相同但交易方向相反的期货合约,了结期货交易的行为。 + +#### 3.8.2 VWAP (Volume Weighted Average Price) + +在不同价位、数量不同的多头或空头,组合为 **Volume Weighted Average Price (成交量加权平均价**) + +#### 3.8.3 Profit and Loss (PoL) of position + +通过比较当前市场价格和 open position (未平仓头寸/持仓头寸,即尚未交割的头寸) 的价格,可以得到 unrealized PoL: + +* Long position 有 unrealized profit (loss) 当市场价格上涨(下降) +* Profit/Loss is realized when open position is closed (平仓) + * 平仓: sell to close a long position, or buy to close a short position. +* After close position, PnL become *realized PnL*. +* total PnL = realized PnLs + unrealized PnLs for open position. + +## 4. 从直觉到程序交易 + +* 大多数情况下,交易策略来自于直觉。e.g. + * trend-following (趋势跟踪),跟着大盘走(如果你觉得大盘还会涨、跌) + * mean reversion strategies, 逆着大盘走(如果你觉得大盘已经到顶、底) + +No trading idea is right all the time. + +### 4.1 为何要自动交易? + +手动交易的进化:对人大叫手动挂单 -> 打电话(broker)来挂单 -> 在程序里手动输入来挂单 + +缺点: + +1. 慢 +2. 容易错过信息 +3. 容易犯错 +4. 容易分心 + +### 4.2 算法交易的进化: rule-based to AI + +以趋势跟踪来做案例,分析算法交易的进化: + +* 早期的经典趋势交易:交易员通过图表观测趋势是否开始/持续。e.g. 股票价格连续一周每天上身5%, 那就应该买入;若股票价格两小时内下跌10%,那就要卖出 + +## 5. 算法交易的部件 + +实际应用中,算法交易系统可以分为两部分: + +* Core infrastructure (核心基础设施), 负责: + * deals with exchange-facing market data protocol integration 与交所的数据协议进行整合 + * market data handler: 作为handler读取市场数据 + * internal market data format normalization 在内部对市场数据进行标准化 + * historical data recording 记录历史数据 + * instrument definition recording/dissemination 记录并传播金融工具的定义 + * exchange order entry protocols 交所下单的通讯协议协议 + * exchange order entry gateway 负责下单 + * core side risk systems + * broker-facing app, 与中介沟通 + * back office reconciliation app, 与后台调和 + * addressing compliance requirement 解决合规问题 + * ... +* Algorithmic trading strategy (算法交易系统),负责: + * normalizing market data 标准化市场数据 + * building order book 建立 order book + * generating signals from incoming market data and order flow information 通过接收到的市场数据和下单情况产生交易信号 + * aggregation of different signals 整合不同的交易信号 + * efficient execution logic built on top of statistical predictive abilities (alpha) 基于统计判断能力(alpha)的高效执行 + * position and PnL management inside the strategies 仓位管理 + * risk management inside strategies 风险控制 + * backtesting 回测 + * historical signal trading research platforms 研究 + +![](../img/1_5_1.jpg) + +### 5.1 Market Data subscription 订阅市场数据 + +负责与 feed handler components 沟通来传播标准化数据。数据在内部网络或本机上通过 Inter-Process Communication (IPC) 来进行传播。 + +### 5.2 Limit order books + +当交易策略得到标准化后的数据,它能为目标金融工具构建出一个limit order book。 + +* 简单版:记录多空两方的参与者数量 +* 复杂版:构建出参与者的先后顺序 + +### 5.3 Signals(交易信号) + +limit order book构建完成后,每次数据更新都能激发交易信号 + +signals 又可被称为 indicators, predictors, calculators, features, alpha, etc. + +* 交易信号是精心定义的 +* 从收到的市场数据信息,limit order book 和交易信息中获取 +* 让参与者得到对其他参与者的相对优势 (edge or advantage vias-a-vis other market participants) +* 交易员花费大量时间构建、更新、添加交易信号 + +### 5.4 Signal aggregators (信号整合) + +* 很多程序交易系统会整合数个交易信号来得到一个更强(better edge)的信号。 +* different aggregtion approach: + * linear/non-linear combination 线性、非线性组合 + * regression 递归 + * ... + +### 5.5 Execution logic 执行逻辑 + +好的交易策略要达到 **快速**&**复杂/富有经验**两个目标,二者往往互相冲突。因此,execution logic 需要在二者之间取得平衡,同时尽量隐藏自己的意图。 + +市场是双向透明的,其他参与者可以得到所有挂单的信息,并且推测影响。同时**slippage(滑点)** 和 **fee(交易费)**也不能忽视。 + +#### slippage + +* slippage = 预期的交易价格和真实交易价格间的差异 +* 两个主要原因: + * latency (延迟),当交易请求抵达交易所慢了一步 + * large volume (大当量),当挂单数量巨大而被分批次(在不同价位)被成交,那整个交易的 VWAP 就会与预期不同 + +当交易算法的仓位数量变大时,滑点会更加显著 + +#### fee + +exchange fees & broker feed 往往与交易量正相关 + +有时一个优异的交易策略会因为滑点和交易费而赚不到钱 + +### 5.6 Position and PnL management (盈亏管理) + +不同的交易策略会导致不同复杂程度的盈亏管理。 + +e.g.: + +* pairs trading (配对交易): 基于两个相关性较高的股票或者其他证券,如果在未来时期保持着良好的相关性,一旦两者之间出现了背离的走势,且这种背离在未来是会得到纠正的,那么就可能产生套利的机会。 + * 需要跟踪多个仓位并对多个金融产品进行盈亏管理。复杂度上升 + +### 5.7 风险管理 + +风控是算法交易的基石(cornerstone): + +* 违反交易所的规定会导致法律性惩罚。 +* 高频交易的风险在于bug + * 需要大量测试,压力测试,鲁棒测试, etc. + +### 5.8 Backtesting 回测 + +研究交易算法需要回测。回测能够模拟交易系统的行为并且得到 expected PnL, expected risk exposure, other matrices. + +高精度的回测系统非常复杂。 + +回测系统可以提供: + +* Profit and loss (P and L): 排除交易费用所产生的盈亏 +* Net profit and loss (net P and L): 包括交易费用的盈亏 +* Exposure: The capital invested 投入的本金 +* Number of trades 交易过程中产生的交易数量 +* Annualized return: 年化收益 +* Sharpe ratio (夏普率): 一项投资(例如证券或投资组合)在对其调整风险后,相对于无风险资产的表现。 计算方法为一项投资(例如证券或投资组合)在对其调整风险后,相对于无风险资产的表现 + +## Why Python? + +此处会实现一个简单的基于趋势跟踪的交易策略(买低卖高)。算法的大致步骤是: + +1. 得到GOOGLE从2014-01-01到2018-01-01的股票数据,包括当日高位、低位、开盘价、收盘价、交易量 +2. 生成交易信号: + 1. 使用GOOGLE股票的修正后收盘价作为基础,计算每日价格变动 + 2. 假如价格变动为正(价格上涨),那就卖出,反之买入(基于自身所拥有仓位的数量上) +3. 生成交易数量的图表,向上箭头表示买入,向下箭头表示卖出 +4. 回测: + 1. 假设拥有$1000作为启动资金,计算3年来 cash (initial amount of money) 和 holding (invest this money) + 1. 若股票价格上涨,value of holding 上涨 + 2. 卖出后,这只股票value of the holding 被转移至 cash amount中。 + 3. **总资产价格 (sum total of the assets)** = cash + holding \ 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 new file mode 100644 index 0000000..e69de29 diff --git a/courses/sources/.ipynb_checkpoints/buylowsellhigh-checkpoint.ipynb b/courses/sources/.ipynb_checkpoints/buylowsellhigh-checkpoint.ipynb new file mode 100644 index 0000000..b2ec75b --- /dev/null +++ b/courses/sources/.ipynb_checkpoints/buylowsellhigh-checkpoint.ipynb @@ -0,0 +1,4358 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 买低卖空\n", + "\n", + "## 获取GOOG股票数据" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "High Low ... Volume Adj Close\n", + "Date ... \n", + "2013-12-31 558.406982 551.064453 ... 2725900.0 558.262512\n", + "2014-01-02 556.788025 552.060730 ... 3656400.0 554.481689\n", + "2014-01-03 556.379578 550.401978 ... 3345800.0 550.436829\n", + "2014-01-06 557.340942 551.154114 ... 3551800.0 556.573853\n", + "2014-01-07 567.717041 558.486633 ... 5124300.0 567.303589\n", + "... ... ... ... ... ...\n", + "2017-12-22 1064.199951 1059.439941 ... 755100.0 1060.119995\n", + "2017-12-26 1060.119995 1050.199951 ... 760600.0 1056.739990\n", + "2017-12-27 1058.369995 1048.050049 ... 1271900.0 1049.369995\n", + "2017-12-28 1054.750000 1044.770020 ... 837100.0 1048.140015\n", + "2017-12-29 1049.699951 1044.900024 ... 887500.0 1046.400024\n", + "\n", + "[1008 rows x 6 columns]\n" + ] + } + ], + "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", + "goog_data = data.DataReader('GOOG', 'yahoo', start_date, end_date)\n", + "print(goog_data)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "DatetimeIndex: 1008 entries, 2013-12-31 to 2017-12-29\n", + "Data columns (total 6 columns):\n", + " # Column Non-Null Count Dtype \n", + "--- ------ -------------- ----- \n", + " 0 High 1008 non-null float64\n", + " 1 Low 1008 non-null float64\n", + " 2 Open 1008 non-null float64\n", + " 3 Close 1008 non-null float64\n", + " 4 Volume 1008 non-null float64\n", + " 5 Adj Close 1008 non-null float64\n", + "dtypes: float64(6)\n", + "memory usage: 55.1 KB\n" + ] + } + ], + "source": [ + "goog_data.info()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Google 数据结构如上所见,我们要用 Adj Close 来产生交易信号\n", + "\n", + "## 准备交易信号" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "DatetimeIndex: 1008 entries, 2013-12-31 to 2017-12-29\n", + "Data columns (total 2 columns):\n", + " # Column Non-Null Count Dtype \n", + "--- ------ -------------- ----- \n", + " 0 price 1008 non-null float64\n", + " 1 daily_difference 1007 non-null float64\n", + "dtypes: float64(2)\n", + "memory usage: 23.6 KB\n" + ] + } + ], + "source": [ + "# 准备新的数据集,包括时间、价格、每日价差、交易信号\n", + "goog_data_signal = pd.DataFrame(index=goog_data.index)\n", + "goog_data_signal['price'] = goog_data['Adj Close']\n", + "goog_data_signal['daily_difference'] = goog_data_signal['price'].diff()\n", + "goog_data_signal.info()" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
pricedaily_differencesignalpositions
Date
2013-12-31558.262512NaN0.0NaN
2014-01-02554.481689-3.7808230.00.0
2014-01-03550.436829-4.0448610.00.0
2014-01-06556.5738536.1370241.01.0
2014-01-07567.30358910.7297361.00.0
\n", + "
" + ], + "text/plain": [ + " price daily_difference signal positions\n", + "Date \n", + "2013-12-31 558.262512 NaN 0.0 NaN\n", + "2014-01-02 554.481689 -3.780823 0.0 0.0\n", + "2014-01-03 550.436829 -4.044861 0.0 0.0\n", + "2014-01-06 556.573853 6.137024 1.0 1.0\n", + "2014-01-07 567.303589 10.729736 1.0 0.0" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# 将每日价差转换为交易信号(挂单)\n", + "import numpy as np\n", + "goog_data_signal['signal'] = 0.0\n", + "goog_data_signal['signal'] = np.where(goog_data_signal['daily_difference'] > 0, 1.0, 0.0)\n", + "goog_data_signal.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "0 为 买入, 1 为 卖出\n", + "\n", + "在资金有限情况下,我们不能在市场持续上升、下降的时候不停地卖出、买入。因此要限制仓位数量\n", + "\n", + "为了简化,我们保证算法不会持续买卖(连续两天内不会连续购买)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
pricedaily_differencesignalpositions
Date
2013-12-31558.262512NaN0.0NaN
2014-01-02554.481689-3.7808230.00.0
2014-01-03550.436829-4.0448610.00.0
2014-01-06556.5738536.1370241.01.0
2014-01-07567.30358910.7297361.00.0
\n", + "
" + ], + "text/plain": [ + " price daily_difference signal positions\n", + "Date \n", + "2013-12-31 558.262512 NaN 0.0 NaN\n", + "2014-01-02 554.481689 -3.780823 0.0 0.0\n", + "2014-01-03 550.436829 -4.044861 0.0 0.0\n", + "2014-01-06 556.573853 6.137024 1.0 1.0\n", + "2014-01-07 567.303589 10.729736 1.0 0.0" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "goog_data_signal['positions'] = goog_data_signal['signal'].diff()\n", + "goog_data_signal.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 图表化" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n" + ], + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "fig = plt.figure()\n", + "ax1 = fig.add_subplot(111, ylabel='Google price in $')\n", + "\n", + "goog_data_signal['price'].plot(ax=ax1, color='r', lw=2.)\n", + "ax1.plot(goog_data_signal.loc[goog_data_signal.positions == 1.0].index, goog_data_signal.price[goog_data_signal.positions == 1.0], '^', markersize=5, color='m')\n", + "ax1.plot(goog_data_signal.loc[goog_data_signal.positions == -1.0].index, goog_data_signal.price[goog_data_signal.positions == -1.0], 'v', markersize=5, color='k')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "加入向上的箭头来表示买入, 加入向下箭头表示卖出加入向下箭头表示卖出\n", + "\n", + "## 回测" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "DatetimeIndex: 1008 entries, 2013-12-31 to 2017-12-29\n", + "Empty DataFrame\n", + "DatetimeIndex: 1008 entries, 2013-12-31 to 2017-12-29\n", + "Empty DataFrame" + ] + } + ], + "source": [ + "initial_capital = float(1000)\n", + "\n", + "positions = pd.DataFrame(index=goog_data_signal.index).fillna(0.0)\n", + "portfolio = pd.DataFrame(index=goog_data_signal.index).fillna(0.0)\n", + "positions.info()\n", + "portfolio.info()" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
GOOG
Date
2013-12-310.0
2014-01-020.0
2014-01-030.0
2014-01-061.0
2014-01-071.0
\n", + "
" + ], + "text/plain": [ + " GOOG\n", + "Date \n", + "2013-12-31 0.0\n", + "2014-01-02 0.0\n", + "2014-01-03 0.0\n", + "2014-01-06 1.0\n", + "2014-01-07 1.0" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "positions['GOOG'] = goog_data_signal['signal']\n", + "positions.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
positions
Date
2013-12-310.000000
2014-01-020.000000
2014-01-030.000000
2014-01-06556.573853
2014-01-07567.303589
\n", + "
" + ], + "text/plain": [ + " positions\n", + "Date \n", + "2013-12-31 0.000000\n", + "2014-01-02 0.000000\n", + "2014-01-03 0.000000\n", + "2014-01-06 556.573853\n", + "2014-01-07 567.303589" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "portfolio['positions'] = positions.multiply(goog_data_signal['price'], axis=0)\n", + "portfolio.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
positionscash
Date
2013-12-310.000000NaN
2014-01-020.0000001000.000000
2014-01-030.0000001000.000000
2014-01-06556.573853443.426147
2014-01-07567.303589443.426147
\n", + "
" + ], + "text/plain": [ + " positions cash\n", + "Date \n", + "2013-12-31 0.000000 NaN\n", + "2014-01-02 0.000000 1000.000000\n", + "2014-01-03 0.000000 1000.000000\n", + "2014-01-06 556.573853 443.426147\n", + "2014-01-07 567.303589 443.426147" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# 计算cash\n", + "portfolio['cash'] = initial_capital - (positions.diff().multiply(goog_data_signal['price'], axis=0)).cumsum()\n", + "portfolio.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [], + "source": [ + "portfolio['total'] = portfolio['positions'] + portfolio['cash']" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "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" + ], + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(portfolio['total'])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "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" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/courses/sources/buylowsellhigh.ipynb b/courses/sources/buylowsellhigh.ipynb new file mode 100644 index 0000000..9f2cd59 --- /dev/null +++ b/courses/sources/buylowsellhigh.ipynb @@ -0,0 +1,4321 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 买低卖空\n", + "\n", + "## 获取GOOG股票数据" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "metadata": { + "tags": [] + }, + "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", + "goog_data = data.DataReader('GOOG', 'yahoo', start_date, end_date)" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "DatetimeIndex: 1008 entries, 2013-12-31 to 2017-12-29\n", + "Data columns (total 6 columns):\n", + " # Column Non-Null Count Dtype \n", + "--- ------ -------------- ----- \n", + " 0 High 1008 non-null float64\n", + " 1 Low 1008 non-null float64\n", + " 2 Open 1008 non-null float64\n", + " 3 Close 1008 non-null float64\n", + " 4 Volume 1008 non-null float64\n", + " 5 Adj Close 1008 non-null float64\n", + "dtypes: float64(6)\n", + "memory usage: 55.1 KB\n" + ] + } + ], + "source": [ + "goog_data.info()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Google 数据结构如上所见,我们要用 Adj Close 来产生交易信号\n", + "\n", + "## 准备交易信号" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "DatetimeIndex: 1008 entries, 2013-12-31 to 2017-12-29\n", + "Data columns (total 2 columns):\n", + " # Column Non-Null Count Dtype \n", + "--- ------ -------------- ----- \n", + " 0 price 1008 non-null float64\n", + " 1 daily_difference 1007 non-null float64\n", + "dtypes: float64(2)\n", + "memory usage: 23.6 KB\n" + ] + } + ], + "source": [ + "# 准备新的数据集,包括时间、价格、每日价差、交易信号\n", + "goog_data_signal = pd.DataFrame(index=goog_data.index)\n", + "goog_data_signal['price'] = goog_data['Adj Close']\n", + "goog_data_signal['daily_difference'] = goog_data_signal['price'].diff()\n", + "goog_data_signal.info()" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
pricedaily_differencesignal
Date
2013-12-31558.262512NaN0.0
2014-01-02554.481689-3.7808230.0
2014-01-03550.436829-4.0448610.0
2014-01-06556.5738536.1370241.0
2014-01-07567.30358910.7297361.0
\n", + "
" + ], + "text/plain": [ + " price daily_difference signal\n", + "Date \n", + "2013-12-31 558.262512 NaN 0.0\n", + "2014-01-02 554.481689 -3.780823 0.0\n", + "2014-01-03 550.436829 -4.044861 0.0\n", + "2014-01-06 556.573853 6.137024 1.0\n", + "2014-01-07 567.303589 10.729736 1.0" + ] + }, + "execution_count": 59, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# 将每日价差转换为交易信号(挂单)\n", + "import numpy as np\n", + "goog_data_signal['signal'] = 0.0\n", + "goog_data_signal['signal'] = np.where(goog_data_signal['daily_difference'] > 0, 1.0, 0.0)\n", + "goog_data_signal.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "0 为 买入, 1 为 卖出\n", + "\n", + "在资金有限情况下,我们不能在市场持续上升、下降的时候不停地卖出、买入。因此要限制仓位数量\n", + "\n", + "为了简化,我们保证算法不会持续买卖(连续两天内不会连续购买)" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
pricedaily_differencesignalpositions
Date
2013-12-31558.262512NaN0.0NaN
2014-01-02554.481689-3.7808230.00.0
2014-01-03550.436829-4.0448610.00.0
2014-01-06556.5738536.1370241.01.0
2014-01-07567.30358910.7297361.00.0
\n", + "
" + ], + "text/plain": [ + " price daily_difference signal positions\n", + "Date \n", + "2013-12-31 558.262512 NaN 0.0 NaN\n", + "2014-01-02 554.481689 -3.780823 0.0 0.0\n", + "2014-01-03 550.436829 -4.044861 0.0 0.0\n", + "2014-01-06 556.573853 6.137024 1.0 1.0\n", + "2014-01-07 567.303589 10.729736 1.0 0.0" + ] + }, + "execution_count": 60, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "goog_data_signal['positions'] = goog_data_signal['signal'].diff()\n", + "goog_data_signal.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 图表化" + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n" + ], + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "fig = plt.figure()\n", + "ax1 = fig.add_subplot(111, ylabel='Google price in $')\n", + "\n", + "goog_data_signal['price'].plot(ax=ax1, color='r', lw=2.)\n", + "ax1.plot(goog_data_signal.loc[goog_data_signal.positions == 1.0].index, goog_data_signal.price[goog_data_signal.positions == 1.0], '^', markersize=5, color='m')\n", + "ax1.plot(goog_data_signal.loc[goog_data_signal.positions == -1.0].index, goog_data_signal.price[goog_data_signal.positions == -1.0], 'v', markersize=5, color='k')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "加入向上的箭头来表示买入, 加入向下箭头表示卖出加入向下箭头表示卖出\n", + "\n", + "## 回测" + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "DatetimeIndex: 1008 entries, 2013-12-31 to 2017-12-29\n", + "Empty DataFrame\n", + "DatetimeIndex: 1008 entries, 2013-12-31 to 2017-12-29\n", + "Empty DataFrame" + ] + } + ], + "source": [ + "initial_capital = float(1000)\n", + "\n", + "positions = pd.DataFrame(index=goog_data_signal.index).fillna(0.0)\n", + "portfolio = pd.DataFrame(index=goog_data_signal.index).fillna(0.0)\n", + "positions.info()\n", + "portfolio.info()" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
GOOG
Date
2013-12-310.0
2014-01-020.0
2014-01-030.0
2014-01-061.0
2014-01-071.0
\n", + "
" + ], + "text/plain": [ + " GOOG\n", + "Date \n", + "2013-12-31 0.0\n", + "2014-01-02 0.0\n", + "2014-01-03 0.0\n", + "2014-01-06 1.0\n", + "2014-01-07 1.0" + ] + }, + "execution_count": 64, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "positions['GOOG'] = goog_data_signal['signal']\n", + "positions.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
positions
Date
2013-12-310.000000
2014-01-020.000000
2014-01-030.000000
2014-01-06556.573853
2014-01-07567.303589
\n", + "
" + ], + "text/plain": [ + " positions\n", + "Date \n", + "2013-12-31 0.000000\n", + "2014-01-02 0.000000\n", + "2014-01-03 0.000000\n", + "2014-01-06 556.573853\n", + "2014-01-07 567.303589" + ] + }, + "execution_count": 65, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "portfolio['positions'] = positions.multiply(goog_data_signal['price'], axis=0)\n", + "portfolio.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
positionscash
Date
2013-12-310.000000NaN
2014-01-020.0000001000.000000
2014-01-030.0000001000.000000
2014-01-06556.573853443.426147
2014-01-07567.303589443.426147
\n", + "
" + ], + "text/plain": [ + " positions cash\n", + "Date \n", + "2013-12-31 0.000000 NaN\n", + "2014-01-02 0.000000 1000.000000\n", + "2014-01-03 0.000000 1000.000000\n", + "2014-01-06 556.573853 443.426147\n", + "2014-01-07 567.303589 443.426147" + ] + }, + "execution_count": 66, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# 计算cash\n", + "portfolio['cash'] = initial_capital - (positions.diff().multiply(goog_data_signal['price'], axis=0)).cumsum()\n", + "portfolio.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "metadata": {}, + "outputs": [], + "source": [ + "portfolio['total'] = portfolio['positions'] + portfolio['cash']" + ] + }, + { + "cell_type": "code", + "execution_count": 68, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 68, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "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" + ], + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(portfolio['total'])" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "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" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/courses/sources/chap1_1.py b/courses/sources/chap1_1.py new file mode 100644 index 0000000..23aa643 --- /dev/null +++ b/courses/sources/chap1_1.py @@ -0,0 +1,37 @@ +import pandas as pd +import numpy as np +import matplotlib.pyplot as plt +from pandas_datareader import data + +# Getting data +start_date = '2014-01-01' +end_date = '2018-01-01' +goog_data = data.DataReader('GOOG','yahoo',start_date,end_date) +print(goog_data) + +# Preparing the signal +goog_data_signal = pd.DataFrame(index=goog_data.index) +goog_data_signal['price'] = goog_data['Adj Close'] +goog_data_signal['daily_difference'] = goog_data_signal['price'].diff() +print(goog_data_signal.head()) + +goog_data_signal['signal'] = 0.0 # Create a signal based on values of daily_difference +goog_data_signal['signal'] = np.where(goog_data_signal['daily_difference'] > 0, 1.0,0.0) # 0 when we need buy +print(goog_data_signal.head()) + +# We cannot buy/sell limiteless, we can only buy/sell the amount of position we have +goog_data_signal['positions'] = goog_data_signal['signal'].diff() +print(goog_data_signal.head()) + +# Signal visualization +fig = plt.figure() +ax1 = fig.add_subplot(111,ylabel='Google price in $') +goog_data_signal['price'].plot(ax=ax1, color='r', lw=2.) +ax1.plot(goog_data_signal.loc[goog_data_signal.positions == 1.0].index, \ + goog_data_signal.price[goog_data_signal.positions == 1.0], + '^', markersize=5, color='m') +ax1.plot(goog_data_signal.loc[goog_data_signal.positions == -1.0].index, \ + goog_data_signal.price[goog_data_signal.positions == -1.0], + 'v', markersize=5, color='k') + +plt.show() \ No newline at end of file diff --git a/img/1_2.jpg b/img/1_2.jpg new file mode 100644 index 0000000..fdac1a3 Binary files /dev/null and b/img/1_2.jpg differ diff --git a/img/1_5_1.jpg b/img/1_5_1.jpg new file mode 100644 index 0000000..af74a03 Binary files /dev/null and b/img/1_5_1.jpg differ diff --git a/mindmap/1_1-why_are_we_trading-zh_cn.plantuml b/mindmap/1_1-why_are_we_trading-zh_cn.plantuml new file mode 100644 index 0000000..e00c163 --- /dev/null +++ b/mindmap/1_1-why_are_we_trading-zh_cn.plantuml @@ -0,0 +1,12 @@ +@startmindmap +* 我们为何交易 +** 交易是天性 +*** 买低卖高 +**** 古罗马,古罗马广场,有钱人交易货币 +**** 14世纪,威尼斯,交易国债 +**** 1531,比利时,首个股票交易中心 +**** 1602, 荷兰东印度公司公募 +**** 17世纪,法国探索路易斯安娜公募 +*** 共同点:有钱人想变得更有钱;最终都失败 +*** 现代交易市场已经非常透明 +@endmindmap \ No newline at end of file diff --git a/mindmap/1_1-why_are_we_trading.plantuml b/mindmap/1_1-why_are_we_trading.plantuml new file mode 100644 index 0000000..6d5fe04 --- /dev/null +++ b/mindmap/1_1-why_are_we_trading.plantuml @@ -0,0 +1,11 @@ +@startmindmap +* Why are we trading? +** trading = inherent part of humankind. +*** Buy at low price & sell at high price +**** Ancient Roman, Roman Forum, exchange currencies +**** 14 century, venice, government debts +**** 1531, Antwerp Belgium stock exchange +**** 1602 Dutch East India open captial for investors. +**** 1700, French expedition to Louisiana +*** Now, price become more efficient. +@endmindmap \ No newline at end of file diff --git a/mindmap/1_2-basic_concepts_regarding_modern_trading_setup-zh_cn.plantuml b/mindmap/1_2-basic_concepts_regarding_modern_trading_setup-zh_cn.plantuml new file mode 100644 index 0000000..f41146e --- /dev/null +++ b/mindmap/1_2-basic_concepts_regarding_modern_trading_setup-zh_cn.plantuml @@ -0,0 +1,25 @@ +@startmindmap +* 现代交易的基本概念: +** 市场基本因素:供需 +** 现代交易:高效的市场价格发现(因为科技) +*** 竞争点: +**** 精细程度 +**** 洞察力 +** market sector (基于标的) +*** 商品(金属,农产品) +*** 能源(油,气) +*** 股票 +*** 债权 +*** 外汇 +** Asset classes (资产类别) +*** 债券,外汇,股票 +*** 基于上述标的的衍生品 +**** future contract (期货合约) +***** 必须交割 +**** option contract (期权合约) +***** 可不交割,但要付premium(权利金) +***** call option +***** put option +** 现代交易系统 + +@endmindmap \ No newline at end of file diff --git a/mindmap/1_2-basic_concepts_regarding_modern_trading_setup.plantuml b/mindmap/1_2-basic_concepts_regarding_modern_trading_setup.plantuml new file mode 100644 index 0000000..868bcaa --- /dev/null +++ b/mindmap/1_2-basic_concepts_regarding_modern_trading_setup.plantuml @@ -0,0 +1,29 @@ +@startmindmap +* Basic concepts regarding the modern trading setup +** Market driver: supply/demand +** Modern trading: efficient market price discovery +*** competition: +**** granularity of data participants recieve & handle +**** sophistication of insight +** Market sectors +*** i.e. different kinds of underlying products that can be traded. +*** e.g. +**** commodities (metal, agricultural produce) +**** energy (oil, gas) +**** equities (stocks) +**** interest rate bonds (coupons) +**** foreign exchange +** Asset classes +*** an asset class is a group of financial instruments which have similar financial characteristics and behave similarly in the marketplace. +*** e.g. +**** cash interest rate bonds, cash foreign exchange, cash stock shares +**** derivatives of above: future & options +*** future contract: buyer/seller cannot refuse +*** option contract: buyer/seller can refuse to buy or sell +** Basics of what a modern trading +*** trading done electronically through different software. +*** Market data feed handler process/understand market data +**** market data is published in specific protocol (e.g. FIX/FAST,ITCH) +*** Handler app relay information back to buyer/seller. +*** buyer/seller made decision and communicated to exchange through similar software application (order entry gateways) +@endmindmap \ No newline at end of file diff --git a/mindmap/1_3-understanding_algo_trading_concepts.plantuml b/mindmap/1_3-understanding_algo_trading_concepts.plantuml new file mode 100644 index 0000000..058e5d0 --- /dev/null +++ b/mindmap/1_3-understanding_algo_trading_concepts.plantuml @@ -0,0 +1,25 @@ +@startmindmap +* Algo trading concepts +** Exchange order book: maintains all incoming buy/sell orders in exchange +*** Buy order (bids): sort from high price to low +**** same price? depending matching algo (e.g. FIFO) +*** Sell order (asks): sorted from low price to high +*** participant can: +**** place new order +**** cancel order +**** modify order detail +** Exchange matching algo: +*** when match happen +**** when incoming bids >= existing ask +**** when incoming asks <= existing bids +*** FIFO matching +**** priority sequence: price > time +*** Pro-rata matching +**** priority sequence: price > quantity > time +** Limit order book: +*** built by market participants +*** market data sent out by exchange +*** purpose: collect/arrange bids/offers to get insight InterfaceBorderColor +** Exchange market data protocols +*** +@endmindmap \ No newline at end of file diff --git a/mindmap/sec1.plantuml b/mindmap/sec1.plantuml new file mode 100644 index 0000000..1acdf39 --- /dev/null +++ b/mindmap/sec1.plantuml @@ -0,0 +1,10 @@ +@startmindmap +* section 1: Intro and Env Setup +** Algo Trading Fundamental +*** Why are we trading? +*** Basic concepts regarding modern trading setup +*** Understanding algo trading concepts +*** From intuition to algo trading +*** Components of algo trading +*** Why Python? +@endminkmap \ No newline at end of file diff --git a/mindmap/sec1_zh-cn.plantuml b/mindmap/sec1_zh-cn.plantuml new file mode 100644 index 0000000..1c19618 --- /dev/null +++ b/mindmap/sec1_zh-cn.plantuml @@ -0,0 +1,10 @@ +@startmindmap +* 章节1:介绍 +** 为何交易? +** 算法交易基础 +*** 现代交易基本概念 +*** 理解交易概念 +*** 从直觉到算法交易 +*** 算法交易部件 +*** 为和选择Python +@endmindmap \ No newline at end of file