深入浅出Python量化交易实学习(一)
第一章 从零开始
金融知识(CAPM资产定价模型+β因子+α因子)+库安装+交易数据下载+展示
1.1 & 1. 2 金融和量化知识
CAPM资产定价模型等,等学习cfa的portfolio后再补充
1.3 python相关准备
1.3.1 库下载
Anaconda安装
https://www.anaconda.com/
寻找免费的数据源,这里用的是歪枣网的数据
http://www.waizaowang.com/
1.3.2 获取股票数据并进行简单分析
wz_data.py
的代码如下(交易数据后续可以直接保存在本地,重复使用):
#coding=utf-8
import sys
import requests
import os
import datetime
import io
import pandas as pd
class wz_data(object):
def __init__(self):
self.TOKEN = 'xxxxxx'
self.DATA_PATH = 'd:/python/data/'
def get_stock_data_online(self, code, s_date, e_date=None):
"""在线接口,直接下载"""
api = 'http://api.waizaowang.com/doc/getStockHSADayKLine?'
params = {}
start_date = s_date
if not e_date:
end_date = datetime.datetime.strftime(datetime.date.today(), '%Y-%m-%d')
else:
end_date = e_date
params['code'] = code
params['startDate'] = start_date
params['endDate'] = end_date
params['fq'] = '0'
params['ktype'] = '101'
params['fields'] = 'tdate,open,high,low,close,cjl,cje,hsl'
params['export'] = '5'
params['token'] = self.TOKEN
r = requests.get(api, params=params).json()
df = pd.DataFrame(data=r['data'], columns=r['zh'])
return df
chap_1.py
的部分代码如下:
#codeing=utf-8
import numpy as np
import pandas as pd
import mplfinance as mpf
from utils import wz_data
if __name__ == '__main__':
#单独实现了去wz网获取数据的接口
wz = wz_data()
#股票代码,起始日期,结束日期,这里走的是未复权
data = wz.get_stock_data_online('601318', '2020-01-01','2020-03-18')
#返回的直接是一个DataFrame对象
data.rename(columns={
'交易时间': 'Date',
'开盘价': 'Open',
'最高价': 'High',
'最低价': 'Low',
'收盘价': 'Close',
'成交量': 'Volume',
'成交额': 'Money',
'换手率': 'Turnover'
}, inplace = True)
data.index = pd.DatetimeIndex(data['Date'])
print(data.head())
#用.diff()方法来计算每日股价变化情况
data['diff'] = data['Close'].diff()
print(data.head())
#绘制蜡烛图
#type='candle', type='line', type='renko', or type='pnf'
mpf.plot(data.tail(30), type="candle", volume=True)
执行结果展示如下:
获取的数据:
加上diff分析后的数据:
绘制的蜡烛图数据:
1.3.3 设计简单的交易策略
策略设计
我们可以设置一个最简单的交易策略:如果当日股价下跌,我们就在下一个交易日开盘前挂单买入;反之,如果当日股价上涨,我们就在下一个交易日开盘前挂单卖出。循环进行这个步骤,我们不就可以赚钱了吗?
要实现这个策略,首先我们来创建一个新的字段Signal(交易信号)。如果diff字段大于0,则Signal标记为1;如果diff字段小于或等于0,则Signal标记为0。输入代码如下:
#codeing=utf-8
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import mplfinance as mpf
from utils import wz_data
if __name__ == '__main__':
#之前的代码略
print('----计算交易信号Signal数据------')
#创建交易信号字段,命名为Signal
#如果diff值大于0,则Signal为1,否则为0
data['Signal'] = np.where(data['diff'] > 0, 1, 0)
#check
print(data.head())
#简单交易策略
#·当日股价下跌,下一个交易日买入
#·当日股价上涨,下一个交易日卖出
#交易信号字段:Signal, diff > 0 Signal=1 卖出,否则Signal=0
解释:从上图中可以看到,使用np.where()可以让程序判断每日股价是上涨还是下跌:如果上涨,则交易信号为1,代表卖出;否则交易信号为0,代表买入。这样我们就得到了最简单的交易信号。
交易信号可视化
#codeing=utf-8
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import mplfinance as mpf
from utils import wz_data
if __name__ == '__main__':
#之前的代码略
#绘图 画布尺寸10*5
plt.figure(figsize=(10, 5))
# 折线图绘制日K线
data['Close'].plot(linewidth=2, color='k', grid=True)
# 卖出标志 x轴日期,y轴数值 卖出信号,倒三角
# matplotlib.pyplot.scatter(x, y, marker, size, color)
plt.scatter(data['Close'].loc[data.Signal == 1].index,
data['Close'][data.Signal == 1],
marker = 'v', s=80, c='g')
# 买入标志 正三角
plt.scatter(data['Close'].loc[data.Signal == 0].index,
data['Close'][data.Signal == 0],
marker='^', s=80, c='r')
plt.show()
从图中可以看到,倒三角所处的位置是股票收盘价较上一个交易日上涨的时刻,代表卖出;正三角所处的位置是股票收
盘价较上一个交易日下跌的时刻,代表买入
2.1 补充学习
np.where的用法
np.where(condition, x, y)
满足条件(condition),输出x,不满足输出y
如果是一维数组,相当于[x_v if c else y_v for (c, x_v, y_v) in zip(condition,x,y)]
>>> a = np.arange(10)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> np.where(a > 5, 1, -1)
array([-1, -1, -1, -1, -1, -1, 1, 1, 1, 1])
>>> np.where([[True, False], [True, True]], # 官网上的例子,多维
[[1, 2], [3, 4]],
[[9, 8], [7, 6]])
array([[1, 8],
[3, 4]])
上面这个例子的条件为[[True, False], [True, False]]
,分别对应最后输出结果的四个值。第一个值从[1, 9]
中选,因为条件为True,所以是选1。第二个值从[2, 8]
中选,因为条件为False,所以选8,后面以此类推。类似的问题可以再看个例子:
>>> a = 10
>>> np.where([[a > 5, a < 5], [a == 10,a == 7]],
[["chosen","not chosen"], ["chosen","not chosen"]],
[["not chosen","chosen"], ["not chosen","chosen"]])
array([['chosen', 'chosen'],
['chosen', 'chosen']], dtype='<U10')