微信公众号:大数据高性能计算
背景
背景是基于人工去做交易本身无法做到24小时无时无刻的交易,主要是虚拟币本身它是24小时交易,人无法做到24小时盯盘,其次就是如果你希望通过配置更加复杂的规则甚至需要爬取最新的信息走模型进行量化交易的时候,就需要自己去做一些量化机器人。这是我们做这件事的出发点
设计方案
大概会分为如下几个重点模块设计:
(1) K线异步线程监控,主要用于拉取各项虚拟币的交易价格波动数据,主要用于计算指标给规则或者模型使用
(2) 决策中心,根据获取的指标信息去判断是跑模型还是跑规则,跑规则的话会走规则引擎
(3) 规则本身主要是基于ANTLR定义了一套简单的规则模块语法树,支持快速定义和配置,主要存储与DB如Mysql中
(4) 消息通知,对于一些直接规则可以走自动化交易。对于一些拿捏不准的,可以走消息通知,由人工在判断需要怎么进行交易。
下面主要是写一下规则部分要怎么做。
规则模块语法树
首先我们用的是ANTLR4来做基础的语法树的。最终我们希望能做到如下的效果:
SELECT 'buy' AS action, 30% AS rate WHERE symbol = 'BTCUSDT' AND change < -2;SELECT 'buy' AS action, 40% AS rate WHERE (symbol = 'BTCUSDT' AND change < -2)
OR (symbol = 'ETHUSDT' AND change < -8);
antlr4的安装与客户端安装
Mac 安装
我的机器是Mac M1 ARM芯片:
- 下载 wget https://www.antlr.org/download/antlr-4.7.2-complete.jar
- 复制jar包sudo cp antlr-4.7.2-complete.jar /usr/local/lib
- 更新~/.bash_profile
export CLASSPATH=".:/usr/local/lib/antlr-4.7.2-complete.jar:$CLASSPATH"
alias antlr4='java -jar /usr/local/lib/antlr-4.7.2-complete.jar'
alias grun='java org.antlr.v4.gui.TestRig'
- 更新配置文件 source ~/.bash_profile source ~/.zshrc
python 客户端安装
pip antlr4-python3-runtime==4.7.2
主要一定要填写4.7.2 因为版本要和机器安装的版本保持一致
antlr4的.g4语法文件设计
我们定义了用于解析 SQL 风格规则的 ANTLR 语法,其中包括了处理 SELECT 语句、动作(ACTION)、百分比(percentage)、以及条件表达式(whereClause、expression 和 condition)的规则。
关键部分
- Action 和 Percentage
selectItem : action 'AS action' | percentage 'AS rate' ;
action : ACTION ;
percentage : NUMBER '%' ;
ACTION : '\''('buy' | 'sell')'\'' ;
这部分定义了选择项可以是一个动作或百分比,其中动作是 ‘buy’ 或 ‘sell’。
- 条件表达式:
whereClause : 'WHERE' expression ;
expression : condition (logicalOp condition)* ;
condition : '('? identifier comparison value ')'?;
identifier : ID ;
value : STRING | number ;
comparison : '=' | '<>' | '<' | '>' | '<=' | '>=' ;
这部分定义了条件表达式的结构,包括标识符、比较运算符和值。
- 词法符号:
STRING : '\'' [a-zA-Z0-9]+ '\'' ;
NUMBER : '-'?[0-9]+ ;
FLOAT : '-'?[0-9]+ '.' [0-9]+ ;
ID : [a-zA-Z_][a-zA-Z0-9_]* ;
WS : [ \t\r\n]+ -> skip ;
这部分定义了字符串、数字、浮点数和标识符的格式。
最终我们生成了一个完整的TradingRulesSQL.g4文件
grammar TradingRulesSQL;rules : query+ ;
query : selectClause whereClause ';' ;
selectClause: 'SELECT' selectItem (',' selectItem)* ;
selectItem : action 'AS action' | percentage 'AS rate' ;
whereClause : 'WHERE' expression ;
expression : condition (logicalOp condition)* ;
condition : '('? identifier comparison value ')'?;
logicalOp : 'AND' | 'OR' ;
action : ACTION ;
percentage : NUMBER '%' ;
identifier : ID ;
value : STRING | number ;
comparison : '=' | '<>' | '<' | '>' | '<=' | '>=' ;
number : NUMBER | FLOAT ;ACTION : '\''('buy' | 'sell')'\'' ;
STRING : '\'' [a-zA-Z0-9]+ '\'' ;
NUMBER : '-'?[0-9]+ ;
FLOAT : '-'?[0-9]+ '.' [0-9]+ ;
ID : [a-zA-Z_][a-zA-Z0-9_]* ;WS : [ \t\r\n]+ -> skip ;
当您使用 ANTLR 工具根据您的 .g4 语法文件生成 Python 代码时,ANTLR 会自动创建几个文件,包括一个词法分析器 (Lexer),一个语法分析器 (Parser),以及一个基础的访问器 (Visitor) 类和一个监听器 (Listener) 类。这些类的名称基于您的语法文件的名称。
我们需要使用我们的antlr4根据我们的.g4文件生成固定的几个类,命令是:
antlr4 -Dlanguage=Python3 TradingRulesSQL.g4
这将会生成以下文件:
TradingRulesSQLLexer.py:包含由您的语法定义的词法规则的词法分析器。
TradingRulesSQLParser.py:包含由您的语法定义的语法规则的语法分析器。
TradingRulesSQLListener.py:包含一个监听器,用于遍历解析树。
TradingRulesSQLVisitor.py:包含一个访问器,用于遍历解析树并可以被重写以实现自定义行为。
TradingRulesSQLVisitor 类是一个基础访问器类,您可以通过继承并重写它的方法来实现自定义的解析行为.
这里我们通过自定义继承该类来达到我们的自定义行为。
自定义TradingRulesSQLVisitor的行为
我们自定义了CustomTradingRulesVisitor 继承TradingRulesSQLVisitor,来实现我们自己的一些逻辑
from antlr4 import *
from TradingRulesSQLLexer import TradingRulesSQLLexer
from TradingRulesSQLParser import TradingRulesSQLParser
from TradingRulesSQLVisitor import TradingRulesSQLVisitorclass CustomTradingRulesVisitor(TradingRulesSQLVisitor):def __init__(self):self.result = {"action": None, "rate": None, "conditions": []}def visitSelectItem(self, ctx):if ctx.action():self.result["action"] = ctx.action().ACTION().getText().strip("'")elif ctx.percentage():self.result["rate"] = ctx.percentage().NUMBER().getText() + '%'return self.visitChildren(ctx) # 确保继续遍历子节点def visitCondition(self, ctx):condition = {"identifier": ctx.identifier().getText(),"comparison": ctx.comparison().getText(),"value": ctx.value().getText() if ctx.value().STRING() else ctx.value().number().getText()}self.result["conditions"].append(condition)return self.visitChildren(ctx) # 确保继续遍历子节点# 示例规则字符串
#rule_str = "SELECT 'buy' AS action, 30% AS rate WHERE symbol = 'BTCUSDT' AND change < -2;"
rule_str = "SELECT 'buy' AS action, 30% AS rate WHERE (symbol = 'BTCUSDT' AND change < -2) OR (symbol = 'ETHUSDT' AND change < -8);"# 解析规则
input_stream = InputStream(rule_str)
lexer = TradingRulesSQLLexer(input_stream)
stream = CommonTokenStream(lexer)
parser = TradingRulesSQLParser(stream)
tree = parser.rules()visitor = CustomTradingRulesVisitor()
visitor.visit(tree)# 输出解析结果
print(visitor.result)
至此一个最基本的语法树文件就定义出来了,后面可以围绕自己的业务需求去做一些更复杂的规则实现在里面,丰富你的语法树以及业务逻辑。