

之前写了不少同花顺问财的文章, 有同学私下问我,怎么利用问财筛选的数据打造一套简易版的量化交易系统。
为什么选择同花顺问财呢? 问财是可以通过自然语言描述策略,筛选符合条件的结果。 那么我们借助筛选结果 提醒给 企业微信、钉钉、 飞书等平台, 如果你的策略够精准,经过进一步的筛选,完全可通过接入迅投miniqmt实现自动买入。前提是,你的策略筛选结果就是你要买入的。
我平时用mac和钉钉居多,那这篇文章写个示例, 工作日9点28分定时把策略筛选的结果发送到钉钉消息, 你完全可以改造成 接入miniqmt自动交易,如果对自己策略足够自信的话。
这篇文章分为3个部分:
1、利用apscheduler写一个定时任务, 定于工作日9点28分执行,这个你可以修改成自己想要的。
2、pywencai查询自己的策略,你可以改成自己的策略
3、通过钉钉,方便钉钉通知上班族
钉钉可以通过面对面建群,建个单人群,设置token,设置关键字,就不需要实时盯盘了。
毕竟策略不一定那么完善,毕竟A股受大盘情绪影响、个股表现各异, 等你的策略完善好后,完全可以借助迅投QMT的xtquant接入买卖。
备注:钉钉新建群,新建机器人修改代码中的token,并设置关键字。修改自己的策略。
from apscheduler.schedulers.blocking import BlockingScheduler
from apscheduler.triggers.cron import CronTrigger
import pywencai
import requests
from datetime import datetime
from chinese_calendar import is_workday
# 钉钉机器人配置(需关闭加签验证)
DING_WEBHOOK = "https://oapi.dingtalk.com/robot/send?access_token=xxxxx"
def get_auction_data():
"""获取竞价排名前10的股票数据"""
try:
query = "非ST,竞价涨停" #改成自己的策略
df = pywencai.get(query=query, sort_key='竞价涨停封单金额', sort_order='desc')
return df[['股票代码', '股票简称']].head(10)
except Exception as e:
print(f"数据获取失败: {str(e)}")
return None
def dingtalk_markdown(content):
"""发送Markdown格式消息到钉钉"""
headers = {"Content-Type": "application/json"}
data = {
"msgtype": "markdown",
"markdown": {
"title": "股票监控提醒",
"text": content + "\n\n**关键词:股票监控提醒**" # 必须包含自定义关键词
}
}
response = requests.post(DING_WEBHOOK, json=data, headers=headers)
print(f"消息发送状态: {response.status_code}")
def job():
"""定时任务主逻辑"""
if not is_workday(datetime.now()): # 排除节假日和周末
return
data = get_auction_data()
if data is not None:
# 生成Markdown表格
markdown_content = "### 🕘 9:28 竞价数据快报\n"
markdown_content += "| 代码 | 名称 |\n"
markdown_content += "|------|------|\n"
for _, row in data.iterrows():
print(data)
markdown_content += f"| {row['股票代码']} | {row['股票简称']} |\n"
dingtalk_markdown(markdown_content)
if __name__ == "__main__":
scheduler = BlockingScheduler(timezone="Asia/Shanghai")
# 设置周一至周五9:28执行
scheduler.add_job(
job,
CronTrigger(day_of_week='mon-fri', hour=9, minute=28)
#CronTrigger(day_of_week='*', hour=15, minute=15)
)
try:
scheduler.start()
except (KeyboardInterrupt, SystemExit):
scheduler.shutdown()