python分析目前为止科创板企业省份分布

李魔佛 发表了文章 • 0 个评论 • 162 次浏览 • 2019-08-26 00:45 • 来自相关话题

科创板上市以来已经有一个多月了,我想看看到目前为止,上市企业都是归属哪些地方的。 因为个人觉得科创板是上证板块的,那么来自江浙一带的企业会更多。 毕竟现在深市和沪市在争夺资源,深市希望把深圳企业留回在深市的主板或者中小创版块。
 
首先获取行情数据,借助tushare这个框架:
在python3环境下,pip install tushare --upgrade ,记得要更新,因为用的旧版本会获取不到科创板的数据。
安装成功后试试import tushare as ts,看看有没有报错。没有就是安装成功了。
 
接下来抓取全市场的行情.




(点击查看大图)
查看前5条数据
 现在行情数据存储在df中,然后分析数据。
因为提取的是全市场的数据,然后获取科创板的企业:




(点击查看大图)

使用的是正则表达式,匹配688开头的代码。
 
接下来就是分析企业归属地:




(点击查看大图)

使用value_counts函数,统计该列每个值出现的次数。

搞定了! 是不是很简单?
 
而且企业地区分布和自己的构想也差不多,江浙沪一带占了一半,加上北京地区,占了80%以上的科创板企业了。
 
每周会定期更新一篇python数据分析股票的文章。
 
原创文章,欢迎转载
请注明出处:
 http://30daydo.com/article/528 

  查看全部
科创板上市以来已经有一个多月了,我想看看到目前为止,上市企业都是归属哪些地方的。 因为个人觉得科创板是上证板块的,那么来自江浙一带的企业会更多。 毕竟现在深市和沪市在争夺资源,深市希望把深圳企业留回在深市的主板或者中小创版块。
 
首先获取行情数据,借助tushare这个框架:
在python3环境下,pip install tushare --upgrade ,记得要更新,因为用的旧版本会获取不到科创板的数据。
安装成功后试试import tushare as ts,看看有没有报错。没有就是安装成功了。
 
接下来抓取全市场的行情.

a1.PNG
(点击查看大图)
查看前5条数据
 现在行情数据存储在df中,然后分析数据。
因为提取的是全市场的数据,然后获取科创板的企业:

a2.PNG
(点击查看大图)

使用的是正则表达式,匹配688开头的代码。
 
接下来就是分析企业归属地:

a3.PNG
(点击查看大图)

使用value_counts函数,统计该列每个值出现的次数。

搞定了! 是不是很简单?
 
而且企业地区分布和自己的构想也差不多,江浙沪一带占了一半,加上北京地区,占了80%以上的科创板企业了。
 
每周会定期更新一篇python数据分析股票的文章。
 
原创文章,欢迎转载
请注明出处:
 http://30daydo.com/article/528 

 

numpy indices的用法

李魔佛 发表了文章 • 0 个评论 • 301 次浏览 • 2019-07-08 17:58 • 来自相关话题

Suppose you have a matrix M whose (i,j)-th element equals

M_ij = 2*i + 3*j
One way to define this matrix would be

i, j = np.indices((2,3))
M = 2*i + 3*j
which yields

array([[0, 3, 6],
[2, 5, 8]])
In other words, np.indices returns arrays which can be used as indices. The elements in i indicate the row index:

In [12]: i
Out[12]:
array([[0, 0, 0],
[1, 1, 1]])
The elements in j indicate the column index:

In [13]: j
Out[13]:
array([[0, 1, 2],
[0, 1, 2]]) 
上面是Stack Overflow的解释。 翻译一下:

np.indices((2,3))
 
返回的是一个行列的索引,然后可以用这个索引快速的创建二维数据。
 
比如我要画一个圆:
img = np.zeros((400,400))
ir,ic = np.indices(img.shape)
circle = (ir-135)**2+(ic-150)**2 < 30**2 # 半径30,圆心在135,150
img[circle]=1
 
img现在就是一个圆啦
  查看全部
Suppose you have a matrix M whose (i,j)-th element equals

M_ij = 2*i + 3*j
One way to define this matrix would be

i, j = np.indices((2,3))
M = 2*i + 3*j
which yields

array([[0, 3, 6],
[2, 5, 8]])
In other words, np.indices returns arrays which can be used as indices. The elements in i indicate the row index:

