通知设置 新通知
np.empty() 函数的用法 (有坑)
李魔佛 发表了文章 • 0 个评论 • 40925 次浏览 • 2018-11-20 11:36
但是实际结果返回: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
查看全部
但是实际结果返回:
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 个评论 • 5584 次浏览 • 2018-10-28 17:54
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 个评论 • 6949 次浏览 • 2018-10-24 14:34
最近居然被元神拉黑了。因为帖子不知道被哪位挖坟,估计被元神看到了。
重新跑了下原来的代码,还能跑通,看来雪球并没有改动什么代码。但是雪球经历了一波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
个人公众号: 查看全部
最近居然被元神拉黑了。因为帖子不知道被哪位挖坟,估计被元神看到了。
重新跑了下原来的代码,还能跑通,看来雪球并没有改动什么代码。但是雪球经历了一波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
个人公众号:

np.asfarray的用法
李魔佛 发表了文章 • 0 个评论 • 8090 次浏览 • 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 个评论 • 6053 次浏览 • 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)的所有数据,如果是次新股,那么数据就是上市当天到今天的数据。
抓取到的数据包含以下的字段:
点击查看大图
但是实际用到的字段只有几个, 开盘价,最高价,涨幅,昨天收盘价。
这里我排除了一字板开盘的个股,因为里面含有新股,会导致数据不精确,【后续我会统计,一字板开盘盘中被砸开的概率】,而且数据也排除了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 个评论 • 11771 次浏览 • 2018-06-02 10:47
(点击查看大图)
今日的涨停信息
(点击查看大图)
昨日涨停的今天信息
还有自动生成的K线图:
(点击查看大图)
有兴趣的朋友可以留言获取上述数据
原创文章
转载请注明出处:http://30daydo.com/article/316 查看全部
(点击查看大图)
今日的涨停信息
(点击查看大图)
昨日涨停的今天信息
还有自动生成的K线图:
(点击查看大图)
有兴趣的朋友可以留言获取上述数据
原创文章
转载请注明出处:http://30daydo.com/article/316
正常退出tushare
李魔佛 发表了文章 • 1 个评论 • 3655 次浏览 • 2018-05-07 21:31
查看源码知道ts.get_api() 里面使用了多线程,程序一直在循环等待。 如果按ctrl + c,是无法正常终止tushare在后台的调用,需要使用ts.close_api(conn), 才能终止掉后台的多线程,这个时候程序才能正常退出,释放系统资源。
原创文章
转载请注明出处:http://30daydo.com/article/308
查看全部
查看源码知道ts.get_api() 里面使用了多线程,程序一直在循环等待。 如果按ctrl + c,是无法正常终止tushare在后台的调用,需要使用ts.close_api(conn), 才能终止掉后台的多线程,这个时候程序才能正常退出,释放系统资源。
原创文章
转载请注明出处:http://30daydo.com/article/308
使用优矿获取股市的基本数据 实例操作
李魔佛 发表了文章 • 1 个评论 • 4816 次浏览 • 2018-05-06 22:44
DataAPI.MktRANKInstTrGet
行业名称,如:传媒,电气设备等,可多值输入,以下为申万28个行业名称:休闲服务,房地产,商业贸易,综合,钢铁,农林牧渔,食品饮料,采掘,电子,国防军工,通信,公用事业,交通运输,轻工制造,计算机,电气设备,家用电器,医药生物,传媒,非银金融,汽车,有色金属,机械设备,建筑材料,化工,纺织服装,银行,建筑装饰,可以是列表,可空
实例
原创文章
转载请注明出处:http://30daydo.com/article/306
查看全部
DataAPI.MktRANKInstTrGet
行业名称,如:传媒,电气设备等,可多值输入,以下为申万28个行业名称:休闲服务,房地产,商业贸易,综合,钢铁,农林牧渔,食品饮料,采掘,电子,国防军工,通信,公用事业,交通运输,轻工制造,计算机,电气设备,家用电器,医药生物,传媒,非银金融,汽车,有色金属,机械设备,建筑材料,化工,纺织服装,银行,建筑装饰,可以是列表,可空
实例
原创文章
转载请注明出处:http://30daydo.com/article/306
python获取涨停板历史数据
李魔佛 发表了文章 • 18 个评论 • 16613 次浏览 • 2018-04-23 20:33
这个数据可以用来后续的大数据分析,比如统计每天涨停板的数目和大盘指数的相关性,涨停打开次数与当日人气的强弱的关系。
点击查看大图
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]
欢迎关注公众号:可转债量化分析
查看全部
这个数据可以用来后续的大数据分析,比如统计每天涨停板的数目和大盘指数的相关性,涨停打开次数与当日人气的强弱的关系。
点击查看大图
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 个评论 • 14095 次浏览 • 2018-03-25 23:42
比如我获取得到了一个股票从14年到现在的开盘,收盘,最高,最低等价格,然后我想对数据中的收盘价重新采样,转换成月数据。可以使用resample函数,参数中的how配合 ohlc。
获取原始数据:
提取收盘价
重新采样:
重新采样后获得的新数据:
可以看到现在的index是每个月的结束,而多了几列,close,open,high,low,这4列就是根据每个月的close价格而提取出来的,比如统计一月份的时候,一月份的收盘价会有一个最低和最高,最开始open1月1号和结束close的1月31号的价格。
原创文章
转载请注明出处:http://30daydo.com/article/288
查看全部
比如我获取得到了一个股票从14年到现在的开盘,收盘,最高,最低等价格,然后我想对数据中的收盘价重新采样,转换成月数据。可以使用resample函数,参数中的how配合 ohlc。
获取原始数据:
提取收盘价
重新采样:
重新采样后获得的新数据:
可以看到现在的index是每个月的结束,而多了几列,close,open,high,low,这4列就是根据每个月的close价格而提取出来的,比如统计一月份的时候,一月份的收盘价会有一个最低和最高,最开始open1月1号和结束close的1月31号的价格。
原创文章
转载请注明出处:http://30daydo.com/article/288
可转债套利【一】 python找出折价可转债个股
李魔佛 发表了文章 • 9 个评论 • 17510 次浏览 • 2018-03-16 17:17
下面的内容默认你对可转债已经有一定的了解。
可转债的价值=正股价格/转股价格 + 利息,忽略可转债的利息,直接用公式 可转债的价值=正股价格/转股价格 计算可转债的价值。
如果当前可转债的交易价格(在交易软件上显示的价格)如:
所以万信转债的价格是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
转载请注明出处
可转债低费率,沪市百万分之二,深圳十万分之四,免五 开户
加微信开通
查看全部
下面的内容默认你对可转债已经有一定的了解。
可转债的价值=正股价格/转股价格 + 利息,忽略可转债的利息,直接用公式 可转债的价值=正股价格/转股价格 计算可转债的价值。
如果当前可转债的交易价格(在交易软件上显示的价格)如:
所以万信转债的价格是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
转载请注明出处
可转债低费率,沪市百万分之二,深圳十万分之四,免五 开户
加微信开通

