Python股票量化交易(一)

一.量化交易的本质

        量化交易强调的是一种新兴的系统化金融投资方法。用先进的数学模型代替人的主观思维制定交易策略,利用计算机强大的运算力从庞大的股票、债券、期货等历史数据中回测交易策略的盈亏概率,通过管理盈亏的概率帮助投资者做出准确的决策。

二.量化交易的过程

        量化交易是将数据、策略和决策综合为一体的系统。首先是把历史行情、基本面信息、新闻资讯等数据进行初步清洗和处理,而后在大数据的基础上以数学建模、程序设计等方法建立交易策略,在对历史数据的回测中评价交易策略的效果,最终筛选出大概率下盈利的策略,并将其应用于实际交易中产生交易的信号。例如:买什么股、什么时候买、买多少、什么时候卖等。

        交易策略是量化交易的核心,包括择时、选股、仓位管理、参数优化、度量分析等角度的分析,不过要客观地声明,凡是公开的、用于人多的策略,基本也就不赚钱了。

        对于个人交易者来说,目前股票交易并没有全面开放程序化接入交易柜台业务,因此股票交易并不能像期货、数字货币那样能够实现全自动化的交易。

三.多角度分析股票

        股票是股份公司发行的所有权的凭证。是股份公司为筹集资金而发行给个股东作为持股并借以取得股息和分红的一种有价证券。

        如何衡量股票溢价:

        市盈率(P/E ratio),也称“本益比”,它是评价股票水平是否合理的常用指标之一。

        每股收益(EPS),又称每股盈利。

        股价=每股收益*市盈率,即 P=EPS*PE

四.股票技术指标的可视化分析

        股票分析一般分为基本面分析和技术指标分析,对于中小股民来说,很难解读政策层面的利好还是利空,也无法了解上市公司内部运营的实质状况以及发布的公告对于股价的影响有多大。而股价的走势则涵盖了所有的盘面信息,当主力做多,表明有资金进场,此时一切指标都会走好,我们只需要跟着主力进场就行。当资金离场时一切指标都会走坏,我们也只需要跟着主力离场即可。

4.1绘制K线图

#股票数据初始化
stock_dat = df_stockload.copy(deep=True)
#面向过程的方式实现
fig = plt.figure(figsize=(14, 7), dpi=100, facecolor="white")  # 创建fig对象
graph_kline = fig.add_subplot(1, 1, 1)  # 创建子图
#方法1:
mpf.candlestick2_ochl(graph_kline, stock_dat.Open, stock_dat.Close, stock_dat.High, stock_dat.Low, width=0.5,
                      colorup='r', colordown='g') # 绘制K线走势
#方法2
# 使用zip方法生成数据列表
ohlc = list(zip(np.arange(0,len(stock_dat.index)),stock_dat.Open,stock_dat.Close,stock_dat.High,stock_dat.Low)) 
# 绘制K线走势
mpf.candlestick_ochl(graph_kline, ohlc, width=0.2, colorup='r', colordown='g', alpha=1.0) 

graph_kline.set_title(u"000651 格力电器-日K线")
graph_kline.set_xlabel("日期")
graph_kline.set_ylabel(u"价格")
graph_kline.set_xlim(0, len(stock_dat.index)) # 设置x轴的范围
graph_kline.set_xticks(range(0, len(stock_dat.index), 15)) # X轴刻度设定 每15天标一个日期
graph_kline.set_xticklabels([stock_dat.index.strftime('%Y-%m-%d')[index] \
                           for index in graph_kline.get_xticks()]) # 标签设置为日期
fig.autofmt_xdate(rotation=45) # 避免x轴日期刻度标签的重叠 将每个ticker标签倾斜45度
plt.show()

Python股票量化交易(一)_第1张图片

4.2绘制成交量图 

def draw_volume_chart(stock_dat):
    #绘制成交量图
    # 绘制BAR>0 柱状图
    bar_red = np.where(stock_dat.Open < stock_dat.Close,stock_dat.Volume,0)
    # 绘制BAR<0 柱状图
    bar_green = np.where(stock_dat.Open > stock_dat.Close,stock_dat.Volume,0)
    
    layout_dict = {'figsize':(14,5),
                  'index':stock_dat.index,
                  'draw_kind':{'bar':
                                  {'bar_red':bar_red,
                                  'bar_green':bar_green
                                  }
                              },
                  'title':u"000651 格力电器-成交量",
                  'ylabel':u"成交量"
                  }
    app.fig_output(**layout_dict)
draw_volume_chart(df_stockload.copy(deep=True))  # 成交量图

Python股票量化交易(一)_第2张图片

4.3 绘制移动平均线图

def draw_sma_chart(stock_dat):
    #绘制移动平均线图
    stock_dat['SMA20'] = stock_dat.Close.rolling(window=20).mean()
    stock_dat['SMA30'] = stock_dat.Close.rolling(window=30).mean()
    stock_dat['SMA60'] = stock_dat.Close.rolling(window=60).mean()
    
    layout_dict = {'figsize':(14,5),
                  'index':stock_dat.index,
                  'draw_kind':{'line':
                                  {'SMA20':stock_dat.SMA20,
                                  'SMA30':stock_dat.SMA30,
                                  'SMA60':stock_dat.SMA60
                                  }
                              },
                  'title': u"000651 格力电器-均线",
                  'ylabel':u"价格",
                  'xlabel':u"日期",
                  'xticks':15,
                  'legend':u'best',
                  'xticklabels':'%Y-%m-%d'}
    app.fig_output(**layout_dict)
