参考书目:深入浅出Python量化交易实战
量化交易是很早就想开的栏目了,之前没时间。现在正好放寒假,然后也找到了一本合适的书可以进行学习。
本次第一章就介绍一下简单的量化流程和一个简单的策略。
量化交易顾名思义就是用代码去验证交易策略是否赚钱,严格按照程序的交易可以避免人性的很多缺点。
核心思想需要回测验证。
第一章就使用最简单的交易策略,低买高卖。如果股价在当天跌了就买,涨了就买。
使用Python进行回测验证收益。
下载数据创建交易信号
使用国内量化最为流行的Tushare库获取数据,很简单便捷。
导入数据分析常用的库
#导入必要的库
import tushare as ts
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
下载中国平安的数据来测试,时间从2020年1月1日到202年3月20日。
#指定下载股票的日期范围
start_date = '2020-01-01'
end_date = '2020-03-20'
#使用ts获取数据
#将时间范围作为参数传入
zgpa = ts.get_k_data('601318',
start_date, end_date)
zgpa = zgpa.set_index('date')
#检查是否下载成功
zgpa.head()
#下面我们来创建交易信号
#为了不影响原始数据,这里创建一个新的数据表
#只保留原始数据中的日期index
zgpa_signal = pd.DataFrame(index = zgpa.index)
#为了更能体现股票的真实价值
#使用Adj Close调整价格作为股票价格
zgpa_signal['price'] = zgpa['close']
#增加一个字段,来存储股价的变化
zgpa_signal['diff'] = zgpa_signal['price'].diff()
#增加diff字段后,第一行会出现空值,我们使用0来进行填补
zgpa_signal = zgpa_signal.fillna(0.0)
#如果股价上涨或不变,则标记为0
#如果股价下跌,则标记为1
zgpa_signal['signal'] = np.where(zgpa_signal['diff'] >= 0, 0,1)
#接下来,根据交易信号的变化进行下单
#一般情况下,在A股市场,买入或卖出至少为100股,即1手
zgpa_signal['order'] = zgpa_signal['signal'].diff()*100
#检查一下下单的情况
zgpa_signal.head()
singal为0表示卖出,1表示买入。order表示相应的买入和卖出的数量 。
回测验证
初始资金20000进行交易,计算持仓市值和账户总余额。
initial_cash = 20000.00
#增加一个字段,代表交易的股票的市值
zgpa_signal['stock'] = zgpa_signal['order']*zgpa_signal['price']
#两次买卖的订单变化之差就是某一时刻仓位的变化情况
#持仓股票的数量变化乘以现价,就是代表交易产生的现金流
#用初始资金减去现金流变化的累加,就是剩余的现金
zgpa_signal['cash'] = initial_cash -(zgpa_signal['order'].diff()*zgpa_signal['price']).cumsum()
#而最股票的市值加上剩余的现金,就是总资产
zgpa_signal['total'] = zgpa_signal['stock'] + zgpa_signal['cash']
zgpa_signal.head()
可以看到计算出来了每一天的持仓市值和总体的账户余额。
自己写量化的核心难点就在于怎么计算现金流的变化,这里是用order表示交易订单的变化之差表示仓位的变化,然后乘价格在累计加合就表示为交易的现金流。
画图展示
#用图形来进行展示
#设置图形的尺寸是10*6
plt.figure(figsize=(10,6))
#分别绘制总资产和持仓股票市值的变化
plt.plot(zgpa_signal['total'])
plt.plot(zgpa_signal['order'].cumsum()*zgpa_signal['price'],'--',
label='stock value')
#增加网格,调整一下图注的位置,就可以显示图像了
plt.xticks([0,12,24,36,48])
plt.grid()
plt.legend(loc='center right')
plt.show()
蓝色的线表示账户总额的变化,可以看到略微亏损,但整体还算不错。