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

Python金融量化 发表了文章 • 3 个评论 • 1422 次浏览 • 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线回测结果:

结语

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

【2019-03-16】市场热度预测 - 通过检测某个论坛(集思录)的热度衡量

李魔佛 发表了文章 • 4 个评论 • 701 次浏览 • 2019-03-16 18:03 • 来自相关话题

很早前就有这个想法,只是最终实践最近才完成,其实并不是很大难度,只是把这个事情早早抛诸脑后。
 
首先得有数据,有了数据就可以慢慢分析了。
 
首先是集思录,把数据进行重新采用,按照周采样,然后绘图:





 
看到这张图后,瞬间也是震惊了,我觉得应该要逃离了。当然不是马上撤离,但是应该时间不会太久,1-2周就应该空仓了。
 
感觉这个是不错逃顶抄底指标呀。
 
文章中的数据每周更新,敬请留意。
 
原创文章
转载请注明出处:
http://30daydo.com/article/428
  查看全部
很早前就有这个想法,只是最终实践最近才完成,其实并不是很大难度,只是把这个事情早早抛诸脑后。
 
首先得有数据,有了数据就可以慢慢分析了。
 
首先是集思录,把数据进行重新采用,按照周采样,然后绘图:

echarts.png

 
看到这张图后,瞬间也是震惊了,我觉得应该要逃离了。当然不是马上撤离,但是应该时间不会太久,1-2周就应该空仓了。
 
感觉这个是不错逃顶抄底指标呀。
 
文章中的数据每周更新,敬请留意。
 
原创文章
转载请注明出处:
http://30daydo.com/article/428
 

可转债价格分布堆叠图 绘制 可视化 python+pyecharts

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

这一节课带大家学习如何利用可视化,更好的呈现数据。
即使你有很多数据,可是,你无法直观地看到数据的总体趋势。使用可视化的绘图,可以帮助我们看到数据背后看不到的数据。 比如我已经有每一个可转债的价格,评级。数据如下:





 点击查看大图

如果我用下面的图形就可以看出规律:




 点击查看大图

横坐标是价格,纵坐标是落在该价格的可转债数量,不同颜色代表不同评级的可转债。
 
可以看到大部分AA-评级(浅橙色)的可转债价格都在100元以下,而AA(浅蓝色)的可转债价格分布较为平均,从90到110都有。而AA+和AAA的一般都在100以上。
 
那么如何使用代码实现呢?from setting import get_mysql_conn,get_engine
import pandas as pd
import pymongo
from pyecharts import Geo,Style,Map
engine = get_engine('db_stock',local='local')
# 堆叠图
from pyecharts import Bar
df = pd.read_sql('tb_bond_jisilu',con=engine)

result ={}
for name,grades in df.groupby('评级'):
# print(name,grades[['可转债名称','可转债价格']])
for each in grades['可转债价格']:
result.setdefault(name,)
result[name].append(each)


# 确定价格的范围

value = [str(i) for i in range(85,140)]
ret = [0]*len(value)
ret1 = dict(zip(value,ret))

ret_A_add = ret1.copy()
for item in result['A+']:
for k in ret1:
if float(k)+0.5>item and float(k)-0.5<=item:
ret_A_add[k]+=1

retAA_ = ret1.copy()
for item in result['']:
for k in ret1:
if float(k)+0.5>item and float(k)-0.5<=item:
retAA_[k]+=1

retAA = ret1.copy()
for item in result['AA']:
for k in ret1:
if float(k)+0.5>item and float(k)-0.5<=item:
retAA[k]+=1

retAA_add = ret1.copy()
for item in result['AA+']:
for k in ret1:
if float(k)+0.5>item and float(k)-0.5<=item:
retAA_add[k]+=1

retAAA = ret1.copy()
for item in result['AAA']:
for k in ret1:
if float(k)+0.5>item and float(k)-0.5<=item:
retAAA[k]+=1