draw_sma_chart(df_stockload.copy(deep=True))  # 移动平均线图

Python股票量化交易(一)_第3张图片

4.4绘制KDJ图 

def draw_kdj_chart(stock_dat):
    #绘制KDJ图
    low_list = stock_dat['Low'].rolling(9,min_periods=1).min()
    high_list = stock_dat['High'].rolling(9,min_periods=1).max()
    rsv = (stock_dat['Close']-low_list) / (high_list - low_list) * 100
    stock_dat['K'] = rsv.ewm(com=2,adjust=False).mean()
    stock_dat['D'] = stock_dat['K'].ewm(com=2,adjust=False).mean()
    stock_dat['J'] = 3*stock_dat['K'] - 2*stock_dat['D']
    
    layout_dict = {'figsize':(14,5),
                  'index':stock_dat.index,
                  'draw_kind':{'line':
                                  {'K':stock_dat.K,
                                  'D':stock_dat.D,
                                  'J':stock_dat.J
                                  }
                              },
                  'title': u"000651 格力电器-KDJ",
                  'ylabel': u"KDJ",
                  'legend': u'best'}
    app.fig_output(**layout_dict)
draw_kdj_chart(df_stockload.copy(deep=True))  # KDJ图

Python股票量化交易(一)_第4张图片

4.5绘制MACD图 

def draw_macd_chart(stock_dat):
    #绘制macd图
    #差离值
    macd_dif = stock_dat['Close'].ewm(span=12,adjust=False).mean() - stock_dat['Close'].ewm(span=26,adjust=False).mean()
    #查离平均值
    macd_dea = macd_dif.ewm(span=9,adjust=False).mean()
    #柱状值
    macd_bar = 2*(macd_dif - macd_dea)
    
    bar_red = np.where(macd_bar > 0,  macd_bar, 0) # 绘制BAR>0 柱状图
    bar_green = np.where(macd_bar < 0,  macd_bar, 0) # 绘制BAR<0 柱状图
    
    layout_dict = {'figsize': (14, 5),
               'index': stock_dat.index,
               'draw_kind': {'bar':
                                 {'bar_red': bar_red,
                                  'bar_green': bar_green
                                  },
                             'line':
                                 {'macd dif': macd_dif,
                                  'macd dea': macd_dea
                                  }
                             },
               'title': u"000651 格力电器-MACD",
               'ylabel': u"MACD",
               'legend': u'best'}

    app.fig_output(**layout_dict)
draw_macd_chart(df_stockload.copy(deep=True))  # MACD图

Python股票量化交易(一)_第5张图片

4.6绘制均线金叉和死叉(均线交叉线) 

def draw_cross_annotate(stock_dat):
    # 绘制均线金叉和死叉

    #graph_sma.legend(loc='upper left')
    #graph_range = stock_dat.High.max() - stock_dat.Low.min()
    #graph_sma.set_ylim(stock_dat.Low.min() - graph_range * 0.25, stock_dat.High.max()) # 设置y轴的范围

    # 绘制移动平均线图
    stock_dat['Ma20'] = stock_dat.Close.rolling(window=20).mean()  # pd.rolling_mean(stock_dat.Close,window=20)
    stock_dat['Ma30'] = stock_dat.Close.rolling(window=30).mean()  # pd.rolling_mean(stock_dat.Close,window=30)

    # 长短期均线序列相减取符号
    list_diff = np.sign(stock_dat['Ma20'] - stock_dat['Ma30'])
    # print(list_diff)
    list_signal = np.sign(list_diff - list_diff.shift(1))
    # print(list_signal)

    down_cross = stock_dat[list_signal < 0]
    up_cross = stock_dat[list_signal > 0]

    # 循环遍历 显示均线金叉/死叉提示符
    layout_dict = {'figsize': (14, 5),
                   'index': stock_dat.index,
                   'draw_kind': {'line':
                                     {'SMA-20': stock_dat.Ma20,
                                      'SMA-30': stock_dat.Ma30
                                      },
                                 'annotate':
                                     {u'死叉':
                                          {'andata': down_cross,
                                           'va':'top',
                                           'xy_y': 'Ma20',
                                           'xytext':(-30,-stock_dat['Ma20'].mean()*0.5),
                                           'fontsize': 8,
                                           'arrow': dict(facecolor='green', shrink=0.1)
                                          },
                                      u'金叉':
                                          {'andata': up_cross,
                                           'va': 'bottom',
                                           'xy_y': 'Ma20',
                                           'xytext': (-30, stock_dat['Ma20'].mean() * 0.5),
                                           'fontsize': 8,
                                           'arrow': dict(facecolor='red', shrink=0.1)
                                           }
                                      }
                                 },
                   'title': u"000651 格力电器-均线交叉",
                   'ylabel': u"价格",
                   'xlabel': u"日期",
                   'legend': u'best'}
    app.fig_output(**layout_dict)
draw_cross_annotate(df_stockload.copy(deep=True))  # 均线交叉提示

Python股票量化交易(一)_第6张图片

未完待续...欢迎一起学习交流 

你可能感兴趣的:(量化金融)