标签归档:量化投资

半年磨一剑,我的第一个出海 APP 发布啦!

每隔一段时间,总有几个重要的经济数据会影响市场。美联储利率决定、非农、CPI、GDP、PMI…这些数字的起伏,往往牵动着全球市场的神经。

现在市面上的经济数据APP 大多都存在一个问题:没有直观体现经济数据发布后这些数据对世界各地的金融市场产生的影响。

这就是我开发 Market Moments 的初衷。它是一个简单但实用的经济数据工具:

它就像一个随身的经济日历,帮你:
1. 追踪重要经济数据对不同市场的影响


2. 交易日历,哪一天发布了什么经济事件,会发布什么经济事件,有什么节假日,在这个 APP 上一清二楚:


3. 搜索,你可以搜索历史上发生过的经济事件以及其对市场的影响


4. 收藏和自定义设置:点击右上角的小星星,你就可以收藏某个事件,避免重复查找。另外,在设置页面中,你还可以选择红涨绿跌/中英文/黑色模式等配置。


5.分享功能最后,你还可以通过分享按钮,将事件分享给你朋友:

不追求花哨的功能,只为满足最基础的需求 – 知道该看什么,什么时候看。

如果你也需要这样一个工具,欢迎在 App Store 搜索【Market Moments】。

推荐一个非常优惠的QMT开户渠道

很多喜欢玩量化的同学都想要找一个靠谱且低费率能做自动化的券商。

我之前也推荐过一个渠道,但是因为他们公司内部问题,之前的那个开户渠道也遗憾下线了,今天给大家找到了一个新的渠道,费率如下:

有需要的或有任何疑问的可以直接联系我的微信: 83493903 (备注开户) 进行开通,或扫描二维码开户,有专业人士会跟进后续的开户和功能开通。

【AI试试水】关于美股Copart公司的走势预测

以下是二七阿尔量化的AI小机器人关于Copart公司的分析。

科帕特(Copart)是一家美国德克萨斯州达拉斯的在线车辆拍卖和再营销服务商,在北美、欧洲和中东都有业务。

[积极因素]:

  1. Copart最近的表现令人印象深刻,股价在2023年上涨了50%,显示出投资者对公司的强烈信心。
  2. 公司在2024财年第一季度实现了实质性的增长,收入和净利润大幅增长,表明公司正在扩大全球业务,并增加市场份额。
  3. 公司强大的财务指标,包括高每股息税前利润(EBIT)和正面的净利润率,表明公司盈利能力健康。
  4. 公司的高流动性,如快速比率所示,表明它有足够的资源来满足短期债务。

[潜在问题]:

  1. 公司高的负债与净资产比率和总负债与总资产比率表明存在大量债务,如果公司的现金流不足以支付利息费用,这可能成为一个问题。
  2. 公司高的存货周转率可能表明存货管理效率低下,可能导致更高的成本和较低的盈利能力。
  3. 公司高的应收账款周转率可能表明较长的收款周期,可能影响其流动性。

分析:基于积极的发展和潜在的担忧,我预测Copart(CPRT)的股价将在未来一周内上涨3-4%(从2023年11月17日到2023年11月24日)。公司强劲的财务表现和增长,以及高流动性,表明它是一个稳健的投资。然而,高负债水平和潜在的存货管理效率不足是可能影响公司盈利能力的潜在问题。

总体而言,公司最近的表现和未来的增长潜力表明它是一个强大的投资。然而,投资者应密切关注公司的债务水平和存货管理,以确保这些问题不会显现出来。在短期内,公司的股价预计将继续上升,受到强烈的市场情绪和公司基本面的推动。

 

关于shortcut learning,是否可以用于股市数据?

什么是shortcut learning(快捷学习)

快捷学习(shortcut learning)是指神经网络在训练期间使用某些特定的捷径(shortcut)来完成任务,而这些捷径可能并没有真正理解任务的本质,而是通过记忆一些特定的输入-输出对来完成任务。这种学习方式可能会导致过拟合问题,并且对于新的输入数据可能会产生不准确的预测。

例如,在图像分类任务中,一个神经网络可能会倾向于使用一些表面特征(如颜色或形状)来判断图像属于哪个类别,而没有真正理解该类别的本质特征。这样的模型可能会在训练集上表现出色,但在测试集上的表现可能会受到影响,因为测试集中可能包含了一些不同于训练集的样本。

为了解决快捷学习问题,一些方法包括增加训练数据,使用正则化技术(如dropout),以及设计更复杂的神经网络架构等。

shortcut learning 适合哪些场景

快捷学习通常适用于一些具有高度结构化和规则化特征的任务,例如语音识别、图像分类和机器翻译等。在这些任务中,数据的结构和规律性可以被网络用来发现一些规则和模式,以加速学习过程。此外,快捷学习在一些数据较少的任务中也可以得到较好的表现,因为模型可以从有限的数据中学习并利用一些常见的输入-输出模式来加快训练速度。

但是,快捷学习也存在一些问题,如过拟合和对新数据的泛化性能不佳等问题。因此,在应用快捷学习技术时需要谨慎选择并结合其他方法来提高模型的泛化性能和稳健性。

股市分类问题通常是一个高度复杂和非线性的问题,由于股票市场的复杂性,快捷学习可能并不适合用于该领域的任务。

shortcut learning 适合股市的分类问题吗

股票市场的特征和趋势是难以预测和解释的,因此需要更深入和细致的分析和建模。相反,快捷学习更适合处理具有明显规则和结构的数据,例如语音、图像和自然语言处理等领域。

在股票市场的分类问题中,需要考虑各种不同的影响因素,例如市场走势、经济政策、公司业绩等等。因此,更适合使用一些复杂的深度学习方法来处理这些数据,例如循环神经网络(RNN)和卷积神经网络(CNN)。这些方法可以更好地捕捉到不同特征之间的复杂关系,并提高模型的泛化性能。