In [12]: i
Out[12]:
array([[0, 0, 0],
[1, 1, 1]])
The elements in j indicate the column index:

In [13]: j
Out[13]:
array([[0, 1, 2],
[0, 1, 2]])
 
上面是Stack Overflow的解释。 翻译一下:

np.indices((2,3))
 
返回的是一个行列的索引,然后可以用这个索引快速的创建二维数据。
 
比如我要画一个圆:
img = np.zeros((400,400))
ir,ic = np.indices(img.shape)
circle = (ir-135)**2+(ic-150)**2 < 30**2 # 半径30,圆心在135,150
img[circle]=1
 
img现在就是一个圆啦
 

nunpy中的std标准差是样本差吗

李魔佛 发表了文章 • 0 个评论 • 204 次浏览 • 2019-07-01 10:08 • 来自相关话题

写个代码测试下:
# 测试一下那个方差
x=[1,2,3,4,5,6,7,8,9,10]
X = np.array(x)
X.mean()
5.5
 
X.std() # 标准差
2.8722813232690143
 
手工计算一下:
def my_fangca(X):
l=len(X)
mean=X.mean()
sum_ = 0
sum_std=0
for i in X:
sum_+=(i-mean)**2
var_=sum_/l
std_=(sum_/(l))**0.5
return var_,std_
result = my_fangca(X)
得到的result

(8.25, 2.8722813232690143)
 
说明numpy的std是标准差,不是样本差 查看全部
写个代码测试下:
# 测试一下那个方差
x=[1,2,3,4,5,6,7,8,9,10]
X = np.array(x)
X.mean()
5.5
 
X.std() # 标准差
2.8722813232690143
 
手工计算一下:
def my_fangca(X):
l=len(X)
mean=X.mean()
sum_ = 0
sum_std=0
for i in X:
sum_+=(i-mean)**2
var_=sum_/l
std_=(sum_/(l))**0.5
return var_,std_

result = my_fangca(X)
得到的result

(8.25, 2.8722813232690143)
 
说明numpy的std是标准差,不是样本差

修改easytrader国金证券的默认启动路径

李魔佛 发表了文章 • 0 个评论 • 214 次浏览 • 2019-06-17 10:23 • 来自相关话题

如果你的国金证券不是安装在默认路径的话,会无法启动。报错:

pywinauto.application.AppStartError: Could not create the process "C:\全能行证券交易终端\xiadan.exe"
Error returned by CreateProcess: (2, 'CreateProcess', '系统找不到指定的文件。')

 
看了配置文件,也是没有具体的参数可以修改,只好修改源代码。
别听到改源代码就害怕,只是需要改一行就可以了。
 
找到文件:
site-package\easytrader\config\client.py
 
找过这一行:
class GJ(CommonConfig):
DEFAULT_EXE_PATH = "C:\\Tool\\xiadan.exe"只要修改上面的路径就可以了。注意用双斜杠。
  查看全部
如果你的国金证券不是安装在默认路径的话,会无法启动。报错:


pywinauto.application.AppStartError: Could not create the process "C:\全能行证券交易终端\xiadan.exe"
Error returned by CreateProcess: (2, 'CreateProcess', '系统找不到指定的文件。')


 
看了配置文件,也是没有具体的参数可以修改,只好修改源代码。
别听到改源代码就害怕,只是需要改一行就可以了。
 
找到文件:
site-package\easytrader\config\client.py
 
找过这一行:
class GJ(CommonConfig):
DEFAULT_EXE_PATH = "C:\\Tool\\xiadan.exe"
只要修改上面的路径就可以了。注意用双斜杠。
 

numpy flatten函数的用法

李魔佛 发表了文章 • 0 个评论 • 378 次浏览 • 2019-04-30 10:01 • 来自相关话题

把数据展平,无论多少维的数据,变为1维

例子:
x=np.array([[1,2,3,4],[5,6,7,8]])x
array([[1, 2, 3, 4],
[5, 6, 7, 8]])
然后对x进行flatten操作
x.flatten()
得到的数据:
array([1, 2, 3, 4, 5, 6, 7, 8])
你也可以指定展平的轴,设定axis就可以了. 查看全部

把数据展平,无论多少维的数据,变为1维

例子:
x=np.array([[1,2,3,4],[5,6,7,8]])
x
array([[1, 2, 3, 4],
[5, 6, 7, 8]])

然后对x进行flatten操作
x.flatten()

