最近股市波动,不少 厮杀多年的投资人 老韭菜也关灯吃面。
作为一名技术人员利用量化交易来进行投资,才能让自己更理智的面对动荡不安的A股。如何建立起一个成熟的投资策略,是非常重要的,关键时刻也许可以让我们避免被割。
想建立一个成熟的投资体系,最重要的就是数据和策略。实现自己的策略后,不仅需要数据进行回测来看自己的策略在不同的交易周期是否正确,也可以让我们找到A股利好利空的方向。尽快的调整自己的投资策略。避免被割减少被割的次数。
想要回看自己的策略是否成功,首先需要有一整套数据才行,最方便的就是从 Tushare 上获取,但是因为现在的积分制改革,或许有一天我们就不能自由的获取了,所以自己建一个数据库是最合适的方法。
本人是在Windows机器上搭建的,所以说一下在Windows上安装的过程。
首先是从网站上下载数据库的安装文件,但是从官方网站上下载太慢了,这里我选用的是从 清华源 下载的MySQL。
选择对应的版本,飞速下载之后,双击安装包安装。安装完成后才是开始。
首先需要新建一个数据文件夹,用来存放MySQL的数据文件,这里命名为 mysqldata,当然也可以是其它的名字。
然后在 MySQL 根目录下,新建一个 my.ini 文件。
文件内容如下:
[mysqld]
# 设置mysql的安装目录,也就是刚才我们安装的目录
basedir=<安装目录>
# 设置mysql数据库的数据的存放目录,刚才创建的mysqldata目录
datadir=<新建目录>
# 设置默认使用的端口
port=3306
# 允许最大连接数
max_connections=200
# 允许连接失败的次数。这是为了防止有人试图攻击数据库
max_connect_errors=10
# 服务端使用的字符集
character-set-server=utf8mb4
# 数据库字符集对应一些排序等规则使用的字符集
collation-server=utf8mb4_general_ci
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
# 默认使用“mysql_native_password”插件作为认证加密方式
# MySQL8.0默认认证加密方式为caching_sha2_password
default_authentication_plugin=mysql_native_password
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8mb4
[client]
default-character-set=utf8mb4
port=3306
然后需要初始化数据库,一共有三步命令:
# 初始化MySQL
mysqld --initialize-insecure --user=mysql --console
# 安装MySQL服务
msyqld --install
# 启动服务
net start mysql
注意:在启动服务前需要管理权限,而且执行命令需要到mysql/bin目录下,否则会提示系统错误2。
获取所有的A股的股票,因为是从Tushare上获取,所以需要先建立股票的基本库。用来存对应的股票代码。
CREATE TABLE `stocks` (
`id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`ts_code` varchar(16) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`symbol` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL,
`name` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL,
`area` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL,
`industry` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL,
`fullname` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL,
`market` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL,
`list_status` varchar(2) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL,
`list_date` timestamp(0) NULL DEFAULT NULL,
`delist_date` timestamp(0) NULL DEFAULT NULL,
`is_hs` varchar(2) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `idx_stocks_ts_code`(`ts_code`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 3836 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
然后建立日交易数据库,用来存放日交易数据。
CREATE TABLE `trade_data` (
`id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
`ts_code` varchar(16) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`trade_date` timestamp(0) NULL DEFAULT NULL,
`open` float NOT NULL DEFAULT 0,
`high` float NOT NULL DEFAULT 0,
`low` float NOT NULL,
`close` float NOT NULL,
`pre_close` float NOT NULL,
`change` float NOT NULL,
`pct_chg` float NOT NULL,
`vol` float NOT NULL,
`amount` float NOT NULL DEFAULT 0,
`cdate` timestamp(0) NULL DEFAULT CURRENT_TIMESTAMP(0) ON UPDATE CURRENT_TIMESTAMP(0),
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `idx_trade_code_date`(`ts_code`, `trade_date`) USING BTREE,
INDEX `idx_date_pct_chg`(`trade_date`, `pct_chg`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 7187583 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '2002年至今日交易数据' ROW_FORMAT = Dynamic;
建立数据库之后,需要先下载股票的数据。Tushare需要先配置上自己的token然后利用新的pro的接口进行下载。
ts.set_token(token)
pro = ts.pro_api()
engine = create_engine('mysql+pymysql://root:@localhost/stocks?charset=utf8')
data = pro.stock_basic(fields='ts_code,symbol,name,fullname,area,industry,market,list_status,list_date,delist_date,'
'is_hs')
pd.io.sql.to_sql(data, 'stocks', con=engine, index=False, if_exists='append', chunksize=500)
之后再更新每日的交易数据。
pro = ts.pro_api()
engine = create_engine('mysql+pymysql://root:@localhost/stocks?charset=utf8')
DBSession = sessionmaker(bind=engine)
Base = declarative_base()
md = MetaData(bind=engine)
class dbStock(Base):
# 加载原表中的数据
__table__ = Table('stocks', md, autoload=True)
class dbDatas(Base):
__table__ = Table('trade_data', md, autoload=True)
session = DBSession()
# stock_count = session.query(func.count(dbStock.id)).scalar()
# datas_count = session.query(func.count(dbDatas.id)).filter(dbDatas.ts_code == '000001.SZ').scalar()
def update_trade(start_date, end_date):
global session
data = session.query(dbStock).filter().all()
for dt in data:
daily = pro.daily(ts_code=dt.ts_code, start_date=start_date, end_date=end_date)
print('stock:%s,count:%s' % (dt.id, daily.shape[0]))
pd.io.sql.to_sql(daily, 'trade_data', con=engine, index=False, if_exists='append', chunksize=500)
print('finshed')
update_trade('20180917', '20200923')
这里数据库的连接是利用的sqlalchemy操作的,因为已经建立的数据库,所以在数据表中加载原数据表即可。
本次文章主要是利用 Tushare 上的数据来搭建自己的数据基础,后面会分享利用 Backtrader 来进行策略编写,回测对应的股票数据。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有