量化分析

量化分析

python识别股票K线形态,准确率回测(一)

量化交易-Ptrade-QMT李魔佛 发表了文章 • 1 个评论 • 2386 次浏览 • 2022-05-22 01:13 • 来自相关话题

python识别股票K线形态,准确率回测(一)

对于一些做股票技术分析的投资者来说,对常见的k线形态应该都不陌生,比如十字星,红三兵,头肩顶(底),岛型反转,吊颈线,两只乌鸦,三只乌鸦,四只乌鸦(哈)








做价投的投资者可能会对这些划线的嗤之以鼻,而短线操盘者却有可能把它奉为圭臬,以之作为买卖标准。

海乃百川,兼听则明,笔者认为多吸收不同的观点与技术,可以更加全面的加深投资认知。你画的圆圈越大,圆圈外的未知空间也越大。

本文介绍使用python对A股市场的股票(转债也可以)的K线进行识别,然后回测某个形态出现后接下来的涨跌幅,还可以通过设定的形态进行选股。

举个例子,我们可以统计所有个股出现了“早晨之星“这一形态后,一周后甚至一个月后,个股是涨了还是跌了,从大量结果中统计出一些有意义的结果。

为了便于验证查看结果图形,我们先介绍如何使用python来画股票K线图。

有数据之后,剩下画图是很简单的,很多第三方的库已经封装好了各种蜡烛图绘制函数。我们要做只是传入每天开,收盘价,以及最高最低价。

获取股票的数据

市面有不少第三方的库可以获取股票和可转债的日线数据,比如tushare和akshare。本文以股票数据为例。

以akshare为例,代码如下所示:
 
# pip install akshare
import akshare as ak
def get_k_line(code="sz002241"): #
df = ak.stock_zh_a_daily(symbol=code, start_date="20220101", end_date="20220515",
adjust="qfq")
# 这个函数只适合取股票数据,转债会报错,转债的日线数据可以使用其他函数,这里选择股价前复权
df.to_excel("同和药业k.xlsx")
如上面代码所示,我们使用stock_zh_a_daily方法获取一段时间的数据,这里的日期可以根据你的需求进行调整,比如设置start_date=“20200101”,end_date=“20220515”,就可以获取一年时间段的股票数据。

而股票的代码有sh与sz之分,sz代表深市的股票,所有深市的股票前面都必须带上sz,比如这里的同和药业,就是sz002241。

同样的,sh是上证交易所的股票,所有上证的股票前面必须带上sh。

这里,我们来看看获取的同和药业股票数据格式,如下图所示:

date:交易日期
open:代表开盘价
high:当天最高价
low:当天最低价
close:当天收盘价
volume:当天成交量(元)
outstanding_share:流动股本(股)
turnover:换手率

既然已经拿到了数据,下面我们来绘制K线图。

绘制K线图

在python中,绘制K线图需要用到mpl_finance库,而这个库提供了4种方式绘制K线图,这里我们介绍其中的一种,代码如下所示:
 
import mpl_finance as mpf
import matplotlib.pyplot as plt
import pandas as pd

#创建绘图的基本参数
fig=plt.figure(figsize=(12, 8))
ax=fig.add_subplot(111)

#获取刚才的股票数据
df = pd.read_excel("同和药业k.xlsx")
mpf.candlestick2_ochl(ax, df["open"], df["close"], df["high"], df["low"], width=0.6, colorup='r',colordown='green',alpha=1.0)
#显示出来
plt.show()
运行此段代码后,会显示如下效果图:






和东财上的同和药业的k线图基本一致的。

不过,这个K线图有一个问题,就是X坐标轴并不是显示的时间,而是数字,这是因为我们绘制K线图的方法,并没有提供X轴的参数,那怎么让下面的数字替换为时间呢?
 
我们先来看一段代码:
import matplotlib.ticker as ticker
#将股票时间转换为标准时间,不带时分秒的数据
def date_to_num(dates):
num_time = []
for date in dates:
date_time = datetime.strptime(date, '%Y-%m-%d')
num_date = date2num(date_time)
num_time.append(num_date)
return num_time

#创建绘图的基本参数
fig=plt.figure(figsize=(12, 8))
ax=fig.add_subplot(111)

#获取刚才的股票数据
df = pd.read_excel("同和药业k.xlsx")
mpf.candlestick2_ochl(ax, df["open"], df["close"], df["high"], df["low"], width=0.6, colorup='r',colordown='green',alpha=1.0)
df['date'] = pd.to_datetime(df['date'])
df['date'] = df['date'].apply(lambda x: x.strftime('%Y-%m-%d'))
def format_date(x, pos=None):
if x < 0 or x > len(df['date']) - 1:
return ''
return df['date'][int(x)]
ax.xaxis.set_major_formatter(ticker.FuncFormatter(format_date))
plt.setp(plt.gca().get_xticklabels(), rotation=45, horizontalalignment='right')
#显示出来
plt.show()
 
这里,我们定义了2个方法:第1个方法date_to_num主要的作用就是将获取的时间数据转换为标准的日期数据;第2个方法,就是根据X的数值替换时间值。

其中,set_major_formatter方法是将数值替换为时间值的操作库,而plt.setup的功能就是设置X轴的标签倾斜45度以及右对齐。运行之后,我们的K线图就显示的非常完美了,如下图所示:



均线图

虽然我们实现了K线图,但是有没有发现,其实大多数的股票交易软件K线图上面其实还标记有均线,比如常用的有5日均线,10日均线,30均线。
所以,我们需要将均线一起添加到我们的K线图之上。
计算均线的方式如下:
df["SMA5"] = df["close"].rolling(5).mean()
df["SMA10"] = df["close"].rolling(10).mean()
df["SMA30"] = df["close"].rolling(30).mean()
 
3行代码就可以获取到股票的均线值。
接着,我们可以使用上面的ax进行绘制均线了,
添加的代码如下所示:
 
ax.plot(np.arange(0, len(df)), df['SMA5']) # 绘制5日均线
ax.plot(np.arange(0, len(df)), df['SMA10']) # 绘制10日均线
ax.plot(np.arange(0, len(df)), df['SMA30']) # 绘制30日均线
这里,同样将X轴设置为数字,将这两段代码添加到上面的K线图代码中,自然也会将X轴替换为时间。运行之后,显示效果如下图所示:


 
这里5日均线为蓝色,10日均线为橙色,30日均线为绿色,如果需要自己设置颜色,可以在每条均线的的绘制方法中加入color参数。


细心的读者肯定发现30日均线只有最后一小段,这是因为前29日不够30日是算不出均线的,同样的5,10日均线也是如此。

成交量

最后,我们还需要绘制成交量。在多数的股票交易软件中,上面是K线图,一般下面对应的就是成交量,这样对比起来看,往往能直观的看到数据的变化。

但是,因为上面有个K线图,那么同一个画布中就有了2个图片,且它们共用一个X轴,那么我们需要更改一下基本的参数,
 
代码如下所示:
import mpl_finance as mpf
import matplotlib.pyplot as plt
import pandas as pd
import matplotlib.ticker as ticker
import numpy as np
#创建绘图的基本参数
fig, axes = plt.subplots(2, 1, sharex=True, figsize=(15, 10))
ax1, ax2 = axes.flatten()

#获取刚才的股票数据
df = pd.read_excel("同和药业k.xlsx")
mpf.candlestick2_ochl(ax1, df["open"], df["close"], df["high"], df["low"], width=0.6, colorup='r',colordown='green',alpha=1.0)
df['date'] = pd.to_datetime(df['date'])
df['date'] = df['date'].apply(lambda x: x.strftime('%Y-%m-%d'))
def format_date(x, pos=None):
if x < 0 or x > len(df['date']) - 1:
return ''
return df['date'][int(x)]
df["SMA5"] = df["close"].rolling(5).mean()
df["SMA10"] = df["close"].rolling(10).mean()
df["SMA30"] = df["close"].rolling(30).mean()
ax1.plot(np.arange(0, len(df)), df['SMA5']) # 绘制5日均线
ax1.plot(np.arange(0, len(df)), df['SMA10']) # 绘制10日均线
ax1.plot(np.arange(0, len(df)), df['SMA30']) # 绘制30日均线
ax1.xaxis.set_major_formatter(ticker.FuncFormatter(format_date))
plt.setp(plt.gca().get_xticklabels(), rotation=45, horizontalalignment='right')
#显示出来
plt.show()
 
这里,我们将绘图的画布设置为2行1列。同时,将上面绘制的所有数据都更改为ax1,这样均线与K线图会绘制到第一个子图中。

接着,我们需要绘制成交量,但是我们知道,一般股票交易软件都将上涨的那天成交量设置为红色,而将下跌的成交量绘制成绿色。所以,首先我们要做的是将获取的股票数据根据当天的涨跌情况进行分类。
 
具体代码如下:
 
red_pred = np.where(df["close"] > df["open"], df["volume"], 0)
blue_pred = np.where(df["close"] < df["open"], df["volume"], 0)
 
如上面代码所示,我们通过np.where(condition, x, y)筛选数据。这里满足条件condition,输出X,不满足条件输出Y,这样我们就将涨跌的成交量数据进行了分类。

最后,我们直接通过柱状图方法绘制成交量,
具体代码如下所示:
ax2.bar(np.arange(0, len(df)), red_pred, facecolor="red")
ax2.bar(np.arange(0, len(df)), blue_pred, facecolor="blue")
 
将这4行代码,全部加入到plt.show()代码的前面即可。

运行之后,输出的效果图如下:


根据定义编写形态

接下来,我们根据定义来构造一个简单的形态函数,比如长上影线。

上影线


根据网络上的定义:

⑤上影阳线:开盘后价格冲高回落,涨势受阻,虽然收盘价仍高于开盘价,但上方有阻力,可视为弱势。

⑥上影阴线:开盘后价格冲高受阻,涨势受阻,收盘价低于开盘价,上方有阻力,可视为弱势。








那么简单定义为:(high - close)/close > 7%,(high - open)/open > 7% ,可能不是太精确,这里只是为了演示,忽略一些具体细节。

简单理解就是,当天最高价比收盘价,开盘价高得多。

长上影匹配函数,简单,只有一行就搞定。
 
def long_up_shadow(o,c,h,l):
return True if (h-c)/c >=0.07 and (h-o)/o>=0.07 else False
 
 
然后把这个长上影函数应用到上面的同和药业。
 
得到的效果:
df = pd.read_excel("同和药业k.xlsx")
count_num = []
for row,item in df.iterrows():
if long_up_shadow(item['open'],item['close'],item['high'],item['low']):
count_num.append(row)

plot_image(df,count_num)
 
图里面的4个箭头长上影是python自动标上去的,然后对着数据到同花顺核对一下,都是满足长度大于7%的。

可以看到在3月18日和28日的两根长上影之后,同和药业的股价走了一波趋势下跌。【PS:选这个股票并没有刻意去挑选,在集思录默认排名,找了一个跌幅第一个转债的正股就把代码拷贝过来测试】

那么,有这么多的形态,难道每一个都要自己写代码筛选形态吗? 不用哈,因为已经有人写了第三方的库,你只需要调用就可以了。


截取的部分函数名与说明


比如,像两只乌鸦,描述起来都感觉有点复杂,自己手撸代码都会搞出一堆bug。而用taLib这个库,你只需要一行调用代码,就可以完成这些复杂的形态筛选工作。

示例代码:
df['tow_crows'] = talib.CDL2CROWS(df['open'].values, df['high'].values, df['low'].values, df['close'].values)

pattern = df[(df['tow_crows'] == 100) | (df['tow_crows'] == -100)]
 
 
上面得到的pattern就是满足要求的形态,如CDL2CROWS 两只乌鸦。测试的个股是歌尔股份2020的日K线。

虽然我不知道两只乌鸦是什么玩意,但是可以通过遍历某个长周期(5-10年)下的全部A股数据,通过数据证伪,统计这个形态过后的一周或一个月(个人随意设定)涨跌幅,来证伪这个形态的有效性。

如果得到的是一个50%概率涨跌概况,那说明这个指标形态只是个游走在随机概率的指标,并不能作为一个有效指标参考。

(未完待续) 查看全部
python识别股票K线形态,准确率回测(一)

对于一些做股票技术分析的投资者来说,对常见的k线形态应该都不陌生,比如十字星,红三兵,头肩顶(底),岛型反转,吊颈线,两只乌鸦,三只乌鸦,四只乌鸦(哈)


faedab64034f78f02380501cf58b9d5cb1191c9e.jpeg



做价投的投资者可能会对这些划线的嗤之以鼻,而短线操盘者却有可能把它奉为圭臬,以之作为买卖标准。

海乃百川,兼听则明,笔者认为多吸收不同的观点与技术,可以更加全面的加深投资认知。你画的圆圈越大,圆圈外的未知空间也越大。

本文介绍使用python对A股市场的股票(转债也可以)的K线进行识别,然后回测某个形态出现后接下来的涨跌幅,还可以通过设定的形态进行选股。

举个例子,我们可以统计所有个股出现了“早晨之星“这一形态后,一周后甚至一个月后,个股是涨了还是跌了,从大量结果中统计出一些有意义的结果。

为了便于验证查看结果图形,我们先介绍如何使用python来画股票K线图。

有数据之后,剩下画图是很简单的,很多第三方的库已经封装好了各种蜡烛图绘制函数。我们要做只是传入每天开,收盘价,以及最高最低价。

获取股票的数据

市面有不少第三方的库可以获取股票和可转债的日线数据,比如tushare和akshare。本文以股票数据为例。

以akshare为例,代码如下所示:
 
# pip install akshare 
import akshare as ak
def get_k_line(code="sz002241"): #
df = ak.stock_zh_a_daily(symbol=code, start_date="20220101", end_date="20220515",
adjust="qfq")
# 这个函数只适合取股票数据,转债会报错,转债的日线数据可以使用其他函数,这里选择股价前复权
df.to_excel("同和药业k.xlsx")

如上面代码所示,我们使用stock_zh_a_daily方法获取一段时间的数据,这里的日期可以根据你的需求进行调整,比如设置start_date=“20200101”,end_date=“20220515”,就可以获取一年时间段的股票数据。

而股票的代码有sh与sz之分,sz代表深市的股票,所有深市的股票前面都必须带上sz,比如这里的同和药业,就是sz002241。

同样的,sh是上证交易所的股票,所有上证的股票前面必须带上sh。

这里,我们来看看获取的同和药业股票数据格式,如下图所示:

date:交易日期
open:代表开盘价
high:当天最高价
low:当天最低价
close:当天收盘价
volume:当天成交量(元)
outstanding_share:流动股本(股)
turnover:换手率


既然已经拿到了数据,下面我们来绘制K线图。

绘制K线图

在python中,绘制K线图需要用到mpl_finance库,而这个库提供了4种方式绘制K线图,这里我们介绍其中的一种,代码如下所示:
 
import mpl_finance as mpf
import matplotlib.pyplot as plt
import pandas as pd

#创建绘图的基本参数
fig=plt.figure(figsize=(12, 8))
ax=fig.add_subplot(111)

#获取刚才的股票数据
df = pd.read_excel("同和药业k.xlsx")
mpf.candlestick2_ochl(ax, df["open"], df["close"], df["high"], df["low"], width=0.6, colorup='r',colordown='green',alpha=1.0)
#显示出来
plt.show()

运行此段代码后,会显示如下效果图:






和东财上的同和药业的k线图基本一致的。

不过,这个K线图有一个问题,就是X坐标轴并不是显示的时间,而是数字,这是因为我们绘制K线图的方法,并没有提供X轴的参数,那怎么让下面的数字替换为时间呢?
 
我们先来看一段代码:
import matplotlib.ticker as ticker
#将股票时间转换为标准时间,不带时分秒的数据
def date_to_num(dates):
num_time = []
for date in dates:
date_time = datetime.strptime(date, '%Y-%m-%d')
num_date = date2num(date_time)
num_time.append(num_date)
return num_time

#创建绘图的基本参数
fig=plt.figure(figsize=(12, 8))
ax=fig.add_subplot(111)

#获取刚才的股票数据
df = pd.read_excel("同和药业k.xlsx")
mpf.candlestick2_ochl(ax, df["open"], df["close"], df["high"], df["low"], width=0.6, colorup='r',colordown='green',alpha=1.0)
df['date'] = pd.to_datetime(df['date'])
df['date'] = df['date'].apply(lambda x: x.strftime('%Y-%m-%d'))
def format_date(x, pos=None):
if x < 0 or x > len(df['date']) - 1:
return ''
return df['date'][int(x)]
ax.xaxis.set_major_formatter(ticker.FuncFormatter(format_date))
plt.setp(plt.gca().get_xticklabels(), rotation=45, horizontalalignment='right')
#显示出来
plt.show()

 
这里,我们定义了2个方法:第1个方法date_to_num主要的作用就是将获取的时间数据转换为标准的日期数据;第2个方法,就是根据X的数值替换时间值。

其中,set_major_formatter方法是将数值替换为时间值的操作库,而plt.setup的功能就是设置X轴的标签倾斜45度以及右对齐。运行之后,我们的K线图就显示的非常完美了,如下图所示:



均线图

虽然我们实现了K线图,但是有没有发现,其实大多数的股票交易软件K线图上面其实还标记有均线,比如常用的有5日均线,10日均线,30均线。
所以,我们需要将均线一起添加到我们的K线图之上。
计算均线的方式如下:
df["SMA5"] = df["close"].rolling(5).mean()
df["SMA10"] = df["close"].rolling(10).mean()
df["SMA30"] = df["close"].rolling(30).mean()

 
3行代码就可以获取到股票的均线值。
接着,我们可以使用上面的ax进行绘制均线了,
添加的代码如下所示:
 
ax.plot(np.arange(0, len(df)), df['SMA5'])  # 绘制5日均线
ax.plot(np.arange(0, len(df)), df['SMA10']) # 绘制10日均线
ax.plot(np.arange(0, len(df)), df['SMA30']) # 绘制30日均线

这里,同样将X轴设置为数字,将这两段代码添加到上面的K线图代码中,自然也会将X轴替换为时间。运行之后,显示效果如下图所示:


 
这里5日均线为蓝色,10日均线为橙色,30日均线为绿色,如果需要自己设置颜色,可以在每条均线的的绘制方法中加入color参数。


细心的读者肯定发现30日均线只有最后一小段,这是因为前29日不够30日是算不出均线的,同样的5,10日均线也是如此。

成交量

最后,我们还需要绘制成交量。在多数的股票交易软件中,上面是K线图,一般下面对应的就是成交量,这样对比起来看,往往能直观的看到数据的变化。

但是,因为上面有个K线图,那么同一个画布中就有了2个图片,且它们共用一个X轴,那么我们需要更改一下基本的参数,
 
代码如下所示:
import mpl_finance as mpf
import matplotlib.pyplot as plt
import pandas as pd
import matplotlib.ticker as ticker
import numpy as np
#创建绘图的基本参数
fig, axes = plt.subplots(2, 1, sharex=True, figsize=(15, 10))
ax1, ax2 = axes.flatten()

#获取刚才的股票数据
df = pd.read_excel("同和药业k.xlsx")
mpf.candlestick2_ochl(ax1, df["open"], df["close"], df["high"], df["low"], width=0.6, colorup='r',colordown='green',alpha=1.0)
df['date'] = pd.to_datetime(df['date'])
df['date'] = df['date'].apply(lambda x: x.strftime('%Y-%m-%d'))
def format_date(x, pos=None):
if x < 0 or x > len(df['date']) - 1:
return ''
return df['date'][int(x)]
df["SMA5"] = df["close"].rolling(5).mean()
df["SMA10"] = df["close"].rolling(10).mean()
df["SMA30"] = df["close"].rolling(30).mean()
ax1.plot(np.arange(0, len(df)), df['SMA5']) # 绘制5日均线
ax1.plot(np.arange(0, len(df)), df['SMA10']) # 绘制10日均线
ax1.plot(np.arange(0, len(df)), df['SMA30']) # 绘制30日均线
ax1.xaxis.set_major_formatter(ticker.FuncFormatter(format_date))
plt.setp(plt.gca().get_xticklabels(), rotation=45, horizontalalignment='right')
#显示出来
plt.show()

 
这里,我们将绘图的画布设置为2行1列。同时,将上面绘制的所有数据都更改为ax1,这样均线与K线图会绘制到第一个子图中。

接着,我们需要绘制成交量,但是我们知道,一般股票交易软件都将上涨的那天成交量设置为红色,而将下跌的成交量绘制成绿色。所以,首先我们要做的是将获取的股票数据根据当天的涨跌情况进行分类。
 
具体代码如下:
 
red_pred = np.where(df["close"] > df["open"], df["volume"], 0)
blue_pred = np.where(df["close"] < df["open"], df["volume"], 0)

 
如上面代码所示,我们通过np.where(condition, x, y)筛选数据。这里满足条件condition,输出X,不满足条件输出Y,这样我们就将涨跌的成交量数据进行了分类。

最后,我们直接通过柱状图方法绘制成交量,
具体代码如下所示:
ax2.bar(np.arange(0, len(df)), red_pred, facecolor="red")
ax2.bar(np.arange(0, len(df)), blue_pred, facecolor="blue")

 
将这4行代码,全部加入到plt.show()代码的前面即可。

运行之后,输出的效果图如下:


根据定义编写形态

接下来,我们根据定义来构造一个简单的形态函数,比如长上影线。

上影线


根据网络上的定义:

⑤上影阳线:开盘后价格冲高回落,涨势受阻,虽然收盘价仍高于开盘价,但上方有阻力,可视为弱势。

⑥上影阴线:开盘后价格冲高受阻,涨势受阻,收盘价低于开盘价,上方有阻力,可视为弱势。


a63d1fc08915cbf8f22f333a3226f331.jpeg



那么简单定义为:(high - close)/close > 7%,(high - open)/open > 7% ,可能不是太精确,这里只是为了演示,忽略一些具体细节。

简单理解就是,当天最高价比收盘价,开盘价高得多。

长上影匹配函数,简单,只有一行就搞定。
 
def long_up_shadow(o,c,h,l):
return True if (h-c)/c >=0.07 and (h-o)/o>=0.07 else False

 
 
然后把这个长上影函数应用到上面的同和药业。
 
得到的效果:
df = pd.read_excel("同和药业k.xlsx")
count_num = []
for row,item in df.iterrows():
if long_up_shadow(item['open'],item['close'],item['high'],item['low']):
count_num.append(row)

plot_image(df,count_num)

 
图里面的4个箭头长上影是python自动标上去的,然后对着数据到同花顺核对一下,都是满足长度大于7%的。

可以看到在3月18日和28日的两根长上影之后,同和药业的股价走了一波趋势下跌。【PS:选这个股票并没有刻意去挑选,在集思录默认排名,找了一个跌幅第一个转债的正股就把代码拷贝过来测试】

那么,有这么多的形态,难道每一个都要自己写代码筛选形态吗? 不用哈,因为已经有人写了第三方的库,你只需要调用就可以了。


截取的部分函数名与说明


比如,像两只乌鸦,描述起来都感觉有点复杂,自己手撸代码都会搞出一堆bug。而用taLib这个库,你只需要一行调用代码,就可以完成这些复杂的形态筛选工作。

示例代码:
df['tow_crows'] = talib.CDL2CROWS(df['open'].values, df['high'].values, df['low'].values, df['close'].values)

pattern = df[(df['tow_crows'] == 100) | (df['tow_crows'] == -100)]

 
 
上面得到的pattern就是满足要求的形态,如CDL2CROWS 两只乌鸦。测试的个股是歌尔股份2020的日K线。

虽然我不知道两只乌鸦是什么玩意,但是可以通过遍历某个长周期(5-10年)下的全部A股数据,通过数据证伪,统计这个形态过后的一周或一个月(个人随意设定)涨跌幅,来证伪这个形态的有效性。

如果得到的是一个50%概率涨跌概况,那说明这个指标形态只是个游走在随机概率的指标,并不能作为一个有效指标参考。

(未完待续)

在2015年山顶5178点 开始定投所有大A股票 结果会是怎样?

量化交易-Ptrade-QMT李魔佛 发表了文章 • 0 个评论 • 1701 次浏览 • 2021-03-29 00:41 • 来自相关话题

对于定投,一般人印象是,如果你最终结果是亏损的,那么原因就是:耐心不够,跌的时候不够定力,不敢继续加仓。

而事实真的是这样吗?

笔者使用2015年6月12日上一轮全面牛市的高点5178点,作为定投的起始点。而定投标的股票为大A所有股票。








股票池为2015年6月12日没有停牌的股票,共 2415 只。使用的量化平台是优矿。

(没错,以前股票数就才两千多只,这几年股票数接近翻倍了)def get_all_code(date):
'''
获取某天的股市运行的股票,排除停牌
'''
df=DataAPI.MktEqudAdjGet(secID=u"",ticker=u"",
tradeDate=date,
beginDate=u"",
endDate=u"",
isOpen="",
field=u"",
pandas="1")
df=df[df['turnoverValue']>0] # 停牌
return df['ticker'].tolist()

















部分股票样本数据


接着从2015年6月12日开始定投,这里笔者按照一个月定投一次,也就是22个交易日定投一次。

每次定投金额10000元。定投到2021年3月28日。

如果定投当天遇到股票停牌,则顺势延续到复牌后继续定投。

这里定投采用净值法定投,为的是让数据更加准确。因为如果按照实际定投股票,10000元的金额可能连1手的茅台也买不进去,这里计算买入的份额为=10000元/股票股价, 比如茅台的股价是2000元,那么这里买入的份额就是5股,并没按照实际股票的1手来算。这样计算得到结果更加精准。

python计算代码如下: 1import time
2import datetime
3
4stock_profit_list=
5start=time.time()
6
7today=datetime.datetime.now().strftime('%Y-%m-%d')
8
9def get_trade_date():
10 df=DataAPI.TradeCalGet(exchangeCD=u"XSHG,XSHE",
11 beginDate=high_date,
12 endDate=today,isOpen=u"1",
13 field=u"",pandas="1")
14 return df['calendarDate'].tolist()
15
16def fixed_investment(code):
17 stock_profit_dict={}
18 stock_profit_dict['code']=code
19 df=DataAPI.MktEqudAdjGet(secID=u"",ticker=code,tradeDate=u'',beginDate=high_date,endDate=today,isOpen="1",field=u"",pandas="1")
20 total_amount=0
21 invest_count=0
22 every_invest_cash=10000
23 total_money_list=list()
24 last_date=None
25 for trade_date in trade_date_list_interval:
26 trade_df = df[df['tradeDate']==trade_date]
27 if len(trade_df)>0:
28 invest_count+=1
29 price=trade_df['closePrice'].iloc[0]
30 amount=every_invest_cash/price
31 cost=invest_count*every_invest_cash
32 profit=total_amount*price/cost
33 total_money_list.append(profit)
34 total_amount=total_amount+amount
35 total_money=price*total_amount
36 last_date=trade_date
37
38
39 stock_profit_dict['profit_rate']=profit
40 stock_profit_dict['last_date']=last_date
41 stock_profit_dict['invest_count']=invest_count
42 stock_profit_dict['total_amount']=total_amount
43 stock_profit_dict['total_money']=total_money
44 stock_profit_dict['profit_list']=total_money_list
45 stock_profit_dict['cost']=cost
46 return stock_profit_dict
47
48for code in target_codes:
49 profit_dict = fixed_investment(code)
50 stock_profit_list.append(profit_dict)
51
52print(time.time()-start)
 
最终得到的数据保存在stock_profit_list变量里面。在计算过程也记录里每一个股票当前一期定投阶段的阶段收益率,组合成一个列表。

为的是倒后镜看看,曾经的历史定投收益率,也可以看看曾经的历史定投收益率的最大值。便于和现在最后一期收益率的对比。

得到数据按照profit_rate收益率排个序:profi_df_sorted = profit_df.sort_values(by='profit_rate',ascending=False)
得到下面的数据:







上面的股票熟悉不?基本都是年初那一批基金ikun们的抱团股。

定投收益率最高的是山西汾酒,收益率达到8.56,即856%,从股灾高点定投下来,到现在2021年3月28日,收益率是8倍!

其月K线如下:







牛气冲天的5年十倍股,股灾时山西汾酒的股价徘徊在21-26之间左右。如果股灾的时候采用一把梭,收益率是336/26=12.9 倍。

而采用定投方式的收益率也不差,8.56倍。

再继续看看定投收益排在倒数的







真是好家伙,亏得底裤都不见了。清一色的退市股,定投收益率基本在0.1以下,意味着投资了100元,最后就剩10元以下。

在前面计算的时候,特意加了一个数据列,定投期数和定投停止日期,也就是股票退市或者停牌导致无法交易的日子。