bar = Bar('可转债价格分布')
bar.add('A+',value,list(ret_A_add.values()),is_stack=True,yaxis_max=11)
bar.add('',value,list(retAA_.values()),is_stack=True,yaxis_max=11)
bar.add('AA',value,list(retAA.values()),is_stack=True,yaxis_max=11)
bar.add('AA+',value,list(retAA_add.values()),is_stack=True,yaxis_max=11)
bar.add('AAA',value,list(retAAA.values()),is_stack=True,yaxis_max=11)
如果没有安装pyecharts,需要用pip安装即可。
 
上面代码运行后就可以得到上面最开始那张堆叠图了。
github:https://github.com/Rockyzsu/convertible_bond​ 
 
 
原创文章
转载请注明出处:
 http://30daydo.com/article/400 

  查看全部
这一节课带大家学习如何利用可视化,更好的呈现数据。
即使你有很多数据,可是,你无法直观地看到数据的总体趋势。使用可视化的绘图,可以帮助我们看到数据背后看不到的数据。 比如我已经有每一个可转债的价格,评级。数据如下:

可转债数据.JPG

 点击查看大图

如果我用下面的图形就可以看出规律:
可转债价格分布.JPG

 点击查看大图

横坐标是价格,纵坐标是落在该价格的可转债数量,不同颜色代表不同评级的可转债。
 
可以看到大部分AA-评级(浅橙色)的可转债价格都在100元以下,而AA(浅蓝色)的可转债价格分布较为平均,从90到110都有。而AA+和AAA的一般都在100以上。
 
那么如何使用代码实现呢?
from  setting import get_mysql_conn,get_engine
import pandas as pd
import pymongo
from pyecharts import Geo,Style,Map
engine = get_engine('db_stock',local='local')
# 堆叠图
from pyecharts import Bar
df = pd.read_sql('tb_bond_jisilu',con=engine)

result ={}
for name,grades in df.groupby('评级'):
# print(name,grades[['可转债名称','可转债价格']])
for each in grades['可转债价格']:
result.setdefault(name,)
result[name].append(each)


# 确定价格的范围

value = [str(i) for i in range(85,140)]
ret = [0]*len(value)
ret1 = dict(zip(value,ret))

ret_A_add = ret1.copy()
for item in result['A+']:
for k in ret1:
if float(k)+0.5>item and float(k)-0.5<=item:
ret_A_add[k]+=1

retAA_ = ret1.copy()
for item in result['']:
for k in ret1:
if float(k)+0.5>item and float(k)-0.5<=item:
retAA_[k]+=1

retAA = ret1.copy()
for item in result['AA']:
for k in ret1:
if float(k)+0.5>item and float(k)-0.5<=item:
retAA[k]+=1

retAA_add = ret1.copy()
for item in result['AA+']:
for k in ret1:
if float(k)+0.5>item and float(k)-0.5<=item:
retAA_add[k]+=1

retAAA = ret1.copy()
for item in result['AAA']:
for k in ret1:
if float(k)+0.5>item and float(k)-0.5<=item:
retAAA[k]+=1

bar = Bar('可转债价格分布')
bar.add('A+',value,list(ret_A_add.values()),is_stack=True,yaxis_max=11)
bar.add('',value,list(retAA_.values()),is_stack=True,yaxis_max=11)
bar.add('AA',value,list(retAA.values()),is_stack=True,yaxis_max=11)
bar.add('AA+',value,list(retAA_add.values()),is_stack=True,yaxis_max=11)
bar.add('AAA',value,list(retAAA.values()),is_stack=True,yaxis_max=11)

如果没有安装pyecharts,需要用pip安装即可。
 
上面代码运行后就可以得到上面最开始那张堆叠图了。
github:https://github.com/Rockyzsu/convertible_bond​ 
 
 
原创文章
转载请注明出处:
 http://30daydo.com/article/400 

 

python数据分析之 A股上市公司按地区分布与可视化 地图显示

李魔佛 发表了文章 • 0 个评论 • 2099 次浏览 • 2018-12-19 14:07 • 来自相关话题

首先传统方法是使用数据库:SELECT area `地区`,count(*) as `数目` FROM `tb_basic_info` GROUP BY area order by 数目 desc;得到下面的结果: 接着我们使用pandas进行数据可视化。
 地区 数目