得到的数据:
array([1, 2, 3, 4, 5, 6, 7, 8])

你也可以指定展平的轴,设定axis就可以了.

发现numpy一个很坑的问题,要一定级别的高手才能发现问题

李魔佛 发表了文章 • 0 个评论 • 386 次浏览 • 2019-04-30 00:04 • 来自相关话题

一个二元一次方程:
y=X0**2+X1**2   # **2 是平方def function_2(x):
return x[0]**2+x[1]**2

 
下面是计算y的偏导数,分布计算X0和X1的偏导def numerical_gradient(f,x):
grad = np.zeros_like(x)
h=1e-4
for idx in range(x.size):
temp_v = x[idx]
x[idx]=temp_v+h
f1=f(x)
print(x,f1)
x[idx]=temp_v-h
f2=f(x)
print(x,f2)
ret = (f1-f2)/(2*h)
print(ret)
x[idx]=temp_v
grad[idx]=ret

return grad
然后调用numerical_gradient(function_2,np.array([3,4]))
计算的是二元一次方程 y=X0**2+X1**2  在点(3,4)的偏导的值
得到的是什么结果?
为什么会得到这样的结果? 
小白一般要花点时间才能找到原因。
  查看全部
一个二元一次方程:
y=X0**2+X1**2   # **2 是平方
def function_2(x):
return x[0]**2+x[1]**2

 
下面是计算y的偏导数,分布计算X0和X1的偏导
def numerical_gradient(f,x):
grad = np.zeros_like(x)
h=1e-4
for idx in range(x.size):
temp_v = x[idx]
x[idx]=temp_v+h
f1=f(x)
print(x,f1)
x[idx]=temp_v-h
f2=f(x)
print(x,f2)
ret = (f1-f2)/(2*h)
print(ret)
x[idx]=temp_v
grad[idx]=ret

return grad

然后调用
numerical_gradient(function_2,np.array([3,4]))

计算的是二元一次方程 y=X0**2+X1**2  在点(3,4)的偏导的值
得到的是什么结果?
为什么会得到这样的结果? 
小白一般要花点时间才能找到原因。
 

numpy和dataframe轴的含义,axis为负数的含义

李魔佛 发表了文章 • 0 个评论 • 422 次浏览 • 2019-04-28 14:22 • 来自相关话题

比如有数组:
a=np.array([[[1,2],[3,4]],[[11,12],[13,14]]])
a
array([[[ 1, 2],
[ 3, 4]],

[[11, 12],
[13, 14]]])
 a有3个中括号,那么就有3条轴,从0开始到2,分别是axis=0,1,2
那么我要对a进行求和,分别用axis=0,1,2进行运行。
 
a.sum(axis=0)得到:
array([[12, 14],
[16, 18]])意思是去掉一个中括号,然后运行。
 
同理:
a.sum(axis=1)对a去掉2个中括号,然后运行。
得到:
array([[ 4, 6],
[24, 26]])那么对a.sum(axis=2)的结果呢?读者可以自己上机去尝试吧。
 
而轴的负数,axis=-3和axis=0的意思是一样的,对于有3层轴的数组来说的话。
 
a.sum(axis=-3)
array([[12, 14],
[16, 18]])
  查看全部
比如有数组:
a=np.array([[[1,2],[3,4]],[[11,12],[13,14]]])

a
array([[[ 1,  2],
[ 3, 4]],

[[11, 12],
[13, 14]]])

 a有3个中括号,那么就有3条轴,从0开始到2,分别是axis=0,1,2
那么我要对a进行求和,分别用axis=0,1,2进行运行。
 
a.sum(axis=0)
得到:
array([[12, 14],
[16, 18]])
意思是去掉一个中括号,然后运行。
 
同理:
a.sum(axis=1)
对a去掉2个中括号,然后运行。
得到:
array([[ 4,  6],
[24, 26]])
那么对a.sum(axis=2)的结果呢?读者可以自己上机去尝试吧。
 
而轴的负数,axis=-3和axis=0的意思是一样的,对于有3层轴的数组来说的话。
 
a.sum(axis=-3)

array([[12, 14],
[16, 18]])

 

np.nonzero()的用法【numpy小白】

李魔佛 发表了文章 • 0 个评论 • 572 次浏览 • 2019-04-28 10:16 • 来自相关话题

numpy函数返回非零元素的位置。

