股票tick图哪个软件有?

金融市场中我们经常会遇到切片数据,例如A股的L1行情,我们处理这类数据的思路无外乎对每一个Ticker,按照时间先后的顺序,在1Min、5Min甚至日线的维度上上汇总特征,加工因子......

股票tick图哪个软件有

数据清洗和理解是数据科学中的基础工作,重要而繁琐,经常占据了80%的工作量,在量化交易中也不例外。本文介绍如何利用Clickhouse数据仓库进行高效的数据清洗工作,以Tick行情......接下来具体说说

市场上散户可以接触到的股票交易量化软件有哪些?

股票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以讯动股票为例:

Tick行情数据流式处理: 应用Clickhouse窗口视图



金融市场中我们经常会遇到切片数据,例如A股的L1行情,我们处理这类数据的思路无外乎对每一个Ticker,按照时间先后的顺序,在1Min、5Min甚至日线的维度上上汇总特征,加工因子。考虑到执行效率问题,手工维护这个流程略显冗繁,本文介绍如何使用Clickhouse数据仓库来自动化的高效完成这类操作,并以K线合成为例完整走一遍流程。

一、基本概念

1.1 窗口

流数据的计算可以把连续不断的数据按照一定的规则拆分成大量的片段,在片段内进行聚合统计和计算。常见的拆分方法有:

  • 以时间为单位的不重叠片段,例如:每1分钟、每1小时等,在流式计算里通常称为Tumble Window。在量化里比如1分钟K线、1小时K线,就是此类型。
  • 以时间为单位的重叠片段,例如:前10分钟、前1小时,每隔一个时间间隔向前滚动,前后两个窗口有一定的重合部分,通常称为Hop Window,很明显,Tumble Window是Hop Window的一个特例。在量化里,计算滑动均值,就是这类任务的一个代表。
  • 以会话为单位的不连续片段,例如每个HTTP访问会话,可能被其他会话打断,在量化交易中较少涉及,本文不再讨论。
股票tick图哪个软件有?

1.2 时间

  • • 处理时间Processing Time,指的是进行数据处理操作时,当时的系统时间。
  • • 事件时间Event Time,指的是业务发生时间,每一条业务记录上会携带一个时间戳。
  • • 提取时间Ingestion Time,指的是数据进入处理系统时,当时的系统时间。

很明显,量化系统中,处理历史数据一定会用到事件时间,处理实时数据大部分情况也应用事件时间,少部分情况下可以用处理时间近似代替。本文将默认时间模式为事件时间。

1.3 视图

ClickHouse支持创建普通视图(normal view)、物化视图(materialized view)、实时视图(live view)和窗口视图(window view),其中实时视图和窗口视图目前还是试验功能,不能保证稳定性。

  • • Normal View:视图本身并不会存储任何的数据,它们仅仅只是读取了所关联的表格的查询结果而已。一个视图其实保存的是一个 select查询的语句,而不是它查询的结果。
  • • Materialized View:物化视图和普通视图最大的区别是物化视图实际存储了一份数据。用户查询的时候和表没有区别,更像是一张时刻在预计算的表。在创建物化视图的时候也需要定义存储引擎。
  • • Live View: 实时视图是一种特殊的视图,类似于ZooKeeper中的注册监听和Redis中的发布订阅,能够将一条SQL查询结果作为监控目标,当 Live view 变化时可以及时感知到。
  • • Window View:窗口可以按时间窗口聚合数据,类似Flink中的Window,并在窗口结束时输出结果。它将部分聚合结果(预聚合)存储在一个内部(或指定的)表中,以减少延迟,并可以将处理结果推送到指定的表或使用WATCH语句查询推送通知。

通过上面的介绍,我们知道通过窗口视图和时间函数,Clickhouse也拥有了流式数据处理能力。但窗口视图处于实验阶段,需要我们手动开启这项功能,开启的方式有两种:

  • • 在sql语句中添加一条控制开关: set allow_experimental_window_view = 1
  • • 在Clickhouse中增加一个用户配置:• 新建文件:nano /etc/clickhouse-server/users.d/allow_experimental_window_functions.xml• 写入如下配置:

<?xml version="1.0"?> <yandex> <profiles> <default> <allow_experimental_window_view>1</allow_experimental_window_view> </default> </profiles> </yandex>

其中增加用户配置方案是永久性的,写入后就默认开启此功能。

二、设计数据表

2.1 原始tick行情数据加工

通常交易所tick行情提供的字段有:

  • • open:开盘价
  • • last:最新价
  • • high:*高价
  • • low:最低价
  • • prev_close:昨收价
  • • volume:累计成交量
  • • total_turnover:累计成交额
  • • change_rate:涨跌幅
  • • ask_price_1-5:卖出价1-5档
  • • ask_volume_1-5: 卖出量1-5档
  • • ask_price_1-5:卖出价1-5档
  • • ask_volume_1-5: 卖出量1-5档

实时处理时通常要使用一个全局字典,将累计成交量、累计成交额转换成切片瞬时成交量和成交金额, 离线处理我们可用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 表中

2.2 设计1分钟窗口视图

首先创建一张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分钟执行一次。

三、效果测试

3.1 客户端模拟实时**

for item in tqdm(data): db_client.execute("insert into tick.sse50_data values", [item])

3.2 查询

在另一个控制台上查询 tick.factor_m1 表,可以发现数据已经实时写入特征表中了(K线与看盘软件有1分钟偏移,因为这里时间戳表示该分钟的起始位置):

股票tick图哪个软件有?

通过WATCH语句,在控制台中我们能看到K线的实时生成:

股票tick图哪个软件有?

结论

浅谈Tick行情数据清洗:应用Clickhouse分析函数



数据清洗和理解是数据科学中的基础工作,重要而繁琐,经常占据了80%的工作量,在量化交易中也不例外。本文介绍如何利用Clickhouse数据仓库进行高效的数据清洗工作,以Tick行情处理为例,重点谈谈分析函数的使用。

一、分析函数概况

1.1 与聚合函数的区别

说到分析函数,就不得不提到聚合函数。聚合函数是汇总计算返回一个计算结果,而分析函数会根据表的行数,每行返回一个计算结果。

  • 聚合函数特点:GROUP BY 分组,统计组内的max、min、std等统计值,赋予到聚合组中
  • 分析函数特点:PARTITION BY 分组,统计组内的max、min、std等统计值,赋予到当前行中

很明显,分析函数有“序”的概念,通过分组的“序”获取上下文指定范围,进而获取聚合值。

1.2 窗口函数的基本用法

语法格式:

<窗口函数> OVER ([PARTITION BY <列清单>] ORDER BY <排序用列清单>)

1.2.1 计算排名

计算一分钟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 表示逆序排列(从大到小)

1.2.2 获取相邻行

计算一分钟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 表示限制数数据在当前行的前面。

1.2.3 计算窗口报告值

计算一分钟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分钟里。

二、数据清洗案例

2.1 关于Tick行情

Tick行情在国内市场通常称为切片数据,把距离上一个时间点的市场状态以及快照行情提供给用户,沪深股票交易所的切片间隔是3s,期货市场则更短,最快可以达到0.5s。Tick数据不同于逐笔委托和逐笔成交数据,最快为3s,如果一段时间没有成交,这个值就更久远。

由此造成一个问题, 某个1分钟时间段里,可能无法直接由Tick行情得到K线数据 ,因此,如果某分钟没有记录,我们需要在其后面补充一条记录,保持K线的完整性。

2.2 选出缺失项

首先我们定义 表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的收盘价

股票tick图哪个软件有?

2.3 利用分析函数填充缺失项

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 ...

2.4 与原始数据并联后的完整语句

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图哪个软件有?的详细内容,希望通过阅读小编的文章之后能够有所收获!

版权:本文由用户自行上传,观点仅代表作者本人,本站仅供存储服务。如有侵权,请联系管理员删除,了解详情>>

发布
问题