浙江 431
江苏 401
北京 316
广东 303
上海 285
深圳 283
山东 196
福建 132
四川 120
湖南 104
安徽 103
湖北 101
河南 79
辽宁 72
河北 56
新疆 54
天津 50
陕西 49
重庆 48
吉林 41
江西 41
山西 38
黑龙江 37
广西 37
云南 33
甘肃 33
海南 31
贵州 29
内蒙 25
西藏 18
宁夏 13
青海 12
看看我们的641主席的功劳,江浙一带的上市公司数量已经超过广东了。
 
接下来我们使用pandas进行数据可视化:
 
首先读入数据:# A股上市公司分布:
df = pd.read_sql('tb_basic_info',con=engine)engine为from sqlalchemy import create_engine 中的连接引擎。
 
然后直接统计:result = df['area'].value_counts()得到的result就是统计结果:





 
看是不是比mysql语句简单多了?
 
得到一样的数据。
 
接下来使用图像来显示我们的数据:





 
什么? 一条命令就可以啦~ 实在太强大了!
从这个柱状图上,可以更加直观地看到A股上市公司的分布情况,东部长三角和珠三角的公司数目最多。而西部只有东部的零头。
 
接着把数据转化为百分比数据:total = result.sum()
ration = result/total*100




可以看到江浙地区占了22%的数量,体量还是很大的。
 
接下来,为了数据更加直观,把数据在地图上显示出来:





            点击查看大图

颜色越红,表明上市公司越多。现在数据够直观了吧。
 
实现代码:# 热力图
def create_heatmap(attr,value,name,maptype):
style = Style(title_color="#fff", title_pos="center",
width=1200, height=600, background_color="#696969")

# 可视化
geo = Geo(name,**style.init_style)
geo.add("", attr, value, visual_range=[min(value), max(value)], symbol_size=8,
visual_text_color="#000",
is_visualmap=True, type='effectScatter',effect_scale=7,is_random=True,is_roam=False,is_piecewise = True,visual_split_number= 10,
)

geo.render('{}.html'.format(name)) create_heatmap(attr,value,'公司分布','china')
 

更多的数据分析,请关注本网站。
不定期更新哦
 
原创文章
转载请注明出处:
http://30daydo.com/article/388
  查看全部
首先传统方法是使用数据库:
SELECT area `地区`,count(*) as `数目` FROM `tb_basic_info` GROUP BY area order by 数目 desc;
得到下面的结果: 接着我们使用pandas进行数据可视化。
 地区 数目
浙江 431
江苏 401
北京 316
广东 303
上海 285
深圳 283
山东 196
福建 132
四川 120
湖南 104
安徽 103
湖北 101
河南 79
辽宁 72
河北 56
新疆 54
天津 50
陕西 49
重庆 48
吉林 41
江西 41
山西 38
黑龙江 37
广西 37
云南 33
甘肃 33
海南 31
贵州 29
内蒙 25
西藏 18
宁夏 13
青海 12
看看我们的641主席的功劳,江浙一带的上市公司数量已经超过广东了。
 
接下来我们使用pandas进行数据可视化:
 
首先读入数据:
# A股上市公司分布:
df = pd.read_sql('tb_basic_info',con=engine)
engine为from sqlalchemy import create_engine 中的连接引擎。
 
然后直接统计:
result = df['area'].value_counts()
得到的result就是统计结果:

地区统计_副本.jpg

 
看是不是比mysql语句简单多了?
 
得到一样的数据。
 
接下来使用图像来显示我们的数据:

地区绘图.JPG

 
什么? 一条命令就可以啦~ 实在太强大了!
从这个柱状图上,可以更加直观地看到A股上市公司的分布情况,东部长三角和珠三角的公司数目最多。而西部只有东部的零头。
 
接着把数据转化为百分比数据:
total = result.sum()
ration = result/total*100

a5.JPG

可以看到江浙地区占了22%的数量,体量还是很大的。
 
接下来,为了数据更加直观,把数据在地图上显示出来:

热力图.JPG

            点击查看大图

颜色越红,表明上市公司越多。现在数据够直观了吧。
 
实现代码:
# 热力图
def create_heatmap(attr,value,name,maptype):
style = Style(title_color="#fff", title_pos="center",
width=1200, height=600, background_color="#696969")

# 可视化
geo = Geo(name,**style.init_style)
geo.add("", attr, value, visual_range=[min(value), max(value)], symbol_size=8,
visual_text_color="#000",
is_visualmap=True, type='effectScatter',effect_scale=7,is_random=True,is_roam=False,is_piecewise = True,visual_split_number= 10,
)

geo.render('{}.html'.format(name))
 
create_heatmap(attr,value,'公司分布','china')

 

更多的数据分析,请关注本网站。
不定期更新哦
 
原创文章
转载请注明出处:
http://30daydo.com/article/388
 

np.empty() 函数的用法 (有坑)

李魔佛 发表了文章 • 0 个评论 • 21872 次浏览 • 2018-11-20 11:36 • 来自相关话题

看名字np.empty(),以为创建一个空的多维数组,如 np.empty((4,4))
但是实际结果返回:array([[4.67296746e-307, 1.69121096e-306, 9.34601642e-307,
1.33511562e-306],
[8.34447260e-308, 6.23043768e-307, 2.22522597e-306,
1.33511969e-306],
[1.37962320e-306, 9.34604358e-307, 9.79101082e-307,
1.78020576e-306],
[1.69119873e-306, 2.22522868e-306, 1.24611809e-306,
8.06632139e-308]])
what ?
 
感觉里面的元素是随机生成的。
查了下官方文档,的确是。np.empty()返回一个随机元素的矩阵,大小按照参数定义。
所以使用的时候要小心。需要手工把每一个值重新定义,否则该值是一个随机数,调试起来会比较麻烦。
 
原创文章
转载请注明出处:
http://www.30daydo.com/article/376
  查看全部
看名字np.empty(),以为创建一个空的多维数组,如 np.empty((4,4))
但是实际结果返回:
array([[4.67296746e-307, 1.69121096e-306, 9.34601642e-307,
1.33511562e-306],
[8.34447260e-308, 6.23043768e-307, 2.22522597e-306,
1.33511969e-306],
[1.37962320e-306, 9.34604358e-307, 9.79101082e-307,
1.78020576e-306],
[1.69119873e-306, 2.22522868e-306, 1.24611809e-306,
8.06632139e-308]])

what ?
 
感觉里面的元素是随机生成的。
查了下官方文档,的确是。np.empty()返回一个随机元素的矩阵,大小按照参数定义。
所以使用的时候要小心。需要手工把每一个值重新定义,否则该值是一个随机数,调试起来会比较麻烦。
 
原创文章
转载请注明出处:
http://www.30daydo.com/article/376
 

numpy logspace的用法

李魔佛 发表了文章 • 0 个评论 • 2240 次浏览 • 2018-10-28 17:54 • 来自相关话题

numpy.logspace

numpy.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None)[source]

Return numbers spaced evenly on a log scale.

In linear space, the sequence starts at base ** start (base to the power of start) and ends with base ** stop (see endpoint below).

Parameters:

start : float

base ** start is the starting value of the sequence.

stop : float

base ** stop is the final value of the sequence, unless endpoint is False. In that case, num + 1 values are spaced over the interval in log-space, of which all but the last (a sequence of length num) are returned.

num : integer, optional

Number of samples to generate. Default is 50.

endpoint : boolean, optional

If true, stop is the last sample. Otherwise, it is not included. Default is True.

base : float, optional

The base of the log space. The step size between the elements in ln(samples) / ln(base) (or log_base(samples)) is uniform. Default is 10.0.

dtype : dtype

The type of the output array. If dtype is not given, infer the data type from the other input arguments.

Returns:

samples : ndarray

num samples, equally spaced on a log scale


 

上面是官方的文档,英文说的很明白,但网上尤其是csdn的解释,(其实都是你抄我,我抄你),实在让人看的一头雾水
 
