今天持仓的某只股票发布了预亏公告,我很担心未来走势,突然想到聚宽这边可以量化未来的走势,给心理一个预期,于是我就动手试了试。
到底是利空还是利好还是无波动,量化一下就能心中有数。
q= query(jy.LC_PerformanceForecast).order_by(jy.LC_PerformanceForecast.InfoPublDate.desc()).limit(3)
df = jy.run_query(q)
以上代码,可以通过聚宽的股票数据库查询公告。
顺便附上相关业绩预告规则。
一、业绩预告及修正
(一)应披露业绩预告的情形
板块
应披露业绩预告的情形
深主板
1、净利润为负值;
2、实现扭亏为盈;
3、实现盈利,且净利润与上年同期相比上升或者下降50%以上;
4、期末净资产为负值;
5、年度营业收入低于1,000万元。
注:
公司如预计出现上述第3项情形,但属于下列较小比较基数的,经深交所同意可以豁免披露:
(1)上一年度每股收益低于或等于0.05元;
(2)上一年度前三季度每股收益低于或等于0.04元;
(3)上一年度半年度每股收益低于或等于0.03元;
(4)上一年度第一季度每股收益低于或等于0.02元。
中小板
1、公司应披露半年度、前三季度、年度业绩预告。
2、公司预计第一季度业绩将出现下列情形之一的,应披露第一季度业绩预告:
(1)净利润为负值;
(2)净利润与上年同期相比上升或者下降50%以上;
(3)与上年同期相比实现扭亏为盈。
注:
上市公司预计出现上述第(2)项情形,比较基数较小(即上一年第一季度基本每股收益绝对值低于或等于0.02元人民币)且净利润变动金额较小的,可免于披露。
创业板
公司应披露一季度、半年度、前三季度、年度业绩预告。
沪主板
1、公司预计年度经营业绩将出现下列情形之一的,应当进行业绩预告;
(1)净利润为负值;
(2)净利润与上年同期相比上升或者下降50%以上;
(3)实现扭亏为盈。
2、预计中期和第三季度业绩出现上述情形之一的,可以进行业绩预告。
注:
公司出现上述第(2)项情形,但属于下列较小比较基数的,经上交所同意可以豁免披露:
(1)上一年年度报告每股收益绝对值低于或等于0.05元;
(2)上一期中期报告每股收益绝对值低于或等于0.03元;
(3)上一期年初至第三季度报告期末每股收益绝对值低于或等于0.04元。
根据近2000 组数据分析可得知,在股价发布预亏公告的30天和60天后波动并不会太大,而发布公告的5天内有平均近2%的跌幅。
from jqdata import finance
from sklearn import linear_model
from jqdata import *
import scipy.stats as stats
import numpy as np
import pandas as pd
import math
import time;
q= query(jy.LC_PerformanceForecast).order_by(jy.LC_PerformanceForecast.InfoPublDate.desc()).limit(3)
df = jy.run_query(q)
df.head(3)
def pct(start_date,stock,days): #计算股价涨跌幅
start_date = datetime.datetime.strptime(start_date,'%Y-%m-%d %H:%M:%S')
end_date = str(start_date + (datetime.timedelta(days)))
p = get_price(stock,start_date = start_date,end_date = end_date)
pct = p.close.pct_change().sum()
return pct
#print pct_change('2019-01-25 00:00:00','000001.XSHE')
secu_category = [1] # 证券类别:1-A股,SecuMain表中的字段
incode = jy.run_query(query(
jy.SecuMain.SecuCode,
jy.SecuMain.CompanyCode,
).filter(
jy.SecuMain.SecuCategory.in_(secu_category),
))
# print(incode)
q = query(
jy.LC_PerformanceForecast
).filter(
jy.LC_PerformanceForecast.CompanyCode.in_(incode['CompanyCode']), # 股票代码
jy.LC_PerformanceForecast.ForcastType == 8, #8为公告为eps预减
).order_by(jy.LC_PerformanceForecast.InfoPublDate.desc() # 公告发布日期
).limit(3000)
df = jy.run_query(q).fillna(value=0, method=None, axis=0)
df2 = pd.merge(incode, df, on='CompanyCode')
DF = df2[['SecuCode','InfoPublDate','ResultStatement']]
DF = DF.copy()
DF['date'] = DF.T.apply(lambda x:(str(x.InfoPublDate).split('+')[0]))
DF['code'] = DF.T.apply(lambda x:normalize_code(x.SecuCode))
DF['pct5'] = DF.T.apply(lambda x: pct(x.date,x.code,5)) #5天(非交易日)之后股价涨跌幅
DF['pct30'] = DF.T.apply(lambda x: pct(x.date,x.code,30)) #30天(非交易日)之后股价涨跌幅
DF['pct60'] = DF.T.apply(lambda x: pct(x.date,x.code,60)) #60天(非交易日)之后股价涨跌幅
DF = DF[(DF['pct30'] != 0)]
#print DF[['code','date','pct']]
print DF.pct5.describe()
print DF.pct30.describe()
print DF.pct60.describe()