返回值为元组, 两个值分别为两个维度, 包含了相应维度上非零元素的目录值。
 
比如:
n1=np.array([0,1,0,0,0,0,1,0,0,0,0,0,0,1])
n1.nonzero()
返回的是:
(array([ 1, 6, 13], dtype=int64),)注意上面是一个yu元组
要获取里面的值,需要用 n1.nonzero()[0] 来获取。
 
原创文章
转载请注明出处:
http://30daydo.com/article/466
  查看全部
numpy函数返回非零元素的位置。

返回值为元组, 两个值分别为两个维度, 包含了相应维度上非零元素的目录值。
 
比如:
n1=np.array([0,1,0,0,0,0,1,0,0,0,0,0,0,1])
n1.nonzero()

返回的是:
(array([ 1,  6, 13], dtype=int64),)
注意上面是一个yu元组
要获取里面的值,需要用 n1.nonzero()[0] 来获取。
 
原创文章
转载请注明出处:
http://30daydo.com/article/466
 

ndarray和array的区别【numpy小白】

李魔佛 发表了文章 • 0 个评论 • 217 次浏览 • 2019-04-28 10:11 • 来自相关话题

在numpy中,np.array()是一个函数,用法: np.array([1,2,3,4])上面代码创建了一个对象,这个对象就是ndarray。 所以ndarray是一个类对象象,而array是一个方法。
 
原创文章
转载请注明出处:
http://30daydo.com/article/465
  查看全部
在numpy中,np.array()是一个函数,用法: 
np.array([1,2,3,4])
上面代码创建了一个对象,这个对象就是ndarray。 所以ndarray是一个类对象象,而array是一个方法。
 
原创文章
转载请注明出处:
http://30daydo.com/article/465
 

【手把手教你】量价关系分析与Python实现

Python金融量化 发表了文章 • 3 个评论 • 788 次浏览 • 2019-04-01 17:15 • 来自相关话题

如果操作过量,即使对市场判断正确,仍会一败涂地。——索罗斯

引言

成交量是股票市场的温度计,许多股票的疯狂上涨并非基本面发生了实质性的变化,而是短期筹码和资金供求关系造成的。量价关系分析法是一种将价格走势与成交量变化相结合的研究方法,正所谓,大军未动,粮草先行。成交量一直被看为是股票市场的“粮草”,成交量的变化是股价变化的前兆。因此,成交量是分析判断市场行情,并作出投资决策时的重要依据,也是各种技术分析指标应用时不可或缺的参照。

本文延续“手把手教你使用Python的TA-Lib”系列,着重介绍交易量指标(Volume Indicators)及其运用。【手把手教你】股市技术分析利器之TA-Lib(一)主要探讨了重叠指标的相关原理与Python实现,【手把手教你】股市技术分析利器之TA-Lib(二)则着重介绍了TA-Lib中强大的数学运算、数学变换、统计函数、价格变换、周期指标和波动率指标函数及其应用实例。TA-Lib的安装使用可查看以前推文。

                        


01
A/D Line 累积派发线


Chaikin Accumulation/Distribution Line (AD),是Marc Chaikin提出的用来平衡交易量的指标,以当日收盘价、最高价和最低价来估算一段时间内该股票累积的资金流量, 用来确定潜在的趋势以及预测趋势反转。


函数名:AD

调用格式:ta.AD(high,low,close,volume)

计算方法: AD=前日AD值+(多空对比*成交量)

多空对比=((收盘价-最低价)-(最高价-收盘价))/(最高价-最低价);注意:当最高价等于最低价时,多空对比 = (收盘价 / 昨收盘) - 1

运用要点:

AD测量资金流向,AD向上表明多方占优势,反之表明空方占优势;

AD与价格的背离可视为买卖信号:底背离考虑买入,顶背离考虑卖出;

AD指标无需设置参数,但在应用时,可结合均线、MACD、KDJ等指标进行分析;

AD指标忽略了缺口的影响,有时无法真实反映价格与成交量的关系。


02
A/D Oscillator 震荡指标


震荡指标是计算长短周期的AD差,将资金流动情况与价格行为相对比,用来研判市场中资金流入和流出的情况。


函数名:ADOSC

调用格式:ta. ADOSC(high,low,close,volume,

              fastperiod=3,slowperiod=10)

计算方法:fastperiod AD - slowperiod AD,AD的计算同上。