比如对于450W数据量的股市数据,由于数据量较大,可以考虑使用一些比较复杂的深度学习模型来进行建模。以下是几种可能适合的模型:

  1. 卷积神经网络(CNN):CNN适用于处理图像等具有空间结构的数据,可以学习到数据中的空间特征。在股票数据中,也可以将数据视为二维数据,其中一个维度表示时间,另一个维度表示不同的特征(如开盘价、收盘价等)。通过使用CNN,可以从这些二维数据中学习到时间序列上的模式,以及不同特征之间的关系。
  2. 长短时记忆网络(LSTM):LSTM适用于处理序列数据,能够捕捉到时间序列上的长期依赖关系。在股票数据中,LSTM可以用于学习和预测未来的股价走势。通过使用LSTM,可以从历史数据中学习到市场的趋势和规律,以及不同特征之间的关系,以便进行未来的预测。
  3. 注意力机制(Attention):注意力机制是一种可以自动学习不同特征之间的权重分配的技术。在股票数据中,可以使用注意力机制来学习哪些特征对于预测股价变化更加重要。通过使用注意力机制,可以从海量数据中自动选择对预测最有用的特征,提高预测的准确性。

综上所述,对于450W数据量的股市数据,可以尝试使用一些复杂的深度学习模型,例如CNN、LSTM和注意力机制等,以提高预测的准确性和稳定性。但是,选择哪种模型还需要考虑具体的问题和数据特征,需要进行实验和调整来选择最适合的模型。

Python 制作CNN模型分类股市秒级数据

1.准备

开始之前,你要确保Python和pip已经成功安装在电脑上,如果没有,请访问这篇文章:超详细Python安装指南 进行安装。

(可选1) 如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda,它内置了Python和pip.

(可选2) 此外,推荐大家用VSCode编辑器来编写小型Python项目:Python 编程的最好搭档—VSCode 详细指南

Windows环境下打开Cmd(开始—运行—CMD),苹果系统环境下请打开Terminal(command+空格输入Terminal),输入命令安装依赖:

pip install pandas
pip install numpy
pip install scikit-learn
pip install keras

2.CNN模型数据与预处理

获取数据

首先,你需要准备好股市秒级数据,这个文件的内容如下(可以在二七阿尔公众号后台回复秒级数据获取):

ts_code,trade_time,open,high,low,close,volume,amount
000001.SH,2021-10-08 15:00:00.0000000+08:00,3599.8,3600.0,3599.8,3600.0,0,0
000001.SH,2021-10-08 14:59:59.0000000+08:00,3599.8,3599.8,3599.7,3599.7,0,0
000001.SH,2021-10-08 14:59:58.0000000+08:00,
...

其中包含了某只股票的每秒开盘价、最高价、最低价、收盘价和成交量等信息。

然后,你需要对数据进行预处理,例如归一化、划分训练集和测试集、构造输入和输出等。这里我们假设你想用前10秒的数据来预测下一秒的涨跌情况,即二分类问题。我们可以用以下代码实现:

import pandas as pd
import numpy as np
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import train_test_split

# 读取数据
data = pd.read_csv("stock_data.csv")

# 归一化数据
scaler = MinMaxScaler()
data_scaled = scaler.fit_transform(data)

# 构造输入和输出
X = []
y = []
seq_len = 10 # 前10秒作为输入
for i in range(seq_len, len(data_scaled)):
    X.append(data_scaled[i-seq_len:i]) # 输入是10秒的数据
    y.append(1 if data_scaled[i][3] > data_scaled[i-1][3] else 0) # 输出是下一秒的涨跌情况

X = np.array(X)
y = np.array(y)

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

3.CNN模型搭建与评估

接下来,你需要搭建一个CNN模型来对输入进行特征提取和分类。这里我们使用Keras框架来实现一个简单的CNN模型,包含两个卷积层、两个池化层和一个全连接层:

from keras.models import Sequential
from keras.layers import Conv1D, MaxPooling1D, Flatten, Dense

# 定义模型参数
input_shape = (seq_len, 5) # 输入形状是(10, 5),即10秒的5个特征值
num_classes = 2 # 输出类别数是2,即涨或跌

# 搭建模型结构
model = Sequential()
model.add(Conv1D(filters=32, kernel_size=3, activation="relu", input_shape=input_shape)) # 第一个卷积层,使用32个3大小的卷积核,并使用relu激活函数
model.add(MaxPooling1D(pool_size=2)) # 第一个池化层,使用2大小的池化窗口,并默认使用最大池化方法
model.add(Conv1D(filters=64, kernel_size=3, activation="relu")) # 第二个卷积层,使用64个3大小的卷积核,并使用relu激活函数
model.add(MaxPooling1D(pool_size=2)) # 第二个池化层,使用2大小的池化窗口,并默认使用最大池化方法
model.add(Flatten()) # 将多维度的输出展平为一维度的向量,以便输入全连接层
model.add(Dense(units=num_classes, activation="softmax")) # 全连接层,使用softmax激活函数输出类别概率

# 编译模型并查看摘要信息 
model.compile(optimizer="adam", loss="sparse_categorical_crossentropy", metrics=["accuracy"])
model.summary()

最后,你需要训练模型并评估其性能。这里我们使用20个epoch来训练模型,并在每个epoch结束后在测试集上进行评估:

# 定义训练参数
epochs = 20 # 训练轮数
batch_size = 32 # 批次大小

# 训练模型并在测试集上评估
for epoch in range(epochs):
    model.fit(X_train, y_train, batch_size=batch_size) # 在训练集上训练模型
    loss, acc = model.evaluate(X_test, y_test) # 在测试集上评估模型
    print(f"Epoch {epoch+1}: loss={loss:.4f}, acc={acc:.4f}") # 打印损失和准确率

这样,你就完成了一个Python的CNN模型分类股市秒级数据的示例。希望对你有帮助。👍

我们的文章到此就结束啦,如果你喜欢今天的 Python 教程,请持续关注Python实用宝典。

有任何问题,可以在公众号后台回复:加群,回答相应验证信息,进入互助群询问。

原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!

