Python 算法交易实验86 QTV200日常推进-获取A股日交易额并统计

news2024/12/24 2:18:08

说明

上一篇说到,交易量可能可以作为策略规则的支持度分析,但是(我现在还不想付费买数据)现成的接口似乎并没有这样的统计。获取某一只股票的日交易数据是相对简单的,市场上也就不到5000只的股票,总数据量应该也不会超过18M(5000*3000)。所以可以获取全市场的日数据,然后自己汇总。

以下是流程:

  • 1 列出所有的股票
  • 2 for each 抓取所有的日数据
  • 3 将数据存到数据库
  • 4 进行统计,并可视化
  • 5 分析过去几年交易量的变化

内容

使用akshare来抓取数据,这个是接口文档。
我认为,真正的算法交易并不需要太多太频繁的数据,也不需要高频交易。过去有很多技术性套利的方法反而被视为正统,例如利用服务器时间差快速、大量交易。这本身导致了交易系统承受类似DDOS般的影响,也使得交易者的心态收到DDOS的攻击:价格暴跌,直接击穿心理预期。然后这也招致了更多的”管理约束“。从人工智能的角度,算法应该能够和类似人类交易者的方式获取数据,就像一场体育比赛一样。真正实现超越的是内在的方法,例如alphago击败李世石那样。

所以我所基于量化分析的整个体系,对于数据的维度、频率要求都非常低。真正的复杂性在于获得这些数据之后所采取的算法和运行架构,以及基于这些架构产生大量数据之后所作出的决策和调整。另外,从我自己多年处理数据的经验来说,更多的依赖数据商的指标其实不是什么好事。由于数据本身的复杂性,还有业务相关的变化,大部分的指标是无法维护,甚至是有欺骗性的(不是恶意的),使用这些指标无异于坐在火山口上。

1 列出所有的股票

在这里插入图片描述

import akshare as ak

stock_info_a_code_name_df = ak.stock_info_a_code_name()
print(stock_info_a_code_name_df)

在这里插入图片描述
这步分数据也存一下吧,一次性的,就不使用ORM了

from Basefuncs import * 
chcfg = CHCfg(database='qtv200')
click_para = chcfg.dict()
chc = CHClient(**click_para)
chc._exe_sql('show tables')

# 简单表格
create_table_sql = '''
CREATE TABLE stock_name_list
(

code String,
name String,
watch_time String
)
ENGINE = MergeTree
PRIMARY KEY (code)
order by code
'''
chc._exe_sql(create_table_sql)
chc.insert_df2table(table_name='stock_name_list', some_df=stock_info_a_code_name_df, pid_name='code')

在这里插入图片描述

2 抓取日数据/存库

在这里插入图片描述

采用东财历史数据接口

import akshare as ak

stock_zh_a_hist_df = ak.stock_zh_a_hist(symbol="000001", period="daily", start_date="20000101", end_date='20990528', adjust="")
print(stock_zh_a_hist_df)
      日期    股票代码     开盘     收盘     最高     最低      成交量           成交额    振幅   涨跌幅   涨跌额   换手率
0     2017-03-01  000001   9.49   9.49   9.55   9.47   346994  3.301580e+08  0.84  0.11  0.01  0.21
1     2017-03-02  000001   9.51   9.43   9.54   9.42   403629  3.823959e+08  1.26 -0.63 -0.06  0.24
2     2017-03-03  000001   9.41   9.40   9.43   9.36   342655  3.219525e+08  0.74 -0.32 -0.03  0.20
3     2017-03-06  000001   9.40   9.45   9.46   9.39   404511  3.812123e+08  0.74  0.53  0.05  0.24
4     2017-03-07  000001   9.44   9.45   9.46   9.40   294673  2.777474e+08  0.63  0.00  0.00  0.17
...          ...     ...    ...    ...    ...    ...      ...           ...   ...   ...   ...   ...
1755  2024-05-22  000001  11.56  11.56  11.74  11.46  2115531  2.458449e+09  2.42  0.09  0.01  1.09
1756  2024-05-23  000001  11.53  11.40  11.59  11.37  1841623  2.110799e+09  1.90 -1.38 -0.16  0.95
1757  2024-05-24  000001  11.37  11.31  11.49  11.30  1398276  1.593330e+09  1.67 -0.79 -0.09  0.72
1758  2024-05-27  000001  11.31  11.51  11.53  11.31  1454361  1.663272e+09  1.95  1.77  0.20  0.75
1759  2024-05-28  000001  11.50  11.40  11.58  11.36  1204323  1.377107e+09  1.91 -0.96 -0.11  0.62

[1760 rows x 12 columns]

我只需要成交金额,日期和股票代码,所以可以建立如下数据模型:

import pandas as pd
from sqlalchemy import Column, Integer, String, create_engine,Float,DateTime, func, Text, Index
# 映射
from sqlalchemy import MetaData, Table,select
from clickhouse_sqlalchemy import make_session, engines
from sqlalchemy.orm import sessionmaker, declarative_base
from datetime import datetime
# 连接字符串格式: clickhouse+http://<username>:<password>@<host>:<port>/<database 
engine = create_engine('clickhouse+http://xxxx:xxxx@127.0.0.1:18123/qtv200')
Base = declarative_base()

# MergeTree才会持久化
class StockTrade(Base):
    __tablename__ = 'stock_trade'
    id = Column(Integer, primary_key=True)
    create_time = Column(DateTime, default=lambda: datetime.now())

    code = Column(String)
    name = Column(String)
    data_dt = Column(String)
    amt = Column(Float)
    
    __table_args__ = (
        engines.MergeTree(order_by=['id']),
    )

然后获取所有的的code, 通过映射已创建表格的一部分字段,然后使用select来实现。

# 创建元数据对象
metadata = MetaData()
# 映射部分字段
# 定义表结构,并添加 extend_existing=True 参数
stock_name_list = Table('stock_name_list', metadata,
    Column('code', Integer, primary_key=True),
    Column('name', String),
    extend_existing=True  # 允许重新定义表
)
# 查询所有的code列
with engine.connect() as connection:
    # 构建查询语句
    query = select(stock_name_list.c.code)
    
    # 执行查询
    result = connection.execute(query)
    
    # 获取所有结果
    codes = [x[0] for x in result.fetchall()]

# 创建表 
Base.metadata.create_all(engine)

# 创建会话
Session = sessionmaker(bind=engine)

将取数和存库封在一个函数里,入参是code


# 获取数据
def get_and_save(some_code):
    import akshare as ak
    stock_zh_a_hist_df = ak.stock_zh_a_hist(symbol=some_code, period="daily", start_date="20000101", end_date='20990528', adjust="")
    stock_zh_a_hist_df['data_dt'] = stock_zh_a_hist_df['日期']
    stock_zh_a_hist_df['amt'] = stock_zh_a_hist_df['成交额']
    stock_zh_a_hist_df['code'] = stock_zh_a_hist_df['股票代码']

    lod = stock_zh_a_hist_df[['data_dt','amt', 'code']].to_dict(orient='records')

    data = [StockTrade(**x) for x in lod]
    with Session() as session:
        session.bulk_save_objects(data)

然后调用就可以了

import tqdm
for some_code in tqdm.tqdm(codes):
    get_and_save(some_code)

速度比想象中的快
在这里插入图片描述
一共13M数据。
在这里插入图片描述

3 统计

可以感受一下clickhouse的统计速度(其实更强的是,即使是时分秒的状态,也可以随意抽出来统计)

大约200ms完成汇总计算。
在这里插入图片描述
将字符cast到年月统计

select toYYYYMM(toDateTime(data_dt)) AS year_month,sum(amt) as total_amt 
from qtv200.stock_trade 
GROUP BY year_month
ORDER BY year_month;

在这里插入图片描述

4 可视化及分析

先声明基本配置

from Basefuncs import *
import cufflinks as cf
# from plotly.offline import iplot, init_notebook_mode
from plotly.offline import iplot, init_notebook_mode
# 初始化cufflinks
cf.go_offline()
init_notebook_mode()  


chcfg = CHCfg(database='qtv200')
click_para = chcfg.dict()
chc = CHClient(**click_para)
chc._exe_sql('show tables')

daily_sql = '''select data_dt, sum(amt) as total_amt 
from stock_trade 
group by data_dt
order by data_dt 
'''
yymon_sql = '''
select toYYYYMM(toDateTime(data_dt)) AS year_month,sum(amt) as total_amt 
from stock_trade 
GROUP BY year_month
ORDER BY year_month;
'''

先看日数据,主要是校验算的是否对。看起来还是可以的。

daily_data = chc._exe_sql(daily_sql)
daily_data_df = pd.DataFrame(daily_data, columns = ['dt','amt'])
daily_data_df['amt_ww'] = daily_data_df['amt'] /1e8
daily_data_df.tail()


amt	amt_ww
dt		
2024-08-26	5.289036e+11	5289.036477
2024-08-27	5.139930e+11	5139.930070
2024-08-28	4.989520e+11	4989.519683
2024-08-29	6.099332e+11	6099.332157
2024-08-30	8.800362e+11	8800.362105

画图

daily_data_df.set_index('dt', inplace=True)
# 绘制图表
daily_data_df['amt_ww'].iplot( kind='line', xTitle='Date', yTitle='Amount', title='Amount Over Time')