numpy.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None)
 
比如 np.logspace(0,10,9)
那么会有结果是:
array([1.00000000e+00, 1.77827941e+01, 3.16227766e+02, 5.62341325e+03,
1.00000000e+05, 1.77827941e+06, 3.16227766e+07, 5.62341325e+08,
1.00000000e+10])
第一位是开始值0,第二位是结束值10,然后在这0-10之间产生9个值,这9个值是均匀分布的,默认包括最后一个结束点,就是0到10的9个等产数列,那么根据等差数列的公式,a1+(n-1)*d=an,算出,d=1.25,那么a1=0,接着a2=1.25,a3=2.5,。。。。。a9=10,然后再对这9个值做已10为底的指数运算,也就是10^0, 10^1.25 , 10^2.5 这样的结果 查看全部


numpy.logspace

numpy.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None)[source]

Return numbers spaced evenly on a log scale.

In linear space, the sequence starts at base ** start (base to the power of start) and ends with base ** stop (see endpoint below).

Parameters:

start : float

base ** start is the starting value of the sequence.

stop : float

base ** stop is the final value of the sequence, unless endpoint is False. In that case, num + 1 values are spaced over the interval in log-space, of which all but the last (a sequence of length num) are returned.

num : integer, optional

Number of samples to generate. Default is 50.

endpoint : boolean, optional

If true, stop is the last sample. Otherwise, it is not included. Default is True.

base : float, optional

The base of the log space. The step size between the elements in ln(samples) / ln(base) (or log_base(samples)) is uniform. Default is 10.0.

dtype : dtype

The type of the output array. If dtype is not given, infer the data type from the other input arguments.

Returns:

samples : ndarray

num samples, equally spaced on a log scale



 


上面是官方的文档,英文说的很明白,但网上尤其是csdn的解释,(其实都是你抄我,我抄你),实在让人看的一头雾水
 
numpy.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None)
 
比如 np.logspace(0,10,9)
那么会有结果是:
array([1.00000000e+00, 1.77827941e+01, 3.16227766e+02, 5.62341325e+03,
1.00000000e+05, 1.77827941e+06, 3.16227766e+07, 5.62341325e+08,
1.00000000e+10])

第一位是开始值0,第二位是结束值10,然后在这0-10之间产生9个值,这9个值是均匀分布的,默认包括最后一个结束点,就是0到10的9个等产数列,那么根据等差数列的公式,a1+(n-1)*d=an,算出,d=1.25,那么a1=0,接着a2=1.25,a3=2.5,。。。。。a9=10,然后再对这9个值做已10为底的指数运算,也就是10^0, 10^1.25 , 10^2.5 这样的结果

python数据分析入门 --分析雪球元卫南每个月打赏收入

李魔佛 发表了文章 • 2 个评论 • 3479 次浏览 • 2018-10-24 14:34 • 来自相关话题

************************* 2019-08-18日 更新 ******************************
最近居然被元神拉黑了。因为帖子不知道被哪位挖坟,估计被元神看到了。
 
重新跑了下原来的代码,还能跑通,看来雪球并没有改动什么代码。但是雪球经历了一波app下架风波,2019年前的帖子全部无法见到了。
 
重新获取数据:




点击查看大图

统计数据:




点击查看大图

2019年1月到现在(8月),元神收到的赏金为31851.6,数额比他2019年前所有的金额都要多,虽然总额不高,但是说明了元神这一年影响力大增了。
 
 
************************* 写于 2018-11 *******************************
 在上一篇 雪球的元卫南靠打赏收割了多少钱 ? python爬虫实例 中,统计出来元卫南所有打赏收入为 24128.13 ,这个数字出乎不少人的意料。因为不少人看到元卫南最近收到的打赏都很多,不少都是100,200的。 那么接下来我就顺便带大家学一下,如何用python做数据分析。
 
数据来源于上一篇文章中获取到的数据。
首先,从数据库mongodb中读取数据










(点击查看大图)

上面显示数据的前10条,确保数据被正常载入。
 
