Dans le trading programmatique et le trading quantitatif, la recherche de stratégies, la conception de stratégies et l’analyse de backtesting sont indissociables du support des données de marché. Il n’est pas réaliste de collecter toutes les données du marché, après tout, la quantité de données est trop importante. Pour le marché des devises numériques, la plateforme de trading quantitatif Inventor prend en charge les données de backtesting pour des échanges et des paires de trading limités. Si vous souhaitez tester certaines bourses et paires de trading qui ne prennent actuellement pas en charge les données. Vous pouvez utiliser des sources de données personnalisées pour le backtesting, mais cela nécessite que vous disposiez de vos propres données. Il existe donc un besoin urgent d’un programme de collecte d’informations sur le marché qui puisse être stocké de manière persistante et, de préférence, obtenu en temps réel.
Cela résout plusieurs exigences, telles que :
Vous envisagez d’utiliser Python pour l’implémenter, pourquoi ? Parce que c’est pratique :) Si vous avez un besoin, agissez !
Parce qu’une base de données est nécessaire pour le stockage persistant. Utilisation de la sélection des donnéesMongoDB
, utilisez le langage Python pour écrire le programme de collecte, la bibliothèque de pilotes de cette base de données est donc nécessaire.
Installation sur Pythonpymongo
C’est ça.
Par exemple : installer MongoDB sur MAC. Bien entendu, l’installation de MongoDB sur WIN est similaire. Il existe de nombreux tutoriels en ligne. Prenons l’exemple de l’installation sur un Mac d’Apple :
télécharger Lien de téléchargement : https://www.mongodb.com/download-center?jmp=nav#community
Décompresser
Après le téléchargement, décompressez-le dans le répertoire :/usr/local
。
Configuration des variables d’environnement
Entrée du terminal :open -e .bash_profile
, après avoir ouvert le fichier, écrivez :export PATH=${PATH}:/usr/local/MongoDB/bin
Après avoir enregistré, utilisez le terminalsource .bash_profile
Faites en sorte que les modifications prennent effet.
Configurer manuellement le répertoire des fichiers de base de données et le répertoire des journaux
Créer un répertoire/usr/local/data/db
Le dossier correspondant dans .
Créer un répertoire/usr/local/data/logs
Le dossier correspondant dans .
Modification du fichier de configurationmongo.conf
:
#bind_ip_all = true # 任何机器可以连接
bind_ip = 127.0.0.1 # 本机可以访问
port = 27017 # 实例运行在27017端口(默认)
dbpath = /usr/local/data/db # 数据文件夹存放地址(db要预先创建)
logpath = /usr/local/data/logs/mongodb.log # 日志文件地址
logappend = false # 启动时 添加还是重写日志文件
fork = false # 是否后台运行
auth = false # 开启校验用户
Commande:
./mongod -f mongo.conf
use admin;
db.shutdownServer();
Le collecteur fonctionne comme une stratégie de robot Python sur la plateforme de trading quantitatif Inventor. En raison de ma maîtrise limitée de Python, je n’ai implémenté qu’un exemple simple pour démontrer les idées de cet article.
Code de stratégie du collectionneur :
import pymongo
import json
def main():
Log("测试数据收集")
# 连接数据库服务
myDBClient = pymongo.MongoClient("mongodb://localhost:27017") # mongodb://127.0.0.1:27017
# 创建数据库
huobi_DB = myDBClient["huobi"]
# 打印目前数据库表
collist = huobi_DB.list_collection_names()
Log("collist:", collist)
# 检测是否删除表
arrDropNames = json.loads(dropNames)
if isinstance(arrDropNames, list):
for i in range(len(arrDropNames)):
dropName = arrDropNames[i]
if isinstance(dropName, str):
if not dropName in collist:
continue
tab = huobi_DB[dropName]
Log("dropName:", dropName, "删除:", dropName)
ret = tab.drop()
collist = huobi_DB.list_collection_names()
if dropName in collist:
Log(dropName, "删除失败")
else :
Log(dropName, "删除成功")
# 创建records表
huobi_DB_Records = huobi_DB["records"]
# 请求数据
preBarTime = 0
index = 1
while True:
r = _C(exchange.GetRecords)
if len(r) < 2:
Sleep(1000)
continue
if preBarTime == 0:
# 首次写入所有BAR数据
for i in range(len(r) - 1):
# 逐根写入
bar = r[i]
huobi_DB_Records.insert_one({"index": index, "High": bar["High"], "Low": bar["Low"], "Open": bar["Open"], "Close": bar["Close"], "Time": bar["Time"], "Volume": bar["Volume"]})
index += 1
preBarTime = r[-1]["Time"]
elif preBarTime != r[-1]["Time"]:
bar = r[-2]
huobi_DB_Records.insert_one({"index": index, "High": bar["High"], "Low": bar["Low"], "Open": bar["Open"], "Close": bar["Close"], "Time": bar["Time"], "Volume": bar["Volume"]})
index += 1
preBarTime = r[-1]["Time"]
LogStatus(_D(), "preBarTime:", preBarTime, "_D(preBarTime):", _D(preBarTime/1000), "index:", index)
Sleep(10000)
Adresse complète de la politique :Lien
Créez des robots stratégiques qui utilisent les données.
Remarque : vous devez vérifierBibliothèque de dessins au traitSi vous ne l’avez pas, vous pouvez en copier un dans votre propre bibliothèque de stratégies.
import pymongo
import json
def main():
Log("测试使用数据库数据")
# 连接数据库服务
myDBClient = pymongo.MongoClient("mongodb://localhost:27017") # mongodb://127.0.0.1:27017
# 创建数据库
huobi_DB = myDBClient["huobi"]
# 打印目前数据库表
collist = huobi_DB.list_collection_names()
Log("collist:", collist)
# 查询数据打印
huobi_DB_Records = huobi_DB["records"]
while True:
arrRecords = []
for x in huobi_DB_Records.find():
bar = {
"High": x["High"],
"Low": x["Low"],
"Close": x["Close"],
"Open": x["Open"],
"Time": x["Time"],
"Volume": x["Volume"]
}
arrRecords.append(bar)
# 使用画线类库,把取到的K线数据画出来
ext.PlotRecords(arrRecords, "K")
LogStatus(_D(), "records length:", len(arrRecords))
Sleep(10000)
On peut voir que le code du robot de stratégie qui utilise des données n’accède à aucune interface d’échange. Il obtient des données en accédant à la base de données. Le programme de collecte de marché n’enregistre pas les données de la BAR actuelle. Il collecte la BAR K-line dans le état terminé. Si la BAR actuelle doit être mise à jour en temps réel, les données peuvent être légèrement modifiées. L’exemple de code actuel est uniquement destiné à la démonstration. Lors de l’accès aux enregistrements de données dans la table de la base de données, tous les enregistrements de données sont obtenus. Au fur et à mesure que le temps de collecte des données augmente, de plus en plus de données sont collectées. L’interrogation de toutes les données affectera les performances dans une certaine mesure. Vous pouvez concevoir uniquement des requêtes sur les données plus récentes que les données actuelles et les ajouter aux données actuelles.
Exécuter le programme hôte
Sur l’appareil de l’hôte, exécutezMongoDB
Services de base de données
./mongod -f mongo.conf
Le collectionneur court récupérer les disques simulés de la plateforme de trading quantitative de l’inventeurwexApp
deBTC_USDT
Paires de trading :
adresse:wexApp
Robot A utilisant les données de la base de données :
Robot B utilisant les données de la base de données :
wexApp
page:
Comme on peut le voir sur la figure, les robots avec des identifiants différents partagent les données K-line provenant de la même source de données.
En nous appuyant sur les puissantes fonctions de la plateforme de trading quantitative de l’inventeur, nous pouvons facilement collecter des données K-line de n’importe quelle période. Par exemple, je souhaite collecter des K-line de 3 minutes, que dois-je faire si la bourse n’a pas de K-line de 3 minutes ? Ce n’est pas grave, cela peut être facilement réalisé.
Nous modifions la configuration du robot collecteur et fixons la période de la ligne K à 3 minutes. La plateforme de trading quantitative Inventor synthétise automatiquement une ligne K de 3 minutes pour le programme collecteur.
Nous utilisons le paramètre删除表的名称
,installation:["records"]
Supprimez le tableau de données K-line d’une minute précédemment collecté. Préparez-vous à collecter des données de ligne K de 3 minutes.
démarrer收集器程序
, redémarrage使用数据的策略机器人
。
À partir du graphique K-line dessiné, vous pouvez voir que l’intervalle entre les BARS est de 3 minutes et que chaque BAR est une colonne K-line avec une période de 3 minutes.
Dans le prochain numéro, nous essaierons de mettre en œuvre les exigences des sources de données personnalisées. Merci d’avoir lu