在这里插入图片描述
整体看起来,似乎交易量也没想象的那么不堪

然后按月统计

yymon_data = chc._exe_sql(yymon_sql)
yymon_data_df = pd.DataFrame(yymon_data, columns = ['yymon','amt'])
yymon_data_df['yymon'] = yymon_data_df['yymon'].apply(str)
yymon_data_df['amt_ww'] = yymon_data_df['amt'] /1e8
yymon_data_df.tail()
	yymon	amt	amt_ww
291	202404	1.828892e+13	182889.221341
292	202405	1.693721e+13	169372.120202
293	202406	1.371751e+13	137175.121734
294	202407	1.507760e+13	150776.035114
295	202408	1.313773e+13	131377.297951

yymon_data_df.set_index('yymon', inplace=True)
yymon_data_df['amt_ww'].iplot( kind='bar', xTitle='YYMon', yTitle='Amount', title='Amount Over Time')

在这里插入图片描述

放大一点看最近的,也没太大问题
在这里插入图片描述

5 结论

简单从交易量上来看,似乎也没有问题,但是这个仍然不符合直觉。说明支持度并不是单纯的交易量大小决定的。那么我想,是否应该调研价格的波动,以及交易的方向(净买入)。

所以,接下来还要进行的调研:

  • 1 研究价格的波动。就全市场而言,研究每天指数的波动系数。
  • 2 研究净买入方向。基于现在的全量交易额和指数涨跌,从净买入交易额来进行判定。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2095040.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

面向整个价值链的高可信度卫星测试解决方案

在动态行业格局中增强卫星任务能力 在罗德与施瓦茨&#xff0c;我们利用专业知识和量身定制的测试和测量解决方案为卫星行业提供支持。这包括帮助行业参与者满足完整测试路径的要求&#xff0c;以实现完美的系统性能&#xff0c;确保符合最新技术和标准。此外&#xff0c;我们…

2024年8月文章一览

2024年8月编程人总共更新了3篇文章&#xff1a; 1.2024年7月文章一览 2.《Programming from the Ground Up》阅读笔记&#xff1a;p95-p102 3.《Programming from the Ground Up》阅读笔记&#xff1a;p103-p116 8月&#xff0c;对自己而言是糟糕的一个月&#xff0c;两个项…

4-8 进入C语言,并跳转到loarder(1)

1 总体的逻辑。 从这里开始 写 loader 代码了。 1 首先是 从汇编跳转到 C原因呢&#xff0c; 2 然后是 &#xff0c; 再源码中新建新的loader 目录。 3 一直跳转到 loader 目录的C语言函数里面&#xff0c; 做循环操作。 2 代码&#xff1a; 首先 是从 start.s 跳转到 boot…

论文阅读:MicroNet: Towards Image Recognition with Extremely Low FLOPs

论文地址&#xff1a;https://arxiv.org/pdf/2011.12289 发表时间&#xff1a;2022 项目地址&#xff1a;https://github.com/liyunsheng13/micronet MicroNet是一种有效的卷积神经网络&#xff0c;使用极低的计算成本&#xff08;例如&#xff0c;在ImageNet分类上的6M FLOPs…

基于STM32的无线语音放大系统设计

本设计基于STM32设计了一种无线语音放大系统。该系统由语音采集模块、STM32核心控制模块、NRF24L01无线通信模块和语音放大模块组成。语音采集模块承担着对采集到的语音信号进行预处理的任务。STM32单片机负责控制整个系统的运行过程&#xff0c;包括数据处理、发送端的模数转换…

华为云征文|华为云Flexus X实例ultralytics模型yolov10深度学习AI部署与应用

目录 前言&#xff1a; 环境准备 购买服务器配置 连接服务器 安装Python 安装Pytorch 部署YOLOv10 拉取YOLOv10代码并安装相关依赖 数据集准备 Detect目标检测模型训练 训练数据集的配置文件 训练命令 识别命令 前言&#xff1a; 本实验演示从0到1部署YOLOv10深度…

tecplot宏批量导入数据

Tecplot新手进阶——使用tecplot宏操作批量处理数据输出图片&#xff08;详细步骤&#xff09; tecplot 宏的使用方法及代码改写 第一步&#xff1a;首先点击Scripting–>Record Macro&#xff0c;生成一个脚本文件&#xff0c;即.mcr文件 点击保存&#xff0c;会出现这个…

Activity的优雅跳转

需求1&#xff1a;跳转到下一个界面&#xff1a;NextActivity startActivity(Intent(this,NextActivity::class.java))需求2&#xff1a;跳转到下一个界面(并传参数)&#xff1a;NextActivity startActivity(Intent(this,NextActivity::class.java).apply { putExtra("pa…