观察到列 created_at 是打赏的时间, 导入的数据是字符类型,那么对列 created_at 进行换算, 转化为dataframe中的datetime类型。重新定义一列 pub_date 为打赏时间,设为index,因为dataframe可以对时间index做很多丰富的操作。










 (点击查看大图) 

可以看到转换后的时间精确到小时,分,秒,而我们需要统计的是每个月(或者每周,每季度,每年都可以)的数据,那么我们就需要重新采样, pandas提供了很好的resample函数,可以对数据按照时间频次进行重新采样。 





 (点击查看大图)
 
现在可以看到获取到2018年9月的所有打赏金额的数据。
 
那么现在就对所有数据进行重采样,并打赏金额进行求和






 (点击查看大图)
 
现在可以看到,每个月得到的打赏金额的总和都可以看到了。从2016年7月到现在2018年10月,最多的月份是这个月,共1.4万,占了所有金额的60%多,所以才让大家造成一个错觉,元兄靠打赏赚了不少粉丝的打赏钱,其实只是最近才多起来的。
 
还可以绘制条形图。






 (点击查看大图)
 
不过因为月份金额差距过大,导致部分月份的条形显示很短。
 
不过对于赏金的分布也一目了然了吧。
 
原创文章
转载请注明出处:
http://30daydo.com/article/362 
  
个人公众号: 查看全部
************************* 2019-08-18日 更新 ******************************
最近居然被元神拉黑了。因为帖子不知道被哪位挖坟,估计被元神看到了。
 
重新跑了下原来的代码,还能跑通,看来雪球并没有改动什么代码。但是雪球经历了一波app下架风波,2019年前的帖子全部无法见到了。
 
重新获取数据:
元卫南1.PNG

点击查看大图

统计数据:
元卫南赏金.PNG

点击查看大图

2019年1月到现在(8月),元神收到的赏金为31851.6,数额比他2019年前所有的金额都要多,虽然总额不高,但是说明了元神这一年影响力大增了。
 
 
************************* 写于 2018-11 *******************************
 在上一篇 雪球的元卫南靠打赏收割了多少钱 ? python爬虫实例 中,统计出来元卫南所有打赏收入为 24128.13 ,这个数字出乎不少人的意料。因为不少人看到元卫南最近收到的打赏都很多,不少都是100,200的。 那么接下来我就顺便带大家学一下,如何用python做数据分析。
 
数据来源于上一篇文章中获取到的数据。
首先,从数据库mongodb中读取数据

捕获a12.JPG


top10.JPG

(点击查看大图)

上面显示数据的前10条,确保数据被正常载入。
 
观察到列 created_at 是打赏的时间, 导入的数据是字符类型,那么对列 created_at 进行换算, 转化为dataframe中的datetime类型。重新定义一列 pub_date 为打赏时间,设为index,因为dataframe可以对时间index做很多丰富的操作。

捕获a22.JPG


resample1.JPG

 (点击查看大图) 

可以看到转换后的时间精确到小时,分,秒,而我们需要统计的是每个月(或者每周,每季度,每年都可以)的数据,那么我们就需要重新采样, pandas提供了很好的resample函数,可以对数据按照时间频次进行重新采样。 

捕获a24.JPG

 (点击查看大图)
 
现在可以看到获取到2018年9月的所有打赏金额的数据。
 
那么现在就对所有数据进行重采样,并打赏金额进行求和


捕获a25.JPG

 (点击查看大图)
 
现在可以看到,每个月得到的打赏金额的总和都可以看到了。从2016年7月到现在2018年10月,最多的月份是这个月,共1.4万,占了所有金额的60%多,所以才让大家造成一个错觉,元兄靠打赏赚了不少粉丝的打赏钱,其实只是最近才多起来的。
 
还可以绘制条形图。


捕获a26.JPG

 (点击查看大图)
 
不过因为月份金额差距过大,导致部分月份的条形显示很短。
 
不过对于赏金的分布也一目了然了吧。
 
原创文章
转载请注明出处:
http://30daydo.com/article/362 
  
个人公众号:

np.asfarray的用法