invest_count为定投期数,定投一次此值加1. last_date 为最后一个交易日期。倒数第一个国恒退,只交易1期,7月10日退市,等不来第2期的定投,不过也好,这样子只也不至于越陷越深。








国恒退日K
total_money 列是投资得到总金额,cost是投入的成本。投资期数越多,随着股价上涨,该金额会越高,而股价不断下跌,则该金额会越来越少。所以遇到国恒退这种股票,当期只投了10000元就无法继续投下去,还是运气比较好的。类似于止损操作了。

toal_money减去cost得到的是绝对收益。之前因为没有加这一列,可以通过以下公式计算得到:profit_df['absolute_profit']=profit_df['total_money']-profit_df['cost']
按绝对收益计算,最多的还是前面那20位个股,赚最多的山西汾酒,129W的定投金额,盈利金额达到900W。







同样倒序排一下,绝对亏损最多的,肯定也是定投期数较多的。

[图片]
亏损最多的天夏退,目前还没有完全退市,定投了114期,总亏损金额达到100W,定投总金额是110W。额,只剩10W。







它的月K线是这样的。其跌到4元多的时候还放量了,可能一堆人冲进去抄底了,然后按亏损幅度,4元跌到0.22元,亏损幅度也是94.5%,这个亏损幅度其实和在山顶29元站岗的亏损率其实没什么区别了。高手死于抄底,呵呵。

接着看看上面所有股票的定投的平均收益率:profi_df_sorted['profit_rate'].mean()
得到的收益率的平均值为:1.043,减去本金1,收益为1.043-1=0.043,也就是4.3%个点。

换句话说,如果在股票高点5178点定投全市场股票,5年多来的最后收益率为4.3%.







中位数是0.87-1=-0.13,= -13%,中位数是亏损13%,定投金额约126W,亏损金额为14W。

看到这里,笔者想要表述的是,即使是定投也需要挑选一个好标的股票或者基金,也就是择股择时能力。

如果在一个垃圾股或者基金上定投,只会让你越陷越深,亏损越来越多。假如你在定投康得新或者乐视,定投了100期,投入了不少的金额和时间,突然暴雷,然后ST,那么你会继续定投下去吗?

另外,定投也需要一定的择时能力,比如在前春节前,基金抱团股热度不减,对于大部分没有择股能力的人来说,当时是应该止盈离场的。当然,如果倒后镜看,如果有能力抓取上面的大牛股,也不一定能够把上面的8倍收益落袋而安。

上面数据有一列max_profit,total_money/cost, 也就是定投期间,获得的最大收益率。按此列排序:







在定投期间,最大收益率的是ST中安,最大收益率是14.6-1=13.6倍。最后到这个月最终定投收益率是0.67,亏损状态,0.67-1=-0.37,亏损为-37%,绝对收益absolute_profit为-29W.

排在第4是是乐视退,定投期间最大收益max_profit达到10倍,最后如果坚持定投,是亏损93%的。

如果把定投时间放在2018年1月12日,那么得到的定投收益率排名前20名是这样的:







得到不一样的前20排名,定投收益率最高的是英科医疗,疫情手套涨了10倍的大牛股。而山西汾酒跌到第10,并且收益率也只有4倍左右。而茅台也没出现在前20的榜单上。


不同的定投时间,得到的是不一样的结果。当然择股能力强的大神,就不屑定投而采用一把梭了,大神向往的是英科医疗的一年十倍,而不是十年十倍(大V组合抱团,抱团基金的组合)。


其改变定投时间的定投收益率的平均值以及中位数数据如下:







平均收益率达到了1.14-1=0.14=14%,也就是如果你在18年开始定投全市场股票,当前平均收益率是14%,不过中位数的收益率是1-1=0%,因为这两年股票大小票分化得太严重(24%的个股跌破2440的低点,指数涨41%),四分一分位的定投收益率为27%,到了中位数就为0%了。其定投收益率较2015年山顶定投也有了很大的区别。

今天就到这里吧,感觉文章太长了,本来还想把全市场的基金加进来比较的(不同时间点定投全市场所有基金),碍于篇幅原因,留在下一篇再写吧,敬请留意!
 
微信公众号:
可转债量化分析





  查看全部
对于定投,一般人印象是,如果你最终结果是亏损的,那么原因就是:耐心不够,跌的时候不够定力,不敢继续加仓。

而事实真的是这样吗?

笔者使用2015年6月12日上一轮全面牛市的高点5178点,作为定投的起始点。而定投标的股票为大A所有股票。


chrome_8oqFlYXsth.png



股票池为2015年6月12日没有停牌的股票,共 2415 只。使用的量化平台是优矿。

(没错,以前股票数就才两千多只,这几年股票数接近翻倍了)
def get_all_code(date):
'''
获取某天的股市运行的股票,排除停牌
'''
df=DataAPI.MktEqudAdjGet(secID=u"",ticker=u"",
tradeDate=date,
beginDate=u"",
endDate=u"",
isOpen="",
field=u"",
pandas="1")
df=df[df['turnoverValue']>0] # 停牌
return df['ticker'].tolist()


chrome_gvrulmavY7.png







ITIQ1MinNt.png



部分股票样本数据


接着从2015年6月12日开始定投,这里笔者按照一个月定投一次,也就是22个交易日定投一次。

每次定投金额10000元。定投到2021年3月28日。

如果定投当天遇到股票停牌,则顺势延续到复牌后继续定投。

这里定投采用净值法定投,为的是让数据更加准确。因为如果按照实际定投股票,10000元的金额可能连1手的茅台也买不进去,这里计算买入的份额为=10000元/股票股价, 比如茅台的股价是2000元,那么这里买入的份额就是5股,并没按照实际股票的1手来算。这样计算得到结果更加精准。

python计算代码如下:
 1import time
2import datetime
3
4stock_profit_list=
5start=time.time()
6
7today=datetime.datetime.now().strftime('%Y-%m-%d')
8
9def get_trade_date():
10 df=DataAPI.TradeCalGet(exchangeCD=u"XSHG,XSHE",
11 beginDate=high_date,
12 endDate=today,isOpen=u"1",
13 field=u"",pandas="1")
14 return df['calendarDate'].tolist()
15
16def fixed_investment(code):
17 stock_profit_dict={}
18 stock_profit_dict['code']=code
19 df=DataAPI.MktEqudAdjGet(secID=u"",ticker=code,tradeDate=u'',beginDate=high_date,endDate=today,isOpen="1",field=u"",pandas="1")
20 total_amount=0
21 invest_count=0
22 every_invest_cash=10000
23 total_money_list=list()
24 last_date=None
25 for trade_date in trade_date_list_interval:
26 trade_df = df[df['tradeDate']==trade_date]
27 if len(trade_df)>0:
28 invest_count+=1
29 price=trade_df['closePrice'].iloc[0]
30 amount=every_invest_cash/price
31 cost=invest_count*every_invest_cash
32 profit=total_amount*price/cost
33 total_money_list.append(profit)
34 total_amount=total_amount+amount
35 total_money=price*total_amount
36 last_date=trade_date
37
38
39 stock_profit_dict['profit_rate']=profit
40 stock_profit_dict['last_date']=last_date
41 stock_profit_dict['invest_count']=invest_count
42 stock_profit_dict['total_amount']=total_amount
43 stock_profit_dict['total_money']=total_money
44 stock_profit_dict['profit_list']=total_money_list
45 stock_profit_dict['cost']=cost
46 return stock_profit_dict
47
48for code in target_codes:
49 profit_dict = fixed_investment(code)
50 stock_profit_list.append(profit_dict)
51
52print(time.time()-start)

 
最终得到的数据保存在stock_profit_list变量里面。在计算过程也记录里每一个股票当前一期定投阶段的阶段收益率,组合成一个列表。

为的是倒后镜看看,曾经的历史定投收益率,也可以看看曾经的历史定投收益率的最大值。便于和现在最后一期收益率的对比。

得到数据按照profit_rate收益率排个序:
profi_df_sorted = profit_df.sort_values(by='profit_rate',ascending=False)

得到下面的数据:


chrome_2ssHwV7kIF.png


上面的股票熟悉不?基本都是年初那一批基金ikun们的抱团股。

定投收益率最高的是山西汾酒,收益率达到8.56,即856%,从股灾高点定投下来,到现在2021年3月28日,收益率是8倍!

其月K线如下:


chrome_5YfTfpQeGO.png


牛气冲天的5年十倍股,股灾时山西汾酒的股价徘徊在21-26之间左右。如果股灾的时候采用一把梭,收益率是336/26=12.9 倍。

而采用定投方式的收益率也不差,8.56倍。

再继续看看定投收益排在倒数的


chrome_70AmS82Klu.png


真是好家伙,亏得底裤都不见了。清一色的退市股,定投收益率基本在0.1以下,意味着投资了100元,最后就剩10元以下。

在前面计算的时候,特意加了一个数据列,定投期数和定投停止日期,也就是股票退市或者停牌导致无法交易的日子。

invest_count为定投期数,定投一次此值加1. last_date 为最后一个交易日期。倒数第一个国恒退,只交易1期,7月10日退市,等不来第2期的定投,不过也好,这样子只也不至于越陷越深。



chrome_ctuYAng8BL.png


国恒退日K
total_money 列是投资得到总金额,cost是投入的成本。投资期数越多,随着股价上涨,该金额会越高,而股价不断下跌,则该金额会越来越少。所以遇到国恒退这种股票,当期只投了10000元就无法继续投下去,还是运气比较好的。类似于止损操作了。

toal_money减去cost得到的是绝对收益。之前因为没有加这一列,可以通过以下公式计算得到:
profit_df['absolute_profit']=profit_df['total_money']-profit_df['cost']

按绝对收益计算,最多的还是前面那20位个股,赚最多的山西汾酒,129W的定投金额,盈利金额达到900W。


chrome_UQ2xMZ75cl.png


同样倒序排一下,绝对亏损最多的,肯定也是定投期数较多的。

[图片]
亏损最多的天夏退,目前还没有完全退市,定投了114期,总亏损金额达到100W,定投总金额是110W。额,只剩10W。


chrome_FVZp47vc3S.png


它的月K线是这样的。其跌到4元多的时候还放量了,可能一堆人冲进去抄底了,然后按亏损幅度,4元跌到0.22元,亏损幅度也是94.5%,这个亏损幅度其实和在山顶29元站岗的亏损率其实没什么区别了。高手死于抄底,呵呵。

接着看看上面所有股票的定投的平均收益率:
profi_df_sorted['profit_rate'].mean()

得到的收益率的平均值为:1.043,减去本金1,收益为1.043-1=0.043,也就是4.3%个点。

换句话说,如果在股票高点5178点定投全市场股票,5年多来的最后收益率为4.3%.


chrome_U2mijtKyIe.png


中位数是0.87-1=-0.13,= -13%,中位数是亏损13%,定投金额约126W,亏损金额为14W。

看到这里,笔者想要表述的是,即使是定投也需要挑选一个好标的股票或者基金,也就是择股择时能力。

如果在一个垃圾股或者基金上定投,只会让你越陷越深,亏损越来越多。假如你在定投康得新或者乐视,定投了100期,投入了不少的金额和时间,突然暴雷,然后ST,那么你会继续定投下去吗?

另外,定投也需要一定的择时能力,比如在前春节前,基金抱团股热度不减,对于大部分没有择股能力的人来说,当时是应该止盈离场的。当然,如果倒后镜看,如果有能力抓取上面的大牛股,也不一定能够把上面的8倍收益落袋而安。

上面数据有一列max_profit,total_money/cost, 也就是定投期间,获得的最大收益率。按此列排序:


chrome_vMYDUIaC00.png


在定投期间,最大收益率的是ST中安,最大收益率是14.6-1=13.6倍。最后到这个月最终定投收益率是0.67,亏损状态,0.67-1=-0.37,亏损为-37%,绝对收益absolute_profit为-29W.

排在第4是是乐视退,定投期间最大收益max_profit达到10倍,最后如果坚持定投,是亏损93%的。

如果把定投时间放在2018年1月12日,那么得到的定投收益率排名前20名是这样的:


chrome_6UAh6Vp6vE.png


得到不一样的前20排名,定投收益率最高的是英科医疗,疫情手套涨了10倍的大牛股。而山西汾酒跌到第10,并且收益率也只有4倍左右。而茅台也没出现在前20的榜单上。


不同的定投时间,得到的是不一样的结果。当然择股能力强的大神,就不屑定投而采用一把梭了,大神向往的是英科医疗的一年十倍,而不是十年十倍(大V组合抱团,抱团基金的组合)。


其改变定投时间的定投收益率的平均值以及中位数数据如下:


chrome_W3tYI5Sj74.png


平均收益率达到了1.14-1=0.14=14%,也就是如果你在18年开始定投全市场股票,当前平均收益率是14%,不过中位数的收益率是1-1=0%,因为这两年股票大小票分化得太严重(24%的个股跌破2440的低点,指数涨41%),四分一分位的定投收益率为27%,到了中位数就为0%了。其定投收益率较2015年山顶定投也有了很大的区别。

今天就到这里吧,感觉文章太长了,本来还想把全市场的基金加进来比较的(不同时间点定投全市场所有基金),碍于篇幅原因,留在下一篇再写吧,敬请留意!
 
微信公众号:
可转债量化分析

公众号二维码.jpg

 

bandcamp移动开发更简单

数据库linxiaojue 发表了文章 • 0 个评论 • 2299 次浏览 • 2019-12-14 05:12 • 来自相关话题

bandcamp移动开发更简单http://ydkfpgjd.bandcamp.com/
http://TalkingData.bandcamp.com/
http://Bugly.bandcamp.com/
http://Box2D.bandcamp.com/
http://aineice.bandcamp.com/
http://wyyp.bandcamp.com/
http://Prepo.bandcamp.com/
http://Chipmunk.bandcamp.com/
http://openinstall.bandcamp.com/
http://MobileInsight.bandcamp.com/
http://zhugelo.bandcamp.com/
http://CobubRazor.bandcamp.com/
http://Testin.bandcamp.com/
http://crashlytics.bandcamp.com/
http://APKProtect.bandcamp.com/
http://Ucloud.bandcamp.com/
http://ydkfpgj.bandcamp.com/releases
http://TalkingData.bandcamp.com/releases
http://Bugly.bandcamp.com/releases
http://Box2D.bandcamp.com/releases
http://aineice.bandcamp.com/releases
http://wyyp.bandcamp.com/releases
http://Prepo.bandcamp.com/releases
http://Chipmunk.bandcamp.com/releases
http://openinstall.bandcamp.com/releases
http://MobileInsight.bandcamp.com/releases
http://zhugelo.bandcamp.com/releases
http://CobubRazor.bandcamp.com/releases
http://Testin.bandcamp.com/releases
http://crashlytics.bandcamp.com/releases
http://APKProtect.bandcamp.com/releases
http://Ucloud.bandcamp.com/releases 查看全部