给作者打赏,选择打赏金额
¥1¥5¥10¥20¥50¥100¥200 自定义

​Python实用宝典 ( pythondict.com )
不只是一个宝典
欢迎关注公众号:Python实用宝典

期现套利原理及其Python代码

当期货价格高于现货价格时,投资者可以通过期现套利策略,获得低风险、高回报的投资收益。本文将介绍期现套利的基本概念和实现方式,并提供Python代码示例。

什么是期现套利?

期现套利是一种通过利用现货市场和期货市场价格之间的差异进行投资的策略。当期货价格高于现货价格时,可以通过买入现货和卖出期货的方式进行套利,从而获得利润。

1.准备

开始之前,你要确保Python和pip已经成功安装在电脑上,如果没有,请访问这篇文章:超详细Python安装指南 进行安装。

(可选1) 如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda,它内置了Python和pip.

(可选2) 此外,推荐大家用VSCode编辑器来编写小型Python项目:Python 编程的最好搭档—VSCode 详细指南

Windows环境下打开Cmd(开始—运行—CMD),苹果系统环境下请打开Terminal(command+空格输入Terminal),输入命令安装依赖:

2.如何实现期现套利?

期现套利可以通过以下步骤实现:

2.1 确定现货和期货的标的资产,并获取其价格数据。可以使用Python中的yfinance模块获取股票和期货的价格数据。

import yfinance as yf

# 获取标的现货价格
underlying_stock = yf.Ticker("AAPL")
underlying_stock_price = underlying_stock.history(period="1d")["Close"][0]

# 获取期货价格
futures_contract = "ES=F"
futures_data = yf.download(futures_contract, period="1d")
futures_price = futures_data["Close"][0]

2.2 计算期货溢价或折价,并确定买卖方向。如果期货价格高于现货价格,则进行空头套利,即卖出期货合约,买入现货资产;反之,则进行多头套利,即买入期货合约,卖出现货资产。

# 计算期货溢价或折价
futures_premium = futures_price - underlying_stock_price

# 进行期现套利
if futures_premium > 0:
    # 期货折价,买入期货,卖出现货
    futures_quantity = 1
    underlying_stock_quantity = round(futures_price / underlying_stock_price, 2)
    print(f"买入 {futures_quantity} 手期货,卖出 {underlying_stock_quantity} 股现货")
else:
    # 期货溢价,卖出期货,买入现货
    futures_quantity = 1
    underlying_stock_quantity = round(futures_price / underlying_stock_price, 2)
    print(f"卖出 {futures_quantity} 手期货,买入 {underlying_stock_quantity} 股现货")

总结

期现套利是一种通过利用现货市场和期货市场价格差异进行投资的策略,需要投资者在现货和期货市场中具有一定的交易经验和分析能力。通过使用Python等程序化交易工具,投资者可以更加高效地实现期现套利策略。

[股票估值方法] Python实现股利折现模型

股票估值是根据公司的财务数据和市场环境,计算出公司的内在价值,从而决定股票的价格。以下是一些常见的股票估值方法:

  1. 市盈率(P/E比):市盈率是公司股票价格与每股收益之比,用于衡量投资者愿意为每一元盈利支付多少。较高的市盈率通常表示投资者对公司未来的盈利表现持乐观态度,反之则表示投资者对公司未来的盈利表现持悲观态度。
  2. 市净率(P/B比):市净率是公司股票价格与每股净资产之比,用于衡量投资者愿意为每一元净资产支付多少。较低的市净率通常表示公司股票被低估,反之则表示公司股票被高估。
  3. 股利折现模型:股利折现模型将公司未来的股利现值与当前股票价格进行比较。如果公司未来的股利预期较高,那么股票价格就会上升。如果公司未来的股利预期较低,那么股票价格就会下降。
  4. 财务比率分析:通过分析公司的财务数据,如利润率、毛利率、净利润率、流动比率等,来衡量公司的盈利能力、偿债能力、流动性等,从而评估公司的价值和股票价格。

以上这些方法都有各自的优缺点,投资者可以根据自己的风险偏好、投资目标和投资策略,选择最适合自己的股票估值方法。而本文的重点,将介绍股利折现模型的原理及其计算方法。

1.股利折现模型是怎么样的?

股利折现模型是一种估值方法,用于计算一家公司的股票内在价值。该模型的基本假设是,公司未来的股利和股票价格应该是成比例的。因此,该模型基于两个关键要素:预期股利和股利的折现率。

股利折现模型的计算公式如下:

股票价格 = 每股股利 / (折现率 – 成长率)

其中,每股股利是指公司未来每股的预期股利,折现率是指投资者期望从股票投资中获得的回报率,成长率是指公司未来股利的增长率。

该模型的基本思想是,将未来的现金流折现回当前的价值,以便更准确地估算当前股票的内在价值。如果当前股票价格低于计算出的内在价值,则股票被认为是被低估的,可以被认为是购买的好时机。

股利折现模型的优点是可以考虑公司未来的盈利增长,以及投资者对股票的回报要求。但是,该模型的缺点是它基于一些假设,如股利的增长率是稳定的、折现率不变等,这些假设可能不符合实际情况。此外,该模型也无法考虑公司的负债情况、市场竞争等外部因素的影响。因此,投资者在使用股利折现模型进行估值时应该同时考虑其他因素,以得到更全面和准确的估值结果。

2.公司未来每股的预期股利要怎么判断?

公司未来每股的预期股利是股利折现模型的一个重要参数,对于准确估值非常重要。以下是一些方法可以用来判断公司未来每股的预期股利:

  1. 分析公司财务数据:分析公司的财务数据,特别是过去几年的股利发放情况,可以得出公司股利的增长率和稳定性。根据过去的表现和趋势,可以估计公司未来的股利水平。
  2. 研究行业和市场:了解公司所处的行业和市场发展趋势,可以推测公司未来的盈利和股利情况。例如,如果行业处于增长期,公司可能会增加股利以吸引投资者,反之,如果行业处于衰退期,公司可能会减少股利以保持现金流稳定。
  3. 调查公司管理层:通过与公司管理层沟通,了解公司的战略规划和财务目标,可以获得更准确的股利预测。
  4. 参考分析师的研究报告:参考股票分析师的研究报告,了解他们对公司未来股利的预测和分析,可以作为参考。

需要注意的是,股利预测不是绝对准确的,未来的市场和经济环境都是不确定的,因此需要综合考虑多种因素,以得到更准确的股利预测。另外,不同的股利预测方法可能会得出不同的结果,投资者应该根据自己的风险偏好和投资目标,选择最适合自己的股利预测方法。

3.Python实现股利折现模型计算

下面我们将实现一个简单的Python股利折现模型计算。

下面是一个用Python实现股利折现模型的例子,假设公司未来10年每年的股利分别为2, 2.2, 2.4, 2.6, 2.8, 3, 3.2, 3.4, 3.6和3.8元,且未来的股利增长率为5%,投资者对该股票的回报要求为10%。

def dividend_discount_model(dividends, discount_rate, growth_rate):
    # 计算股利折现模型的股票价格
    present_value = 0
    for i in range(len(dividends)):
        present_value += dividends[i] / (1 + discount_rate) ** (i + 1)
    terminal_value = dividends[-1] * (1 + growth_rate) / (discount_rate - growth_rate)
    stock_price = present_value + terminal_value / (1 + discount_rate) ** (len(dividends))
    return stock_price

dividends = [2, 2.2, 2.4, 2.6, 2.8, 3, 3.2, 3.4, 3.6, 3.8]  # 未来10年每年的股利
discount_rate = 0.1  # 投资者对该股票的回报要求为10%
growth_rate = 0.05  # 股利增长率为5%
stock_price = dividend_discount_model(dividends, discount_rate, growth_rate)
print("股票价格为:", round(stock_price, 2), "元")

输出结果为:

股票价格为: 35.37 元

以上代码实现了一个简单的股利折现模型,通过输入股票未来每年的股利、投资者对该股票的回报要求和股利增长率等参数,计算出该股票的内在价值。需要注意的是,股利折现模型并不是唯一的估值方法,投资者应该综合考虑多种因素进行估值,以得到更准确的结果。

我们的文章到此就结束啦,如果你喜欢今天的 Python 教程,请持续关注Python实用宝典。

有任何问题,可以在公众号后台回复:加群,回答相应验证信息,进入互助群询问。

原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!

给作者打赏,选择打赏金额
¥1¥5¥10¥20¥50¥100¥200 自定义

​Python实用宝典 ( pythondict.com )
不只是一个宝典
欢迎关注公众号:Python实用宝典

手把手教你使用QMT实现全自动买卖股票的策略

很多玩股票的朋友都希望能通过计算机来自动买入卖出股票,这样的作法在美股中很常见,但在A股由于监管的问题,从前我们的做法是通过Easytrader来实现股票的自动买入和卖出,但是这种做法会让交易时延达到1秒左右,而现在,通过QMT我们能直接将这1秒的延迟直接消除。

通过QMT的交易接口,我们能实现毫秒级的交易时延,比Easytrader速度快不少。这非常重要,要知道对于交易热门的股票,差1秒,买入价差可能就差5档。

本文将教大家如何使用QMT进行基础的简单买入卖出和撤单的功能,在本文的最后会介绍仅需3万门槛且起步仅0.5元的QMT开通通道。

1.下载并使用QMT程序

QMT程序可以在我们公众号后台回复 QMT 下载。

下载登陆后,请先安装Python,在设置->模型设置中,点击Python库下载即可:

然后,要实现自动交易的功能,我们必须在模型研究中,新建一个策略:

然后就会弹出一个策略的编辑器,在这里会编辑我们的买入卖出策略:

 

 

2.QMT基本函数介绍

QMT的基本执行结构是:

# 公众号:二七阿尔量化

def init(ContextInfo):
	ContextInfo.accID = '你的账号ID'
    
def handlebar(ContextInfo):
    # 处理K线
    pass

下面会一步一步地讲解如何基于这个基本结构制作我们的根据信号买入卖出策略。

定时器

定时器是我们实现毫秒级策略的基础。在QMT中,执行是按照K线来的,比如分钟K线,日线等K线类型,新的一根bar到来后,就进入handle_bar函数被用户处理。但是这样按K线执行的逻辑有一个严重的问题,那就是无法执行秒级、毫秒级的策略。

如果你需要执行毫秒级的策略,就需要用到定时器了:

# 公众号:二七阿尔量化
ContextInfo.run_time("buy_logic", "100nMilliSecond", "2019-10-14 13:20:00")

这行代码的意思便是从2019-10-14 13:20:00开始,每隔100毫秒执行一次 buy_logic 函数。

只需要把这行代码放在 init 函数下,便会启动定时器。

买入卖出

首先介绍如何在QMT中实现自动买入卖出。QMT的买入卖出函数都是 passorder,通过传参实现不同的操作,比如:

passorder(23, 1102, account_id, "002587", 11, 6.80, 55000, "concepts_main", 1, "", ContextInfo)

看不懂不要紧,我们先往下看。

对于股票交易,它的参数列表如下:

passorder(opType, orderType, accountid, orderCode, prType, modelprice, volume, strategyName, quickTrade, ContextInfo)

opType: 我们上述例子中 opType 为 23,意思为 股票买入,或沪港通、深港通股票买入。对于股票的交易,它只有两种选项:

23: 股票买入,或沪港通、深港通股票买入
24: 股票卖出,或沪港通、深港通股票卖出

orderType: 这个参数是能让你指定 按股买入/按金额买入/按总资产比例买入/按可用比例买入某只股票,非常好用:

1101: 单股、单账号、普通、股/手方式下单(ETF申赎只能用此参数)
1102: 单股、单账号、普通、金额(元)方式下单(只支持股票)
1113: 单股、单账号、总资产、比例[0~1]方式下单
1123: 单股、单账号、可用、比例[0~1]方式下单