李魔佛 发表了文章 • 0 个评论 • 3182 次浏览 • 2018-09-24 10:52 • 来自相关话题

以前很少用的一个函数,见到别人的代码里面有,所以查了下文档,看看该函数的用法。
numpy.asfarray(a, dtype=<class 'numpy.float64'>)

Return an array converted to a float type.

Parameters:
a : array_like
The input array.

dtype : str or dtype object, optional
Float type code to coerce input array a. If dtype is one of the ‘int’ dtypes, it is replaced with float64.

Returns:
out : ndarray
The input a as a float ndarray.
用法就是把一个普通的数组转为一个浮点类型的数组:
 
Examples

>>>
>>> np.asfarray([2, 3])
array([ 2., 3.])
>>> np.asfarray([2, 3], dtype='float')
array([ 2., 3.])
>>> np.asfarray([2, 3], dtype='int8')
array([ 2., 3.]) 查看全部
以前很少用的一个函数,见到别人的代码里面有,所以查了下文档,看看该函数的用法。
numpy.asfarray(a, dtype=<class 'numpy.float64'>)

Return an array converted to a float type.

Parameters:
a : array_like
The input array.

dtype : str or dtype object, optional
Float type code to coerce input array a. If dtype is one of the ‘int’ dtypes, it is replaced with float64.

Returns:
out : ndarray
The input a as a float ndarray.

用法就是把一个普通的数组转为一个浮点类型的数组:
 
Examples

>>>
>>> np.asfarray([2, 3])
array([ 2., 3.])
>>> np.asfarray([2, 3], dtype='float')
array([ 2., 3.])
>>> np.asfarray([2, 3], dtype='int8')
array([ 2., 3.])

python量化分析: 股票涨停后该不该卖, 怕砸板还是怕卖飞 ?

李魔佛 发表了文章 • 1 个评论 • 3405 次浏览 • 2018-06-14 19:34 • 来自相关话题

相信大家都有过这样的经验,某个股票忽然直线拉升打到涨停板,然后就会纠结当天要不要卖掉,如果股票没封住,注定会回落,这样会失去部分的利润。 但是又怕卖了后,封死涨停板,然后当天再也买不回来,然后第二天呢,高开就不想去追,或者去追高使得持有该股的成本变高了。
 
那么触及涨停板的个股我们应该继续持有,还是卖掉,还是卖掉做T接回来呢?
接下来用数据说话。【数据使用通联实验室的数据源】
 
首先获取当前市场上所有股票all_stocks = DataAPI.SecTypeRegionRelGet(secID=u"",ticker=u"",typeID=u"",field=u"",pandas="1")
然后获取每一个股票的日k线数据,可以设定一个时间段,我抓取了2012年到今天(2018-06-14)的所有数据,如果是次新股,那么数据就是上市当天到今天的数据。
抓取到的数据包含以下的字段:




点击查看大图 

但是实际用到的字段只有几个, 开盘价,最高价,涨幅,昨天收盘价。
这里我排除了一字板开盘的个股,因为里面含有新股,会导致数据不精确,【后续我会统计,一字板开盘盘中被砸开的概率】,而且数据也排除了ST的个股,因为本人从来不买ST股,所以不会对ST进行统计。fbl =

for code in all_stocks['secID']:
df = DataAPI.MktEqudGet(secID=code,ticker=u"",tradeDate=u"",beginDate=u"20120101",endDate=u"",isOpen="",field=u"",pandas="1")
df['ztj']=map(lambda x:round(x,2),df['preClosePrice']*1.1)
df['chgPct']=df['chgPct']*100

# 非一字板
zt = df[(df['ztj']==df['highestPrice']) & (df['openPrice']!=df['highestPrice'])]
fz= df[(df['ztj']==df['highestPrice']) & (df['openPrice']!=df['highestPrice'])&(df['closePrice']==df['highestPrice'])]
try:
f = len(fz)*1.00/len(zt)*100
fbl.append((code,f))
except Exception,e:
print e
print code
fbl就是封板率的一个列表,包含了每只股票的触及涨停价后封板的概率。 然后对整体的数据取平均值:dx= dict(fbl)
x = np.array(dx.values())
print x.mean()
最后得到的结果是:
64.0866513726

