有同学问我,怎么用Python实现策略选股, 我其实自己用得很low的,就是用的问财自然语句管理我的不同策略。不管是 竞价模式、 盘中追涨模式、一进二模式 , 我就是用自然语句实现的。虽然我知道 一些同学 是用聚宽因子 或QMT因子、 或通达信选股实现。 每个人的习惯不一样, 选择自己习惯的方式就好了。 需要注意的一点,问财的自然语句 需要自己确认语句稳定性,因为一些问法 问财不一定能正确识别。 对于严谨的同学,完全可以自己用 财务因子、情绪因子、资金因子 自行用Python代码实现选股。也许有同学会说,用同花顺APP分组也可以做到这点,为啥这里用界面实现。 其实你的策略一旦稳定, 你后期完全可以用Python语言借助miniqmt自动交易的。我之前写过问财+miniqmt自动交易的文章,以及问财+miniqmt的文章, 感兴趣的同学可以翻一翻。 如果需要miniqmt开户,可以找我咨询。 我写的文章很杂, 比如库 akshare、 tushare、 miniqmt、mootdx、pywencai等有在用,其实这些工具我在不同的阶段都有用到部分。 tushare这1周出问题,一些同学慌了,没有备用方案。 就像股票投资名言, 不要把鸡蛋放在同一个篮子里。 我们做技术的也一样,也要有备用技术方案。 就像我之前写的问财选股,我还专门写了一套 东方财富条件选股做备用。这里贴一下完整代码,参考下思路, 具体根据自己的实际情况改造。 备注:如果发现格式有多余的特殊字符,用普通浏览器打开复制应该没问题。 希望我的分享对大家有所帮助import streamlit as stimport pandas as pdimport jsonimport osimport pywencaiif 'strategies' not in st.session_state: st.session_state.strategies = {}if 'last_result' not in st.session_state: st.session_state.last_result = NoneSTRATEGY_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 result = pywencai.get(query=query_str) return result except Exception as e: st.error(f"查询失败: {str(e)}") return Nonest.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("请选择策略后执行查询,或使用直接查询功能")
如果我的分享对你投资有所帮助,不吝啬给个点赞关注呗。如果对每日复盘感兴趣,欢迎关注我另外一个号。重在市场理解(大盘情绪、 热门概念板块、 热门个股), 技术只是辅助。 另外每天板块RPS变化也会在盘后更新在这个号上。