account_id: 用户ID,即你的股票账户名。

orderCode: 股票代码,不要添加任何后缀。

prType: 下单选价类型,可以选择以下委托方式

0:卖5价
1:卖4价
2:卖3价
3:卖2价
4:卖1价
5:最新价
6:买1价
7:买2价(组合不支持)
8:买3价(组合不支持)
9:买4价(组合不支持)
10:买5价(组合不支持)
11:(指定价)模型价(只对单股情况支持,对组合交易不支持)
12:涨跌停价
13:挂单价
14:对手价
26:限价即时全部成交否则撤单[上交所|深交所][期权]
27:市价即成剩撤[上交所][期权]
28:市价即全成否则撤[上交所][期权]
29:市价剩转限价[上交所][期权]
42:最优五档即时成交剩余撤销申报[上交所][股票]
43:最优五档即时成交剩转限价申报[上交所][股票]
44:对手方最优价格委托[深交所][股票][期权]
45:本方最优价格委托[深交所][股票][期权]
46:即时成交剩余撤销委托[深交所][股票][期权]
47:最优五档即时成交剩余撤销委托[深交所][股票][期权]
48:全额成交或撤销委托[深交所][股票][期权]

请注意,在今天全面注册制后,正常交易存在价格笼子(挂单最多只能在当前最新价上浮动2%),所以除了在集合竞价中使用涨跌停价(12),其他情况都不要使用。

modelprice: 指定买入价格,只有当prType是模型价时price有效;其它情况无效。

volume: 决定买入的量,根据orderType值最后一位确定volume的单位:

# 当orderType最后一位为:
1:股/手
2:金额(元)
3:比例

strategyName: 策略名称,按你喜好来定即可

quickTrade: 是否立马触发下单,0 否,1 是

ContextInfo: QMT的上下文,必须传递,保持变量不变即可。

然后我们再回过头来看这行代码:

# 公众号: 二七阿尔量化
passorder(23, 1102, account_id, "002587", 11, 6.80, 55000, "concepts_main", 1, "", ContextInfo)

它的意思是,用户(参数2) 以指定金额的方式(参数1) 买入(参数0) 股票002587(参数3), 按照指定价(参数4) 6.80 元的价格(参数5), 希望可以成交 55000 元(参数6).

现在,不看我的答案的情况下,尝试理解下面这行卖出代码:

# 公众号: 二七阿尔量化
passorder(24, 1123, account_id, "002587", 12, 0, 1, "concepts_main", 1, "", ContextInfo)

答案是用户(参数2) 以可用比例的方式(参数1) 卖出(参数0) 股票002587(参数3), 按照涨跌停价(参数4) (参数5随意), 希望可以 100% (参数6) 成交。

获取仓位

仓位的获取也很简单,只需要传递account_id,第二个参数指定 “STOCK”(股票), 第三个参数指定为”POSITION”(仓位)即可:

# 公众号: 二七阿尔量化
positions = get_trade_detail_data(account_id, "STOCK", "POSITION")

获取委托

委托列表和仓位列表的获取方式都是通过get_trade_detail_data函数,只不过第三个参数改为”ORDER”

# 公众号: 二七阿尔量化
get_trade_detail_data(account_id, "STOCK", "ORDER"):

3.QMT买入、卖出、撤单并行运行

如果你希望一个线程检测是否买入某只股票、另一个线程检测是否需要撤单,还有一个线程进行卖出操作,那么你可以这么做:

# encoding:gbk
# 公众号: 二七阿尔量化
import time
import datetime


account_id = ""
def init(ContextInfo):
    ContextInfo.accID = account_id
    ContextInfo.max_buy = 3
    ContextInfo.run_time("buy_logic", "100nMilliSecond", "2019-10-14 13:20:00", 'SZ')
    ContextInfo.run_time("cancel_logic", "1000nMilliSecond", "2019-10-14 13:20:00", 'SZ')
    ContextInfo.run_time("sell_logic", "300nMilliSecond", "2019-10-14 13:20:00", 'SZ')


def handlebar(ContextInfo):
    pass


def buy_logic(ContextInfo):
    """
    你的买入逻辑
    """
    pass

def cancel_logic(ContextInfo):
    """
    你的撤单逻辑
    """
    pass

def sell_logic(ContextInfo):
    """
    你的卖出逻辑
    """
    pass

这三个run_time的意思是分别按每100毫秒执行买入逻辑、每1秒执行撤单逻辑,每300毫秒执行卖出逻辑。

只需要一个程序就能完成这三件事,用过Easytrader的同学一下就会明白这比Easytrader好用多了。

我们有一个相对完整的根据信号买入卖出的代码,在开户入金完成后,公众号后台回复:QMT代码 联系我获取代码。

4.运行QMT自动买入卖出程序

填充完你的各种逻辑后,保存程序,点击模型交易

选择左上角的新建策略交易,找到你刚刚保存的策略:

选择好账号类型和资金账号,确定后便可以准备开始运行策略,点击运行模式可以切换实盘/模拟盘。点击操作里的三角形便可以启动策略。

如果你是按本文定时器的方法使用QMT,你不需要在意策略周期。

本文对QMT的基本介绍结束,根据我这半个月的使用经历,我认为QMT对于我们量化交易而言是非常值得使用的,平均成交时间会比Easytrader方法快1秒左右。此外也不需要开启多个Easytrader进程去按键精灵般点点点,基本不会出现报错的情况。

我们的文章到此就结束啦,如果你喜欢今天的 Python 教程,请持续关注Python实用宝典。

有任何问题,可以在公众号后台回复:加群,回答相应验证信息,进入互助群询问。

原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!

给作者打赏,选择打赏金额
¥1¥5¥10¥20¥50¥100¥200 自定义

​Python实用宝典 ( pythondict.com )
不只是一个宝典
欢迎关注公众号:Python实用宝典

Bulbea 让你轻而易举实现股票的深度学习量化

Bulbea 是一个基于深度学习开发的,用于股票市场预测和建模的Python库。

