《利用python进行数据分析》 学习笔记

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

Series
pandas的数组是没有逗号的 ['a' 'b' 'c' 'd' 'e']

r=Series([1,3,5,7,9],index=['A','B','C','D','E'])
print r
print r.index
r.reindex(['B','C''D','E','A'])

重新按照index进行排序
print r[['A','D']] #需要用两个中括号 才能正确地引用你说需要的值
 
字典操作:
print ‘A' in r
返回的是True或者False
可以用字典直接生成 Series
dict={"Username":"Rocky","Sex":"Male","Country":"China","Langauge":"Chinese"}
t=Series(dict)
print t
t.isnull()
判断是否为空
Series 的index可以随时就修改
t.index = ["AAA","DDD","DD","DE"]


DataFrame
默认会给你0,1,2,3,4 的index和columns
创建方法:
data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada'], 'year': [2000, 2001, 2002, 2001, 2002],'pop': [1.5, 1.7, 3.6, 2.4, 2.9]}
df=pd.DataFrame(data)
print df
访问一整列的方法:
print df['year']
print df.year
修改整列 df[’year‘]= 2017
或者使用 Series 来赋值
为不存在的列赋值会创建出一个新列。关 键字del用于删除列
根据列 重新索引
col=["year','states','pop']
df.reindex(colunms=col)
这时会重新按照列进行索引。
当然也可以同时进行索引。

df[df>5]=0
将df中大于5的元素清零
用于行操作时,需要用ix,这也是一种重新索引的方法。
获取某一行:
df.irow(x)
获取某一列:
df.icol(x)
上面的x都是整数,按照实际的行列进行获取
修改某一个值:
df.ix[3, 'a'] = 88
排序:
sort_index() 按照字母表排序,或者 数字大小, 日期
如果想要按照列进行排列, sort_index(axis=1) 默认按照index 也就是行标进行排序。
按照某一列排序 sort_values(by="a"), 如果需要按照多列 就 使用 sort_values(by=['a','b']

文件读取与存储/数据库
pd.read_table(文件名,sep=",") 以,为分隔符读取数据。 如果文件没有标题栏,可以使用header=None来制定,就是columns的值为空。 或者手动制定一个 names=xxx
如果要制定index为某列,可以index_col=“xx”
skiprow 可以帮助跳过第几行。

合并操作:

合并列
pd.merge(df1,df2)
merge重复的的值。 默认做的是交集: inner, 并集是outer, pd.merge(df1,df2,how=outer)
df1.join(df2)
行合并:
df.append(df2[:2]) index 不会变,df的值也不变,返回的值才是append之后的值
pd.concat( [ df1, df2 ] )
index重新排序。 注意格式


排序 df.groupby("Weather") #按照某一列进行排序
weather_group=df.groupby("Weather")
返回一个列表元组: for name, group in weather_group:
weather_group.first() 返回每一组分组中第一行
weather_group.last() 返回第一组分组中的最后一行
多行排序: df.groupby(['A','B'])
记住数据是Series还是DataFrame的 !

从csv文件读入,设置index 用 pd.read_csv(filename, index_col="XXXXX")
或者new_df= df.set_index('XXXX')



利用python进行数据分析
PDF电子书完整版 百度网盘下载
http://pan.baidu.com/s/1pLm7hAb 
密码:pvi4



  查看全部
Series
pandas的数组是没有逗号的 ['a' 'b' 'c' 'd' 'e']

r=Series([1,3,5,7,9],index=['A','B','C','D','E'])
print r
print r.index
r.reindex(['B','C''D','E','A'])

重新按照index进行排序
print r[['A','D']] #需要用两个中括号 才能正确地引用你说需要的值
 
字典操作:
print ‘A' in r
返回的是True或者False
可以用字典直接生成 Series
dict={"Username":"Rocky","Sex":"Male","Country":"China","Langauge":"Chinese"}
t=Series(dict)
print t
t.isnull()
判断是否为空
Series 的index可以随时就修改
t.index = ["AAA","DDD","DD","DE"]


DataFrame
默认会给你0,1,2,3,4 的index和columns
创建方法:
data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada'], 'year': [2000, 2001, 2002, 2001, 2002],'pop': [1.5, 1.7, 3.6, 2.4, 2.9]}
df=pd.DataFrame(data)
print df
访问一整列的方法:
print df['year']
print df.year
修改整列 df[’year‘]= 2017
或者使用 Series 来赋值
为不存在的列赋值会创建出一个新列。关 键字del用于删除列
根据列 重新索引
col=["year','states','pop']
df.reindex(colunms=col)
这时会重新按照列进行索引。
当然也可以同时进行索引。

df[df>5]=0
将df中大于5的元素清零
用于行操作时,需要用ix,这也是一种重新索引的方法。
获取某一行:
df.irow(x)
获取某一列:
df.icol(x)
上面的x都是整数,按照实际的行列进行获取
修改某一个值:
df.ix[3, 'a'] = 88
排序:
sort_index() 按照字母表排序,或者 数字大小, 日期
如果想要按照列进行排列, sort_index(axis=1) 默认按照index 也就是行标进行排序。
按照某一列排序 sort_values(by="a"), 如果需要按照多列 就 使用 sort_values(by=['a','b']

文件读取与存储/数据库
pd.read_table(文件名,sep=",") 以,为分隔符读取数据。 如果文件没有标题栏,可以使用header=None来制定,就是columns的值为空。 或者手动制定一个 names=xxx
如果要制定index为某列,可以index_col=“xx”
skiprow 可以帮助跳过第几行。

合并操作:

合并列
pd.merge(df1,df2)
merge重复的的值。 默认做的是交集: inner, 并集是outer, pd.merge(df1,df2,how=outer)
df1.join(df2)
行合并:
df.append(df2[:2]) index 不会变,df的值也不变,返回的值才是append之后的值
pd.concat( [ df1, df2 ] )
index重新排序。 注意格式


排序 df.groupby("Weather") #按照某一列进行排序
weather_group=df.groupby("Weather")
返回一个列表元组: for name, group in weather_group:
weather_group.first() 返回每一组分组中第一行
weather_group.last() 返回第一组分组中的最后一行
多行排序: df.groupby(['A','B'])
记住数据是Series还是DataFrame的 !

从csv文件读入,设置index 用 pd.read_csv(filename, index_col="XXXXX")
或者new_df= df.set_index('XXXX')



利用python进行数据分析
PDF电子书完整版 百度网盘下载
http://pan.baidu.com/s/1pLm7hAb 
密码:pvi4



 

dataframe按照条件删除行

李魔佛 发表了文章 • 0 个评论 • 10723 次浏览 • 2016-09-22 01:51 • 来自相关话题

#存储每天 涨幅排行榜,避免每次读取耗时过长
        filename=self.today+'.xls'
        filename=os.path.join(os.getcwd(),filename)
        if not os.path.exists(filename):
            self.df_today_all=ts.get_today_all()
            #过滤停牌的
            self.df_today_all.drop(self.df_today_all[self.df_today_all['turnoverratio']==0].index,inplace=True)
            #实测可用,删除的方法
            #n1=self.df_today_all[self.df_today_all['turnoverratio']==0]
            #n2=self.df_today_all.drop(n1.index)
            #print n2
            print self.df_today_all
            self.df_today_all.to_excel(filename)
        else:
            self.df_today_all=pd.read_excel(filename)
            print self.df_today_all 查看全部
#存储每天 涨幅排行榜,避免每次读取耗时过长
        filename=self.today+'.xls'
        filename=os.path.join(os.getcwd(),filename)
        if not os.path.exists(filename):
            self.df_today_all=ts.get_today_all()
            #过滤停牌的
            self.df_today_all.drop(self.df_today_all[self.df_today_all['turnoverratio']==0].index,inplace=True)
            #实测可用,删除的方法
            #n1=self.df_today_all[self.df_today_all['turnoverratio']==0]
            #n2=self.df_today_all.drop(n1.index)
            #print n2
            print self.df_today_all
            self.df_today_all.to_excel(filename)
        else:
            self.df_today_all=pd.read_excel(filename)
            print self.df_today_all

说实话,没觉得德州扑克有什么好玩的

回复

李魔佛 发起了问题 • 1 人关注 • 0 个回复 • 3806 次浏览 • 2016-08-05 00:48 • 来自相关话题

如何使用pandas把某些行的数据进行算术处理?

回复

李魔佛 发起了问题 • 1 人关注 • 0 个回复 • 5828 次浏览 • 2016-07-28 15:35 • 来自相关话题

tushare 源码分析 之 fundamental.py

李魔佛 发表了文章 • 0 个评论 • 14572 次浏览 • 2016-07-22 08:56 • 来自相关话题

python的tushare用来做数据分析是一个不错的工具。
 
下面来具体看看里面的一些具体的函数是怎么实现的。
 
fundamental.py  这个文件是获取企业的基本面信息的。 
 
比如 在主程序 main中,import tushare as ts
df=ts.get_stock_basics()那么我们来看看get_stock_basics函数的实现。def get_stock_basics():
"""
获取沪深上市公司基本情况
Return
--------
DataFrame
code,代码
name,名称
industry,细分行业
area,地区
pe,市盈率
outstanding,流通股本
totals,总股本(万)
totalAssets,总资产(万)
liquidAssets,流动资产
fixedAssets,固定资产
reserved,公积金
reservedPerShare,每股公积金
eps,每股收益
bvps,每股净资
pb,市净率
timeToMarket,上市日期
"""
request = Request(ct.ALL_STOCK_BASICS_FILE)
text = urlopen(request, timeout=10).read()
text = text.decode('GBK')
text = text.replace('--', '')
df = pd.read_csv(StringIO(text), dtype={'code':'object'})
df = df.set_index('code')
return df
上面通过urlib2的Request函数获取url的信息,然后保存为df格式然后返回。
url路径在这个变量里面: 
ct.ALL_STOCK_BASICS_FILE
 
跳转到这个变量





 
ALL_STOCK_BASICS_FILE = '%s%s/static/all.csv'%(P_TYPE['http'], DOMAINS['oss'])
 
P_TYPE 和DOMAINS 是字典变量, 在同一个文件内可以找到他们的值:P_TYPE = {'http': 'http://', 'ftp': 'ftp://'}

DOMAINS = {'sina': 'sina.com.cn', 'sinahq': 'sinajs.cn',
'ifeng': 'ifeng.com', 'sf': 'finance.sina.com.cn',
'vsf': 'vip.stock.finance.sina.com.cn',
'idx': 'www.csindex.com.cn', '163': 'money.163.com',
'em': 'eastmoney.com', 'sseq': 'query.sse.com.cn',
'sse': 'www.sse.com.cn', 'szse': 'www.szse.cn',
'oss': '218.244.146.57', 'idxip':'115.29.204.48',
'shibor': 'www.shibor.org', 'mbox':'www.cbooo.cn'}
 
然后把上面的字典值抽取出来:
 
那么url就是 http://218.244.146.57/static/all.csv , 你可以试试在浏览器里直接输入。 看到了吗?
可以直接下载一个all.csv格式的文件,打开后可以看到里面很多企业基本面的信息。
 






 
 
获取业绩报表
def get_report_data(year, quarter):
    """
        获取业绩报表数据
    Parameters
    --------
    year:int 年度 e.g:2014
    quarter:int 季度 :1、2、3、4,只能输入这4个季度
       说明:由于是从网站获取的数据,需要一页页抓取,速度取决于您当前网络速度
       
    Return
    --------
    DataFrame
        code,代码
        name,名称
        eps,每股收益
        eps_yoy,每股收益同比(%)
        bvps,每股净资产
        roe,净资产收益率(%)
        epcf,每股现金流量(元)
        net_profits,净利润(万元)
        profits_yoy,净利润同比(%)
        distrib,分配方案
        report_date,发布日期
    """
 
函数主要通过 request = Request(url) 在财经网站获取信息。request = Request(ct.REPORT_URL%(ct.P_TYPE['http'], ct.DOMAINS['vsf'], ct.PAGES['fd'],year, quarter, pageNo, ct.PAGE_NUM[1]))
text = urlopen(request, timeout=10).read()
Request里面的参数是一个可变量,通过循环的列表来获取所有的公司业绩报表。
通过定位参数里的变量,可以得到随意一个url, 比如 REPORT_URL = '%s%s/q/go.php/vFinanceAnalyze/kind/mainindex/%s?s_i=&s_a=&s_c=&reportdate=%s&quarter=%s&p=%s&num=%s'
 
那么url =http://vip.stock.finance.sina.com.cn/q/go.php/vFinanceAnalyze/kind/mainindex/index.phtml?s_i=&s_a=&s_c=&reportdate=2014&quarter=1&p=1&num=38
 
那么直接在浏览器输入看看 是什么数据
 





 
看到了2014年第一节度的每个公司的业绩(因为有些是新股,所以2014的数据显示不全)
 
 
注意 df=ts.get_report_data(2016,4)
#第四季度就是年报
 根据作者的意思,这个参数写4就是年报。 (可以自己根据网址内容去到新浪财经去验证)

新版tushare注册码
https://tushare.pro/register?reg=217168 
注册后送积分,只有足够的积分才能够调用一些高权限的接口

待续。 查看全部
python的tushare用来做数据分析是一个不错的工具。
 
下面来具体看看里面的一些具体的函数是怎么实现的。
 
fundamental.py  这个文件是获取企业的基本面信息的。 
 
比如 在主程序 main中,
import tushare as ts
df=ts.get_stock_basics()
那么我们来看看get_stock_basics函数的实现。
def get_stock_basics():
"""
获取沪深上市公司基本情况
Return
--------
DataFrame
code,代码
name,名称
industry,细分行业
area,地区
pe,市盈率
outstanding,流通股本
totals,总股本(万)
totalAssets,总资产(万)
liquidAssets,流动资产
fixedAssets,固定资产
reserved,公积金
reservedPerShare,每股公积金
eps,每股收益
bvps,每股净资
pb,市净率
timeToMarket,上市日期
"""
request = Request(ct.ALL_STOCK_BASICS_FILE)
text = urlopen(request, timeout=10).read()
text = text.decode('GBK')
text = text.replace('--', '')
df = pd.read_csv(StringIO(text), dtype={'code':'object'})
df = df.set_index('code')
return df

上面通过urlib2的Request函数获取url的信息,然后保存为df格式然后返回。
url路径在这个变量里面: 
ct.ALL_STOCK_BASICS_FILE
 
跳转到这个变量

goto.png

 
ALL_STOCK_BASICS_FILE = '%s%s/static/all.csv'%(P_TYPE['http'], DOMAINS['oss'])
 
P_TYPE 和DOMAINS 是字典变量, 在同一个文件内可以找到他们的值:
P_TYPE = {'http': 'http://', 'ftp': 'ftp://'}

DOMAINS = {'sina': 'sina.com.cn', 'sinahq': 'sinajs.cn',
'ifeng': 'ifeng.com', 'sf': 'finance.sina.com.cn',
'vsf': 'vip.stock.finance.sina.com.cn',
'idx': 'www.csindex.com.cn', '163': 'money.163.com',
'em': 'eastmoney.com', 'sseq': 'query.sse.com.cn',
'sse': 'www.sse.com.cn', 'szse': 'www.szse.cn',
'oss': '218.244.146.57', 'idxip':'115.29.204.48',
'shibor': 'www.shibor.org', 'mbox':'www.cbooo.cn'}

 
然后把上面的字典值抽取出来:
 
那么url就是 http://218.244.146.57/static/all.csv , 你可以试试在浏览器里直接输入。 看到了吗?
可以直接下载一个all.csv格式的文件,打开后可以看到里面很多企业基本面的信息。
 

allcsv.PNG


 
 
获取业绩报表
def get_report_data(year, quarter):
    """
        获取业绩报表数据
    Parameters
    --------
    year:int 年度 e.g:2014
    quarter:int 季度 :1、2、3、4,只能输入这4个季度
       说明:由于是从网站获取的数据,需要一页页抓取,速度取决于您当前网络速度
       
    Return
    --------
    DataFrame
        code,代码
        name,名称
        eps,每股收益
        eps_yoy,每股收益同比(%)
        bvps,每股净资产
        roe,净资产收益率(%)
        epcf,每股现金流量(元)
        net_profits,净利润(万元)
        profits_yoy,净利润同比(%)
        distrib,分配方案
        report_date,发布日期
    """
 
函数主要通过 request = Request(url) 在财经网站获取信息。
request = Request(ct.REPORT_URL%(ct.P_TYPE['http'], ct.DOMAINS['vsf'], ct.PAGES['fd'],year, quarter, pageNo, ct.PAGE_NUM[1]))
text = urlopen(request, timeout=10).read()

Request里面的参数是一个可变量,通过循环的列表来获取所有的公司业绩报表。
通过定位参数里的变量,可以得到随意一个url, 比如 REPORT_URL = '%s%s/q/go.php/vFinanceAnalyze/kind/mainindex/%s?s_i=&s_a=&s_c=&reportdate=%s&quarter=%s&p=%s&num=%s'
 
那么url =http://vip.stock.finance.sina.com.cn/q/go.php/vFinanceAnalyze/kind/mainindex/index.phtml?s_i=&s_a=&s_c=&reportdate=2014&quarter=1&p=1&num=38
 
那么直接在浏览器输入看看 是什么数据
 

财报.PNG

 
看到了2014年第一节度的每个公司的业绩(因为有些是新股,所以2014的数据显示不全)
 
 
注意
        df=ts.get_report_data(2016,4)
#第四季度就是年报

 根据作者的意思,这个参数写4就是年报。 (可以自己根据网址内容去到新浪财经去验证)

新版tushare注册码
https://tushare.pro/register?reg=217168 
注册后送积分,只有足够的积分才能够调用一些高权限的接口

待续。

30天学会量化交易模型 Day05

李魔佛 发表了文章 • 7 个评论 • 12804 次浏览 • 2016-07-19 22:52 • 来自相关话题

tushare数据写入SQLite
 这一节 我们学习如何把得到的数据写入数据库。
 
虽然也可以写入excel或者json,不过考虑到后面用的的排序和其他python脚本的调用,最后选择了轻量级的数据库SQLiite作为首选。# -*-coding=utf-8-*-
#数据库的操作
'''
http://30daydo.com
weigesysu@qq.com
'''
import sqlite3, time, datetime

__author__ = 'rocky'


class SqliteDb():


def __init__(self,dbtable):
'''
self.today = time.strftime("%Y-%m-%d")
self.DBname = self.today + '.db'
self.conn = sqlite3.connect(self.DBname)
'''
today = time.strftime("%Y-%m-%d")
DBname = today + '.db'
self.conn = sqlite3.connect(DBname)
self.dbtable=dbtable
create_tb = "CREATE TABLE %s (date varchar(10),id varchar(6), name varchar(30), p_change REAL,turnover REAL);" %self.dbtable
self.conn.execute(create_tb)
self.conn.commit()

def store_break_high(self,price_high_data):

#data 是创新高的个股信息 dataframe
#print today
#create_tb = 'CREATE TABLE STOCK (date TEXT,id text PRIMARY KEY, p_change REAL,turnover REAL);'

#conn.commit()
#print "(%s,%s,%f,%f)" %(price_high_data[0], price_high_data[1], price_high_data[2], price_high_data[3])
insert_data_cmd = "INSERT INTO %s(date,id,name,p_change,turnover) VALUES(\"%s\",\"%s\",\"%s\",%f,%f);" %(self.dbtable,price_high_data[0], price_high_data[1], price_high_data[2], price_high_data[3],price_high_data[4])
self.conn.execute(insert_data_cmd)
#self.conn.execute('INSERT INTO STOCK(date,id,name,p_change,turnover) VALUES(?,?,?,?,?)',(price_high_data[0], price_high_data[1], price_high_data[2], price_high_data[3],price_high_data[4]))
self.conn.commit()


def close(self):
self.conn.close()
上面创建的表名是 以日期为命名的(前面的下划线是因为数据库的命名规则不能以数字为首)
 
上一篇:30天学会量化交易模型 Day04 (tushare获取破新高的股票)
http://www.30daydo.com/article/70 查看全部
tushare数据写入SQLite
 这一节 我们学习如何把得到的数据写入数据库。
 
虽然也可以写入excel或者json,不过考虑到后面用的的排序和其他python脚本的调用,最后选择了轻量级的数据库SQLiite作为首选。
# -*-coding=utf-8-*-
#数据库的操作
'''
http://30daydo.com
weigesysu@qq.com
'''
import sqlite3, time, datetime

__author__ = 'rocky'


class SqliteDb():


def __init__(self,dbtable):
'''
self.today = time.strftime("%Y-%m-%d")
self.DBname = self.today + '.db'
self.conn = sqlite3.connect(self.DBname)
'''
today = time.strftime("%Y-%m-%d")
DBname = today + '.db'
self.conn = sqlite3.connect(DBname)
self.dbtable=dbtable
create_tb = "CREATE TABLE %s (date varchar(10),id varchar(6), name varchar(30), p_change REAL,turnover REAL);" %self.dbtable
self.conn.execute(create_tb)
self.conn.commit()

def store_break_high(self,price_high_data):

#data 是创新高的个股信息 dataframe
#print today
#create_tb = 'CREATE TABLE STOCK (date TEXT,id text PRIMARY KEY, p_change REAL,turnover REAL);'

#conn.commit()
#print "(%s,%s,%f,%f)" %(price_high_data[0], price_high_data[1], price_high_data[2], price_high_data[3])
insert_data_cmd = "INSERT INTO %s(date,id,name,p_change,turnover) VALUES(\"%s\",\"%s\",\"%s\",%f,%f);" %(self.dbtable,price_high_data[0], price_high_data[1], price_high_data[2], price_high_data[3],price_high_data[4])
self.conn.execute(insert_data_cmd)
#self.conn.execute('INSERT INTO STOCK(date,id,name,p_change,turnover) VALUES(?,?,?,?,?)',(price_high_data[0], price_high_data[1], price_high_data[2], price_high_data[3],price_high_data[4]))
self.conn.commit()


def close(self):
self.conn.close()

上面创建的表名是 以日期为命名的(前面的下划线是因为数据库的命名规则不能以数字为首)
 
上一篇:30天学会量化交易模型 Day04 (tushare获取破新高的股票)
http://www.30daydo.com/article/70

30天学会量化交易模型 Day04

李魔佛 发表了文章 • 4 个评论 • 21081 次浏览 • 2016-07-16 21:28 • 来自相关话题

tushare获取破新高的股票

 股市有句话,新高后有新高。
因为新高后说明消化了前面的套牢盘。 所以这个时候的阻力很小。
 
下面使用一个例子来用代码获取当天创新高的股票。
 






使用的是tushare#-*-coding=utf-8-*-
__author__ = 'rocky'
'''
http://30daydo.com
weigesysu@qq.com
'''
#获取破指定天数内的新高 比如破60日新高
import tushare as ts
import datetime
info=ts.get_stock_basics()

def loop_all_stocks():
for EachStockID in info.index:
if is_break_high(EachStockID,60):
print "High price on",
print EachStockID,
print info.ix[EachStockID]['name'].decode('utf-8')



def is_break_high(stockID,days):
end_day=datetime.date(datetime.date.today().year,datetime.date.today().month,datetime.date.today().day)
days=days*7/5
#考虑到周六日非交易
start_day=end_day-datetime.timedelta(days)

start_day=start_day.strftime("%Y-%m-%d")
end_day=end_day.strftime("%Y-%m-%d")
df=ts.get_h_data(stockID,start=start_day,end=end_day)

period_high=df['high'].max()
#print period_high
today_high=df.iloc[0]['high']
#这里不能直接用 .values
#如果用的df【:1】 就需要用.values
#print today_high
if today_high>=period_high:
return True
else:
return False

loop_all_stocks()
可以修改 函数 is_break_high(EachStockID,60) 中的60 为破多少天内的新高。
 
上一篇:30天学会量化交易模型 Day03
http://www.30daydo.com/article/15
 
下一篇: 30天学会量化交易模型 Day05 (tushare数据写入SQLite)
http://www.30daydo.com/article/73 查看全部
tushare获取破新高的股票

 股市有句话,新高后有新高
因为新高后说明消化了前面的套牢盘。 所以这个时候的阻力很小。
 
下面使用一个例子来用代码获取当天创新高的股票。
 

createhigh.PNG


使用的是tushare
#-*-coding=utf-8-*-
__author__ = 'rocky'
'''
http://30daydo.com
weigesysu@qq.com
'''
#获取破指定天数内的新高 比如破60日新高
import tushare as ts
import datetime
info=ts.get_stock_basics()

def loop_all_stocks():
for EachStockID in info.index:
if is_break_high(EachStockID,60):
print "High price on",
print EachStockID,
print info.ix[EachStockID]['name'].decode('utf-8')



def is_break_high(stockID,days):
end_day=datetime.date(datetime.date.today().year,datetime.date.today().month,datetime.date.today().day)
days=days*7/5
#考虑到周六日非交易
start_day=end_day-datetime.timedelta(days)

start_day=start_day.strftime("%Y-%m-%d")
end_day=end_day.strftime("%Y-%m-%d")
df=ts.get_h_data(stockID,start=start_day,end=end_day)

period_high=df['high'].max()
#print period_high
today_high=df.iloc[0]['high']
#这里不能直接用 .values
#如果用的df【:1】 就需要用.values
#print today_high
if today_high>=period_high:
return True
else:
return False

loop_all_stocks()

可以修改 函数 is_break_high(EachStockID,60) 中的60 为破多少天内的新高。
 
上一篇:30天学会量化交易模型 Day03
http://www.30daydo.com/article/15
 
下一篇: 30天学会量化交易模型 Day05 (tushare数据写入SQLite)
http://www.30daydo.com/article/73

30天学会量化交易模型 Day03

李魔佛 发表了文章 • 9 个评论 • 14219 次浏览 • 2016-05-18 23:33 • 来自相关话题

第二天讲到保存为csv文件,下面的命令将数据保存为我们更加常用,且兼容性更好的excel文件 和sql数据库文件。
 





 
常用参数说明:

excel_writer: 文件路径或者ExcelWriter对象
sheet_name:sheet名称,默认为Sheet1
sep : 文件内容分隔符,默认为,逗号
na_rep: 在遇到NaN值时保存为某字符,默认为’‘空字符
float_format: float类型的格式
columns: 需要保存的列,默认为None
header: 是否保存columns名,默认为True
index: 是否保存index,默认为True
encoding: 文件编码格式
startrow: 在数据的头部留出startrow行空行
startcol :在数据的左边留出startcol列空列


tushare数据保存到SQL数据库文件

df.to_sql(表名,数据库的连接器)
引用官方的参数:

pandas.DataFrame.to_sql

DataFrame.to_sql(name, con, flavor=None, schema=None, if_exists='fail', index=True, index_label=None,chunksize=None, dtype=None)[source]

Write records stored in a DataFrame to a SQL database.

Parameters:

name : string

Name of SQL table

con : SQLAlchemy engine or DBAPI2 connection (legacy mode)

Using SQLAlchemy makes it possible to use any DB supported by that library. If a DBAPI2 object, only sqlite3 is supported.

flavor : ‘sqlite’, default None

DEPRECATED: this parameter will be removed in a future version, as ‘sqlite’ is the only supported option if SQLAlchemy is not installed.

schema : string, default None

Specify the schema (if database flavor supports this). If None, use default schema.

if_exists : {‘fail’, ‘replace’, ‘append’}, default ‘fail’

fail: If table exists, do nothing.
replace: If table exists, drop it, recreate it, and insert data.
append: If table exists, insert data. Create if does not exist.

index : boolean, default True

Write DataFrame index as a column.

index_label : string or sequence, default None

Column label for index column(s). If None is given (default) and index is True, then the index names are used. A sequence should be given if the DataFrame uses MultiIndex.

chunksize : int, default None

If not None, then rows will be written in batches of this size at a time. If None, all rows will be written at once.

dtype : dict of column name to SQL type, default None

Optional specifying the datatype for columns. The SQL type should be a SQLAlchemy type, or a string for sqlite3 fallback connection.

这里只支持sqlalchemy和sqlite。 所以如果是用的mysql,需要安装sqlalchemy的插件才行。

这里使用简单的sqlite3 作为例子:import sqlite3
db=sqlite3.connect("testdb.db")
df = ts.get_k_data('300333',start='2016-01-01',end='2016-12-28')
df.to_sql("newtable",db,flavor='sqlite')

这样,数据就保存到到名字为testdb.db的数据库中,表名为 newtable


 
上一篇:30天学会量化交易模型 Day02 
http://30daydo.com/article/13 

下一篇:30天学会量化交易模型 Day04 (tushare获取破新高的股票)
链接: http://www.30daydo.com/article/70 

  查看全部
第二天讲到保存为csv文件,下面的命令将数据保存为我们更加常用,且兼容性更好的excel文件 和sql数据库文件。
 

excel.jpg

 
常用参数说明:

excel_writer: 文件路径或者ExcelWriter对象
sheet_name:sheet名称,默认为Sheet1
sep : 文件内容分隔符,默认为,逗号
na_rep: 在遇到NaN值时保存为某字符,默认为’‘空字符
float_format: float类型的格式
columns: 需要保存的列,默认为None
header: 是否保存columns名,默认为True
index: 是否保存index,默认为True
encoding: 文件编码格式
startrow: 在数据的头部留出startrow行空行
startcol :在数据的左边留出startcol列空列


tushare数据保存到SQL数据库文件

df.to_sql(表名,数据库的连接器)
引用官方的参数:


pandas.DataFrame.to_sql

DataFrame.to_sql(name, con, flavor=None, schema=None, if_exists='fail', index=True, index_label=None,chunksize=None, dtype=None)[source]

Write records stored in a DataFrame to a SQL database.

Parameters:

name : string

Name of SQL table

con : SQLAlchemy engine or DBAPI2 connection (legacy mode)

Using SQLAlchemy makes it possible to use any DB supported by that library. If a DBAPI2 object, only sqlite3 is supported.

flavor : ‘sqlite’, default None

DEPRECATED: this parameter will be removed in a future version, as ‘sqlite’ is the only supported option if SQLAlchemy is not installed.

schema : string, default None

Specify the schema (if database flavor supports this). If None, use default schema.

if_exists : {‘fail’, ‘replace’, ‘append’}, default ‘fail’

fail: If table exists, do nothing.
replace: If table exists, drop it, recreate it, and insert data.
append: If table exists, insert data. Create if does not exist.

index : boolean, default True

Write DataFrame index as a column.

index_label : string or sequence, default None

Column label for index column(s). If None is given (default) and index is True, then the index names are used. A sequence should be given if the DataFrame uses MultiIndex.

chunksize : int, default None

If not None, then rows will be written in batches of this size at a time. If None, all rows will be written at once.

dtype : dict of column name to SQL type, default None

Optional specifying the datatype for columns. The SQL type should be a SQLAlchemy type, or a string for sqlite3 fallback connection.


这里只支持sqlalchemy和sqlite。 所以如果是用的mysql,需要安装sqlalchemy的插件才行。

这里使用简单的sqlite3 作为例子:
import sqlite3
db=sqlite3.connect("testdb.db")
df = ts.get_k_data('300333',start='2016-01-01',end='2016-12-28')
df.to_sql("newtable",db,flavor='sqlite')

这样,数据就保存到到名字为testdb.db的数据库中,表名为 newtable


 
上一篇:30天学会量化交易模型 Day02 
http://30daydo.com/article/13 

下一篇:30天学会量化交易模型 Day04 (tushare获取破新高的股票)
链接: http://www.30daydo.com/article/70 

 

30天学会量化交易模型 Day02

李魔佛 发表了文章 • 0 个评论 • 20941 次浏览 • 2016-05-17 16:30 • 来自相关话题

github同步代码: https://github.com/Rockyzsu/stock
 30天学会量化交易模型 Day01
 
接着上一篇,如果已经掌握了pandas数据类型的各种使用,就可以进入tushare数据的抓取环节。
 
tushare安装教程:
pip install tushare #最傻瓜且最快的安装方式
 
使用方法:





说明:
获取个股历史交易数据(包括均线数据),可以通过参数设置获取日k线、周k线、月k线,以及5分钟、15分钟、30分钟和60分钟k线数据。本接口只能获取近3年的日线数据,适合搭配均线数据进行选股和分析,如果需要全部历史数据,请调用下一个接口get_h_data()。

参数说明:

code:股票代码,即6位数字代码,或者指数代码(sh=上证指数 sz=深圳成指 hs300=沪深300指数 sz50=上证50 zxb=中小板 cyb=创业板)
start:开始日期,格式YYYY-MM-DD
end:结束日期,格式YYYY-MM-DD
ktype:数据类型,D=日k线 W=周 M=月 5=5分钟 15=15分钟 30=30分钟 60=60分钟,默认为D
retry_count:当网络异常后重试次数,默认为3
pause:重试时停顿秒数,默认为0

返回值说明:

date:日期
open:开盘价
high:最高价
close:收盘价
low:最低价
volume:成交量
price_change:价格变动
p_change:涨跌幅
ma5:5日均价
ma10:10日均价
ma20:20日均价
v_ma5:5日均量
v_ma10:10日均量
v_ma20:20日均量
turnover:换手率[注:指数无此项]
 
如果要获取所有的历史数据,可以使用 ts.get_h_data(股票代码,开始日期,结束日期) 即可。
 

ts.get_hist_data('600848',start='2015-01-05',end='2015-01-09')
 







 其它的一些参数:






 
接着学习数据的存储:
 
首先来扫一下盲: csv和excel的区别:

excel中后缀为csv和xls,二者区别如下:
1、xls 文件就是Microsoft excel电子表格的文件格式。
2、csv是最通用的一种文件格式,它可以非常容易地被导入各种PC表格及数据库中。 此文件,一行即为数据表的一行。生成数据表字段用半角逗号隔开。
csv是文本文件,用记事本就能打开,XLS是二进制的文件只有用EXCEL才能打
csv文件是以逗号为分隔符号,将各字段列分离出的一种ASCII文件。
csv(*.csv) 文件格式只能保存活动工作表中的单元格所显示的文本和数值。工作表中所有的数据行和字符都将保存。
数据列以逗号分隔,每一行数据都以回车符结束。如果单元格中包含逗号,则该单元格中的内容以双引号引起。

 

保存为csv格式







############################
获取股市市场的基本信息:
 
stock_info=ts.get_stock_basics()
 
包含了
"""
        获取沪深上市公司基本情况
    Return
    --------
    DataFrame
               code,代码
               name,名称
               industry,细分行业
               area,地区
               pe,市盈率
               outstanding,流通股本
               totals,总股本(万)
               totalAssets,总资产(万)
               liquidAssets,流动资产
               fixedAssets,固定资产
               reserved,公积金
               reservedPerShare,每股公积金
               eps,每股收益
               bvps,每股净资
               pb,市净率
               timeToMarket,上市日期
    """
 
获取所有股市的代码:
stock_info=ts.get_stock_basics()
def get_all_stock_id():
#获取所有股票代码
for i in stock_info.index:
print i
 


下一篇:30天学会量化交易模型 Day03
链接:http://30daydo.com/article/15 

 

  查看全部
github同步代码: https://github.com/Rockyzsu/stock
 30天学会量化交易模型 Day01
 
接着上一篇,如果已经掌握了pandas数据类型的各种使用,就可以进入tushare数据的抓取环节。
 
tushare安装教程:
pip install tushare #最傻瓜且最快的安装方式
 
使用方法:
TuShare_-财经数据接口包.jpg


说明:
获取个股历史交易数据(包括均线数据),可以通过参数设置获取日k线、周k线、月k线,以及5分钟、15分钟、30分钟和60分钟k线数据。本接口只能获取近3年的日线数据,适合搭配均线数据进行选股和分析,如果需要全部历史数据,请调用下一个接口get_h_data()。

参数说明:

code:股票代码,即6位数字代码,或者指数代码(sh=上证指数 sz=深圳成指 hs300=沪深300指数 sz50=上证50 zxb=中小板 cyb=创业板)
start:开始日期,格式YYYY-MM-DD
end:结束日期,格式YYYY-MM-DD
ktype:数据类型,D=日k线 W=周 M=月 5=5分钟 15=15分钟 30=30分钟 60=60分钟,默认为D
retry_count:当网络异常后重试次数,默认为3
pause:重试时停顿秒数,默认为0

返回值说明:

date:日期
open:开盘价
high:最高价
close:收盘价
low:最低价
volume:成交量
price_change:价格变动
p_change:涨跌幅
ma5:5日均价
ma10:10日均价
ma20:20日均价
v_ma5:5日均量
v_ma10:10日均量
v_ma20:20日均量
turnover:换手率[注:指数无此项]
 
如果要获取所有的历史数据,可以使用 ts.get_h_data(股票代码,开始日期,结束日期) 即可。
 

ts.get_hist_data('600848',start='2015-01-05',end='2015-01-09')
 

所有数据.jpg



 其它的一些参数:

TuShare_-财经数据接口包1.jpg


 
接着学习数据的存储:
 
首先来扫一下盲: csv和excel的区别:


excel中后缀为csv和xls,二者区别如下:
1、xls 文件就是Microsoft excel电子表格的文件格式。
2、csv是最通用的一种文件格式,它可以非常容易地被导入各种PC表格及数据库中。 此文件,一行即为数据表的一行。生成数据表字段用半角逗号隔开。
csv是文本文件,用记事本就能打开,XLS是二进制的文件只有用EXCEL才能打
csv文件是以逗号为分隔符号,将各字段列分离出的一种ASCII文件。
csv(*.csv) 文件格式只能保存活动工作表中的单元格所显示的文本和数值。工作表中所有的数据行和字符都将保存。
数据列以逗号分隔,每一行数据都以回车符结束。如果单元格中包含逗号,则该单元格中的内容以双引号引起。


 

保存为csv格式

cvs.jpg



############################
获取股市市场的基本信息:
 
stock_info=ts.get_stock_basics()
 
包含了
"""
        获取沪深上市公司基本情况
    Return
    --------
    DataFrame
               code,代码
               name,名称
               industry,细分行业
               area,地区
               pe,市盈率
               outstanding,流通股本
               totals,总股本(万)
               totalAssets,总资产(万)
               liquidAssets,流动资产
               fixedAssets,固定资产
               reserved,公积金
               reservedPerShare,每股公积金
               eps,每股收益
               bvps,每股净资
               pb,市净率
               timeToMarket,上市日期
    """
 
获取所有股市的代码:
stock_info=ts.get_stock_basics()
def get_all_stock_id():
#获取所有股票代码
for i in stock_info.index:
print i

 


下一篇:30天学会量化交易模型 Day03
链接:http://30daydo.com/article/15 

 

 

30天学会量化交易模型 Day01

李魔佛 发表了文章 • 6 个评论 • 71380 次浏览 • 2016-05-16 16:14 • 来自相关话题

### 更新一个支持python的自动下单券商接口 #####

http://121.41.137.161:9091/hub/help/api
开通条件: 
http://www.30daydo.com/article/44236
 
 Day 01 ---- Pandas
github同步代码: https://github.com/Rockyzsu/stock

 本人是一个会一点pyhton语言的菜鸟,对量化交易很好奇,准备在30天内学会量化交易。每天更新一篇文章,视乎个人每天宽裕的时间有多少,时间多就多写点,如果时间仓促就可能写的粗略一些,但每天都会坚持去写。
 
第一天
首先要找到获取股票市场的数据来源,python支持几个股票接口。 个人采用tushare。
 
对于tushare,使用最多的数据类型就是pandas中的DataFrame了。
 
先导入包:





创建对象 Series
1、可以通过传递一个list对象来创建一个Series,pandas会默认创建整型索引:




(np.nan是一个空值)

通过传递一个numpy array,时间索引以及列标签来创建一个DataFrame:





通过传递一个能够被转换成类似序列结构的字典对象来创建一个DataFrame:




 
查看不同列的数据类型:




 
查看数据
 
查看frame中头部和尾部的行:





显示索引、列和底层的numpy数据:





describe()函数对于数据的快速统计汇总:





 对数据的转置:




 
数据选择
虽然标准的Python/Numpy的选择和设置表达式都能够直接派上用场,但是作为工程使用的代码,我们推荐使用经过优化的pandas数据访问方式: .at, .iat, .loc, .iloc 和 .ix
选择一个单独的列,这将会返回一个Series,等同于df.A:
 




通过进行选择,这将会对行进行切片




 
通过标签选择
使用标签来获取一个交叉的区域
 




通过标签来在多个轴上进行选择





标签切片





 

通过位置选择
 
通过传递数值进行位置选择(选择的是行)
 






通过数值进行切片,与numpy/python中的情况类似
 






 
通过指定一个位置的列表,与numpy/python中的情况类似
 






 
获取特定的值
 






 
布尔索引
 
1. 使用一个单独列的值来选择数据:






2. 使用where操作来选择数据:






 3.  使用isin()方法来过滤:






相关操作
 
  统计(相关操作通常情况下不包括缺失值)
 
执行描述性统计:
 






 
 
Pandas读取excel数据:#-*-coding=utf-8-*-
__author__ = 'rocky'
import pandas as pd
import numpy as np
def excel_op():
df=pd.read_excel("mystock.xls")
print df.head()

excel_op()(前提是需要安装xlrd 一个python对excel操作的包)
 






pandas中有Nan的非法数据,需要怎样处理呢?
 
可以使用 
code=code.fillna(0)
这个fillna(0) 函数,用来填充NaN的部分。 
 
填充后是这样子的:






这样对数据进行遍历的时候就可以通过 if data !=0 来判断是非非法。 因为没有其他表达式可以判断NaN
 
 
对于一些超大的excel或者csv文件,怎样读才能提高效率呢 ?df = pd.read_csv('test.csv', chunksize=10000)
for chunk in df:
# TODO: process the chunk as a normal DataFrame上面的参数就把csv文件分割为10000份,然后每份进行处理。
 
 
对dataframe的每一行进行遍历: for index,row in df.iterrows():
print row[u'代码'],row[u'资金发生数']上面的代码会循环输出每一行的 “代码”列和“资金发生数”列。
 

 下一篇:30天学会量化交易模型 Day02
http://30daydo.com/article/13
 
python数据分析之 A股上市公司按地区分布与可视化
http://30daydo.com/article/388 

转载请注明:http://30daydo.com/article/11
公众号: 查看全部
### 更新一个支持python的自动下单券商接口 #####

http://121.41.137.161:9091/hub/help/api
开通条件: 
http://www.30daydo.com/article/44236
 
 Day 01 ---- Pandas
github同步代码: https://github.com/Rockyzsu/stock

 本人是一个会一点pyhton语言的菜鸟,对量化交易很好奇,准备在30天内学会量化交易。每天更新一篇文章,视乎个人每天宽裕的时间有多少,时间多就多写点,如果时间仓促就可能写的粗略一些,但每天都会坚持去写。
 
第一天
首先要找到获取股票市场的数据来源,python支持几个股票接口。 个人采用tushare。
 
对于tushare,使用最多的数据类型就是pandas中的DataFrame了。
 
先导入包:
1.jpg


创建对象 Series
1、可以通过传递一个list对象来创建一个Series,pandas会默认创建整型索引:
2.jpg

(np.nan是一个空值)

通过传递一个numpy array,时间索引以及列标签来创建一个DataFrame:
3.jpg


通过传递一个能够被转换成类似序列结构的字典对象来创建一个DataFrame:
4.jpg

 
查看不同列的数据类型:
5.jpg

 
查看数据
 
查看frame中头部和尾部的行:
6.jpg


显示索引、列和底层的numpy数据:
a1.jpg


describe()函数对于数据的快速统计汇总:
a2.jpg


 对数据的转置:
a3.jpg

 
数据选择
虽然标准的Python/Numpy的选择和设置表达式都能够直接派上用场,但是作为工程使用的代码,我们推荐使用经过优化的pandas数据访问方式: .at, .iat, .loc, .iloc 和 .ix
选择一个单独的列,这将会返回一个Series,等同于df.A:
 
a4.jpg


通过进行选择,这将会对行进行切片
a5.jpg

 
通过标签选择
使用标签来获取一个交叉的区域
 
a6.jpg


通过标签来在多个轴上进行选择
a7.jpg


标签切片

a8.jpg

 

通过位置选择
 
通过传递数值进行位置选择(选择的是行)
 
a1.jpg



通过数值进行切片,与numpy/python中的情况类似
 

a2.jpg


 
通过指定一个位置的列表,与numpy/python中的情况类似
 
a3.jpg



 
获取特定的值
 

a4.jpg


 
布尔索引
 
1. 使用一个单独列的值来选择数据:

a11.jpg


2. 使用where操作来选择数据:

a12.jpg


 3.  使用isin()方法来过滤:

a13.jpg


相关操作
 
  统计(相关操作通常情况下不包括缺失值)
 
执行描述性统计:
 

a14.jpg


 
 
Pandas读取excel数据:
#-*-coding=utf-8-*-
__author__ = 'rocky'
import pandas as pd
import numpy as np
def excel_op():
df=pd.read_excel("mystock.xls")
print df.head()

excel_op()
(前提是需要安装xlrd 一个python对excel操作的包)
 

pandas1.PNG


pandas中有Nan的非法数据,需要怎样处理呢?
 
可以使用 
code=code.fillna(0)
这个fillna(0) 函数,用来填充NaN的部分。 
 
填充后是这样子的:

pandas2.PNG


这样对数据进行遍历的时候就可以通过 if data !=0 来判断是非非法。 因为没有其他表达式可以判断NaN
 
 
对于一些超大的excel或者csv文件,怎样读才能提高效率呢 ?
df = pd.read_csv('test.csv', chunksize=10000)
for chunk in df:
# TODO: process the chunk as a normal DataFrame
上面的参数就把csv文件分割为10000份,然后每份进行处理。
 
 
对dataframe的每一行进行遍历:
    for index,row in df.iterrows():
print row[u'代码'],row[u'资金发生数']
上面的代码会循环输出每一行的 “代码”列和“资金发生数”列。
 

 下一篇:30天学会量化交易模型 Day02
http://30daydo.com/article/13
 
python数据分析之 A股上市公司按地区分布与可视化
http://30daydo.com/article/388 

转载请注明:http://30daydo.com/article/11
公众号: