pandas dataframe 切片与python列表切片的区别

李魔佛 发表了文章 • 0 个评论 • 3050 次浏览 • 2020-10-29 23:34 • 来自相关话题

 
有一个Dataframedf = pd.DataFrame(np.arange(16).reshape((8,2)),index=list('abcdefgh'),columns=['COL1','COL2'])COL1 COL2
a 0 1
b 2 3
c 4 5
d 6 7
e 8 9
f 10 11
g 12 13
h 14 15那么如果我用df['a':'e'] 返回的结果是:
  COL1 COL2
a 0 1
b 2 3
c 4 5
d 6 7
e 8 9是包含e尾部的,
 
而python的切片 
a = [0,1,2,3,4,5]
a[1:5] 是不包含最后一个元素的。
 
原文链接:
http://30daydo.com/article/630
  查看全部
 
有一个Dataframe
df = pd.DataFrame(np.arange(16).reshape((8,2)),index=list('abcdefgh'),columns=['COL1','COL2'])
COL1	COL2
a 0 1
b 2 3
c 4 5
d 6 7
e 8 9
f 10 11
g 12 13
h 14 15
那么如果我用df['a':'e'] 返回的结果是:
 
	COL1	COL2
a 0 1
b 2 3
c 4 5
d 6 7
e 8 9
是包含e尾部的,
 
而python的切片 
a = [0,1,2,3,4,5]
a[1:5] 是不包含最后一个元素的。
 
原文链接:
http://30daydo.com/article/630
 

华宝油气自动化申购脚本 AutoJS

李魔佛 发表了文章 • 0 个评论 • 4344 次浏览 • 2020-09-24 23:40 • 来自相关话题

运行效果图:https://v.qq.com/x/page/u3155gvuxvt.html
 
 因为最近两周的华宝油气都呈现很大的折价,但是限购,所以拖拉机申购非常的麻烦,需要一路点击,非常的耗时间,而且容易出错,容易点重复了,导致另外一个股东号没有申购。


所以自己用appium写了个手机自动化申购的脚本,只是它的部署相当不方便,对于一般小白几乎很难独立实现。在上一篇文章中埋了个伏笔 转债水位在降低 当时还准备基于appium写个教程来着。

最近发现有一个叫auto.js的app,基于JS代码的自动化工具,可以很方便的操控手机,只需要在手机上安装一个app,然后写一段JS脚本,然后运行就可以了,部署简化了不少。

后台回复:autojs  会提供相应的app下载与源码打包。


先看运行效果图:





 
运行的视频文件下面:
https://v.qq.com/x/page/u3155gvuxvt.html
 
脚本代码入口函数:main("162411", "6", "100");其中第二个参数是申购的次数,场内的最多6个股东号,所以设置为6。

完整代码://可转债量化分析
function main(code, count, money) {
log(code, count, money);
if (!code) {
toast("请输入基金代码");
return;
}
if (!count) {
toast("股东账户数量");
return;
}
if (!money) {
toast("申购金额");
return;
}
app.launchApp("中国银河证券");
waitForPackage("com.galaxy.stock");
log("成功打开银河证券");
sleep(1000);
// 切换到【交易】tab
const tradeBtn = text("交易")
.findOne()
.parent()
.parent();
log(tradeBtn);
tradeBtn.click();

//点击【场内基金】
sleep(1000);
const internalFund = text("场内基金")
.findOnce()
.parent();
internalFund.click();

//点击【基金申购】
waitForActivity("cn.com.chinastock.trade.activity.LofActivity");
const fundPurchase = text("基金申购")
.findOnce()
.parent();
fundPurchase.click();

// 自动填信息
sleep(1000);

purchaseFund(code, count, money);
}

function purchaseFund(code, count, money) {
for (let i = 0; i < count; i++) {
log(code, count, money);
const codeInput = id("stockCode").findOne();
codeInput.click();
codeInput.setText(code);
sleep(1000);
const accountSelect = id("secuidList").findOne();
accountSelect.click();
sleep(1000);
const options = className("CheckedTextView").find();
click(options[i].bounds().left + 2, options[i].bounds().top + 2);
sleep(300);
const orderAmount = id("orderAmount")
.findOnce()
.children()[0];
log(orderAmount);
orderAmount.setText(money);
sleep(300);
id("order")
.findOnce()
.click();
sleep(6000);
id("acceptedCb")
.findOnce()
.click();
id("okBtn")
.findOnce()
.click();
sleep(6000);
click("本人已认真阅读并理解上述内容");
sleep(200);
click("我接受");
sleep(200);
click("本人已认真阅读并理解上述内容");
sleep(200)
click("我接受");
sleep(7000);
click("本人已认真阅读并理解上述内容");
sleep(200);
click("我接受");
sleep(500);
text('确认申购').findOnce().click();
sleep(1000);
text("确定")
.findOnce()
.click();

sleep(1000);
}
}

main("162411", "6", "100");[/i][/i]
[i]安装使用步骤:


安装autojs app
 [/i]
[i]手机设置无障碍模式,把autojs添加进去,一般按住app的时候会提示引导你这么操作[/i][list][*][i]打开autojs app,把上面的JS代码复制进去[/i][list][*][i]登录你的X河牌拖拉机[/i][list][*][i]在autojs app里面点击执行[/i]