Bulbea 自带了不少可用于股票深度学习训练及测试的API,并且易于对数据进行扩展和延申,构建属于我们自己的数据及模型。

下面就来介绍一下这个模块。

1.准备

开始之前,你要确保Python和pip已经成功安装在电脑上,如果没有,请访问这篇文章:超详细Python安装指南 进行安装。

(可选1) 如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda,它内置了Python和pip.

(可选2) 此外,推荐大家用VSCode编辑器来编写小型Python项目:Python 编程的最好搭档—VSCode 详细指南

Windows环境下打开Cmd(开始—运行—CMD),苹果系统环境下请打开Terminal(command+空格输入Terminal),输入命令安装依赖:

git clone https://github.com/achillesrasquinha/bulbea.git && cd bulbea
pip install -r requirements.txt
python setup.py install

如果你无法访问Github,请在二七阿尔量化后台回复Bulbea下载项目镜像(2022-11-28).

此外,你还需要安装 Tensorflow 的CPU版本或GPU版本:

pip install tensorflow     # CPU 版本
pip install tensorflow-gpu # GPU 版本 - 需要 CUDA, CuDNN

2.Bulbea 基本使用方法

Bulbea 和普通的深度学习研究项目一样,在做训练和测试时,分为四步(加载数据,预处理,建模,测试)。

2.1 加载数据

Bulbea内置了数据下载模块,让你很轻易地能够下载雅虎财经的股票数据,比如下面下载雅虎财经源的GOOGL股票数据:

>>> import bulbea as bb
>>> share = bb.Share('YAHOO', 'GOOGL')
>>> share.data
# Open        High         Low       Close      Volume  \
# Date                                                                     
# 2004-08-19   99.999999  104.059999   95.959998  100.339998  44659000.0   
# 2004-08-20  101.010005  109.079998  100.500002  108.310002  22834300.0   
# 2004-08-23  110.750003  113.479998  109.049999  109.399998  18256100.0   
# 2004-08-24  111.239999  111.599998  103.570003  104.870002  15247300.0   
# 2004-08-25  104.960000  108.000002  103.880003  106.000005   9188600.0
...

2.2 预处理

Bulbea 同样也内置了预处理模块,让你能够轻易地分割训练集和测试集:

>>> from bulbea.learn.evaluation import split
>>> Xtrain, Xtest, ytrain, ytest = split(share, 'Close', normalize = True)

2.3 建模

Bulbea自带了RNN模型可供使用:

>>> import numpy as np
>>> Xtrain = np.reshape(Xtrain, (Xtrain.shape[0], Xtrain.shape[1], 1))
>>> Xtest  = np.reshape( Xtest, ( Xtest.shape[0],  Xtest.shape[1], 1))

>>> from bulbea.learn.models import RNN
>>> rnn = RNN([1, 100, 100, 1]) # number of neurons in each layer
>>> rnn.fit(Xtrain, ytrain)
# Epoch 1/10
# 1877/1877 [==============================] - 6s - loss: 0.0039
# Epoch 2/10
# 1877/1877 [==============================] - 6s - loss: 0.0019
...

2.4 测试

通过调用sklearn的metrics就能对数据实现测试:

>>> from sklearn.metrics import mean_squared_error
>>> p = rnn.predict(Xtest)
>>> mean_squared_error(ytest, p)
0.00042927869370525931
>>> import matplotlib.pyplot as pplt
>>> pplt.plot(ytest)
>>> pplt.plot(p)
>>> pplt.show()

3.情感分析

Bulbea 能自动爬取相关股票在推特上的文字,并对这些文字做一个情感分析。

你只需要给Bulbea提供以下环境变量就能够进行感情色彩分析:

export BULBEA_TWITTER_API_KEY="<YOUR_TWITTER_API_KEY>"
export BULBEA_TWITTER_API_SECRET="<YOUR_TWITTER_API_SECRET>"

export BULBEA_TWITTER_ACCESS_TOKEN="<YOUR_TWITTER_ACCESS_TOKEN>"
export BULBEA_TWITTER_ACCESS_TOKEN_SECRET="<YOUR_TWITTER_ACCESS_TOKEN_SECRET>"

测试一下:

>>> import bulbea as bb
>>> share = bb.Share('YAHOO', 'GOOGL')
>>> bb.sentiment(share)
0.07580128205128206

当然,这个分析仅供参考,太粗略了。

我们的文章到此就结束啦,如果你喜欢今天的 Python 教程,请持续关注Python实用宝典。

有任何问题,可以在公众号后台回复:加群,回答相应验证信息,进入互助群询问。

原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!

给作者打赏,选择打赏金额
¥1¥5¥10¥20¥50¥100¥200 自定义

​Python实用宝典 ( pythondict.com )
不只是一个宝典
欢迎关注公众号:Python实用宝典

Zvt 集成A股数据下载及策略开发的好工具

Zvt 既提供了可视化的历史数据浏览方式(web),又提供了A股历史数据的获取接口,是一个好用的股票数据下载工具。

它的使用方式非常简单,下面就教大家如何安装使用这个模块。

1.准备

开始之前,你要确保Python和pip已经成功安装在电脑上,如果没有,请访问这篇文章:超详细Python安装指南 进行安装。

(可选1) 如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda,它内置了Python和pip.

(可选2) 此外,推荐大家用VSCode编辑器来编写小型Python项目:Python 编程的最好搭档—VSCode 详细指南

Windows环境下打开Cmd(开始—运行—CMD),苹果系统环境下请打开Terminal(command+空格输入Terminal),输入命令安装依赖:

pip install -U zvt

注意,Python版本最好大于等于Python3.6.

2.Zvt Web 界面

如果你想要进入web界面,在安装完成模块后,重启终端,进入你的zvt所属Python环境,执行下面这行命令:

zvt

然后打开  http://127.0.0.1:8050/ 就能看到相关的图表:

3.Zvt 获取数据

想要通过Zvt获取A股股票的基本数据,你只需要这样:

from zvt.domain import *
Stock.record_data(provider="em")
df = Stock.query_data(provider="em", index='code')
print(df)
"""
                     id        entity_id  timestamp entity_type exchange    code   name  list_date end_date
code
000001  stock_sz_000001  stock_sz_000001 1991-04-03       stock       sz  000001   平安银行 1991-04-03     None
000002  stock_sz_000002  stock_sz_000002 1991-01-29       stock       sz  000002  万  科A 1991-01-29     None
000004  stock_sz_000004  stock_sz_000004 1990-12-01       stock       sz  000004   国华网安 1990-12-01     None
000005  stock_sz_000005  stock_sz_000005 1990-12-10       stock       sz  000005   世纪星源 1990-12-10     None
000006  stock_sz_000006  stock_sz_000006 1992-04-27       stock       sz  000006   深振业A 1992-04-27     None
...                 ...              ...        ...         ...      ...     ...    ...        ...      ...
605507  stock_sh_605507  stock_sh_605507 2021-08-02       stock       sh  605507   国邦医药 2021-08-02     None
605577  stock_sh_605577  stock_sh_605577 2021-08-24       stock       sh  605577   龙版传媒 2021-08-24     None
605580  stock_sh_605580  stock_sh_605580 2021-08-19       stock       sh  605580   恒盛能源 2021-08-19     None
605588  stock_sh_605588  stock_sh_605588 2021-08-12       stock       sh  605588   冠石科技 2021-08-12     None
605589  stock_sh_605589  stock_sh_605589 2021-08-10       stock       sh  605589   圣泉集团 2021-08-10     None

[4136 rows x 9 columns]
"""

注意, provider = “em” 指的是 东方财富(eastmoney).

历史数据获取:

from zvt.domain import *
Stock1dHfqKdata.record_data(code='000338', provider='em')
df = Stock1dHfqKdata.query_data(code='000338', provider='em')
print(df)
"""
                              id        entity_id  timestamp provider    code  name level    open   close    high     low     volume      turnover  change_pct  turnover_rate
0     stock_sz_000338_2007-04-30  stock_sz_000338 2007-04-30     None  000338  潍柴动力    1d   70.00   64.93   71.00   62.88   207375.0  1.365189e+09      2.1720         0.1182
1     stock_sz_000338_2007-05-08  stock_sz_000338 2007-05-08     None  000338  潍柴动力    1d   66.60   64.00   68.00   62.88    86299.0  5.563198e+08     -0.0143         0.0492
2     stock_sz_000338_2007-05-09  stock_sz_000338 2007-05-09     None  000338  潍柴动力    1d   63.32   62.00   63.88   59.60    93823.0  5.782065e+08     -0.0313         0.0535
3     stock_sz_000338_2007-05-10  stock_sz_000338 2007-05-10     None  000338  潍柴动力    1d   61.50   62.49   64.48   61.01    47720.0  2.999226e+08      0.0079         0.0272
4     stock_sz_000338_2007-05-11  stock_sz_000338 2007-05-11     None  000338  潍柴动力    1d   61.90   60.65   61.90   59.70    39273.0  2.373126e+08     -0.0294         0.0224
...                          ...              ...        ...      ...     ...   ...   ...     ...     ...     ...     ...        ...           ...         ...            ...
3426  stock_sz_000338_2021-08-27  stock_sz_000338 2021-08-27     None  000338  潍柴动力    1d  331.97  345.95  345.95  329.82  1688497.0  3.370241e+09      0.0540         0.0398
3427  stock_sz_000338_2021-08-30  stock_sz_000338 2021-08-30     None  000338  潍柴动力    1d  345.95  342.72  346.10  337.96  1187601.0  2.377957e+09     -0.0093         0.0280
3428  stock_sz_000338_2021-08-31  stock_sz_000338 2021-08-31     None  000338  潍柴动力    1d  344.41  342.41  351.02  336.73  1143985.0  2.295195e+09     -0.0009         0.0270
3429  stock_sz_000338_2021-09-01  stock_sz_000338 2021-09-01     None  000338  潍柴动力    1d  341.03  336.42  341.03  328.28  1218697.0  2.383841e+09     -0.0175         0.0287
3430  stock_sz_000338_2021-09-02  stock_sz_000338 2021-09-02     None  000338  潍柴动力    1d  336.88  339.03  340.88  329.67  1023545.0  2.012006e+09      0.0078         0.0241

[3431 rows x 15 columns]
"""

财务数据获取:

from zvt.domain import *
FinanceFactor.record_data(code='000338')
FinanceFactor.query_data(code='000338',columns=FinanceFactor.important_cols(),index='timestamp')
"""
            basic_eps  total_op_income    net_profit  op_income_growth_yoy  net_profit_growth_yoy     roe    rota  gross_profit_margin  net_margin  timestamp
timestamp
2002-12-31        NaN     1.962000e+07  2.471000e+06                   NaN                    NaN     NaN     NaN               0.2068      0.1259 2002-12-31
2003-12-31       1.27     3.574000e+09  2.739000e+08              181.2022               109.8778  0.7729  0.1783               0.2551      0.0766 2003-12-31
2004-12-31       1.75     6.188000e+09  5.369000e+08                0.7313                 0.9598  0.3245  0.1474               0.2489      0.0868 2004-12-31
2005-12-31       0.93     5.283000e+09  3.065000e+08               -0.1463                -0.4291  0.1327  0.0603               0.2252      0.0583 2005-12-31
2006-03-31       0.33     1.859000e+09  1.079000e+08                   NaN                    NaN     NaN     NaN                  NaN      0.0598 2006-03-31
...               ...              ...           ...                   ...                    ...     ...     ...                  ...         ...        ...
2020-08-28       0.59     9.449000e+10  4.680000e+09                0.0400                -0.1148  0.0983  0.0229               0.1958      0.0603 2020-08-28
2020-10-31       0.90     1.474000e+11  7.106000e+09                0.1632                 0.0067  0.1502  0.0347               0.1949      0.0590 2020-10-31
2021-03-31       1.16     1.975000e+11  9.207000e+09                0.1327                 0.0112  0.1919  0.0444               0.1931      0.0571 2021-03-31
2021-04-30       0.42     6.547000e+10  3.344000e+09                0.6788                 0.6197  0.0622  0.0158               0.1916      0.0667 2021-04-30
2021-08-31       0.80     1.264000e+11  6.432000e+09                0.3375                 0.3742  0.1125  0.0287               0.1884      0.0653 2021-08-31

[66 rows x 10 columns]
"""