Vulnhub靶场 | DC系列 - DC9

文章目录 DC-9环境搭建渗透测试端口敲门服务 DC-9 环境搭建 靶机镜像下载地址&#xff1a;https://vulnhub.com/entry/dc-6,315/需要将靶机和 kali 攻击机放在同一个局域网里&#xff1b;本实验kali 的 IP 地址&#xff1a;192.168.10.146。 渗透测试 使用 nmap 扫描 192.1…

【Linux】Ubuntu 安装 NFS 步骤详解

Ubuntu 安装 NFS 步骤详解 1.安装 NFS 服务2.配置 NFS 服务3.启用 NFS 服务4.客户端挂载 NFS 共享目录5.验证挂载是否成功6.持久化挂载&#xff08;可选&#xff09;7.其他客户端节点安装 NFS&#xff08;Network File System&#xff09;是一种允许不同主机之间通过网络共享文…

快速了解Git 文件的四种状态及其操作指令、如何忽略文件

&#x1f600;前言 在软件开发过程中&#xff0c;版本控制是团队协作的基石之一。Git 作为分布式版本控制系统&#xff0c;被广泛应用于各类项目的管理中。在使用 Git 进行文件管理时&#xff0c;理解文件的不同状态以及如何有效操作这些文件是非常重要的。本文将介绍 Git 文件…

BaseCTF之web(week2)

目录 ez_ser 一起吃豆豆 你听不到我的声音 Really EZ POP RCEisamazingwithspace 所以你说你懂 MD5? 数学大师 ez_ser <?php highlight_file(__FILE__); error_reporting(0);class re{public $chu0;public function __toString(){if(!isset($this->chu0)){return…

Docker 容器编排之 Docker Compose

目录 1 Docker Compose 概述 1.1 主要功能 1.2 工作原理 1.3 Docker Compose 中的管理层 2 Docker Compose 的常用命令参数 2.1 服务管理 2.1.1 docker-compose up &#xff1a; 2.1.2 docker-compose down &#xff1a; 2.1.3 docker-compose start &#xff1a; 2.1.4 docker…

数据结构:(LeetCode101)对称二叉树

给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff1a;root [1,2,2,null,3,null,3] 输出&#xff1a;false提示&#xff1a; 树中节点数目在范围…

World of Warcraft [CLASSIC][80][Shushia] [Obsidian Sanctum][Sartharion]

黑曜石圣殿 [Obsidian Sanctum] 萨塔里奥[Sartharion] 号旗披风、龙魂图典、五色巨龙之怒、黑曜石巨盔等装备&#xff0c;都是非常极品的BIS装备 召唤顺序&#xff1a;&#xff08;中&#xff09;塔尼布隆、&#xff08;右&#xff09;沙德隆、&#xff08;左&#xff09;维斯…

SAP OBYC配置方案

在SAP OBYC配置中&#xff0c;确保评估级别与会计科目匹配的关键在于正确设置评估级别、评估分组代码以及相关的会计科目。以下是确保匹配的步骤和注意事项&#xff1a; 定义评估控制&#xff1a;在SAP中&#xff0c;首先需要定义评估控制&#xff0c;这通常与工厂或公司代码相…

switch语句和while循环

switch语句和while循环 switch语句break的用法default的用法switch语句中的case和default的顺序问题 while语句while语句的执行流程while语句的具体例子 switch语句 switch 语句是⼀种特殊形式的 if…else 结构&#xff0c;用于判断条件有多个结果的情况。它把多重 的 else if…

13 隔离性

数据库并发的场景 读-读&#xff1a;不存在任何问题&#xff0c;也不需要并发控制 读-写&#xff1a;有线程安全问题&#xff0c;可能会造成事务隔离性问题&#xff0c;可能遇到脏读&#xff0c;幻读&#xff0c;不可重复读 写-写&#xff1a;有线程安全问题&#xff0c;可能存…

低代码开发与数据库:数字化转型的新引擎

低代码开发与数据库&#xff1a;数字化转型的新引擎 前言低代码开发的革命性优势数据库在低代码开发中的关键角色实践案例分析未来展望结语 前言 在当今这个快速变化的时代&#xff0c;技术的革新不断推动着企业向数字化转型迈进。随着云计算、大数据、人工智能等技术的飞速发展…

VastBase——执行计划

一、SQL的执行过程 1.词法分析 从查询语句中识别出系统支持的关键字、标识符、运算符、终结符等&#xff0c;确定每个词固有的特性。 以如下这个查询为例&#xff1a; select name from test_0717 where id > 1; 该SQL语句可以划分的关键字、标识符、运算符、常量等…