[/*]
[/list]

[/*]
[/list]

[/*]
[/list]

[i] 
然后就静静的等待脚本执行完成,你的6个股东号就全部打完啦。如果你有多个证券账户,需要你退出当前的账户,然后登陆下一个账号,然后继续运行这个脚本即可。


后台回复:autojs 就可以获取autojs的app与上面的源码打包。

PS:如果你有有趣的想法要验证或者苦于没有数据无从下手,可以后台留言,一起交流,笔者会尝试帮你们验证分析。
 
关注公众号:




 [/i] 查看全部
运行效果图:https://v.qq.com/x/page/u3155gvuxvt.html
 
 因为最近两周的华宝油气都呈现很大的折价,但是限购,所以拖拉机申购非常的麻烦,需要一路点击,非常的耗时间,而且容易出错,容易点重复了,导致另外一个股东号没有申购。


所以自己用appium写了个手机自动化申购的脚本,只是它的部署相当不方便,对于一般小白几乎很难独立实现。在上一篇文章中埋了个伏笔 转债水位在降低 当时还准备基于appium写个教程来着。

最近发现有一个叫auto.js的app,基于JS代码的自动化工具,可以很方便的操控手机,只需要在手机上安装一个app,然后写一段JS脚本,然后运行就可以了,部署简化了不少。

后台回复:autojs  会提供相应的app下载与源码打包。


先看运行效果图:

微信图片_20200924201837.jpg

 
运行的视频文件下面:
https://v.qq.com/x/page/u3155gvuxvt.html
 
脚本代码入口函数:
main("162411", "6", "100");
其中第二个参数是申购的次数,场内的最多6个股东号,所以设置为6。

完整代码:
//可转债量化分析
function main(code, count, money) {
log(code, count, money);
if (!code) {
toast("请输入基金代码");
return;
}
if (!count) {
toast("股东账户数量");
return;
}
if (!money) {
toast("申购金额");
return;
}
app.launchApp("中国银河证券");
waitForPackage("com.galaxy.stock");
log("成功打开银河证券");
sleep(1000);
// 切换到【交易】tab
const tradeBtn = text("交易")
.findOne()
.parent()
.parent();
log(tradeBtn);
tradeBtn.click();

//点击【场内基金】
sleep(1000);
const internalFund = text("场内基金")
.findOnce()
.parent();
internalFund.click();

//点击【基金申购】
waitForActivity("cn.com.chinastock.trade.activity.LofActivity");
const fundPurchase = text("基金申购")
.findOnce()
.parent();
fundPurchase.click();

// 自动填信息
sleep(1000);

purchaseFund(code, count, money);
}

function purchaseFund(code, count, money) {
for (let i = 0; i < count; i++) {
log(code, count, money);
const codeInput = id("stockCode").findOne();
codeInput.click();
codeInput.setText(code);
sleep(1000);
const accountSelect = id("secuidList").findOne();
accountSelect.click();
sleep(1000);
const options = className("CheckedTextView").find();
click(options[i].bounds().left + 2, options[i].bounds().top + 2);
sleep(300);
const orderAmount = id("orderAmount")
.findOnce()
.children()[0];
log(orderAmount);
orderAmount.setText(money);
sleep(300);
id("order")
.findOnce()
.click();
sleep(6000);
id("acceptedCb")
.findOnce()
.click();
id("okBtn")
.findOnce()
.click();
sleep(6000);
click("本人已认真阅读并理解上述内容");
sleep(200);
click("我接受");
sleep(200);
click("本人已认真阅读并理解上述内容");
sleep(200)
click("我接受");
sleep(7000);
click("本人已认真阅读并理解上述内容");
sleep(200);
click("我接受");
sleep(500);
text('确认申购').findOnce().click();
sleep(1000);
text("确定")
.findOnce()
.click();

sleep(1000);
}
}

main("162411", "6", "100");[/i][/i]

[i]安装使用步骤:


安装autojs app
 
[/i]
  • [i]手机设置无障碍模式,把autojs添加进去,一般按住app的时候会提示引导你这么操作[/i][list][*][i]打开autojs app,把上面的JS代码复制进去[/i][list][*][i]登录你的X河牌拖拉机[/i][list][*][i]在autojs app里面点击执行[/i]


[/*]
[/list]

[/*]
[/list]

[/*]
[/list]

[i] 
然后就静静的等待脚本执行完成,你的6个股东号就全部打完啦。如果你有多个证券账户,需要你退出当前的账户,然后登陆下一个账号,然后继续运行这个脚本即可。


后台回复:autojs 就可以获取autojs的app与上面的源码打包。

PS:如果你有有趣的想法要验证或者苦于没有数据无从下手,可以后台留言,一起交流,笔者会尝试帮你们验证分析。
 
关注公众号:
微信图片_20200923020240.jpg

 
[/i]

个人的知识星球

李魔佛 发表了文章 • 0 个评论 • 3471 次浏览 • 2020-02-23 11:10 • 来自相关话题

最近开通了知识星球,尝试在里面分享一些量化投资套利的学习教程。在里面你可以对不懂的问题进行提问,球主会一一的耐心解答。





 
微信扫一扫加入我的知识星球
 
 
星球的第一篇文章
python获取全市场LOF基金折溢价数据并进行套利
 
 
市场是总共的LOF基金有301只(上图右下角的圈圈是所有基金的条数),而集思录上只有120只左右,所以有些溢价厉害(大于10%)的LOF基金并没有在集思录的网站上显示,这对于专注于套利的投资者来说,会损失很多潜在的套利机会。






点击查看大图

我回复了该贴后,有大量的人私信我,问我能否提供一份这个数据,或者教对方如何获取这些数据。 因为人数众多,也没有那么多精力来一一回答。毕竟不同人的水平背景不一样,逐个回答起来也很累,所以就回答了几个朋友的问题后就一一婉拒了。


然后在几个投资群里,居然也有人提到这个数据,在咨询如何才能获取到这个完整的数据,并且可以实时更新显示。 因为我的微信群昵称和集思录是一样的,所以不少人@我,我也都简单的回复了下,是使用python抓取的数据,数据保存到Mysql和MongoDB。 代码行数不多,100行都不到。
 
具体实现在星球会有完整代码。 查看全部
最近开通了知识星球,尝试在里面分享一些量化投资套利的学习教程。在里面你可以对不懂的问题进行提问,球主会一一的耐心解答。

ZSXQ_20200223_104730797.png

 
微信扫一扫加入我的知识星球
 
 
星球的第一篇文章
python获取全市场LOF基金折溢价数据并进行套利
 
 
市场是总共的LOF基金有301只(上图右下角的圈圈是所有基金的条数),而集思录上只有120只左右,所以有些溢价厉害(大于10%)的LOF基金并没有在集思录的网站上显示,这对于专注于套利的投资者来说,会损失很多潜在的套利机会。


lof.PNG

点击查看大图

我回复了该贴后,有大量的人私信我,问我能否提供一份这个数据,或者教对方如何获取这些数据。 因为人数众多,也没有那么多精力来一一回答。毕竟不同人的水平背景不一样,逐个回答起来也很累,所以就回答了几个朋友的问题后就一一婉拒了。


然后在几个投资群里,居然也有人提到这个数据,在咨询如何才能获取到这个完整的数据,并且可以实时更新显示。 因为我的微信群昵称和集思录是一样的,所以不少人@我,我也都简单的回复了下,是使用python抓取的数据,数据保存到Mysql和MongoDB。 代码行数不多,100行都不到。
 
具体实现在星球会有完整代码。

dataframe 根据日期重采样 计算个数

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

按照日期重新采样,计算每天的个数new_df = df.resample('D').count()
按照日期重新采样,计算每天的个数new_df = df.resample('D').count()

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

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

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




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




(点击查看大图)

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




(点击查看大图)

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

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

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

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

a2.PNG
(点击查看大图)

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

a3.PNG
(点击查看大图)

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

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

 

numpy indices的用法

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

result = my_fangca(X)
得到的result

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

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

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

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

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

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


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


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

numpy flatten函数的用法

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

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

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

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

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

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

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

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

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

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

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

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

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

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

return grad

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

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

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

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

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

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

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

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

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

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

 

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

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

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

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

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

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

ndarray和array的区别【numpy小白】

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

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

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

Python金融量化 发表了文章 • 3 个评论 • 6375 次浏览 • 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 个评论 • 3844 次浏览 • 2019-03-16 18:03 • 来自相关话题

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





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

echarts.png

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

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

李魔佛 发表了文章 • 0 个评论 • 7165 次浏览 • 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安装即可。
 

 

原创文章
转载请注明出处:
 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安装即可。
 

 

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

 

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

李魔佛 发表了文章 • 0 个评论 • 8379 次浏览 • 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 个评论 • 44707 次浏览 • 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 个评论 • 7175 次浏览 • 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 个评论 • 8454 次浏览 • 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 个评论 • 9381 次浏览 • 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 个评论 • 7519 次浏览 • 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获取每天的涨停个股数据 和昨天涨停的今天表现

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

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



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




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




(点击查看大图)

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

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

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

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

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

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

正常退出tushare

李魔佛 发表了文章 • 1 个评论 • 4358 次浏览 • 2018-05-07 21:31 • 来自相关话题

tushare最新的api中,很多函数的调用像这样,ts.bar(code,conn=conn), 其中conn=ts.get_api()
查看源码知道ts.get_api() 里面使用了多线程,程序一直在循环等待。 如果按ctrl + c,是无法正常终止tushare在后台的调用,需要使用ts.close_api(conn), 才能终止掉后台的多线程,这个时候程序才能正常退出,释放系统资源。
原创文章
转载请注明出处:http://30daydo.com/article/308
  查看全部
tushare最新的api中,很多函数的调用像这样,ts.bar(code,conn=conn), 其中conn=ts.get_api()
查看源码知道ts.get_api() 里面使用了多线程,程序一直在循环等待。 如果按ctrl + c,是无法正常终止tushare在后台的调用,需要使用ts.close_api(conn), 才能终止掉后台的多线程,这个时候程序才能正常退出,释放系统资源。
原创文章
转载请注明出处:http://30daydo.com/article/308
 

使用优矿获取股市的基本数据 实例操作

李魔佛 发表了文章 • 1 个评论 • 5823 次浏览 • 2018-05-06 22:44 • 来自相关话题

1. 每日行业个股换手率排名
DataAPI.MktRANKInstTrGet

 行业名称,如:传媒,电气设备等,可多值输入,以下为申万28个行业名称:休闲服务,房地产,商业贸易,综合,钢铁,农林牧渔,食品饮料,采掘,电子,国防军工,通信,公用事业,交通运输,轻工制造,计算机,电气设备,家用电器,医药生物,传媒,非银金融,汽车,有色金属,机械设备,建筑材料,化工,纺织服装,银行,建筑装饰,可以是列表,可空
 
实例
 
原创文章
转载请注明出处:http://30daydo.com/article/306
  查看全部
1. 每日行业个股换手率排名
DataAPI.MktRANKInstTrGet

 行业名称,如:传媒,电气设备等,可多值输入,以下为申万28个行业名称:休闲服务,房地产,商业贸易,综合,钢铁,农林牧渔,食品饮料,采掘,电子,国防军工,通信,公用事业,交通运输,轻工制造,计算机,电气设备,家用电器,医药生物,传媒,非银金融,汽车,有色金属,机械设备,建筑材料,化工,纺织服装,银行,建筑装饰,可以是列表,可空
 
实例
 
原创文章
转载请注明出处:http://30daydo.com/article/306
 

python获取涨停板历史数据

李魔佛 发表了文章 • 18 个评论 • 19061 次浏览 • 2018-04-23 20:33 • 来自相关话题

获取A股每天的涨停板数据,起始日期和截止日期都可以自定义。
这个数据可以用来后续的大数据分析,比如统计每天涨停板的数目和大盘指数的相关性,涨停打开次数与当日人气的强弱的关系。
 




点击查看大图

python代码(pyhton2版本,另外最下面有python3版本的代码实现):# -*- coding=utf-8 -*-
import datetime

__author__ = 'Rocky'
'''
http://30daydo.com
Contact: weigesysu@qq.com
'''
# 每天的涨跌停
import urllib2, re, time, xlrd, xlwt, sys, os
import setting
import pandas as pd
import tushare as ts
from setting import LLogger
reload(sys)
sys.setdefaultencoding('gbk')

logger = LLogger('zdt.log')
class GetZDT:
def __init__(self,current):
self.user_agent = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/64.0.3282.167 Chrome/64.0.3282.167 Safari/537.36"
# self.today = time.strftime("%Y%m%d")
self.today=current
self.path = os.path.join(os.path.dirname(__file__), 'data')
self.zdt_url = 'http://home.flashdata2.jrj.com.cn/limitStatistic/ztForce/' + self.today + ".js"
self.zrzt_url = 'http://hqdata.jrj.com.cn/zrztjrbx/limitup.js'

self.host = "home.flashdata2.jrj.com.cn"
self.reference = "http://stock.jrj.com.cn/tzzs/z ... ot%3B

self.header_zdt = {"User-Agent": self.user_agent,
"Host": self.host,
"Referer": self.reference}

self.zdt_indexx = [u'代码', u'名称', u'最新价格', u'涨跌幅', u'封成比', u'封流比', u'封单金额', u'最后一次涨停时间', u'第一次涨停时间', u'打开次数',
u'振幅',
u'涨停强度']

self.zrzt_indexx = [u'序号', u'代码', u'名称', u'昨日涨停时间', u'最新价格', u'今日涨幅', u'最大涨幅', u'最大跌幅', u'是否连板', u'连续涨停次数',
u'昨日涨停强度', u'今日涨停强度', u'是否停牌', u'昨天的日期', u'昨日涨停价', u'今日开盘价格', u'今日开盘涨幅']
self.header_zrzt = {"User-Agent": self.user_agent,
"Host": "hqdata.jrj.com.cn",
"Referer": "http://stock.jrj.com.cn/tzzs/zrztjrbx.shtml"
}

def getdata(self, url, headers, retry=5):
req = urllib2.Request(url=url, headers=headers)
for i in range(retry):
try:
resp = urllib2.urlopen(req,timeout=20)
content = resp.read()
md_check = re.findall('summary|lasttradedate',content)
if content and len(md_check)>0:
return content
else:
time.sleep(60)
logger.log('failed to get content, retry: {}'.format(i))
continue
except Exception, e:
logger.log(e)
time.sleep(60)
continue
return None

def convert_json(self, content):
p = re.compile(r'"Data":(.*)};', re.S)
if len(content)<=0:
logger.log('Content\'s length is 0')
exit(0)
result = p.findall(content)
if result:
try:
# print result
t1 = result[0]
t2 = list(eval(t1))
return t2
except Exception,e:
logger.log(e)
return None
else:
return None


def save_to_dataframe(self, data, indexx, choice, post_fix):
engine = setting.get_engine('db_zdt')
if not data:
exit()
data_len = len(data)
if choice == 1:
for i in range(data_len):
data[choice] = data[choice].decode('gbk')

df = pd.DataFrame(data, columns=indexx)

filename = os.path.join(self.path, self.today + "_" + post_fix + ".xls")
if choice == 1:
df[u'今天的日期']=self.today
df.to_excel(filename, encoding='gbk')
try:
df.to_sql(self.today + post_fix, engine, if_exists='fail')
except Exception,e:
logger.log(e)


def storedata(self):
zdt_content = self.getdata(self.zdt_url, headers=self.header_zdt)
logger.log('zdt Content'+zdt_content)
zdt_js = self.convert_json(zdt_content)
self.save_to_dataframe(zdt_js, self.zdt_indexx, 1, 'zdt')
time.sleep(5)

if __name__ == '__main__':
date_list = [datetime.datetime.strftime(i,'%Y%m%d') for i in list(pd.date_range('20170401','20171231'))]
for today in date_list:

if not ts.is_holiday(datetime.datetime.strptime(today,'%Y%m%d').strftime('%Y-%m-%d')):
print today
obj = GetZDT(today)
obj.storedata()
else:
logger.log('Holiday')



 
python3代码:# -*- coding=utf-8 -*-
__author__ = 'Rocky'
'''
http://30daydo.com
Contact: weigesysu@qq.com
'''
# 每天的涨跌停
import re
import time
import xlrd
import xlwt
import sys
import os
import setting
from setting import is_holiday, DATA_PATH
import pandas as pd
import tushare as ts
from setting import llogger
import requests
from send_mail import sender_139
import datetime
# reload(sys)
# sys.setdefaultencoding('gbk')

logger = llogger(__file__)


class GetZDT:
def __init__(self):
self.user_agent = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/64.0.3282.167 Chrome/64.0.3282.167 Safari/537.36"
self.today = time.strftime("%Y%m%d")
self.path = DATA_PATH
self.zdt_url = 'http://home.flashdata2.jrj.com.cn/limitStatistic/ztForce/' + \
self.today + ".js"
self.zrzt_url = 'http://hqdata.jrj.com.cn/zrztjrbx/limitup.js'

self.host = "home.flashdata2.jrj.com.cn"
self.reference = "http://stock.jrj.com.cn/tzzs/z ... ot%3B

self.header_zdt = {"User-Agent": self.user_agent,
"Host": self.host,
"Referer": self.reference}

self.zdt_indexx = [u'代码', u'名称', u'最新价格', u'涨跌幅', u'封成比', u'封流比', u'封单金额', u'最后一次涨停时间', u'第一次涨停时间', u'打开次数',
u'振幅',
u'涨停强度']

self.zrzt_indexx = [u'序号', u'代码', u'名称', u'昨日涨停时间', u'最新价格', u'今日涨幅', u'最大涨幅', u'最大跌幅', u'是否连板', u'连续涨停次数',
u'昨日涨停强度', u'今日涨停强度', u'是否停牌', u'昨天的日期', u'昨日涨停价', u'今日开盘价格', u'今日开盘涨幅']
self.header_zrzt = {"User-Agent": self.user_agent,
"Host": "hqdata.jrj.com.cn",
"Referer": "http://stock.jrj.com.cn/tzzs/zrztjrbx.shtml"
}

def getdata(self, url, headers, retry=5):
for i in range(retry):
try:
resp = requests.get(url=url, headers=headers)
content = resp.text
md_check = re.findall('summary|lasttradedate', content)
if content and len(md_check) > 0:
return content
else:
time.sleep(60)
logger.info('failed to get content, retry: {}'.format(i))
continue
except Exception as e:
logger.info(e)
time.sleep(60)
continue
return None

def convert_json(self, content):
p = re.compile(r'"Data":(.*)};', re.S)
if len(content) <= 0:
logger.info('Content\'s length is 0')
exit(0)
result = p.findall(content)
if result:
try:
# print(result)
t1 = result[0]
t2 = list(eval(t1))
return t2
except Exception as e:
logger.info(e)
return None
else:
return None

# 2016-12-27 to do this
def save_excel(self, date, data):
# data is list type
w = xlwt.Workbook(encoding='gbk')
ws = w.add_sheet(date)
excel_filename = date + ".xls"
# sheet=open_workbook(excel_filenme)
# table=wb.sheets()[0]
xf = 0
ctype = 1
rows = len(data)
point_x = 1
point_y = 0
ws.write(0, 0, u'代码')
ws.write(0, 1, u'名称')
ws.write(0, 2, u'最新价格')
ws.write(0, 3, u'涨跌幅')
ws.write(0, 4, u'封成比')
ws.write(0, 5, u'封流比')
ws.write(0, 6, u'封单金额')
ws.write(0, 7, u'第一次涨停时间')
ws.write(0, 8, u'最后一次涨停时间')
ws.write(0, 9, u'打开次数')
ws.write(0, 10, u'振幅')
ws.write(0, 11, u'涨停强度')
print("Rows:%d" % rows)
for row in data:
rows = len(data)
cols = len(row)
point_y = 0
for col in row:
# print(col)
# table.put_cell(row,col,)
# print(col)
ws.write(point_x, point_y, col)
# print("[%d,%d]" % (point_x, point_y))
point_y = point_y + 1

point_x = point_x + 1

w.save(excel_filename)

def save_to_dataframe(self, data, indexx, choice, post_fix):
engine = setting.get_engine('db_zdt')
if not data:
exit()
data_len = len(data)
if choice == 1:
for i in range(data_len):
data[i][choice] = data[i][choice]

df = pd.DataFrame(data, columns=indexx)

filename = os.path.join(
self.path, self.today + "_" + post_fix + ".xls")

# 今日涨停
if choice == 1:
df['今天的日期'] = self.today
df.to_excel(filename, encoding='gbk')
try:
df.to_sql(self.today + post_fix, engine, if_exists='fail')
except Exception as e:
logger.info(e)
# 昨日涨停
if choice == 2:
df = df.set_index(u'序号')
df[u'最大涨幅'] = df[u'最大涨幅'].map(lambda x: round(x * 100, 3))
df[u'最大跌幅'] = df[u'最大跌幅'].map(lambda x: round(x * 100, 3))
df[u'今日开盘涨幅'] = df[u'今日开盘涨幅'].map(lambda x: round(x * 100, 3))
df[u'昨日涨停强度'] = df[u'昨日涨停强度'].map(lambda x: round(x, 0))
df[u'今日涨停强度'] = df[u'今日涨停强度'].map(lambda x: round(x, 0))
try:
df.to_sql(self.today + post_fix, engine, if_exists='fail')
except Exception as e:
logger.info(e)

avg = round(df['今日涨幅'].mean(), 2)
current = datetime.datetime.now().strftime('%Y-%m-%d')
title = '昨天涨停个股今天{}\n的平均涨幅{}\n'.format(current, avg)
try:
sender_139(title, title)
except Exception as e:
print(e)

# 昨日涨停今日的状态,今日涨停

def storedata(self):
zdt_content = self.getdata(self.zdt_url, headers=self.header_zdt)
logger.info('zdt Content' + zdt_content)
zdt_js = self.convert_json(zdt_content)
self.save_to_dataframe(zdt_js, self.zdt_indexx, 1, 'zdt')
time.sleep(0.5)
zrzt_content = self.getdata(self.zrzt_url, headers=self.header_zrzt)
logger.info('zrzt Content' + zdt_content)

zrzt_js = self.convert_json(zrzt_content)
self.save_to_dataframe(zrzt_js, self.zrzt_indexx, 2, 'zrzt')


if __name__ == '__main__':
# today='2018-04-16'
# 填补以前的数据
# x=pd.date_range('20170101','20180312')
# date_list = [datetime.datetime.strftime(i,'%Y%m%d') for i in list(pd.date_range('20170401','20171231'))

if is_holiday():
logger.info('Holiday')
exit()
logger.info("start")
obj = GetZDT()
obj.storedata()

 
原创。
转载请注明出处。
http://30daydo.com/article/295
 [/i][/i][/code] 
欢迎关注公众号:可转债量化分析
  查看全部
获取A股每天的涨停板数据,起始日期和截止日期都可以自定义。
这个数据可以用来后续的大数据分析,比如统计每天涨停板的数目和大盘指数的相关性,涨停打开次数与当日人气的强弱的关系。
 

Screenshot_from_2018-04-23_20-31-13.png
点击查看大图

python代码(pyhton2版本,另外最下面有python3版本的代码实现):
# -*- coding=utf-8 -*-
import datetime

__author__ = 'Rocky'
'''
http://30daydo.com
Contact: weigesysu@qq.com
'''
# 每天的涨跌停
import urllib2, re, time, xlrd, xlwt, sys, os
import setting
import pandas as pd
import tushare as ts
from setting import LLogger
reload(sys)
sys.setdefaultencoding('gbk')

logger = LLogger('zdt.log')
class GetZDT:
def __init__(self,current):
self.user_agent = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/64.0.3282.167 Chrome/64.0.3282.167 Safari/537.36"
# self.today = time.strftime("%Y%m%d")
self.today=current
self.path = os.path.join(os.path.dirname(__file__), 'data')
self.zdt_url = 'http://home.flashdata2.jrj.com.cn/limitStatistic/ztForce/' + self.today + ".js"
self.zrzt_url = 'http://hqdata.jrj.com.cn/zrztjrbx/limitup.js'

self.host = "home.flashdata2.jrj.com.cn"
self.reference = "http://stock.jrj.com.cn/tzzs/z ... ot%3B

self.header_zdt = {"User-Agent": self.user_agent,
"Host": self.host,
"Referer": self.reference}

self.zdt_indexx = [u'代码', u'名称', u'最新价格', u'涨跌幅', u'封成比', u'封流比', u'封单金额', u'最后一次涨停时间', u'第一次涨停时间', u'打开次数',
u'振幅',
u'涨停强度']

self.zrzt_indexx = [u'序号', u'代码', u'名称', u'昨日涨停时间', u'最新价格', u'今日涨幅', u'最大涨幅', u'最大跌幅', u'是否连板', u'连续涨停次数',
u'昨日涨停强度', u'今日涨停强度', u'是否停牌', u'昨天的日期', u'昨日涨停价', u'今日开盘价格', u'今日开盘涨幅']
self.header_zrzt = {"User-Agent": self.user_agent,
"Host": "hqdata.jrj.com.cn",
"Referer": "http://stock.jrj.com.cn/tzzs/zrztjrbx.shtml"
}

def getdata(self, url, headers, retry=5):
req = urllib2.Request(url=url, headers=headers)
for i in range(retry):
try:
resp = urllib2.urlopen(req,timeout=20)
content = resp.read()
md_check = re.findall('summary|lasttradedate',content)
if content and len(md_check)>0:
return content
else:
time.sleep(60)
logger.log('failed to get content, retry: {}'.format(i))
continue
except Exception, e:
logger.log(e)
time.sleep(60)
continue
return None

def convert_json(self, content):
p = re.compile(r'"Data":(.*)};', re.S)
if len(content)<=0:
logger.log('Content\'s length is 0')
exit(0)
result = p.findall(content)
if result:
try:
# print result
t1 = result[0]
t2 = list(eval(t1))
return t2
except Exception,e:
logger.log(e)
return None
else:
return None


def save_to_dataframe(self, data, indexx, choice, post_fix):
engine = setting.get_engine('db_zdt')
if not data:
exit()
data_len = len(data)
if choice == 1:
for i in range(data_len):
data[choice] = data[choice].decode('gbk')

df = pd.DataFrame(data, columns=indexx)

filename = os.path.join(self.path, self.today + "_" + post_fix + ".xls")
if choice == 1:
df[u'今天的日期']=self.today
df.to_excel(filename, encoding='gbk')
try:
df.to_sql(self.today + post_fix, engine, if_exists='fail')
except Exception,e:
logger.log(e)


def storedata(self):
zdt_content = self.getdata(self.zdt_url, headers=self.header_zdt)
logger.log('zdt Content'+zdt_content)
zdt_js = self.convert_json(zdt_content)
self.save_to_dataframe(zdt_js, self.zdt_indexx, 1, 'zdt')
time.sleep(5)

if __name__ == '__main__':
date_list = [datetime.datetime.strftime(i,'%Y%m%d') for i in list(pd.date_range('20170401','20171231'))]
for today in date_list:

if not ts.is_holiday(datetime.datetime.strptime(today,'%Y%m%d').strftime('%Y-%m-%d')):
print today
obj = GetZDT(today)
obj.storedata()
else:
logger.log('Holiday')



 
python3代码:
# -*- coding=utf-8 -*-
__author__ = 'Rocky'
'''
http://30daydo.com
Contact: weigesysu@qq.com
'''
# 每天的涨跌停
import re
import time
import xlrd
import xlwt
import sys
import os
import setting
from setting import is_holiday, DATA_PATH
import pandas as pd
import tushare as ts
from setting import llogger
import requests
from send_mail import sender_139
import datetime
# reload(sys)
# sys.setdefaultencoding('gbk')

logger = llogger(__file__)


class GetZDT:
def __init__(self):
self.user_agent = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/64.0.3282.167 Chrome/64.0.3282.167 Safari/537.36"
self.today = time.strftime("%Y%m%d")
self.path = DATA_PATH
self.zdt_url = 'http://home.flashdata2.jrj.com.cn/limitStatistic/ztForce/' + \
self.today + ".js"
self.zrzt_url = 'http://hqdata.jrj.com.cn/zrztjrbx/limitup.js'

self.host = "home.flashdata2.jrj.com.cn"
self.reference = "http://stock.jrj.com.cn/tzzs/z ... ot%3B

self.header_zdt = {"User-Agent": self.user_agent,
"Host": self.host,
"Referer": self.reference}

self.zdt_indexx = [u'代码', u'名称', u'最新价格', u'涨跌幅', u'封成比', u'封流比', u'封单金额', u'最后一次涨停时间', u'第一次涨停时间', u'打开次数',
u'振幅',
u'涨停强度']

self.zrzt_indexx = [u'序号', u'代码', u'名称', u'昨日涨停时间', u'最新价格', u'今日涨幅', u'最大涨幅', u'最大跌幅', u'是否连板', u'连续涨停次数',
u'昨日涨停强度', u'今日涨停强度', u'是否停牌', u'昨天的日期', u'昨日涨停价', u'今日开盘价格', u'今日开盘涨幅']
self.header_zrzt = {"User-Agent": self.user_agent,
"Host": "hqdata.jrj.com.cn",
"Referer": "http://stock.jrj.com.cn/tzzs/zrztjrbx.shtml"
}

def getdata(self, url, headers, retry=5):
for i in range(retry):
try:
resp = requests.get(url=url, headers=headers)
content = resp.text
md_check = re.findall('summary|lasttradedate', content)
if content and len(md_check) > 0:
return content
else:
time.sleep(60)
logger.info('failed to get content, retry: {}'.format(i))
continue
except Exception as e:
logger.info(e)
time.sleep(60)
continue
return None

def convert_json(self, content):
p = re.compile(r'"Data":(.*)};', re.S)
if len(content) <= 0:
logger.info('Content\'s length is 0')
exit(0)
result = p.findall(content)
if result:
try:
# print(result)
t1 = result[0]
t2 = list(eval(t1))
return t2
except Exception as e:
logger.info(e)
return None
else:
return None

# 2016-12-27 to do this
def save_excel(self, date, data):
# data is list type
w = xlwt.Workbook(encoding='gbk')
ws = w.add_sheet(date)
excel_filename = date + ".xls"
# sheet=open_workbook(excel_filenme)
# table=wb.sheets()[0]
xf = 0
ctype = 1
rows = len(data)
point_x = 1
point_y = 0
ws.write(0, 0, u'代码')
ws.write(0, 1, u'名称')
ws.write(0, 2, u'最新价格')
ws.write(0, 3, u'涨跌幅')
ws.write(0, 4, u'封成比')
ws.write(0, 5, u'封流比')
ws.write(0, 6, u'封单金额')
ws.write(0, 7, u'第一次涨停时间')
ws.write(0, 8, u'最后一次涨停时间')
ws.write(0, 9, u'打开次数')
ws.write(0, 10, u'振幅')
ws.write(0, 11, u'涨停强度')
print("Rows:%d" % rows)
for row in data:
rows = len(data)
cols = len(row)
point_y = 0
for col in row:
# print(col)
# table.put_cell(row,col,)
# print(col)
ws.write(point_x, point_y, col)
# print("[%d,%d]" % (point_x, point_y))
point_y = point_y + 1

point_x = point_x + 1

w.save(excel_filename)

def save_to_dataframe(self, data, indexx, choice, post_fix):
engine = setting.get_engine('db_zdt')
if not data:
exit()
data_len = len(data)
if choice == 1:
for i in range(data_len):
data[i][choice] = data[i][choice]

df = pd.DataFrame(data, columns=indexx)

filename = os.path.join(
self.path, self.today + "_" + post_fix + ".xls")

# 今日涨停
if choice == 1:
df['今天的日期'] = self.today
df.to_excel(filename, encoding='gbk')
try:
df.to_sql(self.today + post_fix, engine, if_exists='fail')
except Exception as e:
logger.info(e)
# 昨日涨停
if choice == 2:
df = df.set_index(u'序号')
df[u'最大涨幅'] = df[u'最大涨幅'].map(lambda x: round(x * 100, 3))
df[u'最大跌幅'] = df[u'最大跌幅'].map(lambda x: round(x * 100, 3))
df[u'今日开盘涨幅'] = df[u'今日开盘涨幅'].map(lambda x: round(x * 100, 3))
df[u'昨日涨停强度'] = df[u'昨日涨停强度'].map(lambda x: round(x, 0))
df[u'今日涨停强度'] = df[u'今日涨停强度'].map(lambda x: round(x, 0))
try:
df.to_sql(self.today + post_fix, engine, if_exists='fail')
except Exception as e:
logger.info(e)

avg = round(df['今日涨幅'].mean(), 2)
current = datetime.datetime.now().strftime('%Y-%m-%d')
title = '昨天涨停个股今天{}\n的平均涨幅{}\n'.format(current, avg)
try:
sender_139(title, title)
except Exception as e:
print(e)

# 昨日涨停今日的状态,今日涨停

def storedata(self):
zdt_content = self.getdata(self.zdt_url, headers=self.header_zdt)
logger.info('zdt Content' + zdt_content)
zdt_js = self.convert_json(zdt_content)
self.save_to_dataframe(zdt_js, self.zdt_indexx, 1, 'zdt')
time.sleep(0.5)
zrzt_content = self.getdata(self.zrzt_url, headers=self.header_zrzt)
logger.info('zrzt Content' + zdt_content)

zrzt_js = self.convert_json(zrzt_content)
self.save_to_dataframe(zrzt_js, self.zrzt_indexx, 2, 'zrzt')


if __name__ == '__main__':
# today='2018-04-16'
# 填补以前的数据
# x=pd.date_range('20170101','20180312')
# date_list = [datetime.datetime.strftime(i,'%Y%m%d') for i in list(pd.date_range('20170401','20171231'))

if is_holiday():
logger.info('Holiday')
exit()
logger.info("start")
obj = GetZDT()
obj.storedata()

 
原创。
转载请注明出处。
http://30daydo.com/article/295
 [/i][/i][/code] 
欢迎关注公众号:可转债量化分析
 

pandas中resample的how参数“ohlc”

李魔佛 发表了文章 • 2 个评论 • 16743 次浏览 • 2018-03-25 23:42 • 来自相关话题

这个ohlc对应的是股市中的open,high,low,close这几个价格。专门用于股票市场的分析。
比如我获取得到了一个股票从14年到现在的开盘,收盘,最高,最低等价格,然后我想对数据中的收盘价重新采样,转换成月数据。可以使用resample函数,参数中的how配合 ohlc。
 
获取原始数据:





 
提取收盘价





 
 
重新采样:





 
重新采样后获得的新数据:





 
可以看到现在的index是每个月的结束,而多了几列,close,open,high,low,这4列就是根据每个月的close价格而提取出来的,比如统计一月份的时候,一月份的收盘价会有一个最低和最高,最开始open1月1号和结束close的1月31号的价格。
 
 
原创文章
转载请注明出处:http://30daydo.com/article/288
  查看全部
这个ohlc对应的是股市中的open,high,low,close这几个价格。专门用于股票市场的分析。
比如我获取得到了一个股票从14年到现在的开盘,收盘,最高,最低等价格,然后我想对数据中的收盘价重新采样,转换成月数据。可以使用resample函数,参数中的how配合 ohlc。
 
获取原始数据:

Screenshot_from_2018-03-25_23-28-30.png

 
提取收盘价

Screenshot_from_2018-03-25_23-34-21.png

 
 
重新采样:

Screenshot_from_2018-03-25_23-34-55.png

 
重新采样后获得的新数据:

Screenshot_from_2018-03-25_23-35-25.png

 
可以看到现在的index是每个月的结束,而多了几列,close,open,high,low,这4列就是根据每个月的close价格而提取出来的,比如统计一月份的时候,一月份的收盘价会有一个最低和最高,最开始open1月1号和结束close的1月31号的价格。
 
 
原创文章
转载请注明出处:http://30daydo.com/article/288
 

可转债套利【一】 python找出折价可转债个股

李魔佛 发表了文章 • 9 个评论 • 19708 次浏览 • 2018-03-16 17:17 • 来自相关话题

关于可转债的定义,可以到https://xueqiu.com/6832369826/103042836 这里科普一下。
 
下面的内容默认你对可转债已经有一定的了解。
 
可转债的价值=正股价格/转股价格 + 利息,忽略可转债的利息,直接用公式 可转债的价值=正股价格/转股价格 计算可转债的价值。
 
如果当前可转债的交易价格(在交易软件上显示的价格)如:




所以万信转债的价格是121.5元,然后万信转债的价值呢? 按照上面的公式,万信转债的正股是万达信息,今天万达信息  (2018-03-16)的股价是





以收盘价为例,17.25。
 
而万信转债的股转价格呢? 这个可以到万信转债F10页面的公告中找到,为13.11元。 所以万信转债的价值是
17.25/13.11 = 1.315 , 可转债单位是100, 所以万信转债的内在价值是1.315*100=131.5, 而当前的交易价格为 121.5





 
 
也就是你用121.5元买到一个价值 131.5的商品, 所以相当于打折买到了一个超值的商品,所以当前的万信转债是折价状态。
 
所以本次任务就是要找出可交易的可转债中折价状态的可转债。
 
然后直接上干货。上python代码。#-*-coding=utf-8
'''
可转债监控
'''
import tushare as ts
from setting import get_engine
engine = get_engine('db_bond')
import pandas as pd
import datetime
class ConvertBond():

def __init__(self):
self.conn=ts.get_apis()
self.allBonds=ts.new_cbonds(pause=2)
self.onSellBond=self.allBonds.dropna(subset=['marketprice'])
self.today=datetime.datetime.now().strftime('%Y-%m-%d %H:%M')

def stockPrice(self,code):
stock_df = ts.get_realtime_quotes(code)
price = float(stock_df['price'].values[0])
return price

def dataframe(self):
price_list=
for code in self.onSellBond['scode']:
price_list.append(self.stockPrice(code))
self.onSellBond['stock_price']=price_list
self.onSellBond['ratio'] = (
self.onSellBond['marketprice']
/(self.onSellBond['stock_price'] / self.onSellBond['convprice'])-1)*100
self.onSellBond['Updated']=self.today
self.onSellBond.to_sql('tb_bond',engine,if_exists='replace')

def closed(self):
ts.close_apis(self.conn)

def main():
bond=ConvertBond()
bond.dataframe()
bond.closed()
if __name__=='__main__':
main()








 上面的setting库,把下面的*** 替换成你自己的Mysql用户和密码即可。import os
import MySQLdb
MYSQL_USER = *********
MYSQL_PASSWORD = ********
MYSQL_HOST = *********
MYSQL_PORT = *****

def get_engine(db):
engine = create_engine('mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(MYSQL_USER, MYSQL_PASSWORD, MYSQL_HOST, MYSQL_PORT, db))
return engine 
上面的少于100行的代码就能够满足你的要求。
运行后会把结果保存在MySQL 数据库。如下图所示:







点击放大
  2018-03-16 可转债表格
 
其中折价率是ratio列。按照ratio列进行排列,只有2个是正,也就是当前市场是只有2只可转债是处于折价状态的,其余的都是溢价状态(价格比内在价值要贵,忽略利息的前提下,如果把4~5%的利息也算进去的话,-3~4%的折价率其实也算小折价吧)
 
目前万信转债折价10个点,宝信转债折价5.8个点。 所以适合低风险投资者建仓。 因为可转债有兜底价格,所以出现亏损的概率很低(除非遇到黑天鹅,公司破产了,像遇到乐视这种PPT独角兽公司,欠债不还的。 但是A股上能够有资格发行可转债的,本身对公司的盈利,分红都有硬性要求)。
 
所以可以保存上面的代码,可以每天运行一次,可以很方便地找出折价的个股,当然也可以在盘中一直监测,因为可转债的价格是实时变化的,一旦遇到大跌,跌到折价状态,你也可以择时入手标的。

原文链接:
http://30daydo.com/article/286
转载请注明出处
 
可转债低费率,沪市百万分之二,深圳十万分之四,免五 开户
加微信开通

  查看全部
关于可转债的定义,可以到https://xueqiu.com/6832369826/103042836 这里科普一下。
 
下面的内容默认你对可转债已经有一定的了解。
 
可转债的价值=正股价格/转股价格 + 利息,忽略可转债的利息,直接用公式 可转债的价值=正股价格/转股价格 计算可转债的价值。
 
如果当前可转债的交易价格(在交易软件上显示的价格)如:
wxzz.GIF

所以万信转债的价格是121.5元,然后万信转债的价值呢? 按照上面的公式,万信转债的正股是万达信息,今天万达信息  (2018-03-16)的股价是

万达信息.GIF

以收盘价为例,17.25。
 
而万信转债的股转价格呢? 这个可以到万信转债F10页面的公告中找到,为13.11元。 所以万信转债的价值是
17.25/13.11 = 1.315 , 可转债单位是100, 所以万信转债的内在价值是1.315*100=131.5, 而当前的交易价格为 121.5

wxzz.GIF

 
 
也就是你用121.5元买到一个价值 131.5的商品, 所以相当于打折买到了一个超值的商品,所以当前的万信转债是折价状态。
 
所以本次任务就是要找出可交易的可转债中折价状态的可转债。
 
然后直接上干货。上python代码。
#-*-coding=utf-8
'''
可转债监控
'''
import tushare as ts
from setting import get_engine
engine = get_engine('db_bond')
import pandas as pd
import datetime
class ConvertBond():

def __init__(self):
self.conn=ts.get_apis()
self.allBonds=ts.new_cbonds(pause=2)
self.onSellBond=self.allBonds.dropna(subset=['marketprice'])
self.today=datetime.datetime.now().strftime('%Y-%m-%d %H:%M')

def stockPrice(self,code):
stock_df = ts.get_realtime_quotes(code)
price = float(stock_df['price'].values[0])
return price

def dataframe(self):
price_list=
for code in self.onSellBond['scode']:
price_list.append(self.stockPrice(code))
self.onSellBond['stock_price']=price_list
self.onSellBond['ratio'] = (
self.onSellBond['marketprice']
/(self.onSellBond['stock_price'] / self.onSellBond['convprice'])-1)*100
self.onSellBond['Updated']=self.today
self.onSellBond.to_sql('tb_bond',engine,if_exists='replace')

def closed(self):
ts.close_apis(self.conn)

def main():
bond=ConvertBond()
bond.dataframe()
bond.closed()
if __name__=='__main__':
main()








 上面的setting库,把下面的*** 替换成你自己的Mysql用户和密码即可。
import os
import MySQLdb
MYSQL_USER = *********
MYSQL_PASSWORD = ********
MYSQL_HOST = *********
MYSQL_PORT = *****

def get_engine(db):
engine = create_engine('mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(MYSQL_USER, MYSQL_PASSWORD, MYSQL_HOST, MYSQL_PORT, db))
return engine
 
上面的少于100行的代码就能够满足你的要求。
运行后会把结果保存在MySQL 数据库。如下图所示:


Screenshot_from_2018-03-28_09-14-35.png


点击放大
  2018-03-16 可转债表格
 
其中折价率是ratio列。按照ratio列进行排列,只有2个是正,也就是当前市场是只有2只可转债是处于折价状态的,其余的都是溢价状态(价格比内在价值要贵,忽略利息的前提下,如果把4~5%的利息也算进去的话,-3~4%的折价率其实也算小折价吧)
 
目前万信转债折价10个点,宝信转债折价5.8个点。 所以适合低风险投资者建仓。 因为可转债有兜底价格,所以出现亏损的概率很低(除非遇到黑天鹅,公司破产了,像遇到乐视这种PPT独角兽公司,欠债不还的。 但是A股上能够有资格发行可转债的,本身对公司的盈利,分红都有硬性要求)。
 
所以可以保存上面的代码,可以每天运行一次,可以很方便地找出折价的个股,当然也可以在盘中一直监测,因为可转债的价格是实时变化的,一旦遇到大跌,跌到折价状态,你也可以择时入手标的。

原文链接:
http://30daydo.com/article/286
转载请注明出处
 
可转债低费率,沪市百万分之二,深圳十万分之四,免五 开户
加微信开通

 

tushare 调用ts.get_apis() 后一直在运行无法退出

李魔佛 发表了文章 • 0 个评论 • 4750 次浏览 • 2018-03-16 00:47 • 来自相关话题

旧版本中运行ts.get_apis()后会一直在后台监听,但是在1.0.5的后续版本中,你可以手工中断这个后台监听,从而让你的程序可以正常退出。
 
conn=ts.get_apis()
......
 
在你的程序退出前,运行
ts.close_apis(conn)
 
这样你的程序就能够正常退出。 查看全部
旧版本中运行ts.get_apis()后会一直在后台监听,但是在1.0.5的后续版本中,你可以手工中断这个后台监听,从而让你的程序可以正常退出。
 
conn=ts.get_apis()
......
 
在你的程序退出前,运行
ts.close_apis(conn)
 
这样你的程序就能够正常退出。

【量化选股】A股上有哪些东北股(排雷)?

李魔佛 发表了文章 • 0 个评论 • 3360 次浏览 • 2018-01-31 01:09 • 来自相关话题

上一篇文章中写道,东北企业由于本地特色,会存在一定的造假风险,所以需要在选股的时候排除东北的A股上市企业。
 
打开jupyter notebook。然后输入下面的代码:





 
上面可以获得A股上市公司所有区域的分布。果然刘士余上台后,浙江地区的企业一下子超越广东,成为A股最多公司的省份(当然,这里的广东是把深圳给单独分离出去了),浙江有418个上市公司。
 
然后根据条件筛选列area,选出辽宁,吉林,黑龙江的企业。





共有152家上市公司。截止2018-01-30日。
列表太长没有显示完整,贴在附件里面供大家参考(排雷)。
 
原文地址:http://30daydo.com/article/271
转载请注明出处 查看全部
上一篇文章中写道,东北企业由于本地特色,会存在一定的造假风险,所以需要在选股的时候排除东北的A股上市企业。
 
打开jupyter notebook。然后输入下面的代码:

area.GIF

 
上面可以获得A股上市公司所有区域的分布。果然刘士余上台后,浙江地区的企业一下子超越广东,成为A股最多公司的省份(当然,这里的广东是把深圳给单独分离出去了),浙江有418个上市公司。
 
然后根据条件筛选列area,选出辽宁,吉林,黑龙江的企业。

area1.GIF

共有152家上市公司。截止2018-01-30日。
列表太长没有显示完整,贴在附件里面供大家参考(排雷)。
 
原文地址:http://30daydo.com/article/271
转载请注明出处