资产负债表、利润表、现金流表:

from zvt.domain import *
BalanceSheet.record_data(code='000338')
IncomeStatement.record_data(code='000338')
CashFlowStatement.record_data(code='000338')

更多数据请看

from zvt.domain import *
print(zvt_context.schemas)
"""
[zvt.domain.dividend_financing.DividendFinancing,
 zvt.domain.dividend_financing.DividendDetail,
 zvt.domain.dividend_financing.SpoDetail...]
"""

4.Zvt 市场筛选

基于query_data的filters参数,你还能实现筛选,比如2018年年报中roe>8%、营收增速>8%的前20只股票:

from zvt.domain import *
df = FinanceFactor.query_data(filters=[FinanceFactor.roe>0.08,FinanceFactor.report_period=='year',FinanceFactor.op_income_growth_yoy>0.08],start_timestamp='2019-01-01',order=FinanceFactor.roe.desc(),limit=20,columns=["code"]+FinanceFactor.important_cols(),index='code')
print(df)
"""
          code  basic_eps  total_op_income    net_profit  op_income_growth_yoy  net_profit_growth_yoy     roe    rota  gross_profit_margin  net_margin  timestamp
code
000048  000048     2.7350     4.919000e+09  1.101000e+09                0.4311                 1.5168  0.7035  0.1988               0.5243      0.2355 2020-04-30
000912  000912     0.3500     4.405000e+09  3.516000e+08                0.1796                 1.2363  4.7847  0.0539               0.2175      0.0795 2019-03-20
002207  002207     0.2200     3.021000e+08  5.189000e+07                0.1600                 1.1526  1.1175  0.1182               0.1565      0.1718 2020-04-27
002234  002234     5.3300     3.276000e+09  1.610000e+09                0.8023                 3.2295  0.8361  0.5469               0.5968      0.4913 2020-04-21
002458  002458     3.7900     3.584000e+09  2.176000e+09                1.4326                 4.9973  0.8318  0.6754               0.6537      0.6080 2020-02-20
...        ...        ...              ...           ...                   ...                    ...     ...     ...                  ...         ...        ...
600701  600701    -3.6858     7.830000e+08 -3.814000e+09                1.3579                -0.0325  1.9498 -0.7012               0.4173     -4.9293 2020-04-29
600747  600747    -1.5600     3.467000e+08 -2.290000e+09                2.1489                -0.4633  3.1922 -1.5886               0.0378     -6.6093 2020-06-30
600793  600793     1.6568     1.293000e+09  1.745000e+08                0.1164                 0.8868  0.7490  0.0486               0.1622      0.1350 2019-04-30
600870  600870     0.0087     3.096000e+07  4.554000e+06                0.7773                 1.3702  0.7458  0.0724               0.2688      0.1675 2019-03-30
688169  688169    15.6600     4.205000e+09  7.829000e+08                0.3781                 1.5452  0.7172  0.4832               0.3612      0.1862 2020-04-28

[20 rows x 11 columns]
"""

5.Zvt 编写策略

Zvt还能编写策略,然后能在页面上查看你策略产生的买入信号和卖出信号:

# -*- coding: utf-8 -*-
import pandas as pd

from zvt.api import get_recent_report_date
from zvt.contract import ActorType, AdjustType
from zvt.domain import StockActorSummary, Stock1dKdata
from zvt.trader import StockTrader
from zvt.utils import pd_is_not_null, is_same_date, to_pd_timestamp


class FollowIITrader(StockTrader):
    finish_date = None

    def on_time(self, timestamp: pd.Timestamp):
        recent_report_date = to_pd_timestamp(get_recent_report_date(timestamp))
        if self.finish_date and is_same_date(recent_report_date, self.finish_date):
            return
        filters = [StockActorSummary.actor_type == ActorType.raised_fund.value,
                   StockActorSummary.report_date == recent_report_date]

        if self.entity_ids:
            filters = filters + [StockActorSummary.entity_id.in_(self.entity_ids)]

        df = StockActorSummary.query_data(filters=filters)

        if pd_is_not_null(df):
            self.logger.info(f'{df}')
            self.finish_date = recent_report_date

        long_df = df[df['change_ratio'] > 0.05]
        short_df = df[df['change_ratio'] < -0.5]
        try:
            self.trade_the_targets(due_timestamp=timestamp, happen_timestamp=timestamp,
                                   long_selected=set(long_df['entity_id'].to_list()),
                                   short_selected=set(short_df['entity_id'].to_list()))
        except Exception as e:
            self.logger.error(e)


if __name__ == '__main__':
    entity_id = 'stock_sh_600519'
    Stock1dKdata.record_data(entity_id=entity_id, provider='em')
    StockActorSummary.record_data(entity_id=entity_id, provider='em')
    FollowIITrader(start_timestamp='2002-01-01', end_timestamp='2021-01-01', entity_ids=[entity_id],
                   provider='em', adjust_type=AdjustType.qfq, profit_threshold=None).run()

它将能输出如下所示的信号图:

更多的功能请见 Zvt 官方文档:zvt.readthedocs.io/en/latest/

我们的文章到此就结束啦,如果你喜欢今天的 Python 教程,请持续关注Python实用宝典。

有任何问题,可以在公众号后台回复:加群,回答相应验证信息,进入互助群询问。

原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!

给作者打赏,选择打赏金额
¥1¥5¥10¥20¥50¥100¥200 自定义

​Python实用宝典 ( pythondict.com )
不只是一个宝典
欢迎关注公众号:Python实用宝典