运用要点:

交易信号是背离:看涨背离做多,看跌背离做空;

股价与90天移动平均结合,与其他指标结合;

由正变负卖出,由负变正买进。

03
OBV - 能量潮


全称为 On Balance Volume, 由 Joe Granville 提出,通过统计成交量变动的趋势推测股价趋势。


函数名:OBV

调用格式:ta.OBV(close, volume)

计算公式:以某日为基期,逐日累计每日股票总成交量,若隔日指数或股票上涨,则基期OBV加上本日成交量为本日OBV。隔日指数或股票下跌, 则基期OBV减去本日成交量为本日OBV。

研判:

以“N”字型为波动单位,一浪高于一浪称“上升潮”,下跌称“跌潮”;

上升潮买进,跌潮卖出;

须配合K线图、股价走势和其他指标。


04
应用实例代码


#先引入后面可能用到的包(package)
import pandas as pd  
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline   

#正常显示画图时出现的中文和负号
from pylab import mpl
mpl.rcParams['font.sans-serif']=['SimHei']
mpl.rcParams['axes.unicode_minus']=False


#引入TA-Lib库
import talib as ta


#获取交易数据函数,这里使用tushare的老接口,比较方便
import tushare as ts
def get_data(code,start='2018-11-01',end='2019-03-26'):
    df=ts.get_k_data(code,start,end)
    df.index=pd.to_datetime(df.date)
    df=df.sort_index()
    return df[['open','close','high','low','volume']]


#获取当前交易是所有股票代码和名字
basics=ts.get_stock_basics()
print(len(basics))
#basics.head()


3602


index={'上证综指': 'sh','深证成指': 'sz','沪深300': 'hs300',
               '创业板指': 'cyb', '上证50': 'sz50','中小板指': 'zxb'}


#将当前交易的股票和常用指数代码和名称写入字典,方便调用
stock=dict(zip(basics.name,basics.index))
stocks=dict(stock,**index)



计算交易量指标并可视化

#使用matplotlib画k线图以及
import matplotlib.patches as patches
def plot_line(name):   
    code=stocks[name]
    data=get_data(code)
    fig = plt.figure(figsize=(12,5))
    ax1 = fig.add_axes([0, 1, 1, 1])               
    ax1.set_title(name+"K线图与交易量指标",  fontsize=15)
    ax1.set_xlim(-1, len(data)+1)

    for i in range(len(data)):
        close_price,open_price = data.iloc[i, 1], data.iloc[i, 0]
        high_price, low_price = data.iloc[i,2], data.iloc[i, 3]
        trade_date = data.index[i]
        if close_price > open_price:#画阳线
            ax1.add_patch(patches.Rectangle((i-0.2, open_price), 0.4, close_price-open_price, fill=False, color='r'))
            ax1.plot([i, i], [low_price, open_price], 'r')
            ax1.plot([i, i], [close_price, high_price], 'r')
        else:#画阴线
            ax1.add_patch(patches.Rectangle((i-0.2, open_price), 0.4, close_price-open_price, color='g'))
            ax1.plot([i, i], [low_price, high_price], color='g')
    ax1.set_title("Price", fontsize=15, loc='left', color='r')
    #设置x轴标签
    ax1.set_xticks(range(0,len(data),5))#位置
    ax1.set_xticklabels([(data.index[i]).strftime('%Y-%m-%d') for i in ax1.get_xticks()] , rotation=20)
    high, low, close, volume = np.array(data['high']),np.array(data['low']),np.array(data['close']),np.array(data['volume'])
    #计算AD线
    AD = ta.AD(high, low, close, volume)       
    #计算ADOSC线
    ADOSC = ta.ADOSC(high,low, close, volume, fastperiod=3, slowperiod=10)      
    #计算OBC线
    OBV = ta.OBV(close, volume)                                                        

    ax2 = ax1.twinx() 
    ax2.plot(AD, color='r', linewidth=2, label='AD')
    ax2.plot(ADOSC, color='b', linewidth=2, label='ADOSC')
    ax2.plot(OBV, color='y', linewidth=2, label='OBV')
    ax2.legend(loc=0)