tushare 调用ts.get_apis() 后一直在运行无法退出
李魔佛 发表了文章 • 0 个评论 • 3879 次浏览 • 2018-03-16 00:47
conn=ts.get_apis()
......
在你的程序退出前,运行
ts.close_apis(conn)
这样你的程序就能够正常退出。 查看全部
conn=ts.get_apis()
......
在你的程序退出前,运行
ts.close_apis(conn)
这样你的程序就能够正常退出。
【量化选股】A股上有哪些东北股(排雷)?
李魔佛 发表了文章 • 0 个评论 • 2763 次浏览 • 2018-01-31 01:09
打开jupyter notebook。然后输入下面的代码:
上面可以获得A股上市公司所有区域的分布。果然刘士余上台后,浙江地区的企业一下子超越广东,成为A股最多公司的省份(当然,这里的广东是把深圳给单独分离出去了),浙江有418个上市公司。
然后根据条件筛选列area,选出辽宁,吉林,黑龙江的企业。
共有152家上市公司。截止2018-01-30日。
列表太长没有显示完整,贴在附件里面供大家参考(排雷)。
原文地址:http://30daydo.com/article/271
转载请注明出处 查看全部
打开jupyter notebook。然后输入下面的代码:
上面可以获得A股上市公司所有区域的分布。果然刘士余上台后,浙江地区的企业一下子超越广东,成为A股最多公司的省份(当然,这里的广东是把深圳给单独分离出去了),浙江有418个上市公司。
然后根据条件筛选列area,选出辽宁,吉林,黑龙江的企业。
共有152家上市公司。截止2018-01-30日。
列表太长没有显示完整,贴在附件里面供大家参考(排雷)。
原文地址:http://30daydo.com/article/271
转载请注明出处
python获取A股上市公司的盈利能力
李魔佛 发表了文章 • 0 个评论 • 5449 次浏览 • 2018-01-04 16:09
比如企业的盈利能力。
import tushare as ts
#获取2017年第3季度的盈利能力数据
ts.get_profit_data(2017,3)返回的结果:
按年度、季度获取盈利能力数据,结果返回的数据属性说明如下:
code,代码
name,名称
roe,净资产收益率(%)
net_profit_ratio,净利率(%)
gross_profit_rate,毛利率(%)
net_profits,净利润(百万元) #这里的官网信息有误,单位应该是百万
esp,每股收益
business_income,营业收入(百万元)
bips,每股主营业务收入(元)
例如返回如下结果:
code name roe net_profit_ratio gross_profit_rate net_profits \
000717 韶钢松山 79.22 9.44 14.1042 1750.2624
600793 宜宾纸业 65.40 13.31 7.9084 100.6484
600306 商业城 63.19 18.55 17.8601 114.9175
000526 *ST紫学 61.03 2.78 31.1212 63.6477
600768 宁波富邦 57.83 14.95 2.7349 88.3171
原创,转载请注明:
http://30daydo.com/article/260
查看全部
比如企业的盈利能力。
import tushare as ts返回的结果:
#获取2017年第3季度的盈利能力数据
ts.get_profit_data(2017,3)
按年度、季度获取盈利能力数据,结果返回的数据属性说明如下:
code,代码
name,名称
roe,净资产收益率(%)
net_profit_ratio,净利率(%)
gross_profit_rate,毛利率(%)
net_profits,净利润(百万元) #这里的官网信息有误,单位应该是百万
esp,每股收益
business_income,营业收入(百万元)
bips,每股主营业务收入(元)
例如返回如下结果:
code name roe net_profit_ratio gross_profit_rate net_profits \
000717 韶钢松山 79.22 9.44 14.1042 1750.2624
600793 宜宾纸业 65.40 13.31 7.9084 100.6484
600306 商业城 63.19 18.55 17.8601 114.9175
000526 *ST紫学 61.03 2.78 31.1212 63.6477
600768 宁波富邦 57.83 14.95 2.7349 88.3171
原创,转载请注明:
http://30daydo.com/article/260
python获取股票年涨跌幅排名
李魔佛 发表了文章 • 4 个评论 • 7363 次浏览 • 2017-12-30 23:11
作为年终回顾,首先看看A股市场2017的总体涨跌幅排名。
下面函数是用来获取个股某个时间段的涨跌幅。code是股票代码,start为开始时间段,end为结束时间段。def profit(code,start,end):
try:
df=ts.get_k_data(code,start=start,end=end)
except Exception,e:
print e
return None
try:
p=(df['close'].iloc[-1]-df['close'].iloc[0])/df['close'].iloc[0]*100.00
except Exception,e:
print e
return None
return round(p,2)
如果要获取华大基因的2017年涨幅,可以使用profit('300678','2016-12-31','2017-12-31')
需要注意的是,需要添加一个except的异常处理,因为部分个股停牌时间超过一年,所以该股的收盘价都是空的,这种情况就返回一个None值,在dataframe里就是NaN。
剩下了的就是枚举所有A股的个股代码了,然后把遍历所有代码,调用profit函数即可。def price_change():
basic=ts.get_stock_basics()
pro=
for code in basic.index.values:
print code
p=profit(code,'2016-12-31','2017-12-31')
pro.append(p)
basic['price_change']=pro
basic.to_csv('2017_all_price_change.xls',encoding='gbk')
df=pd.read_csv('2017_all_price_change.xls',encoding='gbk')
df.to_excel('2017_all_price_change.xls',encoding='gbk')
结果保存到2017_all_price_change.xls中,里面有个股的基本信息,还追加了一列2017年的涨跌幅,price_change
最后我们把price_change按照从高到低进行排序。 看看哪些个股排名靠前。def analysis():
df=pd.read_excel('2017_all_price_change.xls',encoding='gbk')
df=df.sort_values(by='price_change',ascending=False)
df.to_excel('2017-year.xls',encoding='gbk')
最终保存的文件为2017-year.xls,当然你也可以保存到mysql的数据库当中。engine=get_engine('stock')
df.to_sql('2017years',engine)
其中get_engine() 函数如下定义:def get_engine(db):
engine = create_engine('mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(MYSQL_USER, MYSQL_PASSWORD, MYSQL_HOST, MYSQL_PORT, db))
return engine
只需要把你的mysql数据库的用户名密码等变量加上去就可以了。
最终的结果如下:
点击查看大图
附件是导出来的excel格式的数据,你们可以拿去参考。
下一篇我们来学习统计个股的信息,比如哪类股涨得好,哪类股具有相关性,哪类股和大盘走向类似等等。
原文链接:http://30daydo.com/article/258
转载请注明出处
附件
2017-year.zip
查看全部
作为年终回顾,首先看看A股市场2017的总体涨跌幅排名。
下面函数是用来获取个股某个时间段的涨跌幅。code是股票代码,start为开始时间段,end为结束时间段。
def profit(code,start,end):
try:
df=ts.get_k_data(code,start=start,end=end)
except Exception,e:
print e
return None
try:
p=(df['close'].iloc[-1]-df['close'].iloc[0])/df['close'].iloc[0]*100.00
except Exception,e:
print e
return None
return round(p,2)
如果要获取华大基因的2017年涨幅,可以使用
profit('300678','2016-12-31','2017-12-31')
需要注意的是,需要添加一个except的异常处理,因为部分个股停牌时间超过一年,所以该股的收盘价都是空的,这种情况就返回一个None值,在dataframe里就是NaN。
剩下了的就是枚举所有A股的个股代码了,然后把遍历所有代码,调用profit函数即可。
def price_change():
basic=ts.get_stock_basics()
pro=
for code in basic.index.values:
print code
p=profit(code,'2016-12-31','2017-12-31')
pro.append(p)
basic['price_change']=pro
basic.to_csv('2017_all_price_change.xls',encoding='gbk')
df=pd.read_csv('2017_all_price_change.xls',encoding='gbk')
df.to_excel('2017_all_price_change.xls',encoding='gbk')
结果保存到2017_all_price_change.xls中,里面有个股的基本信息,还追加了一列2017年的涨跌幅,price_change
最后我们把price_change按照从高到低进行排序。 看看哪些个股排名靠前。
def analysis():
df=pd.read_excel('2017_all_price_change.xls',encoding='gbk')
df=df.sort_values(by='price_change',ascending=False)
df.to_excel('2017-year.xls',encoding='gbk')
最终保存的文件为2017-year.xls,当然你也可以保存到mysql的数据库当中。
engine=get_engine('stock')
df.to_sql('2017years',engine)
其中get_engine() 函数如下定义:
def get_engine(db):
engine = create_engine('mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(MYSQL_USER, MYSQL_PASSWORD, MYSQL_HOST, MYSQL_PORT, db))
return engine
只需要把你的mysql数据库的用户名密码等变量加上去就可以了。
最终的结果如下:
点击查看大图
附件是导出来的excel格式的数据,你们可以拿去参考。
下一篇我们来学习统计个股的信息,比如哪类股涨得好,哪类股具有相关性,哪类股和大盘走向类似等等。
原文链接:http://30daydo.com/article/258
转载请注明出处
附件