所以保持住涨停的概率还是大一些。所以站在概率大的一边上,触及涨停的时候应该继续持有,会有62.5%会到收盘保持涨停价。
 
(待续)
 
原创文章,转载请注明出处: 
http://30daydo.com/article/331 
  查看全部
相信大家都有过这样的经验,某个股票忽然直线拉升打到涨停板,然后就会纠结当天要不要卖掉,如果股票没封住,注定会回落,这样会失去部分的利润。 但是又怕卖了后,封死涨停板,然后当天再也买不回来,然后第二天呢,高开就不想去追,或者去追高使得持有该股的成本变高了。
 
那么触及涨停板的个股我们应该继续持有,还是卖掉,还是卖掉做T接回来呢?
接下来用数据说话。【数据使用通联实验室的数据源】
 
首先获取当前市场上所有股票
all_stocks = DataAPI.SecTypeRegionRelGet(secID=u"",ticker=u"",typeID=u"",field=u"",pandas="1")

然后获取每一个股票的日k线数据,可以设定一个时间段,我抓取了2012年到今天(2018-06-14)的所有数据,如果是次新股,那么数据就是上市当天到今天的数据。
抓取到的数据包含以下的字段:
cd11.PNG

点击查看大图 

但是实际用到的字段只有几个, 开盘价,最高价,涨幅,昨天收盘价。
这里我排除了一字板开盘的个股,因为里面含有新股,会导致数据不精确,【后续我会统计,一字板开盘盘中被砸开的概率】,而且数据也排除了ST的个股,因为本人从来不买ST股,所以不会对ST进行统计。
fbl = 

for code in all_stocks['secID']:
df = DataAPI.MktEqudGet(secID=code,ticker=u"",tradeDate=u"",beginDate=u"20120101",endDate=u"",isOpen="",field=u"",pandas="1")
df['ztj']=map(lambda x:round(x,2),df['preClosePrice']*1.1)
df['chgPct']=df['chgPct']*100

# 非一字板
zt = df[(df['ztj']==df['highestPrice']) & (df['openPrice']!=df['highestPrice'])]
fz= df[(df['ztj']==df['highestPrice']) & (df['openPrice']!=df['highestPrice'])&(df['closePrice']==df['highestPrice'])]
try:
f = len(fz)*1.00/len(zt)*100
fbl.append((code,f))
except Exception,e:
print e
print code

fbl就是封板率的一个列表,包含了每只股票的触及涨停价后封板的概率。 然后对整体的数据取平均值:
dx= dict(fbl)
x = np.array(dx.values())
print x.mean()

最后得到的结果是:
64.0866513726

所以保持住涨停的概率还是大一些。所以站在概率大的一边上,触及涨停的时候应该继续持有,会有62.5%会到收盘保持涨停价。
 
(待续)
 
原创文章,转载请注明出处: 
http://30daydo.com/article/331 
 

python获取每天的涨停个股数据 和昨天涨停的今天表现

李魔佛 发表了文章 • 9 个评论 • 7244 次浏览 • 2018-06-02 10:47 • 来自相关话题

python获取每天的涨停个股数据 和昨天涨停的今天表现
 



(点击查看大图)
今日的涨停信息




(点击查看大图)
昨日涨停的今天信息
 
还有自动生成的K线图:




(点击查看大图)

有兴趣的朋友可以留言获取上述数据

原创文章
转载请注明出处:http://30daydo.com/article/316 查看全部
python获取每天的涨停个股数据 和昨天涨停的今天表现
 
ztb2_副本_副本_副本.jpg
(点击查看大图)
今日的涨停信息

zrzt1_副本.jpg
(点击查看大图)
昨日涨停的今天信息
 
还有自动生成的K线图:

涨跌停.PNG
(点击查看大图)

有兴趣的朋友可以留言获取上述数据

原创文章
转载请注明出处:http://30daydo.com/article/316