融安python量化交易培训费用a股和期货量化交易python入门
下载地址 https://share.weiyun.com/tIMc8ewb
资料目录 Python股票量化投资视频课程(25集完结) Python股票量化策略培训预习材料(视频讲解+素材) 《Python机器学习与量化投资》电子书 《Python量化交易》.pdf 《Python与量化投资:从基础到实战》.pdf 《零起点TensorFlow与量化交易》.pdf 机器学习在量化投资中的应用研究_汤凌冰著 pdf 量化交易之路:用Python做股票量化分析(高清).pdf 量化投资以Python为工具.pdf 举例 向量回测 下面以上证 50ETF(510050)为例进行双均线的向量回测,其具体步骤如下。 (1)导入包。 import matplotlib.pyplot as plt %matplotlib inline import pandas as pd import tushare as ts (2)用 Tushare 获取数据,然后用 sort_index()改变其时间排序方式,再计算每天的价格变化,df.head(20)可以显示头 20 行数据,如图 5-2 所示。 # 获取数据 data = ts.get_hist_data('510050', '2017-01-01', '2018-01-01') #50ETF 1 年日线历史数据 data = data.sort_index() #按照日期排序 df = pd.DataFrame() #创建新DataFrame df['close'] = data['close'] #收盘价 df['change'] = data['close'] - data['close'].shift(1) #每日收盘价的变动 df.head(20) #显示头20 行数据(交易日) 图 5-2 显示头 20 行数据(部分截取) ( 3 ) 计 算 两 条 均 线 , 分 别 是 5 天 移 动 均 线 和 20 天 移 动 均 线 。 rolling(window=5,center=False)意味着滚动回望窗口的周期是 5,不取中位数。 # 计算均值 df['ma5'] = df['close'].rolling(window=5, center=False).mean() df['ma20'] = df['close'].rolling(window=20, center=False).mean() df.head(20) (4)从图 5-3 中可以观察到,ma5 是从第 5 个交易日才开始有的(统计的是前 4 天的收盘价,加上今天的收盘价),而 ma20 是从第 20 个交易日才开始产生的。所以到 2 月 6 日所有数据才完整起来,同时从这天起(第 20 个交易日)开始产生交易信号。 图 5-3 从第 20 个交易日后开始产生信号 (5)清除空值,从 2 月 6 日开始统计: # 删除空值 df = df.dropna() (6)通过交易信号计算持仓情况。若快均线上穿慢均线,即 ma5 > ma20 时 产生买入信号。因为 ma5 和 ma20 是当天收盘的时候才刚刚统计出来的,所以其交易信号需要第二天开盘的时候执行。若是不注意写成当天执行的话,就隐含未来函数,导致策略回测结果偏高。因为函数必须满足时序不变性,即时间靠后的数据对时间靠前的结果不产生影响,未来函数就是时间靠后的数据对靠前结果有影响。 反之,若 ma5 < ma20,手头有多仓,则先平掉,然后再开相同数目的空仓, 如图 5-4 所示。 # 持仓情况 df['pos'] = 0 # 初始化 #交易信号判断 df['pos'][df['ma5'] >= df['ma20']] = 10000 df['pos'][df['ma5'] < df['ma20']] = -10000 df['pos'] = df['pos'].shift(1).fillna(0) df 图 5-4 通过交易信号计算持仓情况 (7)计算净盈亏。 每天盈亏=当日持仓×当天价格变化 当仓位发生变化时,如做多变成做空,则会产生手续费。 手续费=开仓的总数(这里是 2 万股)×当日收盘价×手续费率(万分之三) 净盈亏=每天盈亏−手续费 如图 5-5 所示。 # 计算每日盈亏和手续费 df['pnl'] = df['pos']*df['change'] df['fee'] = 0 #初始化fee df['fee'][df['pos']!= df['pos'].shift(1)] = 20000 * df['close'] * 3 / 10000 df['netpnl'] = df['pnl'] - df['fee'] df 图 5-5 计算净盈亏 (8)计算累计盈亏,如图 5-6 所示。 # 累计盈亏 cumsum() df['cumpnl'] = df['netpnl'].cumsum() df 图 5-6 计算累计盈亏 (9)最后绘图得到累计盈亏曲线,如图 5-7 所示。 df['cumpnl'].plot() 测试表明双均线策略并不理想。图中显示 2.3 万元人民币的本钱,在 2017 年全年最终赢利 2 千元左右。 图 5-7 累计盈亏曲线
|