numpy indices的用法

量化交易-Ptrade-QMT李魔佛 发表了文章 • 0 个评论 • 8346 次浏览 • 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现在就是一个圆啦
 

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

量化交易-Ptrade-QMT李魔佛 发表了文章 • 0 个评论 • 3837 次浏览 • 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"
只要修改上面的路径就可以了。注意用双斜杠。
 

jupyter notebook格式的文件损坏如何修复

python李魔佛 发表了文章 • 0 个评论 • 3660 次浏览 • 2019-06-08 13:44 • 来自相关话题

有时候用git同步时,造成了冲突后合并,jupyter notebook的文件被插入了诸如>>>>>HEAD,ORIGIN等字符,这时候再打开jupyter notebook文件(.ipynb后缀),会无法打开。修复过程:
 
使用下面的代码:
# 拯救损坏的jupyter 文件
import re
import codecs

pattern = re.compile('"source": \[(.*?)\]\s+\},',re.S)
filename = 'tushare_usage.ipynb'
with codecs.open(filename,encoding='utf8') as f:
content = f.read()

source = pattern.findall(content)
for s in source:
t=s.replace('\\n','')
t=re.sub('"','',t)
t=re.sub('(,$)','',t)
print(t)只要把你要修复的文件替换一下就可以了。 查看全部
有时候用git同步时,造成了冲突后合并,jupyter notebook的文件被插入了诸如>>>>>HEAD,ORIGIN等字符,这时候再打开jupyter notebook文件(.ipynb后缀),会无法打开。修复过程:
 
使用下面的代码:
# 拯救损坏的jupyter 文件
import re
import codecs

pattern = re.compile('"source": \[(.*?)\]\s+\},',re.S)
filename = 'tushare_usage.ipynb'
with codecs.open(filename,encoding='utf8') as f:
content = f.read()

source = pattern.findall(content)
for s in source:
t=s.replace('\\n','')
t=re.sub('"','',t)
t=re.sub('(,$)','',t)
print(t)
只要把你要修复的文件替换一下就可以了。

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

量化交易-Ptrade-QMT李魔佛 发表了文章 • 0 个评论 • 6944 次浏览 • 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
 

python识别股票K线形态,准确率回测(一)

量化交易-Ptrade-QMT李魔佛 发表了文章 • 1 个评论 • 2386 次浏览 • 2022-05-22 01:13 • 来自相关话题

python识别股票K线形态,准确率回测(一)

对于一些做股票技术分析的投资者来说,对常见的k线形态应该都不陌生,比如十字星,红三兵,头肩顶(底),岛型反转,吊颈线,两只乌鸦,三只乌鸦,四只乌鸦(哈)








做价投的投资者可能会对这些划线的嗤之以鼻,而短线操盘者却有可能把它奉为圭臬,以之作为买卖标准。

海乃百川,兼听则明,笔者认为多吸收不同的观点与技术,可以更加全面的加深投资认知。你画的圆圈越大,圆圈外的未知空间也越大。

本文介绍使用python对A股市场的股票(转债也可以)的K线进行识别,然后回测某个形态出现后接下来的涨跌幅,还可以通过设定的形态进行选股。

举个例子,我们可以统计所有个股出现了“早晨之星“这一形态后,一周后甚至一个月后,个股是涨了还是跌了,从大量结果中统计出一些有意义的结果。

为了便于验证查看结果图形,我们先介绍如何使用python来画股票K线图。

有数据之后,剩下画图是很简单的,很多第三方的库已经封装好了各种蜡烛图绘制函数。我们要做只是传入每天开,收盘价,以及最高最低价。

获取股票的数据

市面有不少第三方的库可以获取股票和可转债的日线数据,比如tushare和akshare。本文以股票数据为例。

以akshare为例,代码如下所示:
 
# pip install akshare
import akshare as ak
def get_k_line(code="sz002241"): #
df = ak.stock_zh_a_daily(symbol=code, start_date="20220101", end_date="20220515",
adjust="qfq")
# 这个函数只适合取股票数据,转债会报错,转债的日线数据可以使用其他函数,这里选择股价前复权
df.to_excel("同和药业k.xlsx")
如上面代码所示,我们使用stock_zh_a_daily方法获取一段时间的数据,这里的日期可以根据你的需求进行调整,比如设置start_date=“20200101”,end_date=“20220515”,就可以获取一年时间段的股票数据。

而股票的代码有sh与sz之分,sz代表深市的股票,所有深市的股票前面都必须带上sz,比如这里的同和药业,就是sz002241。

同样的,sh是上证交易所的股票,所有上证的股票前面必须带上sh。

这里,我们来看看获取的同和药业股票数据格式,如下图所示:

date:交易日期
open:代表开盘价
high:当天最高价
low:当天最低价
close:当天收盘价
volume:当天成交量(元)
outstanding_share:流动股本(股)
turnover:换手率

既然已经拿到了数据,下面我们来绘制K线图。

绘制K线图

在python中,绘制K线图需要用到mpl_finance库,而这个库提供了4种方式绘制K线图,这里我们介绍其中的一种,代码如下所示:
 
import mpl_finance as mpf
import matplotlib.pyplot as plt
import pandas as pd

#创建绘图的基本参数
fig=plt.figure(figsize=(12, 8))
ax=fig.add_subplot(111)

#获取刚才的股票数据
df = pd.read_excel("同和药业k.xlsx")
mpf.candlestick2_ochl(ax, df["open"], df["close"], df["high"], df["low"], width=0.6, colorup='r',colordown='green',alpha=1.0)
#显示出来
plt.show()
运行此段代码后,会显示如下效果图:






和东财上的同和药业的k线图基本一致的。

不过,这个K线图有一个问题,就是X坐标轴并不是显示的时间,而是数字,这是因为我们绘制K线图的方法,并没有提供X轴的参数,那怎么让下面的数字替换为时间呢?
 
我们先来看一段代码:
import matplotlib.ticker as ticker
#将股票时间转换为标准时间,不带时分秒的数据
def date_to_num(dates):
num_time = []
for date in dates:
date_time = datetime.strptime(date, '%Y-%m-%d')
num_date = date2num(date_time)
num_time.append(num_date)
return num_time

#创建绘图的基本参数
fig=plt.figure(figsize=(12, 8))
ax=fig.add_subplot(111)

#获取刚才的股票数据
df = pd.read_excel("同和药业k.xlsx")
mpf.candlestick2_ochl(ax, df["open"], df["close"], df["high"], df["low"], width=0.6, colorup='r',colordown='green',alpha=1.0)
df['date'] = pd.to_datetime(df['date'])
df['date'] = df['date'].apply(lambda x: x.strftime('%Y-%m-%d'))
def format_date(x, pos=None):
if x < 0 or x > len(df['date']) - 1:
return ''
return df['date'][int(x)]
ax.xaxis.set_major_formatter(ticker.FuncFormatter(format_date))
plt.setp(plt.gca().get_xticklabels(), rotation=45, horizontalalignment='right')
#显示出来
plt.show()
 
这里,我们定义了2个方法:第1个方法date_to_num主要的作用就是将获取的时间数据转换为标准的日期数据;第2个方法,就是根据X的数值替换时间值。

其中,set_major_formatter方法是将数值替换为时间值的操作库,而plt.setup的功能就是设置X轴的标签倾斜45度以及右对齐。运行之后,我们的K线图就显示的非常完美了,如下图所示:



均线图

虽然我们实现了K线图,但是有没有发现,其实大多数的股票交易软件K线图上面其实还标记有均线,比如常用的有5日均线,10日均线,30均线。
所以,我们需要将均线一起添加到我们的K线图之上。
计算均线的方式如下:
df["SMA5"] = df["close"].rolling(5).mean()
df["SMA10"] = df["close"].rolling(10).mean()
df["SMA30"] = df["close"].rolling(30).mean()
 
3行代码就可以获取到股票的均线值。
接着,我们可以使用上面的ax进行绘制均线了,
添加的代码如下所示:
 
ax.plot(np.arange(0, len(df)), df['SMA5']) # 绘制5日均线
ax.plot(np.arange(0, len(df)), df['SMA10']) # 绘制10日均线
ax.plot(np.arange(0, len(df)), df['SMA30']) # 绘制30日均线
这里,同样将X轴设置为数字,将这两段代码添加到上面的K线图代码中,自然也会将X轴替换为时间。运行之后,显示效果如下图所示:


 
这里5日均线为蓝色,10日均线为橙色,30日均线为绿色,如果需要自己设置颜色,可以在每条均线的的绘制方法中加入color参数。


细心的读者肯定发现30日均线只有最后一小段,这是因为前29日不够30日是算不出均线的,同样的5,10日均线也是如此。

成交量

最后,我们还需要绘制成交量。在多数的股票交易软件中,上面是K线图,一般下面对应的就是成交量,这样对比起来看,往往能直观的看到数据的变化。

但是,因为上面有个K线图,那么同一个画布中就有了2个图片,且它们共用一个X轴,那么我们需要更改一下基本的参数,
 
代码如下所示:
import mpl_finance as mpf
import matplotlib.pyplot as plt
import pandas as pd
import matplotlib.ticker as ticker
import numpy as np
#创建绘图的基本参数
fig, axes = plt.subplots(2, 1, sharex=True, figsize=(15, 10))
ax1, ax2 = axes.flatten()

#获取刚才的股票数据
df = pd.read_excel("同和药业k.xlsx")
mpf.candlestick2_ochl(ax1, df["open"], df["close"], df["high"], df["low"], width=0.6, colorup='r',colordown='green',alpha=1.0)
df['date'] = pd.to_datetime(df['date'])
df['date'] = df['date'].apply(lambda x: x.strftime('%Y-%m-%d'))
def format_date(x, pos=None):
if x < 0 or x > len(df['date']) - 1:
return ''
return df['date'][int(x)]
df["SMA5"] = df["close"].rolling(5).mean()
df["SMA10"] = df["close"].rolling(10).mean()
df["SMA30"] = df["close"].rolling(30).mean()
ax1.plot(np.arange(0, len(df)), df['SMA5']) # 绘制5日均线
ax1.plot(np.arange(0, len(df)), df['SMA10']) # 绘制10日均线
ax1.plot(np.arange(0, len(df)), df['SMA30']) # 绘制30日均线
ax1.xaxis.set_major_formatter(ticker.FuncFormatter(format_date))
plt.setp(plt.gca().get_xticklabels(), rotation=45, horizontalalignment='right')
#显示出来
plt.show()
 
这里,我们将绘图的画布设置为2行1列。同时,将上面绘制的所有数据都更改为ax1,这样均线与K线图会绘制到第一个子图中。

接着,我们需要绘制成交量,但是我们知道,一般股票交易软件都将上涨的那天成交量设置为红色,而将下跌的成交量绘制成绿色。所以,首先我们要做的是将获取的股票数据根据当天的涨跌情况进行分类。
 
具体代码如下:
 
red_pred = np.where(df["close"] > df["open"], df["volume"], 0)
blue_pred = np.where(df["close"] < df["open"], df["volume"], 0)
 
如上面代码所示,我们通过np.where(condition, x, y)筛选数据。这里满足条件condition,输出X,不满足条件输出Y,这样我们就将涨跌的成交量数据进行了分类。

最后,我们直接通过柱状图方法绘制成交量,
具体代码如下所示:
ax2.bar(np.arange(0, len(df)), red_pred, facecolor="red")
ax2.bar(np.arange(0, len(df)), blue_pred, facecolor="blue")
 
将这4行代码,全部加入到plt.show()代码的前面即可。

运行之后,输出的效果图如下:


根据定义编写形态

接下来,我们根据定义来构造一个简单的形态函数,比如长上影线。

上影线


根据网络上的定义:

⑤上影阳线:开盘后价格冲高回落,涨势受阻,虽然收盘价仍高于开盘价,但上方有阻力,可视为弱势。

⑥上影阴线:开盘后价格冲高受阻,涨势受阻,收盘价低于开盘价,上方有阻力,可视为弱势。








那么简单定义为:(high - close)/close > 7%,(high - open)/open > 7% ,可能不是太精确,这里只是为了演示,忽略一些具体细节。

简单理解就是,当天最高价比收盘价,开盘价高得多。

长上影匹配函数,简单,只有一行就搞定。
 
def long_up_shadow(o,c,h,l):
return True if (h-c)/c >=0.07 and (h-o)/o>=0.07 else False
 
 
然后把这个长上影函数应用到上面的同和药业。
 
得到的效果:
df = pd.read_excel("同和药业k.xlsx")
count_num = []
for row,item in df.iterrows():
if long_up_shadow(item['open'],item['close'],item['high'],item['low']):
count_num.append(row)

plot_image(df,count_num)
 
图里面的4个箭头长上影是python自动标上去的,然后对着数据到同花顺核对一下,都是满足长度大于7%的。

可以看到在3月18日和28日的两根长上影之后,同和药业的股价走了一波趋势下跌。【PS:选这个股票并没有刻意去挑选,在集思录默认排名,找了一个跌幅第一个转债的正股就把代码拷贝过来测试】

那么,有这么多的形态,难道每一个都要自己写代码筛选形态吗? 不用哈,因为已经有人写了第三方的库,你只需要调用就可以了。


截取的部分函数名与说明


比如,像两只乌鸦,描述起来都感觉有点复杂,自己手撸代码都会搞出一堆bug。而用taLib这个库,你只需要一行调用代码,就可以完成这些复杂的形态筛选工作。

示例代码:
df['tow_crows'] = talib.CDL2CROWS(df['open'].values, df['high'].values, df['low'].values, df['close'].values)

pattern = df[(df['tow_crows'] == 100) | (df['tow_crows'] == -100)]
 
 
上面得到的pattern就是满足要求的形态,如CDL2CROWS 两只乌鸦。测试的个股是歌尔股份2020的日K线。

虽然我不知道两只乌鸦是什么玩意,但是可以通过遍历某个长周期(5-10年)下的全部A股数据,通过数据证伪,统计这个形态过后的一周或一个月(个人随意设定)涨跌幅,来证伪这个形态的有效性。

如果得到的是一个50%概率涨跌概况,那说明这个指标形态只是个游走在随机概率的指标,并不能作为一个有效指标参考。

