当前位置:   article > 正文

【《深入浅出python量化交易交易实战》Python复现(第一章:Step By Step)】_深入浅出python量化交易实战pdf

深入浅出python量化交易实战pdf

第一章 从零开始

金融知识(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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
'
运行

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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

执行结果展示如下:
获取的数据:
在这里插入图片描述
加上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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

在这里插入图片描述
解释:从上图中可以看到,使用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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

交易信号的可视化
从图中可以看到,倒三角所处的位置是股票收盘价较上一个交易日上涨的时刻,代表卖出;正三角所处的位置是股票收
盘价较上一个交易日下跌的时刻,代表买入

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]])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

上面这个例子的条件为[[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')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

参考资料

  1. https://blog.csdn.net/qq_24380731/article/details/128798325
  2. https://developer.aliyun.com/article/620173
  3. numpy.where用法
  4. 深入浅出Python量化交易实战:第一章
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/人工智能uu/article/detail/836173
推荐阅读
相关标签
  

闽ICP备14008679号