今年,我最成功的一笔投资!
大家好,我是 Jack。
小伙伴们期盼已久的量化交易教程,今天它来了!
有不少小伙伴,一直很关心的我量化交易的实战情况,经常会被问到:5 万元,现在赚了多少?
这里统一回复下,目前浮盈 6%。
远低于我的预期,这跟大盘的走弱脱不开关系。9 月开始即巅峰,一路惨遭滑铁卢,大盘再也没回到过 3700 点,属实惨淡。
不过越是这种冷清的时候,越是充能学习的时刻。
我最成功的一笔投资,不是买了哪支股票,而是自学了很多有趣的技术。
我还是那句话,最好的投资,就是投资自己!
回顾了自己的这一年,收获良多,我学到了很多新技术。
今天,我们继续聊量化交易,上两期教程没看的小伙伴,可以看这里:
https://github.com/Jack-Cherish/quantitative
或者在公众号的精选文章->量化交易的栏目里查看往期教程。
量化交易,说白了,主要分为三个部分:
炒股数据获取 选股& 择时策略 交易系统
对于一些低频的交易策略,甚至都用不上交易系统,手动操作都行。
Udata
一个稳定的炒股数据获取接口很重要,可以自己写爬虫爬数据,但这样太不稳定。
今天给大家推荐一个好用的 API 接口:
https://udata.hs.net
Udata 大牌子,是深耕金融领域 30 年的恒生电子推出的金融数据社区。
恒生电子大家应该都听过,近千亿市值的大公司,用数据这种事,找这类背景好的社区准没错。
今天我就以 Udata 提供的 API 股票接口为例,来一期保姆级的量化交易教程。
Udata 安装
我们先从 Udata 的安装开始讲起。
首先要搭建一个 Python 的开发环境,Python 开发环境不会搭建的,可以看我之前发布的一篇教程:
Udata 可以使用 pip 安装。
pip install hs_udata
这样就表明安装好了。
然后注册个 Udata 账户,订阅一个体验套餐。各个社区都是一样的,都有免费的体验套餐给初学者使用。
注册并订阅号后,获取 token。
https://udata.hs.net/console/overAllView
打开链接,就能看到 token 的获取方式,直接复制即可。
然后使用如下代码,就可以获取数据了。
from hs_udata import set_token, stock_list # 引入 hs_udata 模块中 set_token 和 stock_list
if __name__ == "__main__":
# 替换你的 token,查看 token 地址:https://udata.hs.net/console/overAllView
set_token(token = 'xxxxx')
# 获取 股票列表数据,返回格式为 dataframe
data = stock_list()
# 打印数据前 5 行
print(data.head())
有正确的数据结果了,那恭喜你,配置成功!
量化分析
数据搞定了,我们就可以利用这个 API 接口,做一些策略。
无论是选股,还是择时交易,都可以使用这个 API 接口的数据进行。
Udata 的 API 文档写的很全面:
https://udata.hs.net/datas/202/
应有尽有:
之前的教程,给大家讲解过 ETF 动量轮动策略。
今天来点不一样的,基础的分析技巧,也是我们必备的基本功。
比如画个 K 线,可视化工具,可以直接使用 pyecharts。
如果没有安装这个库,可以先使用 pip 安装一下。
pip install pyecharts
pyecharts 的使用非常简单,可以直接看手册。
https://pyecharts.org/#/zh-cn/intro
我们结合 Udata 的数据获取 api 接口和 pyecharts 可视化工具,就可以自己绘制 K 线。
import hs_udata as udata
from datetime import datetime, timedelta
import time
from pyecharts import options as opts
from pyecharts.charts import Kline
if __name__ == "__main__":
# 替换你的 token,查看 token 地址:https://udata.hs.net/console/overAllView
udata.set_token(token = 'xxxxx')
current_dt = time.strftime("%Y-%m-%d", time.localtime())
current_dt = datetime.strptime(current_dt, '%Y-%m-%d')
# 获取 30 天的数据
day_num = 30
all_data = []
all_date = []
for i in range(1, day_num + 1)[::-1]:
search_date = current_dt - timedelta(days = i)
search_date = search_date.strftime("%Y%m%d")
# 恒生电子近 30 日的股价
data = udata.stock_quote_daily(en_prod_code = "600570.SH", trading_date = search_date)
# 开盘价
open_price = data['open_price'][0]
# 收盘价
close_price = data['close_price'][0]
# 最低价
low_price = data['low_price'][0]
# 最高价
high_price = data['high_price'][0]
# 去掉非交易日数据
if len(open_price) == 0:
continue
all_date.append(search_date)
all_data.append([float(open_price), float(close_price), float(low_price), float(high_price)])
# 使用 pyecharts 绘制 K 线
c = (
Kline()
.add_xaxis(all_date)
.add_yaxis(
"K线",
all_data,
itemstyle_opts = opts.ItemStyleOpts(
color = "#ec0000",
color0 = "#00da3c",
border_color = "#8A0000",
border_color0 = "#008F28",
),
)
.set_global_opts(
xaxis_opts = opts.AxisOpts(is_scale = True),
yaxis_opts = opts.AxisOpts(
is_scale = True,
splitarea_opts = opts.SplitAreaOpts(
is_show = True, areastyle_opts = opts.AreaStyleOpts(opacity = 1)
),
),
datazoom_opts = [opts.DataZoomOpts(type_ = "inside")],
title_opts = opts.TitleOpts(title = "恒生电子近 30 日 K 线"),
)
.render("kline.html")
)
运行成功后,会生成一个 kline.html
文件,用浏览器打开这个 html 文件,就可以看到绘制效果了。
可能有小伙伴会问,这都是炒股软件现成的,为什么要自己绘制?
只有亲自写代码后,你才能深刻认识到每个数据背后所代表的含义。
这是一个很好的,帮助我们学习的过程。
更重要的是,等我们熟练之后,可以根据自己的各种需求,定制化自己独家炒股界面。
你可以监控自己想要监控的所有信息。
像什么 KDJ、MACD 等各种指标,我们都是可以自己计算并可视化出来的。
不再受限于炒股软件的一些指标,甚至一些炒股软件的付费因子,我们都可以自己计算。
再比如,我们可以使用数据,做一些自己不了解的分析。举个非常简单的例子,你知道 A 股的行业分布情况吗?
几行代码就可以搞定。
import hs_udata as udata
from pyecharts import options as opts
from pyecharts.charts import Pie
from tqdm import tqdm
if __name__ == "__main__":
# 替换你的 token,查看 token 地址:https://udata.hs.net/console/overAllView
udata.set_token(token = 'xxxxx')
# 获取所有股票
data = udata.stock_list(listed_state = "1")
codes = data['hs_code'].tolist()
industry_name_dict = {}
# 遍历股票
for code in tqdm(codes):
# 获取股票行业信息
data = udata.industry_category(en_prod_code = code)
industry_name_csrc = data['industry_name_csrc'][0].split("-")[0]
# print(industry_name_csrc)
# 统计行业数量
if industry_name_csrc not in industry_name_dict.keys():
industry_name_dict[industry_name_csrc] = 1
else:
industry_name_dict[industry_name_csrc] += 1
# 可视化
c = (
Pie()
.add(
"",
[
list(z)
for z in zip(
industry_name_dict.keys(),
industry_name_dict.values(),
)
],
center=["40%", "50%"],
)
.set_global_opts(
title_opts=opts.TitleOpts(title="A 股股票行业分布"),
legend_opts=opts.LegendOpts(type_="scroll", pos_left="80%", orient="vertical"),
)
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
.render("pie.html")
)
运行代码,打开 pie.html
,即可查看 A 股股票的行业分布情况。
制造业半壁江山啊!
除了这种简单的行业统计,我们还可以统计每日的龙虎榜情况,监控股东持股情况,资金流向等。
根据股票的每日价格,我们还可以计算各种因子,辅助我们决策。
根据自己的需求,来个私人定制,搭建自己的交易体系。
当然了,师傅领进门,修行看个人。
能写的内容太多了,篇幅有限,今天先教一些基础的玩法。
这个系列教程,还会继续出,跟着 Jack 学技术吧!
哦对了, Udata 还有小程序社区,社区也有自己的技术教程,有很多干货文章和源代码。
我在里面也看了一些文章,社区的内容还是很丰富的,有很多学习量化交易的小伙伴们交流,也有一些大佬做技术分享。
絮叨
最后再多说两句,一直有不少小伙伴问我,卖系统不?卖源码不?卖服务不?
这样的询问,自从发了那期量化炒股的视频后,就没有断过,这是最近一次的这类对话。
说实话,还是建议自己学技术,自己写策略,那多香啊!
真的,一切并没有那么难,日积月累,慢慢学,学习用代码赚钱的过程,是一件很有趣的事情。
我是 Jack,我们下期见~
PS:Udata 社区的链接,为了方便大家查看,我放在了左下角的阅读原文里,点击即可查看。