(未完待续) 查看全部
python识别股票K线形态,准确率回测(一)

对于一些做股票技术分析的投资者来说,对常见的k线形态应该都不陌生,比如十字星,红三兵,头肩顶(底),岛型反转,吊颈线,两只乌鸦,三只乌鸦,四只乌鸦(哈)


faedab64034f78f02380501cf58b9d5cb1191c9e.jpeg



做价投的投资者可能会对这些划线的嗤之以鼻,而短线操盘者却有可能把它奉为圭臬,以之作为买卖标准。

海乃百川,兼听则明,笔者认为多吸收不同的观点与技术,可以更加全面的加深投资认知。你画的圆圈越大,圆圈外的未知空间也越大。

本文介绍使用python对A股市场的股票(转债也可以)的K线进行识别,然后回测某个形态出现后接下来的涨跌幅,还可以通过设定的形态进行选股。

举个例子,我们可以统计所有个股出现了“早晨之星“这一形态后,一周后甚至一个月后,个股是涨了还是跌了,从大量结果中统计出一些有意义的结果。

为了便于验证查看结果图形,我们先介绍如何使用python来画股票K线图。

有数据之后,剩下画图是很简单的,很多第三方的库已经封装好了各种蜡烛图绘制函数。我们要做只是传入每天开,收盘价,以及最高最低价。

获取股票的数据

市面有不少第三方的库可以获取股票和可转债的日线数据,比如tushare和akshare。本文以股票数据为例。

以akshare为例,代码如下所示:
 
# pip install akshare 
import akshare as ak
def get_k_line(code="sz002241"): #
df = ak.stock_zh_a_daily(symbol=code, start_date="20220101", end_date="20220515",
adjust="qfq")
# 这个函数只适合取股票数据,转债会报错,转债的日线数据可以使用其他函数,这里选择股价前复权
df.to_excel("同和药业k.xlsx")

如上面代码所示,我们使用stock_zh_a_daily方法获取一段时间的数据,这里的日期可以根据你的需求进行调整,比如设置start_date=“20200101”,end_date=“20220515”,就可以获取一年时间段的股票数据。

而股票的代码有sh与sz之分,sz代表深市的股票,所有深市的股票前面都必须带上sz,比如这里的同和药业,就是sz002241。

同样的,sh是上证交易所的股票,所有上证的股票前面必须带上sh。

这里,我们来看看获取的同和药业股票数据格式,如下图所示:

date:交易日期
open:代表开盘价
high:当天最高价
low:当天最低价
close:当天收盘价
volume:当天成交量(元)
outstanding_share:流动股本(股)
turnover:换手率


既然已经拿到了数据,下面我们来绘制K线图。

绘制K线图

在python中,绘制K线图需要用到mpl_finance库,而这个库提供了4种方式绘制K线图,这里我们介绍其中的一种,代码如下所示:
 
import mpl_finance as mpf
import matplotlib.pyplot as plt
import pandas as pd

#创建绘图的基本参数
fig=plt.figure(figsize=(12, 8))
ax=fig.add_subplot(111)

#获取刚才的股票数据
df = pd.read_excel("同和药业k.xlsx")
mpf.candlestick2_ochl(ax, df["open"], df["close"], df["high"], df["low"], width=0.6, colorup='r',colordown='green',alpha=1.0)
#显示出来
plt.show()

运行此段代码后,会显示如下效果图:






和东财上的同和药业的k线图基本一致的。

不过,这个K线图有一个问题,就是X坐标轴并不是显示的时间,而是数字,这是因为我们绘制K线图的方法,并没有提供X轴的参数,那怎么让下面的数字替换为时间呢?
 
我们先来看一段代码:
import matplotlib.ticker as ticker
#将股票时间转换为标准时间,不带时分秒的数据
def date_to_num(dates):
num_time = []
for date in dates:
date_time = datetime.strptime(date, '%Y-%m-%d')
num_date = date2num(date_time)
num_time.append(num_date)
return num_time

#创建绘图的基本参数
fig=plt.figure(figsize=(12, 8))
ax=fig.add_subplot(111)

#获取刚才的股票数据
df = pd.read_excel("同和药业k.xlsx")
mpf.candlestick2_ochl(ax, df["open"], df["close"], df["high"], df["low"], width=0.6, colorup='r',colordown='green',alpha=1.0)
df['date'] = pd.to_datetime(df['date'])
df['date'] = df['date'].apply(lambda x: x.strftime('%Y-%m-%d'))
def format_date(x, pos=None):
if x < 0 or x > len(df['date']) - 1:
return ''
return df['date'][int(x)]
ax.xaxis.set_major_formatter(ticker.FuncFormatter(format_date))
plt.setp(plt.gca().get_xticklabels(), rotation=45, horizontalalignment='right')
#显示出来
plt.show()

 
这里,我们定义了2个方法:第1个方法date_to_num主要的作用就是将获取的时间数据转换为标准的日期数据;第2个方法,就是根据X的数值替换时间值。

其中,set_major_formatter方法是将数值替换为时间值的操作库,而plt.setup的功能就是设置X轴的标签倾斜45度以及右对齐。运行之后,我们的K线图就显示的非常完美了,如下图所示:



均线图

虽然我们实现了K线图,但是有没有发现,其实大多数的股票交易软件K线图上面其实还标记有均线,比如常用的有5日均线,10日均线,30均线。
所以,我们需要将均线一起添加到我们的K线图之上。
计算均线的方式如下:
df["SMA5"] = df["close"].rolling(5).mean()
df["SMA10"] = df["close"].rolling(10).mean()
df["SMA30"] = df["close"].rolling(30).mean()

 
3行代码就可以获取到股票的均线值。
接着,我们可以使用上面的ax进行绘制均线了,
添加的代码如下所示:
 
ax.plot(np.arange(0, len(df)), df['SMA5'])  # 绘制5日均线
ax.plot(np.arange(0, len(df)), df['SMA10']) # 绘制10日均线
ax.plot(np.arange(0, len(df)), df['SMA30']) # 绘制30日均线

这里,同样将X轴设置为数字,将这两段代码添加到上面的K线图代码中,自然也会将X轴替换为时间。运行之后,显示效果如下图所示:


 
这里5日均线为蓝色,10日均线为橙色,30日均线为绿色,如果需要自己设置颜色,可以在每条均线的的绘制方法中加入color参数。


细心的读者肯定发现30日均线只有最后一小段,这是因为前29日不够30日是算不出均线的,同样的5,10日均线也是如此。

成交量

最后,我们还需要绘制成交量。在多数的股票交易软件中,上面是K线图,一般下面对应的就是成交量,这样对比起来看,往往能直观的看到数据的变化。

但是,因为上面有个K线图,那么同一个画布中就有了2个图片,且它们共用一个X轴,那么我们需要更改一下基本的参数,
 
代码如下所示:
import mpl_finance as mpf
import matplotlib.pyplot as plt
import pandas as pd
import matplotlib.ticker as ticker
import numpy as np
#创建绘图的基本参数
fig, axes = plt.subplots(2, 1, sharex=True, figsize=(15, 10))
ax1, ax2 = axes.flatten()

#获取刚才的股票数据
df = pd.read_excel("同和药业k.xlsx")
mpf.candlestick2_ochl(ax1, df["open"], df["close"], df["high"], df["low"], width=0.6, colorup='r',colordown='green',alpha=1.0)
df['date'] = pd.to_datetime(df['date'])
df['date'] = df['date'].apply(lambda x: x.strftime('%Y-%m-%d'))
def format_date(x, pos=None):
if x < 0 or x > len(df['date']) - 1:
return ''
return df['date'][int(x)]
df["SMA5"] = df["close"].rolling(5).mean()
df["SMA10"] = df["close"].rolling(10).mean()
df["SMA30"] = df["close"].rolling(30).mean()
ax1.plot(np.arange(0, len(df)), df['SMA5']) # 绘制5日均线
ax1.plot(np.arange(0, len(df)), df['SMA10']) # 绘制10日均线
ax1.plot(np.arange(0, len(df)), df['SMA30']) # 绘制30日均线
ax1.xaxis.set_major_formatter(ticker.FuncFormatter(format_date))
plt.setp(plt.gca().get_xticklabels(), rotation=45, horizontalalignment='right')
#显示出来
plt.show()

 
这里,我们将绘图的画布设置为2行1列。同时,将上面绘制的所有数据都更改为ax1,这样均线与K线图会绘制到第一个子图中。

接着,我们需要绘制成交量,但是我们知道,一般股票交易软件都将上涨的那天成交量设置为红色,而将下跌的成交量绘制成绿色。所以,首先我们要做的是将获取的股票数据根据当天的涨跌情况进行分类。
 
具体代码如下:
 
red_pred = np.where(df["close"] > df["open"], df["volume"], 0)
blue_pred = np.where(df["close"] < df["open"], df["volume"], 0)

 
如上面代码所示,我们通过np.where(condition, x, y)筛选数据。这里满足条件condition,输出X,不满足条件输出Y,这样我们就将涨跌的成交量数据进行了分类。

最后,我们直接通过柱状图方法绘制成交量,
具体代码如下所示:
ax2.bar(np.arange(0, len(df)), red_pred, facecolor="red")
ax2.bar(np.arange(0, len(df)), blue_pred, facecolor="blue")

 
将这4行代码,全部加入到plt.show()代码的前面即可。

运行之后,输出的效果图如下:


根据定义编写形态

接下来,我们根据定义来构造一个简单的形态函数,比如长上影线。

上影线


根据网络上的定义:

⑤上影阳线:开盘后价格冲高回落,涨势受阻,虽然收盘价仍高于开盘价,但上方有阻力,可视为弱势。

⑥上影阴线:开盘后价格冲高受阻,涨势受阻,收盘价低于开盘价,上方有阻力,可视为弱势。


a63d1fc08915cbf8f22f333a3226f331.jpeg



那么简单定义为:(high - close)/close > 7%,(high - open)/open > 7% ,可能不是太精确,这里只是为了演示,忽略一些具体细节。

简单理解就是,当天最高价比收盘价,开盘价高得多。

长上影匹配函数,简单,只有一行就搞定。
 
def long_up_shadow(o,c,h,l):
return True if (h-c)/c >=0.07 and (h-o)/o>=0.07 else False

 
 
然后把这个长上影函数应用到上面的同和药业。
 
得到的效果:
df = pd.read_excel("同和药业k.xlsx")
count_num = []
for row,item in df.iterrows():
if long_up_shadow(item['open'],item['close'],item['high'],item['low']):
count_num.append(row)

plot_image(df,count_num)

 
图里面的4个箭头长上影是python自动标上去的,然后对着数据到同花顺核对一下,都是满足长度大于7%的。

可以看到在3月18日和28日的两根长上影之后,同和药业的股价走了一波趋势下跌。【PS:选这个股票并没有刻意去挑选,在集思录默认排名,找了一个跌幅第一个转债的正股就把代码拷贝过来测试】

那么,有这么多的形态,难道每一个都要自己写代码筛选形态吗? 不用哈,因为已经有人写了第三方的库,你只需要调用就可以了。


截取的部分函数名与说明


比如,像两只乌鸦,描述起来都感觉有点复杂,自己手撸代码都会搞出一堆bug。而用taLib这个库,你只需要一行调用代码,就可以完成这些复杂的形态筛选工作。

示例代码:
df['tow_crows'] = talib.CDL2CROWS(df['open'].values, df['high'].values, df['low'].values, df['close'].values)

pattern = df[(df['tow_crows'] == 100) | (df['tow_crows'] == -100)]

 
 
上面得到的pattern就是满足要求的形态,如CDL2CROWS 两只乌鸦。测试的个股是歌尔股份2020的日K线。

虽然我不知道两只乌鸦是什么玩意,但是可以通过遍历某个长周期(5-10年)下的全部A股数据,通过数据证伪,统计这个形态过后的一周或一个月(个人随意设定)涨跌幅,来证伪这个形态的有效性。

如果得到的是一个50%概率涨跌概况,那说明这个指标形态只是个游走在随机概率的指标,并不能作为一个有效指标参考。

(未完待续)

python识别股票K线形态,准确率回测(一)

量化交易-Ptrade-QMT李魔佛 发表了文章 • 1 个评论 • 2386 次浏览 • 2022-05-22 01:13 • 来自相关话题

python识别股票K线形态,准确率回测(一)

对于一些做股票技术分析的投资者来说,对常见的k线形态应该都不陌生,比如十字星,红三兵,头肩顶(底),岛型反转,吊颈线,两只乌鸦,三只乌鸦,四只乌鸦(哈)








做价投的投资者可能会对这些划线的嗤之以鼻,而短线操盘者却有可能把它奉为圭臬,以之作为买卖标准。

海乃百川,兼听则明,笔者认为多吸收不同的观点与技术,可以更加全面的加深投资认知。你画的圆圈越大,圆圈外的未知空间也越大。

本文介绍使用python对A股市场的股票(转债也可以)的K线进行识别,然后回测某个形态出现后接下来的涨跌幅,还可以通过设定的形态进行选股。

举个例子,我们可以统计所有个股出现了“早晨之星“这一形态后,一周后甚至一个月后,个股是涨了还是跌了,从大量结果中统计出一些有意义的结果。

为了便于验证查看结果图形,我们先介绍如何使用python来画股票K线图。

有数据之后,剩下画图是很简单的,很多第三方的库已经封装好了各种蜡烛图绘制函数。我们要做只是传入每天开,收盘价,以及最高最低价。

获取股票的数据

市面有不少第三方的库可以获取股票和可转债的日线数据,比如tushare和akshare。本文以股票数据为例。

以akshare为例,代码如下所示:
 
# pip install akshare
import akshare as ak
def get_k_line(code="sz002241"): #
df = ak.stock_zh_a_daily(symbol=code, start_date="20220101", end_date="20220515",
adjust="qfq")
# 这个函数只适合取股票数据,转债会报错,转债的日线数据可以使用其他函数,这里选择股价前复权
df.to_excel("同和药业k.xlsx")
如上面代码所示,我们使用stock_zh_a_daily方法获取一段时间的数据,这里的日期可以根据你的需求进行调整,比如设置start_date=“20200101”,end_date=“20220515”,就可以获取一年时间段的股票数据。

而股票的代码有sh与sz之分,sz代表深市的股票,所有深市的股票前面都必须带上sz,比如这里的同和药业,就是sz002241。

同样的,sh是上证交易所的股票,所有上证的股票前面必须带上sh。

这里,我们来看看获取的同和药业股票数据格式,如下图所示:

date:交易日期
open:代表开盘价
high:当天最高价
low:当天最低价
close:当天收盘价
volume:当天成交量(元)
outstanding_share:流动股本(股)
turnover:换手率

既然已经拿到了数据,下面我们来绘制K线图。

绘制K线图

在python中,绘制K线图需要用到mpl_finance库,而这个库提供了4种方式绘制K线图,这里我们介绍其中的一种,代码如下所示:
 
import mpl_finance as mpf
import matplotlib.pyplot as plt
import pandas as pd

#创建绘图的基本参数
fig=plt.figure(figsize=(12, 8))
ax=fig.add_subplot(111)

#获取刚才的股票数据
df = pd.read_excel("同和药业k.xlsx")
mpf.candlestick2_ochl(ax, df["open"], df["close"], df["high"], df["low"], width=0.6, colorup='r',colordown='green',alpha=1.0)
#显示出来
plt.show()
运行此段代码后,会显示如下效果图:






和东财上的同和药业的k线图基本一致的。

不过,这个K线图有一个问题,就是X坐标轴并不是显示的时间,而是数字,这是因为我们绘制K线图的方法,并没有提供X轴的参数,那怎么让下面的数字替换为时间呢?
 
我们先来看一段代码:
import matplotlib.ticker as ticker
#将股票时间转换为标准时间,不带时分秒的数据
def date_to_num(dates):
num_time = []
for date in dates:
date_time = datetime.strptime(date, '%Y-%m-%d')
num_date = date2num(date_time)
num_time.append(num_date)
return num_time

#创建绘图的基本参数
fig=plt.figure(figsize=(12, 8))
ax=fig.add_subplot(111)

#获取刚才的股票数据
df = pd.read_excel("同和药业k.xlsx")
mpf.candlestick2_ochl(ax, df["open"], df["close"], df["high"], df["low"], width=0.6, colorup='r',colordown='green',alpha=1.0)
df['date'] = pd.to_datetime(df['date'])
df['date'] = df['date'].apply(lambda x: x.strftime('%Y-%m-%d'))
def format_date(x, pos=None):
if x < 0 or x > len(df['date']) - 1:
return ''
return df['date'][int(x)]
ax.xaxis.set_major_formatter(ticker.FuncFormatter(format_date))
plt.setp(plt.gca().get_xticklabels(), rotation=45, horizontalalignment='right')
#显示出来
plt.show()
 
这里,我们定义了2个方法:第1个方法date_to_num主要的作用就是将获取的时间数据转换为标准的日期数据;第2个方法,就是根据X的数值替换时间值。

其中,set_major_formatter方法是将数值替换为时间值的操作库,而plt.setup的功能就是设置X轴的标签倾斜45度以及右对齐。运行之后,我们的K线图就显示的非常完美了,如下图所示:



均线图

虽然我们实现了K线图,但是有没有发现,其实大多数的股票交易软件K线图上面其实还标记有均线,比如常用的有5日均线,10日均线,30均线。
所以,我们需要将均线一起添加到我们的K线图之上。
计算均线的方式如下:
df["SMA5"] = df["close"].rolling(5).mean()
df["SMA10"] = df["close"].rolling(10).mean()
df["SMA30"] = df["close"].rolling(30).mean()
 
3行代码就可以获取到股票的均线值。
接着,我们可以使用上面的ax进行绘制均线了,
添加的代码如下所示:
 
ax.plot(np.arange(0, len(df)), df['SMA5']) # 绘制5日均线
ax.plot(np.arange(0, len(df)), df['SMA10']) # 绘制10日均线
ax.plot(np.arange(0, len(df)), df['SMA30']) # 绘制30日均线
这里,同样将X轴设置为数字,将这两段代码添加到上面的K线图代码中,自然也会将X轴替换为时间。运行之后,显示效果如下图所示:


 
这里5日均线为蓝色,10日均线为橙色,30日均线为绿色,如果需要自己设置颜色,可以在每条均线的的绘制方法中加入color参数。


细心的读者肯定发现30日均线只有最后一小段,这是因为前29日不够30日是算不出均线的,同样的5,10日均线也是如此。

成交量

最后,我们还需要绘制成交量。在多数的股票交易软件中,上面是K线图,一般下面对应的就是成交量,这样对比起来看,往往能直观的看到数据的变化。

但是,因为上面有个K线图,那么同一个画布中就有了2个图片,且它们共用一个X轴,那么我们需要更改一下基本的参数,
 
代码如下所示:
import mpl_finance as mpf
import matplotlib.pyplot as plt
import pandas as pd
import matplotlib.ticker as ticker
import numpy as np
#创建绘图的基本参数
fig, axes = plt.subplots(2, 1, sharex=True, figsize=(15, 10))
ax1, ax2 = axes.flatten()

#获取刚才的股票数据
df = pd.read_excel("同和药业k.xlsx")
mpf.candlestick2_ochl(ax1, df["open"], df["close"], df["high"], df["low"], width=0.6, colorup='r',colordown='green',alpha=1.0)
df['date'] = pd.to_datetime(df['date'])
df['date'] = df['date'].apply(lambda x: x.strftime('%Y-%m-%d'))
def format_date(x, pos=None):
if x < 0 or x > len(df['date']) - 1:
return ''
return df['date'][int(x)]
df["SMA5"] = df["close"].rolling(5).mean()
df["SMA10"] = df["close"].rolling(10).mean()
df["SMA30"] = df["close"].rolling(30).mean()
ax1.plot(np.arange(0, len(df)), df['SMA5']) # 绘制5日均线
ax1.plot(np.arange(0, len(df)), df['SMA10']) # 绘制10日均线
ax1.plot(np.arange(0, len(df)), df['SMA30']) # 绘制30日均线
ax1.xaxis.set_major_formatter(ticker.FuncFormatter(format_date))
plt.setp(plt.gca().get_xticklabels(), rotation=45, horizontalalignment='right')
#显示出来
plt.show()
 
这里,我们将绘图的画布设置为2行1列。同时,将上面绘制的所有数据都更改为ax1,这样均线与K线图会绘制到第一个子图中。

接着,我们需要绘制成交量,但是我们知道,一般股票交易软件都将上涨的那天成交量设置为红色,而将下跌的成交量绘制成绿色。所以,首先我们要做的是将获取的股票数据根据当天的涨跌情况进行分类。
 
具体代码如下:
 
red_pred = np.where(df["close"] > df["open"], df["volume"], 0)
blue_pred = np.where(df["close"] < df["open"], df["volume"], 0)
 
如上面代码所示,我们通过np.where(condition, x, y)筛选数据。这里满足条件condition,输出X,不满足条件输出Y,这样我们就将涨跌的成交量数据进行了分类。

最后,我们直接通过柱状图方法绘制成交量,
具体代码如下所示:
ax2.bar(np.arange(0, len(df)), red_pred, facecolor="red")
ax2.bar(np.arange(0, len(df)), blue_pred, facecolor="blue")
 
将这4行代码,全部加入到plt.show()代码的前面即可。

运行之后,输出的效果图如下:


根据定义编写形态

接下来,我们根据定义来构造一个简单的形态函数,比如长上影线。

上影线


根据网络上的定义:

⑤上影阳线:开盘后价格冲高回落,涨势受阻,虽然收盘价仍高于开盘价,但上方有阻力,可视为弱势。

⑥上影阴线:开盘后价格冲高受阻,涨势受阻,收盘价低于开盘价,上方有阻力,可视为弱势。








那么简单定义为:(high - close)/close > 7%,(high - open)/open > 7% ,可能不是太精确,这里只是为了演示,忽略一些具体细节。

简单理解就是,当天最高价比收盘价,开盘价高得多。

长上影匹配函数,简单,只有一行就搞定。
 
def long_up_shadow(o,c,h,l):
return True if (h-c)/c >=0.07 and (h-o)/o>=0.07 else False
 
 
然后把这个长上影函数应用到上面的同和药业。
 
得到的效果:
df = pd.read_excel("同和药业k.xlsx")
count_num = []
for row,item in df.iterrows():
if long_up_shadow(item['open'],item['close'],item['high'],item['low']):
count_num.append(row)

plot_image(df,count_num)
 
图里面的4个箭头长上影是python自动标上去的,然后对着数据到同花顺核对一下,都是满足长度大于7%的。

可以看到在3月18日和28日的两根长上影之后,同和药业的股价走了一波趋势下跌。【PS:选这个股票并没有刻意去挑选,在集思录默认排名,找了一个跌幅第一个转债的正股就把代码拷贝过来测试】

那么,有这么多的形态,难道每一个都要自己写代码筛选形态吗? 不用哈,因为已经有人写了第三方的库,你只需要调用就可以了。


截取的部分函数名与说明


比如,像两只乌鸦,描述起来都感觉有点复杂,自己手撸代码都会搞出一堆bug。而用taLib这个库,你只需要一行调用代码,就可以完成这些复杂的形态筛选工作。

示例代码:
df['tow_crows'] = talib.CDL2CROWS(df['open'].values, df['high'].values, df['low'].values, df['close'].values)

pattern = df[(df['tow_crows'] == 100) | (df['tow_crows'] == -100)]
 
 
上面得到的pattern就是满足要求的形态,如CDL2CROWS 两只乌鸦。测试的个股是歌尔股份2020的日K线。

虽然我不知道两只乌鸦是什么玩意,但是可以通过遍历某个长周期(5-10年)下的全部A股数据,通过数据证伪,统计这个形态过后的一周或一个月(个人随意设定)涨跌幅,来证伪这个形态的有效性。

如果得到的是一个50%概率涨跌概况,那说明这个指标形态只是个游走在随机概率的指标,并不能作为一个有效指标参考。

(未完待续) 查看全部
python识别股票K线形态,准确率回测(一)

对于一些做股票技术分析的投资者来说,对常见的k线形态应该都不陌生,比如十字星,红三兵,头肩顶(底),岛型反转,吊颈线,两只乌鸦,三只乌鸦,四只乌鸦(哈)


faedab64034f78f02380501cf58b9d5cb1191c9e.jpeg



做价投的投资者可能会对这些划线的嗤之以鼻,而短线操盘者却有可能把它奉为圭臬,以之作为买卖标准。

海乃百川,兼听则明,笔者认为多吸收不同的观点与技术,可以更加全面的加深投资认知。你画的圆圈越大,圆圈外的未知空间也越大。

本文介绍使用python对A股市场的股票(转债也可以)的K线进行识别,然后回测某个形态出现后接下来的涨跌幅,还可以通过设定的形态进行选股。

举个例子,我们可以统计所有个股出现了“早晨之星“这一形态后,一周后甚至一个月后,个股是涨了还是跌了,从大量结果中统计出一些有意义的结果。

为了便于验证查看结果图形,我们先介绍如何使用python来画股票K线图。

有数据之后,剩下画图是很简单的,很多第三方的库已经封装好了各种蜡烛图绘制函数。我们要做只是传入每天开,收盘价,以及最高最低价。

获取股票的数据

市面有不少第三方的库可以获取股票和可转债的日线数据,比如tushare和akshare。本文以股票数据为例。

以akshare为例,代码如下所示:
 
# pip install akshare 
import akshare as ak
def get_k_line(code="sz002241"): #
df = ak.stock_zh_a_daily(symbol=code, start_date="20220101", end_date="20220515",
adjust="qfq")
# 这个函数只适合取股票数据,转债会报错,转债的日线数据可以使用其他函数,这里选择股价前复权
df.to_excel("同和药业k.xlsx")

如上面代码所示,我们使用stock_zh_a_daily方法获取一段时间的数据,这里的日期可以根据你的需求进行调整,比如设置start_date=“20200101”,end_date=“20220515”,就可以获取一年时间段的股票数据。

而股票的代码有sh与sz之分,sz代表深市的股票,所有深市的股票前面都必须带上sz,比如这里的同和药业,就是sz002241。

同样的,sh是上证交易所的股票,所有上证的股票前面必须带上sh。

这里,我们来看看获取的同和药业股票数据格式,如下图所示:

date:交易日期
open:代表开盘价
high:当天最高价
low:当天最低价
close:当天收盘价
volume:当天成交量(元)
outstanding_share:流动股本(股)
turnover:换手率


既然已经拿到了数据,下面我们来绘制K线图。

绘制K线图

在python中,绘制K线图需要用到mpl_finance库,而这个库提供了4种方式绘制K线图,这里我们介绍其中的一种,代码如下所示:
 
import mpl_finance as mpf
import matplotlib.pyplot as plt
import pandas as pd

#创建绘图的基本参数
fig=plt.figure(figsize=(12, 8))
ax=fig.add_subplot(111)

#获取刚才的股票数据
df = pd.read_excel("同和药业k.xlsx")
mpf.candlestick2_ochl(ax, df["open"], df["close"], df["high"], df["low"], width=0.6, colorup='r',colordown='green',alpha=1.0)
#显示出来
plt.show()

运行此段代码后,会显示如下效果图:






和东财上的同和药业的k线图基本一致的。

不过,这个K线图有一个问题,就是X坐标轴并不是显示的时间,而是数字,这是因为我们绘制K线图的方法,并没有提供X轴的参数,那怎么让下面的数字替换为时间呢?
 
我们先来看一段代码:
import matplotlib.ticker as ticker
#将股票时间转换为标准时间,不带时分秒的数据
def date_to_num(dates):
num_time = []
for date in dates:
date_time = datetime.strptime(date, '%Y-%m-%d')
num_date = date2num(date_time)
num_time.append(num_date)
return num_time

#创建绘图的基本参数
fig=plt.figure(figsize=(12, 8))
ax=fig.add_subplot(111)

#获取刚才的股票数据
df = pd.read_excel("同和药业k.xlsx")
mpf.candlestick2_ochl(ax, df["open"], df["close"], df["high"], df["low"], width=0.6, colorup='r',colordown='green',alpha=1.0)
df['date'] = pd.to_datetime(df['date'])
df['date'] = df['date'].apply(lambda x: x.strftime('%Y-%m-%d'))
def format_date(x, pos=None):
if x < 0 or x > len(df['date']) - 1:
return ''
return df['date'][int(x)]
ax.xaxis.set_major_formatter(ticker.FuncFormatter(format_date))
plt.setp(plt.gca().get_xticklabels(), rotation=45, horizontalalignment='right')
#显示出来
plt.show()

 
这里,我们定义了2个方法:第1个方法date_to_num主要的作用就是将获取的时间数据转换为标准的日期数据;第2个方法,就是根据X的数值替换时间值。