plot_line('东方通信')plot_line('上证综指')plot_line('创业板指')plot_line('中国平安')最后,在万矿上使用AD线进行了历史回测,作为演示例子,这里只对东方通信和中国平安股票进行了回测,期间为2018年1月1日至2019年3月25日。从AD线单一指标回测来看,在市场反弹或形成向上趋势时跑赢市场,但是最大回撤也比较大,如东方通信达到43.2%,当然这与回测期间和标的选择有很大的关系。这里只是作为演示例子,深入研究还得待结合其他指标。


东方通信AD线回测结果:


中国平安AD线回测结果:

结语

价量分析系统属于技术分析,而技术分析是股票分析的温度计。温度计无法预测未来的准确温度,更不可能决定温度。因此,技术分析只是告诉你发生了什么,但不能预测未来会发生什么。不要过于依赖技术指标提供的信号,市场总是充满突发性的事件,交易者情绪波动较大,因此股价并不是总是沿着规律运行。在使用量价关系时,不仅要分析量价关系中量的变化对价的影响,还应该分析量变化的原因,更应该知道这些变化之后交易者的情绪或行为,只有这样才能真正体会量价关系的精髓,提高自己预判的准确率。 查看全部
如果操作过量,即使对市场判断正确,仍会一败涂地。——索罗斯

引言

成交量是股票市场的温度计,许多股票的疯狂上涨并非基本面发生了实质性的变化,而是短期筹码和资金供求关系造成的。量价关系分析法是一种将价格走势与成交量变化相结合的研究方法,正所谓,大军未动,粮草先行。成交量一直被看为是股票市场的“粮草”,成交量的变化是股价变化的前兆。因此,成交量是分析判断市场行情,并作出投资决策时的重要依据,也是各种技术分析指标应用时不可或缺的参照。

本文延续“手把手教你使用Python的TA-Lib”系列,着重介绍交易量指标(Volume Indicators)及其运用。【手把手教你】股市技术分析利器之TA-Lib(一)主要探讨了重叠指标的相关原理与Python实现,【手把手教你】股市技术分析利器之TA-Lib(二)则着重介绍了TA-Lib中强大的数学运算、数学变换、统计函数、价格变换、周期指标和波动率指标函数及其应用实例。TA-Lib的安装使用可查看以前推文。

                        


01
A/D Line 累积派发线


Chaikin Accumulation/Distribution Line (AD),是Marc Chaikin提出的用来平衡交易量的指标,以当日收盘价、最高价和最低价来估算一段时间内该股票累积的资金流量, 用来确定潜在的趋势以及预测趋势反转。


函数名:AD

调用格式:ta.AD(high,low,close,volume)

计算方法: AD=前日AD值+(多空对比*成交量)

多空对比=((收盘价-最低价)-(最高价-收盘价))/(最高价-最低价);注意:当最高价等于最低价时,多空对比 = (收盘价 / 昨收盘) - 1

运用要点:

AD测量资金流向,AD向上表明多方占优势,反之表明空方占优势;

AD与价格的背离可视为买卖信号:底背离考虑买入,顶背离考虑卖出;

AD指标无需设置参数,但在应用时,可结合均线、MACD、KDJ等指标进行分析;

AD指标忽略了缺口的影响,有时无法真实反映价格与成交量的关系。


02
A/D Oscillator 震荡指标


震荡指标是计算长短周期的AD差,将资金流动情况与价格行为相对比,用来研判市场中资金流入和流出的情况。


函数名:ADOSC

调用格式:ta. ADOSC(high,low,close,volume,

              fastperiod=3,slowperiod=10)

计算方法:fastperiod AD - slowperiod AD,AD的计算同上。

运用要点:

交易信号是背离:看涨背离做多,看跌背离做空;

股价与90天移动平均结合,与其他指标结合;

由正变负卖出,由负变正买进。

03
OBV - 能量潮


全称为 On Balance Volume, 由 Joe Granville 提出,通过统计成交量变动的趋势推测股价趋势。


函数名:OBV

调用格式:ta.OBV(close, volume)

计算公式:以某日为基期,逐日累计每日股票总成交量,若隔日指数或股票上涨,则基期OBV加上本日成交量为本日OBV。隔日指数或股票下跌, 则基期OBV减去本日成交量为本日OBV。

研判:

以“N”字型为波动单位,一浪高于一浪称“上升潮”,下跌称“跌潮”;

上升潮买进,跌潮卖出;

须配合K线图、股价走势和其他指标。


04
应用实例代码


#先引入后面可能用到的包(package)
import pandas as pd  
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline   

