股票tick图哪个软件有
数据清洗和理解是数据科学中的基础工作,重要而繁琐,经常占据了80%的工作量,在量化交易中也不例外。本文介绍如何利用Clickhouse数据仓库进行高效的数据清洗工作,以Tick行情......接下来具体说说
靠前类:各大券商的量化终端,以国泰君安旗下和广发证券旗下为例。
数据方面:2005年至今的股票财务数据、行业概念数据、宏观数据,基金(ETE、LOF、分级基金、货币基金)的行情和净值数据,场外基金的净值、投资组合数据,600多和股指指数数据,所有中命所推出的金融期货产品数据,股票期权和商品期权的合约及行情数据,TuShared的龙虎榜、新闻事件、银行同业拆放利率等数据,技术分析因子数据等。
研究方面:支持使用Python进行策略研究。提供API。
回测方面:支持股票、基命、期货、指数等品和的日、分钟级回测。
总结:只提供量化终端,策略需要自己写,或者找IT公司写,市面上写一个策略的价格在3-15万不等
第二类:各大量化终端开发公司,以掘金量化,聚宽和优矿为例
数据方面:提供2005年至今完整的股市Leve1数据、上市公司财务数据、完整的停复权信息。实时更新行情数据,盘后更新财务数据。此外还提供基金(包括ETF、LOF、分级A/B基金、货币基命)的行情和净值数据,金融期货数据、股票指数数据、行1板块数据、概念板块数据、宏观数据、行情数据等。
研究方面:提供基干IPythonNotebook的研究平台,支持Tick级数据,支持Python2、Python3。提供API(Application Programming Interface)。
回测方面:支持股票、基金、期货等品种的回测,支持日、分钟、Tick级回测。
总结:跟券商提供的量化终端类似,对干使用者要求会写程序,如果自己出策略找I公司写,一个策略的成本在3-15万不等,根据策略的难易程度
第三类:和券商合作,镶嵌在券商的量化终端内的量化交易软件
第四类:市面上的一些全自动智能炒股APP以讯动股票为例: )
金融市场中我们经常会遇到切片数据,例如A股的L1行情,我们处理这类数据的思路无外乎对每一个Ticker,按照时间先后的顺序,在1Min、5Min甚至日线的维度上上汇总特征,加工因子。考虑到执行效率问题,手工维护这个流程略显冗繁,本文介绍如何使用Clickhouse数据仓库来自动化的高效完成这类操作,并以K线合成为例完整走一遍流程。
流数据的计算可以把连续不断的数据按照一定的规则拆分成大量的片段,在片段内进行聚合统计和计算。常见的拆分方法有:
很明显,量化系统中,处理历史数据一定会用到事件时间,处理实时数据大部分情况也应用事件时间,少部分情况下可以用处理时间近似代替。本文将默认时间模式为事件时间。
ClickHouse支持创建普通视图(normal view)、物化视图(materialized view)、实时视图(live view)和窗口视图(window view),其中实时视图和窗口视图目前还是试验功能,不能保证稳定性。
通过上面的介绍,我们知道通过窗口视图和时间函数,Clickhouse也拥有了流式数据处理能力。但窗口视图处于实验阶段,需要我们手动开启这项功能,开启的方式有两种:
<?xml version="1.0"?> <yandex> <profiles> <default> <allow_experimental_window_view>1</allow_experimental_window_view> </default> </profiles> </yandex>
其中增加用户配置方案是永久性的,写入后就默认开启此功能。
通常交易所tick行情提供的字段有:
实时处理时通常要使用一个全局字典,将累计成交量、累计成交额转换成切片瞬时成交量和成交金额, 离线处理我们可用SQL进行简单的转换。
首先创建一张tick数据表(股票代码、交易时间、tick价格、tick成交量、涨跌幅):
create table tick.sse50_data( ticker String, trade_time DateTime('Asia/Shanghai'), tick_price_close Float32, tick_volume Int32, close_chg_rate Float32)ENGINE = AggregatingMergeTree()ORDER BY (trade_time, ticker)
然后使用如下SQL进行简单加工,即通过 volume - ifNull(any(volume) OVER (PARTITION BY stock_code ORDER BY trade_time ASC ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING), 0) 语句获得瞬时成交量:
select stock_code as ticker, trade_time, last as tick_price_close, toInt32(volume - ifNull(any(volume) OVER (PARTITION BY stock_code ORDER BY trade_time ASC ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING), 0)) AS tick_volume, round(100 * change_rate, 3) as close_chg_ratefrom tick.sse_50order by trade_time ASC, ticker
这里我们可以把数据先存储到data对象中,后面用来做行情回放,动态写入 tick.sse50_data 表中
首先创建一张1分钟特征表用来存储加工得到的K线特征(包含1分钟开盘价、收盘价、*高价、最低价、平均价、价格标准差、峰度等统计量):
create table if not exists tick.factor_m1( ticker String, trade_timestamp DateTime('Asia/Shanghai'), m1_price_open Float32, m1_price_close Float32, m1_price_high Float32, m1_price_low Float32, m1_price_avg Float32, m1_volume Int32, m1_chg_ptp Float32, m1_chg_avg Float32, m1_price_std Float32, m1_price_skew Float32, m1_price_kurt Float32)ENGINE = AggregatingMergeTree()ORDER BY (trade_timestamp, ticker)
然后创建我们的主角,窗口函数:
CREATE WINDOW VIEW IF NOT EXISTS stock_m1 TO tick.factor_m1 WATERMARK=INTERVAL '2' SECOND ASSELECT ticker, tumbleStart(trade_time_id) as trade_timestamp, any(tick_price_close) as m1_price_open, anyLast(tick_price_close) as m1_price_close, max(tick_price_close) as m1_price_high, min(tick_price_close) as m1_price_low, 0.5 * (m1_price_open + m1_price_close) as m1_price_avg, sum(tick_volume) as m1_volume, max(close_chg_rate) - min(close_chg_rate) as m1_chg_ptp, avg(close_chg_rate) as m1_chg_avg, stddevPop(tick_price_close) as m1_price_std, skewPop(tick_price_close) as m1_price_skew, kurtPop(tick_price_close) as m1_price_kurtFROM tick.sse50_dataGROUP BY tumble(trade_time, INTERVAL '1' MINUTE) as trade_time_id, tickerORDER BY trade_time_id, ticker
其中 tumble(trade_time, INTERVAL '1' MINUTE) 表示每1分钟执行一次。
for item in tqdm(data): db_client.execute("insert into tick.sse50_data values", [item])
在另一个控制台上查询 tick.factor_m1 表,可以发现数据已经实时写入特征表中了(K线与看盘软件有1分钟偏移,因为这里时间戳表示该分钟的起始位置):
通过WATCH语句,在控制台中我们能看到K线的实时生成:
数据清洗和理解是数据科学中的基础工作,重要而繁琐,经常占据了80%的工作量,在量化交易中也不例外。本文介绍如何利用Clickhouse数据仓库进行高效的数据清洗工作,以Tick行情处理为例,重点谈谈分析函数的使用。
说到分析函数,就不得不提到聚合函数。聚合函数是汇总计算返回一个计算结果,而分析函数会根据表的行数,每行返回一个计算结果。
很明显,分析函数有“序”的概念,通过分组的“序”获取上下文指定范围,进而获取聚合值。
语法格式:
<窗口函数> OVER ([PARTITION BY <列清单>] ORDER BY <排序用列清单>)
计算一分钟K线各个股票的成交额从大到小排名:
select datetime, order_book_id, RANK() OVER (PARTITION BY datetime ORDER BY total_turnover desc) as deal_rankfrom rqdata.stock_kline_1m where date='2023-01-11' and datetime<='2023-01-11 09:32:00' and order_book_id in ('601318.XSHG', '600536.XSHG', '601012.XSHG')
其中 desc 表示逆序排列(从大到小)
计算一分钟K线每分钟相比上一分钟成交额的占比:
select datetime, order_book_id, total_turnover / anyLast(total_turnover) OVER (PARTITION BY order_book_id ORDER BY datetime asc ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) as deal_ratefrom rqdata.stock_kline_1m where date='2023-01-11' and datetime<='2023-01-11 09:32:00' and order_book_id in ('601318.XSHG', '600536.XSHG', '601012.XSHG')
其中 anyLast 表示取分组中的最后一个不为Null的值, asc 表示顺序排列(从小到大), ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING 表示限制数数据在当前行的前面。
计算一分钟K线未来10分钟的*高收益:
select datetime, order_book_id, round(100*(max(high) OVER (PARTITION BY order_book_id ORDER BY datetime asc ROWS BETWEEN 1 FOLLOWING AND 10 FOLLOWING) / close - 1), 3) as min10_high_ratefrom rqdata.stock_kline_1m where date='2023-01-11' and datetime<='2023-01-11 09:40:00' and order_book_id in ('601318.XSHG', '600536.XSHG', '601012.XSHG')
其中 max(high) 取分组中的最大值, ROWS BETWEEN 1 FOLLOWING AND 10 FOLLOWING 表示在接下来的10分钟里。
Tick行情在国内市场通常称为切片数据,把距离上一个时间点的市场状态以及快照行情提供给用户,沪深股票交易所的切片间隔是3s,期货市场则更短,最快可以达到0.5s。Tick数据不同于逐笔委托和逐笔成交数据,最快为3s,如果一段时间没有成交,这个值就更久远。
由此造成一个问题, 某个1分钟时间段里,可能无法直接由Tick行情得到K线数据 ,因此,如果某分钟没有记录,我们需要在其后面补充一条记录,保持K线的完整性。
首先我们定义 表a 为所有股票代码, 表b 为所有分钟日期,两表做笛卡尔乘积可以得到完整的数据主键,这里通过 cross join 来实现。再通过左反连接 left anti join 排除掉已有的数据主键,这样就选出了需要补充的项:
select a.stock_code as stock_code, toDate('2016-03-29') as trade_date, b.trade_time + toIntervalSecond(59) as trade_time, null as open, null as last, null as high, null as low, null as prev_close, null as volume, null as total_turnoverfrom ( select distinct stock_code from rqdata.sse50_tick where trade_date='2016-03-29' ) a cross join ( with toHour(trade_time) * 60 + toMinute(trade_time) as trade_minute select distinct toStartOfMinute(trade_time) as trade_time from rqdata.sse50_tick where trade_date='2016-03-29' and trade_minute != 11 * 60 + 30 and trade_minute != 9 * 60 + 29 and trade_minute != 12 * 60 + 59 and trade_minute>= 9*60 + 25 ) bleft anti join ( select distinct stock_code, toStartOfMinute(trade_time) as trade_time from rqdata.sse50_tick where trade_date='2016-03-29' ) c on a.stock_code = c.stock_code and b.trade_time = c.trade_time
可以发现,部分股票没有15:00的收盘价
select stock_code, trade_date, trade_time, anyLast(open) over (PARTITION BY stock_code ORDER BY trade_time ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as open, ...from ...
select * from ( select stock_code, trade_date, trade_time, anyLast(open) over (PARTITION BY stock_code ORDER BY trade_time ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as open, anyLast(last) over (PARTITION BY stock_code ORDER BY trade_time ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as last, anyLast(high) over (PARTITION BY stock_code ORDER BY trade_time ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as high, anyLast(low) over (PARTITION BY stock_code ORDER BY trade_time ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as low, anyLast(prev_close) over (PARTITION BY stock_code ORDER BY trade_time ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as prev_close, anyLast(volume) over (PARTITION BY stock_code ORDER BY trade_time ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as volume, anyLast(total_turnover) over (PARTITION BY stock_code ORDER BY trade_time ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as total_turnover from ( select a.stock_code as stock_code, toDate('2016-03-29') as trade_date, b.trade_time + toIntervalSecond(59) as trade_time, null as open, null as last, null as high, null as low, null as prev_close, null as volume, null as total_turnover from ( select distinct stock_code from rqdata.sse50_tick where trade_date='2016-03-29' ) a cross join ( with toHour(trade_time) * 60 + toMinute(trade_time) as trade_minute select distinct toStartOfMinute(trade_time) as trade_time from rqdata.sse50_tick where trade_date='2016-03-29' and trade_minute != 11 * 60 + 30 and trade_minute != 9 * 60 + 29 and trade_minute != 12 * 60 + 59 and trade_minute>= 9*60 + 25 ) b left anti join ( select distinct stock_code, toStartOfMinute(trade_time) as trade_time from rqdata.sse50_tick where trade_date='2016-03-29' ) c on a.stock_code = c.stock_code and b.trade_time = c.trade_time union all select stock_code, trade_date, trade_time, open, last, high, low, prev_close, volume, total_turnover from rqdata.sse50_tick where trade_date='2016-03-29' )) where stock_code='601669.XSHG' and trade_time>'2016-03-29 14:59:00'
可以看到,最后一行进行了填充,当时间精确到分钟后,便得到收盘价。
以上就是股票tick图哪个软件有?的详细内容,希望通过阅读小编的文章之后能够有所收获!