其中,set_major_formatter方法是将数值替换为时间值的操作库,而plt.setup的功能就是设置X轴的标签倾斜45度以及右对齐。运行之后,我们的K线图就显示的非常完美了,如下图所示:



均线图

虽然我们实现了K线图,但是有没有发现,其实大多数的股票交易软件K线图上面其实还标记有均线,比如常用的有5日均线,10日均线,30均线。
所以,我们需要将均线一起添加到我们的K线图之上。
计算均线的方式如下:
df["SMA5"] = df["close"].rolling(5).mean()
df["SMA10"] = df["close"].rolling(10).mean()
df["SMA30"] = df["close"].rolling(30).mean()

 
3行代码就可以获取到股票的均线值。
接着,我们可以使用上面的ax进行绘制均线了,
添加的代码如下所示:
 
ax.plot(np.arange(0, len(df)), df['SMA5'])  # 绘制5日均线
ax.plot(np.arange(0, len(df)), df['SMA10']) # 绘制10日均线
ax.plot(np.arange(0, len(df)), df['SMA30']) # 绘制30日均线

这里,同样将X轴设置为数字,将这两段代码添加到上面的K线图代码中,自然也会将X轴替换为时间。运行之后,显示效果如下图所示:


 
这里5日均线为蓝色,10日均线为橙色,30日均线为绿色,如果需要自己设置颜色,可以在每条均线的的绘制方法中加入color参数。


细心的读者肯定发现30日均线只有最后一小段,这是因为前29日不够30日是算不出均线的,同样的5,10日均线也是如此。

成交量

最后,我们还需要绘制成交量。在多数的股票交易软件中,上面是K线图,一般下面对应的就是成交量,这样对比起来看,往往能直观的看到数据的变化。

但是,因为上面有个K线图,那么同一个画布中就有了2个图片,且它们共用一个X轴,那么我们需要更改一下基本的参数,
 
代码如下所示:
import mpl_finance as mpf
import matplotlib.pyplot as plt
import pandas as pd
import matplotlib.ticker as ticker
import numpy as np
#创建绘图的基本参数
fig, axes = plt.subplots(2, 1, sharex=True, figsize=(15, 10))
ax1, ax2 = axes.flatten()

#获取刚才的股票数据
df = pd.read_excel("同和药业k.xlsx")
mpf.candlestick2_ochl(ax1, df["open"], df["close"], df["high"], df["low"], width=0.6, colorup='r',colordown='green',alpha=1.0)
df['date'] = pd.to_datetime(df['date'])
df['date'] = df['date'].apply(lambda x: x.strftime('%Y-%m-%d'))
def format_date(x, pos=None):
if x < 0 or x > len(df['date']) - 1:
return ''
return df['date'][int(x)]
df["SMA5"] = df["close"].rolling(5).mean()
df["SMA10"] = df["close"].rolling(10).mean()
df["SMA30"] = df["close"].rolling(30).mean()
ax1.plot(np.arange(0, len(df)), df['SMA5']) # 绘制5日均线
ax1.plot(np.arange(0, len(df)), df['SMA10']) # 绘制10日均线
ax1.plot(np.arange(0, len(df)), df['SMA30']) # 绘制30日均线
ax1.xaxis.set_major_formatter(ticker.FuncFormatter(format_date))
plt.setp(plt.gca().get_xticklabels(), rotation=45, horizontalalignment='right')
#显示出来
plt.show()

 
这里,我们将绘图的画布设置为2行1列。同时,将上面绘制的所有数据都更改为ax1,这样均线与K线图会绘制到第一个子图中。

接着,我们需要绘制成交量,但是我们知道,一般股票交易软件都将上涨的那天成交量设置为红色,而将下跌的成交量绘制成绿色。所以,首先我们要做的是将获取的股票数据根据当天的涨跌情况进行分类。
 
具体代码如下:
 
red_pred = np.where(df["close"] > df["open"], df["volume"], 0)
blue_pred = np.where(df["close"] < df["open"], df["volume"], 0)

 
如上面代码所示,我们通过np.where(condition, x, y)筛选数据。这里满足条件condition,输出X,不满足条件输出Y,这样我们就将涨跌的成交量数据进行了分类。

最后,我们直接通过柱状图方法绘制成交量,
具体代码如下所示:
ax2.bar(np.arange(0, len(df)), red_pred, facecolor="red")
ax2.bar(np.arange(0, len(df)), blue_pred, facecolor="blue")

 
将这4行代码,全部加入到plt.show()代码的前面即可。

运行之后,输出的效果图如下:


根据定义编写形态

接下来,我们根据定义来构造一个简单的形态函数,比如长上影线。

上影线


根据网络上的定义:

⑤上影阳线:开盘后价格冲高回落,涨势受阻,虽然收盘价仍高于开盘价,但上方有阻力,可视为弱势。

⑥上影阴线:开盘后价格冲高受阻,涨势受阻,收盘价低于开盘价,上方有阻力,可视为弱势。


a63d1fc08915cbf8f22f333a3226f331.jpeg



那么简单定义为:(high - close)/close > 7%,(high - open)/open > 7% ,可能不是太精确,这里只是为了演示,忽略一些具体细节。

简单理解就是,当天最高价比收盘价,开盘价高得多。

长上影匹配函数,简单,只有一行就搞定。
 
def long_up_shadow(o,c,h,l):
return True if (h-c)/c >=0.07 and (h-o)/o>=0.07 else False

 
 
然后把这个长上影函数应用到上面的同和药业。
 
得到的效果:
df = pd.read_excel("同和药业k.xlsx")
count_num = []
for row,item in df.iterrows():
if long_up_shadow(item['open'],item['close'],item['high'],item['low']):
count_num.append(row)

plot_image(df,count_num)

 
图里面的4个箭头长上影是python自动标上去的,然后对着数据到同花顺核对一下,都是满足长度大于7%的。

可以看到在3月18日和28日的两根长上影之后,同和药业的股价走了一波趋势下跌。【PS:选这个股票并没有刻意去挑选,在集思录默认排名,找了一个跌幅第一个转债的正股就把代码拷贝过来测试】

那么,有这么多的形态,难道每一个都要自己写代码筛选形态吗? 不用哈,因为已经有人写了第三方的库,你只需要调用就可以了。


截取的部分函数名与说明


比如,像两只乌鸦,描述起来都感觉有点复杂,自己手撸代码都会搞出一堆bug。而用taLib这个库,你只需要一行调用代码,就可以完成这些复杂的形态筛选工作。

示例代码:
df['tow_crows'] = talib.CDL2CROWS(df['open'].values, df['high'].values, df['low'].values, df['close'].values)

pattern = df[(df['tow_crows'] == 100) | (df['tow_crows'] == -100)]

 
 
上面得到的pattern就是满足要求的形态,如CDL2CROWS 两只乌鸦。测试的个股是歌尔股份2020的日K线。

虽然我不知道两只乌鸦是什么玩意,但是可以通过遍历某个长周期(5-10年)下的全部A股数据,通过数据证伪,统计这个形态过后的一周或一个月(个人随意设定)涨跌幅,来证伪这个形态的有效性。

如果得到的是一个50%概率涨跌概况,那说明这个指标形态只是个游走在随机概率的指标,并不能作为一个有效指标参考。

(未完待续)

在2015年山顶5178点 开始定投所有大A股票 结果会是怎样?

量化交易-Ptrade-QMT李魔佛 发表了文章 • 0 个评论 • 1701 次浏览 • 2021-03-29 00:41 • 来自相关话题

对于定投,一般人印象是,如果你最终结果是亏损的,那么原因就是:耐心不够,跌的时候不够定力,不敢继续加仓。

而事实真的是这样吗?

笔者使用2015年6月12日上一轮全面牛市的高点5178点,作为定投的起始点。而定投标的股票为大A所有股票。








股票池为2015年6月12日没有停牌的股票,共 2415 只。使用的量化平台是优矿。

(没错,以前股票数就才两千多只,这几年股票数接近翻倍了)def get_all_code(date):
'''
获取某天的股市运行的股票,排除停牌
'''
df=DataAPI.MktEqudAdjGet(secID=u"",ticker=u"",
tradeDate=date,
beginDate=u"",
endDate=u"",
isOpen="",
field=u"",
pandas="1")
df=df[df['turnoverValue']>0] # 停牌
return df['ticker'].tolist()

















部分股票样本数据


接着从2015年6月12日开始定投,这里笔者按照一个月定投一次,也就是22个交易日定投一次。

每次定投金额10000元。定投到2021年3月28日。

如果定投当天遇到股票停牌,则顺势延续到复牌后继续定投。

这里定投采用净值法定投,为的是让数据更加准确。因为如果按照实际定投股票,10000元的金额可能连1手的茅台也买不进去,这里计算买入的份额为=10000元/股票股价, 比如茅台的股价是2000元,那么这里买入的份额就是5股,并没按照实际股票的1手来算。这样计算得到结果更加精准。

python计算代码如下: 1import time
2import datetime
3
4stock_profit_list=
5start=time.time()
6
7today=datetime.datetime.now().strftime('%Y-%m-%d')
8
9def get_trade_date():
10 df=DataAPI.TradeCalGet(exchangeCD=u"XSHG,XSHE",
11 beginDate=high_date,
12 endDate=today,isOpen=u"1",
13 field=u"",pandas="1")
14 return df['calendarDate'].tolist()
15
16def fixed_investment(code):
17 stock_profit_dict={}
18 stock_profit_dict['code']=code
19 df=DataAPI.MktEqudAdjGet(secID=u"",ticker=code,tradeDate=u'',beginDate=high_date,endDate=today,isOpen="1",field=u"",pandas="1")
20 total_amount=0
21 invest_count=0
22 every_invest_cash=10000
23 total_money_list=list()
24 last_date=None
25 for trade_date in trade_date_list_interval:
26 trade_df = df[df['tradeDate']==trade_date]
27 if len(trade_df)>0:
28 invest_count+=1
29 price=trade_df['closePrice'].iloc[0]
30 amount=every_invest_cash/price
31 cost=invest_count*every_invest_cash
32 profit=total_amount*price/cost
33 total_money_list.append(profit)
34 total_amount=total_amount+amount
35 total_money=price*total_amount
36 last_date=trade_date
37
38
39 stock_profit_dict['profit_rate']=profit
40 stock_profit_dict['last_date']=last_date
41 stock_profit_dict['invest_count']=invest_count
42 stock_profit_dict['total_amount']=total_amount
43 stock_profit_dict['total_money']=total_money
44 stock_profit_dict['profit_list']=total_money_list
45 stock_profit_dict['cost']=cost
46 return stock_profit_dict
47
48for code in target_codes:
49 profit_dict = fixed_investment(code)
50 stock_profit_list.append(profit_dict)
51
52print(time.time()-start)
 
最终得到的数据保存在stock_profit_list变量里面。在计算过程也记录里每一个股票当前一期定投阶段的阶段收益率,组合成一个列表。

为的是倒后镜看看,曾经的历史定投收益率,也可以看看曾经的历史定投收益率的最大值。便于和现在最后一期收益率的对比。

得到数据按照profit_rate收益率排个序:profi_df_sorted = profit_df.sort_values(by='profit_rate',ascending=False)
得到下面的数据:







上面的股票熟悉不?基本都是年初那一批基金ikun们的抱团股。

定投收益率最高的是山西汾酒,收益率达到8.56,即856%,从股灾高点定投下来,到现在2021年3月28日,收益率是8倍!

其月K线如下:







牛气冲天的5年十倍股,股灾时山西汾酒的股价徘徊在21-26之间左右。如果股灾的时候采用一把梭,收益率是336/26=12.9 倍。

而采用定投方式的收益率也不差,8.56倍。

再继续看看定投收益排在倒数的







真是好家伙,亏得底裤都不见了。清一色的退市股,定投收益率基本在0.1以下,意味着投资了100元,最后就剩10元以下。

在前面计算的时候,特意加了一个数据列,定投期数和定投停止日期,也就是股票退市或者停牌导致无法交易的日子。

invest_count为定投期数,定投一次此值加1. last_date 为最后一个交易日期。倒数第一个国恒退,只交易1期,7月10日退市,等不来第2期的定投,不过也好,这样子只也不至于越陷越深。








国恒退日K
total_money 列是投资得到总金额,cost是投入的成本。投资期数越多,随着股价上涨,该金额会越高,而股价不断下跌,则该金额会越来越少。所以遇到国恒退这种股票,当期只投了10000元就无法继续投下去,还是运气比较好的。类似于止损操作了。

toal_money减去cost得到的是绝对收益。之前因为没有加这一列,可以通过以下公式计算得到:profit_df['absolute_profit']=profit_df['total_money']-profit_df['cost']
按绝对收益计算,最多的还是前面那20位个股,赚最多的山西汾酒,129W的定投金额,盈利金额达到900W。







同样倒序排一下,绝对亏损最多的,肯定也是定投期数较多的。

[图片]
亏损最多的天夏退,目前还没有完全退市,定投了114期,总亏损金额达到100W,定投总金额是110W。额,只剩10W。







它的月K线是这样的。其跌到4元多的时候还放量了,可能一堆人冲进去抄底了,然后按亏损幅度,4元跌到0.22元,亏损幅度也是94.5%,这个亏损幅度其实和在山顶29元站岗的亏损率其实没什么区别了。高手死于抄底,呵呵。

接着看看上面所有股票的定投的平均收益率:profi_df_sorted['profit_rate'].mean()
得到的收益率的平均值为:1.043,减去本金1,收益为1.043-1=0.043,也就是4.3%个点。

换句话说,如果在股票高点5178点定投全市场股票,5年多来的最后收益率为4.3%.







中位数是0.87-1=-0.13,= -13%,中位数是亏损13%,定投金额约126W,亏损金额为14W。

看到这里,笔者想要表述的是,即使是定投也需要挑选一个好标的股票或者基金,也就是择股择时能力。

如果在一个垃圾股或者基金上定投,只会让你越陷越深,亏损越来越多。假如你在定投康得新或者乐视,定投了100期,投入了不少的金额和时间,突然暴雷,然后ST,那么你会继续定投下去吗?

另外,定投也需要一定的择时能力,比如在前春节前,基金抱团股热度不减,对于大部分没有择股能力的人来说,当时是应该止盈离场的。当然,如果倒后镜看,如果有能力抓取上面的大牛股,也不一定能够把上面的8倍收益落袋而安。

上面数据有一列max_profit,total_money/cost, 也就是定投期间,获得的最大收益率。按此列排序:







在定投期间,最大收益率的是ST中安,最大收益率是14.6-1=13.6倍。最后到这个月最终定投收益率是0.67,亏损状态,0.67-1=-0.37,亏损为-37%,绝对收益absolute_profit为-29W.

排在第4是是乐视退,定投期间最大收益max_profit达到10倍,最后如果坚持定投,是亏损93%的。

如果把定投时间放在2018年1月12日,那么得到的定投收益率排名前20名是这样的:







得到不一样的前20排名,定投收益率最高的是英科医疗,疫情手套涨了10倍的大牛股。而山西汾酒跌到第10,并且收益率也只有4倍左右。而茅台也没出现在前20的榜单上。


不同的定投时间,得到的是不一样的结果。当然择股能力强的大神,就不屑定投而采用一把梭了,大神向往的是英科医疗的一年十倍,而不是十年十倍(大V组合抱团,抱团基金的组合)。


其改变定投时间的定投收益率的平均值以及中位数数据如下:







平均收益率达到了1.14-1=0.14=14%,也就是如果你在18年开始定投全市场股票,当前平均收益率是14%,不过中位数的收益率是1-1=0%,因为这两年股票大小票分化得太严重(24%的个股跌破2440的低点,指数涨41%),四分一分位的定投收益率为27%,到了中位数就为0%了。其定投收益率较2015年山顶定投也有了很大的区别。

今天就到这里吧,感觉文章太长了,本来还想把全市场的基金加进来比较的(不同时间点定投全市场所有基金),碍于篇幅原因,留在下一篇再写吧,敬请留意!
 
微信公众号:
可转债量化分析





  查看全部
对于定投,一般人印象是,如果你最终结果是亏损的,那么原因就是:耐心不够,跌的时候不够定力,不敢继续加仓。

而事实真的是这样吗?

笔者使用2015年6月12日上一轮全面牛市的高点5178点,作为定投的起始点。而定投标的股票为大A所有股票。


chrome_8oqFlYXsth.png



股票池为2015年6月12日没有停牌的股票,共 2415 只。使用的量化平台是优矿。

(没错,以前股票数就才两千多只,这几年股票数接近翻倍了)
def get_all_code(date):
'''
获取某天的股市运行的股票,排除停牌
'''
df=DataAPI.MktEqudAdjGet(secID=u"",ticker=u"",
tradeDate=date,
beginDate=u"",
endDate=u"",
isOpen="",
field=u"",
pandas="1")
df=df[df['turnoverValue']>0] # 停牌
return df['ticker'].tolist()


chrome_gvrulmavY7.png







ITIQ1MinNt.png



部分股票样本数据


接着从2015年6月12日开始定投,这里笔者按照一个月定投一次,也就是22个交易日定投一次。

每次定投金额10000元。定投到2021年3月28日。

如果定投当天遇到股票停牌,则顺势延续到复牌后继续定投。

这里定投采用净值法定投,为的是让数据更加准确。因为如果按照实际定投股票,10000元的金额可能连1手的茅台也买不进去,这里计算买入的份额为=10000元/股票股价, 比如茅台的股价是2000元,那么这里买入的份额就是5股,并没按照实际股票的1手来算。这样计算得到结果更加精准。

python计算代码如下:
 1import time
2import datetime
3
4stock_profit_list=
5start=time.time()
6
7today=datetime.datetime.now().strftime('%Y-%m-%d')
8
9def get_trade_date():
10 df=DataAPI.TradeCalGet(exchangeCD=u"XSHG,XSHE",
11 beginDate=high_date,
12 endDate=today,isOpen=u"1",
13 field=u"",pandas="1")
14 return df['calendarDate'].tolist()
15
16def fixed_investment(code):
17 stock_profit_dict={}
18 stock_profit_dict['code']=code
19 df=DataAPI.MktEqudAdjGet(secID=u"",ticker=code,tradeDate=u'',beginDate=high_date,endDate=today,isOpen="1",field=u"",pandas="1")
20 total_amount=0
21 invest_count=0
22 every_invest_cash=10000
23 total_money_list=list()
24 last_date=None
25 for trade_date in trade_date_list_interval:
26 trade_df = df[df['tradeDate']==trade_date]
27 if len(trade_df)>0:
28 invest_count+=1
29 price=trade_df['closePrice'].iloc[0]
30 amount=every_invest_cash/price
31 cost=invest_count*every_invest_cash
32 profit=total_amount*price/cost
33 total_money_list.append(profit)
34 total_amount=total_amount+amount
35 total_money=price*total_amount
36 last_date=trade_date
37
38
39 stock_profit_dict['profit_rate']=profit
40 stock_profit_dict['last_date']=last_date
41 stock_profit_dict['invest_count']=invest_count
42 stock_profit_dict['total_amount']=total_amount
43 stock_profit_dict['total_money']=total_money
44 stock_profit_dict['profit_list']=total_money_list
45 stock_profit_dict['cost']=cost
46 return stock_profit_dict
47
48for code in target_codes:
49 profit_dict = fixed_investment(code)
50 stock_profit_list.append(profit_dict)
51
52print(time.time()-start)

 
最终得到的数据保存在stock_profit_list变量里面。在计算过程也记录里每一个股票当前一期定投阶段的阶段收益率,组合成一个列表。

为的是倒后镜看看,曾经的历史定投收益率,也可以看看曾经的历史定投收益率的最大值。便于和现在最后一期收益率的对比。

得到数据按照profit_rate收益率排个序:
profi_df_sorted = profit_df.sort_values(by='profit_rate',ascending=False)

得到下面的数据:


chrome_2ssHwV7kIF.png


上面的股票熟悉不?基本都是年初那一批基金ikun们的抱团股。

定投收益率最高的是山西汾酒,收益率达到8.56,即856%,从股灾高点定投下来,到现在2021年3月28日,收益率是8倍!

其月K线如下:


chrome_5YfTfpQeGO.png


牛气冲天的5年十倍股,股灾时山西汾酒的股价徘徊在21-26之间左右。如果股灾的时候采用一把梭,收益率是336/26=12.9 倍。

而采用定投方式的收益率也不差,8.56倍。

再继续看看定投收益排在倒数的


chrome_70AmS82Klu.png


真是好家伙,亏得底裤都不见了。清一色的退市股,定投收益率基本在0.1以下,意味着投资了100元,最后就剩10元以下。

在前面计算的时候,特意加了一个数据列,定投期数和定投停止日期,也就是股票退市或者停牌导致无法交易的日子。

invest_count为定投期数,定投一次此值加1. last_date 为最后一个交易日期。倒数第一个国恒退,只交易1期,7月10日退市,等不来第2期的定投,不过也好,这样子只也不至于越陷越深。



chrome_ctuYAng8BL.png


国恒退日K
total_money 列是投资得到总金额,cost是投入的成本。投资期数越多,随着股价上涨,该金额会越高,而股价不断下跌,则该金额会越来越少。所以遇到国恒退这种股票,当期只投了10000元就无法继续投下去,还是运气比较好的。类似于止损操作了。

toal_money减去cost得到的是绝对收益。之前因为没有加这一列,可以通过以下公式计算得到:
profit_df['absolute_profit']=profit_df['total_money']-profit_df['cost']

按绝对收益计算,最多的还是前面那20位个股,赚最多的山西汾酒,129W的定投金额,盈利金额达到900W。


chrome_UQ2xMZ75cl.png


同样倒序排一下,绝对亏损最多的,肯定也是定投期数较多的。

[图片]
亏损最多的天夏退,目前还没有完全退市,定投了114期,总亏损金额达到100W,定投总金额是110W。额,只剩10W。


chrome_FVZp47vc3S.png


它的月K线是这样的。其跌到4元多的时候还放量了,可能一堆人冲进去抄底了,然后按亏损幅度,4元跌到0.22元,亏损幅度也是94.5%,这个亏损幅度其实和在山顶29元站岗的亏损率其实没什么区别了。高手死于抄底,呵呵。

接着看看上面所有股票的定投的平均收益率:
profi_df_sorted['profit_rate'].mean()

得到的收益率的平均值为:1.043,减去本金1,收益为1.043-1=0.043,也就是4.3%个点。

换句话说,如果在股票高点5178点定投全市场股票,5年多来的最后收益率为4.3%.


chrome_U2mijtKyIe.png


中位数是0.87-1=-0.13,= -13%,中位数是亏损13%,定投金额约126W,亏损金额为14W。

看到这里,笔者想要表述的是,即使是定投也需要挑选一个好标的股票或者基金,也就是择股择时能力。

如果在一个垃圾股或者基金上定投,只会让你越陷越深,亏损越来越多。假如你在定投康得新或者乐视,定投了100期,投入了不少的金额和时间,突然暴雷,然后ST,那么你会继续定投下去吗?

另外,定投也需要一定的择时能力,比如在前春节前,基金抱团股热度不减,对于大部分没有择股能力的人来说,当时是应该止盈离场的。当然,如果倒后镜看,如果有能力抓取上面的大牛股,也不一定能够把上面的8倍收益落袋而安。

上面数据有一列max_profit,total_money/cost, 也就是定投期间,获得的最大收益率。按此列排序:


chrome_vMYDUIaC00.png


在定投期间,最大收益率的是ST中安,最大收益率是14.6-1=13.6倍。最后到这个月最终定投收益率是0.67,亏损状态,0.67-1=-0.37,亏损为-37%,绝对收益absolute_profit为-29W.

排在第4是是乐视退,定投期间最大收益max_profit达到10倍,最后如果坚持定投,是亏损93%的。

如果把定投时间放在2018年1月12日,那么得到的定投收益率排名前20名是这样的:


chrome_6UAh6Vp6vE.png


得到不一样的前20排名,定投收益率最高的是英科医疗,疫情手套涨了10倍的大牛股。而山西汾酒跌到第10,并且收益率也只有4倍左右。而茅台也没出现在前20的榜单上。


不同的定投时间,得到的是不一样的结果。当然择股能力强的大神,就不屑定投而采用一把梭了,大神向往的是英科医疗的一年十倍,而不是十年十倍(大V组合抱团,抱团基金的组合)。


其改变定投时间的定投收益率的平均值以及中位数数据如下:


chrome_W3tYI5Sj74.png


平均收益率达到了1.14-1=0.14=14%,也就是如果你在18年开始定投全市场股票,当前平均收益率是14%,不过中位数的收益率是1-1=0%,因为这两年股票大小票分化得太严重(24%的个股跌破2440的低点,指数涨41%),四分一分位的定投收益率为27%,到了中位数就为0%了。其定投收益率较2015年山顶定投也有了很大的区别。

今天就到这里吧,感觉文章太长了,本来还想把全市场的基金加进来比较的(不同时间点定投全市场所有基金),碍于篇幅原因,留在下一篇再写吧,敬请留意!
 
微信公众号:
可转债量化分析

公众号二维码.jpg

 

bandcamp移动开发更简单

数据库linxiaojue 发表了文章 • 0 个评论 • 2299 次浏览 • 2019-12-14 05:12 • 来自相关话题

bandcamp移动开发更简单http://ydkfpgjd.bandcamp.com/
http://TalkingData.bandcamp.com/
http://Bugly.bandcamp.com/
http://Box2D.bandcamp.com/
http://aineice.bandcamp.com/
http://wyyp.bandcamp.com/
http://Prepo.bandcamp.com/
http://Chipmunk.bandcamp.com/
http://openinstall.bandcamp.com/
http://MobileInsight.bandcamp.com/
http://zhugelo.bandcamp.com/
http://CobubRazor.bandcamp.com/
http://Testin.bandcamp.com/
http://crashlytics.bandcamp.com/
http://APKProtect.bandcamp.com/
http://Ucloud.bandcamp.com/
http://ydkfpgj.bandcamp.com/releases
http://TalkingData.bandcamp.com/releases
http://Bugly.bandcamp.com/releases
http://Box2D.bandcamp.com/releases
http://aineice.bandcamp.com/releases
http://wyyp.bandcamp.com/releases
http://Prepo.bandcamp.com/releases
http://Chipmunk.bandcamp.com/releases
http://openinstall.bandcamp.com/releases
http://MobileInsight.bandcamp.com/releases
http://zhugelo.bandcamp.com/releases
http://CobubRazor.bandcamp.com/releases
http://Testin.bandcamp.com/releases
http://crashlytics.bandcamp.com/releases
http://APKProtect.bandcamp.com/releases
http://Ucloud.bandcamp.com/releases 查看全部

numpy indices的用法

量化交易-Ptrade-QMT李魔佛 发表了文章 • 0 个评论 • 8346 次浏览 • 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现在就是一个圆啦
 

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

量化交易-Ptrade-QMT李魔佛 发表了文章 • 0 个评论 • 3837 次浏览 • 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"
只要修改上面的路径就可以了。注意用双斜杠。
 

jupyter notebook格式的文件损坏如何修复

python李魔佛 发表了文章 • 0 个评论 • 3660 次浏览 • 2019-06-08 13:44 • 来自相关话题

有时候用git同步时,造成了冲突后合并,jupyter notebook的文件被插入了诸如>>>>>HEAD,ORIGIN等字符,这时候再打开jupyter notebook文件(.ipynb后缀),会无法打开。修复过程:
 
使用下面的代码:
# 拯救损坏的jupyter 文件
import re
import codecs

pattern = re.compile('"source": \[(.*?)\]\s+\},',re.S)
filename = 'tushare_usage.ipynb'
with codecs.open(filename,encoding='utf8') as f:
content = f.read()

source = pattern.findall(content)
for s in source:
t=s.replace('\\n','')
t=re.sub('"','',t)
t=re.sub('(,$)','',t)
print(t)只要把你要修复的文件替换一下就可以了。 查看全部
有时候用git同步时,造成了冲突后合并,jupyter notebook的文件被插入了诸如>>>>>HEAD,ORIGIN等字符,这时候再打开jupyter notebook文件(.ipynb后缀),会无法打开。修复过程:
 
使用下面的代码:
# 拯救损坏的jupyter 文件
import re
import codecs

pattern = re.compile('"source": \[(.*?)\]\s+\},',re.S)
filename = 'tushare_usage.ipynb'
with codecs.open(filename,encoding='utf8') as f:
content = f.read()

source = pattern.findall(content)
for s in source:
t=s.replace('\\n','')
t=re.sub('"','',t)
t=re.sub('(,$)','',t)
print(t)
只要把你要修复的文件替换一下就可以了。

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

量化交易-Ptrade-QMT李魔佛 发表了文章 • 0 个评论 • 6944 次浏览 • 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