#正常显示画图时出现的中文和负号
from pylab import mpl
mpl.rcParams['font.sans-serif']=['SimHei']
mpl.rcParams['axes.unicode_minus']=False


#引入TA-Lib库
import talib as ta


#获取交易数据函数,这里使用tushare的老接口,比较方便
import tushare as ts
def get_data(code,start='2018-11-01',end='2019-03-26'):
    df=ts.get_k_data(code,start,end)
    df.index=pd.to_datetime(df.date)
    df=df.sort_index()
    return df[['open','close','high','low','volume']]


#获取当前交易是所有股票代码和名字
basics=ts.get_stock_basics()
print(len(basics))
#basics.head()


3602


index={'上证综指': 'sh','深证成指': 'sz','沪深300': 'hs300',
               '创业板指': 'cyb', '上证50': 'sz50','中小板指': 'zxb'}


#将当前交易的股票和常用指数代码和名称写入字典,方便调用
stock=dict(zip(basics.name,basics.index))
stocks=dict(stock,**index)



计算交易量指标并可视化

#使用matplotlib画k线图以及
import matplotlib.patches as patches
def plot_line(name):   
    code=stocks[name]
    data=get_data(code)
    fig = plt.figure(figsize=(12,5))
    ax1 = fig.add_axes([0, 1, 1, 1])               
    ax1.set_title(name+"K线图与交易量指标",  fontsize=15)
    ax1.set_xlim(-1, len(data)+1)

    for i in range(len(data)):
        close_price,open_price = data.iloc[i, 1], data.iloc[i, 0]
        high_price, low_price = data.iloc[i,2], data.iloc[i, 3]
        trade_date = data.index[i]
        if close_price > open_price:#画阳线
            ax1.add_patch(patches.Rectangle((i-0.2, open_price), 0.4, close_price-open_price, fill=False, color='r'))
            ax1.plot([i, i], [low_price, open_price], 'r')
            ax1.plot([i, i], [close_price, high_price], 'r')
        else:#画阴线
            ax1.add_patch(patches.Rectangle((i-0.2, open_price), 0.4, close_price-open_price, color='g'))
            ax1.plot([i, i], [low_price, high_price], color='g')
    ax1.set_title("Price", fontsize=15, loc='left', color='r')
    #设置x轴标签
    ax1.set_xticks(range(0,len(data),5))#位置
    ax1.set_xticklabels([(data.index[i]).strftime('%Y-%m-%d') for i in ax1.get_xticks()] , rotation=20)
    high, low, close, volume = np.array(data['high']),np.array(data['low']),np.array(data['close']),np.array(data['volume'])
    #计算AD线
    AD = ta.AD(high, low, close, volume)       
    #计算ADOSC线
    ADOSC = ta.ADOSC(high,low, close, volume, fastperiod=3, slowperiod=10)      
    #计算OBC线
    OBV = ta.OBV(close, volume)                                                        

    ax2 = ax1.twinx() 
    ax2.plot(AD, color='r', linewidth=2, label='AD')
    ax2.plot(ADOSC, color='b', linewidth=2, label='ADOSC')
    ax2.plot(OBV, color='y', linewidth=2, label='OBV')
    ax2.legend(loc=0)
plot_line('东方通信')plot_line('上证综指')plot_line('创业板指')plot_line('中国平安')最后,在万矿上使用AD线进行了历史回测,作为演示例子,这里只对东方通信和中国平安股票进行了回测,期间为2018年1月1日至2019年3月25日。从AD线单一指标回测来看,在市场反弹或形成向上趋势时跑赢市场,但是最大回撤也比较大,如东方通信达到43.2%,当然这与回测期间和标的选择有很大的关系。这里只是作为演示例子,深入研究还得待结合其他指标。


东方通信AD线回测结果:


中国平安AD线回测结果:

结语

价量分析系统属于技术分析,而技术分析是股票分析的温度计。温度计无法预测未来的准确温度,更不可能决定温度。因此,技术分析只是告诉你发生了什么,但不能预测未来会发生什么。不要过于依赖技术指标提供的信号,市场总是充满突发性的事件,交易者情绪波动较大,因此股价并不是总是沿着规律运行。在使用量价关系时,不仅要分析量价关系中量的变化对价的影响,还应该分析量变化的原因,更应该知道这些变化之后交易者的情绪或行为,只有这样才能真正体会量价关系的精髓,提高自己预判的准确率。