首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【Python技术】怎么管理自己的问财多策略

【Python技术】怎么管理自己的问财多策略

作者头像
子晓聊技术
发布2026-04-23 15:57:32
发布2026-04-23 15:57:32
980
举报
文章被收录于专栏:子晓AI量化子晓AI量化

有同学问我,怎么用Python实现策略选股, 我其实自己用得很low的,就是用的问财自然语句管理我的不同策略。不管是 竞价模式、 盘中追涨模式、一进二模式 , 我就是用自然语句实现的。

虽然我知道 一些同学 是用聚宽因子 或QMT因子、 或通达信选股实现。 每个人的习惯不一样, 选择自己习惯的方式就好了。 需要注意的一点,问财的自然语句 需要自己确认语句稳定性,因为一些问法 问财不一定能正确识别。 对于严谨的同学,完全可以自己用 财务因子、情绪因子、资金因子 自行用Python代码实现选股。

也许有同学会说,用同花顺APP分组也可以做到这点,为啥这里用界面实现。 其实你的策略一旦稳定, 你后期完全可以用Python语言借助miniqmt自动交易的。

题外话:

我写的文章很杂, 比如库 akshare、 tushare、 miniqmt、mootdx、pywencai等有在用,其实这些工具我在不同的阶段都有用到部分。 tushare这1周出问题,一些同学慌了,没有备用方案。

就像股票投资名言, 不要把鸡蛋放在同一个篮子里。 我们做技术的也一样,也要有备用技术方案。 就像我之前写的问财选股,我还专门写了一套 东方财富条件选股做备用。

这里贴一下完整代码,参考下思路, 具体根据自己的实际情况改造。 备注:如果发现格式有多余的特殊字符,用普通浏览器打开复制应该没问题。 希望我的分享对大家有所帮助

代码语言:javascript
复制
import streamlit as st
import pandas as pd
import json
import os
import pywencai
# 初始化Session State
if 'strategies' not in st.session_state:
    st.session_state.strategies = {}
if 'last_result' not in st.session_state:
    st.session_state.last_result = None
# 策略存储文件名
STRATEGY_FILE = "wencai_strategies.json"
# 加载策略
def load_strategies():
    if os.path.exists(STRATEGY_FILE):
        with open(STRATEGY_FILE, 'r') as f:
            st.session_state.strategies = json.load(f)
# 保存策略
def save_strategies():
    with open(STRATEGY_FILE, 'w') as f:
        json.dump(st.session_state.strategies, f, indent=2)
# 执行问财查询
def run_wencai_query(query_str):
    """执行问财查询并返回结果"""
    try:
        if not query_str:
            st.warning("查询条件不能为空")
            return None
        # 使用pywencai执行查询
        result = pywencai.get(query=query_str)
        return result
    except Exception as e:
        st.error(f"查询失败: {str(e)}")
        return None
# 页面布局
st.set_page_config(
    page_title="问财策略查询工具",
    page_icon="📊",
    layout="wide"
)
# 加载策略
load_strategies()
# 侧边栏 - 策略管理
with st.sidebar:
    st.header("📋 策略管理")
    # 添加新策略
    with st.expander("➕ 添加新策略", expanded=False):
        with st.form("add_strategy"):
            strategy_name = st.text_input("策略名称", key="strategy_name")
            condition = st.text_area("完整查询语句", key="condition_input",
                                     help="例如: ROE连续三年大于10%,净利率同比增长超过20%,市盈率小于30")
            submit = st.form_submit_button("保存策略")
            if submit and strategy_name:
                if strategy_name in st.session_state.strategies:
                    st.warning("该策略名称已存在!")
                elif not condition.strip():
                    st.warning("请输入查询语句")
                else:
                    st.session_state.strategies[strategy_name] = {
                        "query": condition.strip(),
                        "last_used": pd.Timestamp.now().strftime("%Y-%m-%d %H:%M:%S")
                    }
                    save_strategies()
                    st.success(f"策略 '{strategy_name}' 已保存!")
    # 策略列表
    st.divider()
    st.subheader("已保存策略")
    if not st.session_state.strategies:
        st.info("暂无策略,请添加新策略")
    else:
        for name, details in list(st.session_state.strategies.items()):
            col1, col2 = st.columns([0.7, 0.3])
            with col1:
                st.markdown(f"**{name}**")
                st.caption(f"最后使用: {details['last_used']}")
            with col2:
                if st.button("删除", key=f"del_{name}"):
                    del st.session_state.strategies[name]
                    save_strategies()
                    st.rerun()
# 主面板
st.title("📊 问财策略查询")
# 策略选择和查询执行
if st.session_state.strategies:
    # 策略选择
    selected_strategy = st.selectbox(
        "选择策略",
        list(st.session_state.strategies.keys()),
        index=0
    )
    # 显示策略详情
    strategy_details = st.session_state.strategies[selected_strategy]
    query_str = strategy_details["query"]
    st.subheader("策略详情")
    st.info(f"**策略名称**: {selected_strategy}")
    st.code(query_str, language="sql")
    # 编辑策略按钮
    with st.expander("✏️ 编辑策略", expanded=False):
        new_query = st.text_area("修改查询语句", value=query_str, height=150)
        if st.button("💾 保存修改", key=f"update_{selected_strategy}"):
            st.session_state.strategies[selected_strategy]["query"] = new_query.strip()
            save_strategies()
            st.success("策略已更新!")
            st.rerun()
    # 执行查询
    if st.button("🚀 执行查询", type="primary", key="run_query"):
        with st.spinner(f"执行中... 正在查询 {selected_strategy}"):
            # 更新最后使用时间
            st.session_state.strategies[selected_strategy]["last_used"] = pd.Timestamp.now().strftime(
                "%Y-%m-%d %H:%M:%S")
            save_strategies()
            # 执行查询
            result = run_wencai_query(query_str)
            if result is not None:
                if not result.empty:
                    st.session_state.last_result = result
                    st.session_state.last_strategy = selected_strategy
                    st.session_state.last_query = query_str
                else:
                    st.info("未找到匹配的结果")
# 显示结果区域
if st.session_state.last_result is not None:
    st.divider()
    st.subheader(f"查询结果: {st.session_state.last_strategy}")
    # 显示查询语句
    st.info(f"**查询语句**: {st.session_state.last_query}")
    df = st.session_state.last_result
    # 简单数据预处理
    if '代码' in df.columns:
        df['代码'] = df['代码'].astype(str).str.zfill(6)
    # 结果展示
    st.dataframe(df, height=600)
    # 下载按钮
    csv = df.to_csv(index=False).encode('utf-8')
    st.download_button(
        label="下载CSV",
        data=csv,
        file_name=f"wencai_{st.session_state.last_strategy.replace(' ', '_')}.csv",
        mime='text/csv'
    )
else:
    st.info("请选择策略后执行查询,或使用直接查询功能")

如果我的分享对你投资有所帮助,不吝啬给个点赞关注呗。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-08-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 子晓聊技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档