本系列笔记没有学习顺序,学习系统性。仅是本人学习量化,学习PY过程中的踩坑点和避坑过程记录。特此说明下
发现tushare一次只能下载单支股票60行数据,影响效率,所以找了下其他数据源。
symbol:股票代码,sz000002位市场代码加6位股票代码
scale:k线时长,240为日线,60为小时线以此类推
datalen:数据条数,从获取日倒数,60代表离获取数据当日最近60条数据,日线数据就是最近60天
该接口只能单支股票代码读取,实际操作,当我循环拉各个股票3600天的数据时候ip被封了。所以读取不能频繁,加个时间停顿后就可以正常循环拉下来了
import time
time.sleep(0.3) #暂停0.3秒
为了使数据兼容之前写的策略,所以还要整下格式,让他和tushare的列名一致。所以写上几句
_p["day"] = _p.apply(lambda x:x["day"].replace("-",""),axis=1) #日期调整为yyyymmdd格式
_p.rename(columns={"day":"trade_date","volume":"vol"},inplace=True) #列名修改
_p["ts_code"] = _symbol[2:8]+"."+_symbol[0:2].upper() #增加一列ts_code
_p["vol"] = _p.apply(lambda x:x["vol"]/100,axis=1) #成交量保持一致
新浪数据比tushare默认拉出来的数据少了四列:
pre_closechangepct_chgamount
数据处理量一大之后,对pd的执行效率问题不得不重视起来,着重学习了pd的df对象操作方法以及效率遍历、批量修改数据、快速读取指定值
总结点经验如下:
df对象遍历最快的方式
执行效率问题:下面2个for循环,一个使用iloc取值,一个使用iat取值,iloc比iat慢了起码10倍。写成上面的apply方式也许更快,暂未尝试。
"""
1.当日涨停
2.次日跳空高开(次日开盘价>当日收盘价[幅度4%以上]);
3.次日收阴十字星,上下影线长度>实体,次日收盘价<次日开盘价,跳空缺口保留,次日最低价>当日最高价[0.5%])
4.次日成交量放大(次日成交量>前日成交量[幅度2倍以上])
for i in range(len(_pd)):
#print(_pd.iloc[i]["trade_date"])
if i == len(_pd)-2:
break
if _pd.iloc[i]["close"]==_pd.iloc[i]["high"]:
#print("满足条件1")
if _pd.iloc[i+1]["open"]/_pd.iloc[i]["high"]>=1.04 and _pd.iloc[i+1]["low"]/_pd.iloc[i]["close"]>=1.005 and _pd.iloc[i+1]["close"]<_pd.iloc[i+1]["open"] and (_pd.iloc[i+1]["high"]-_pd.iloc[i+1]["open"])>(_pd.iloc[i+1]["open"]-_pd.iloc[i+1]["close"]) and (_pd.iloc[i+1]["close"]-_pd.iloc[i+1]["low"])>(_pd.iloc[i+1]["open"]-_pd.iloc[i+1]["close"]):
#print("满足条件2")
if _pd.iloc[i+1]["vol"]/_pd.iloc[i]["vol"]>=2:
#print("满足条件3")
#记录次数
if i+3 < len(_pd):
new_row = np.array([_pd.iloc[i]["ts_code"],_pd.iloc[i+1]["trade_date"],round(_pd.iloc[i+3]["close"]/_pd.iloc[i]["close"]-1,2)*100])
else:
new_row = np.array([_pd.iloc[i]["ts_code"],_pd.iloc[i+1]["trade_date"],"nan"])
_result = np.vstack([_result, new_row])
break
"""
for i in range(len(_pd)):
#print(_pd.iloc[i]["trade_date"])
if i == len(_pd)-2:
break
if _pd.at[i,"close"]==_pd.at[i,"high"]:
#print("满足条件1")
if _pd.at[i+1,"open"]/_pd.at[i,"high"]>=1.04 and _pd.at[i+1,"low"]/_pd.at[i,"close"]>=1.005 and _pd.at[i+1,"close"]<_pd.at[i+1,"open"] and (_pd.at[i+1,"high"]-_pd.at[i+1,"open"])>(_pd.at[i+1,"open"]-_pd.at[i+1,"close"]) and (_pd.at[i+1,"close"]-_pd.at[i+1,"low"])>(_pd.at[i+1,"open"]-_pd.at[i+1,"close"]):
#print("满足条件2")
if _pd.at[i+1,"vol"]/_pd.at[i,"vol"]>=2:
#print("满足条件3")
#记录次数
if i+3 < len(_pd):
new_row = np.array([_pd.at[i,"ts_code"],_pd.at[i+1,"trade_date"],round(_pd.at[i+3,"close"]/_pd.at[i,"close"]-1,2)*100])
else:
new_row = np.array([_pd.at[i,"ts_code"],_pd.at[i+1,"trade_date"],"nan"])
_result = np.vstack([_result, new_row])
break
终于把10年的日k数据都下载下来了~后续如果要继续下载数据,可以用
pd的merge方法来进行数据合并。
最近发现同花顺有个量化平台SuperMind,可以免费使用。不过好像数据也就能使用最近100天的。功能比较丰富,下次也许会研究总结下使用经验。
easytrader也需要研究下,是以模拟方式使用券商交易软件,进行交易的py包。
文章为作者独立观点,不代表股票交易接口观点