|
|
本地运行的新策略
1.获取“平安银行”2024年10月6到11日的单日股票波动数据(数据:分钟级1m)并用折线图展示出来
m = 0.005
2.获得昨天收盘价
3.如果当前价格高于昨天收盘价在第一个波峰标记为卖点,绘制卖出线,
记录卖出价,当价格降低m设置买点,绘制买入线,设置买入标志
两个标志都有交易结束。
如果当前价格低于昨天收盘价且出现第一个波谷设置买点,设置买入完成标志
记录买入价,高于买入价m设置卖出点,设置卖出完成标志
两个标志都有交易结束
如果当天买入完成标志没有设置,标记收盘价为买入标志,或者卖出标志没有设置标记收盘价为卖出标志
输出
当日:
买点时间 & 价格
卖点时间 & 价格
并画图:
分钟折线
昨收线
买卖点横线 + 散点
参考代码:
from jqdatasdk import *
import pandas as pd
import matplotlib.pyplot as plt
from datetime import datetime, timedelta
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei', 'SimHei']
plt.rcParams['axes.unicode_minus'] = False
# =============================
# 1. 登录
# =============================
import config
auth(config.JQ_USERNAME, config.JQ_PASSWORD)
# =============================
# 2. 参数
# =============================
stock = "000001.XSHE"
start_date = "2024-10-06"
end_date = "2024-10-11"
m = 0.005
# =============================
# 3. 工具函数
# =============================
def get_intraday(date):
df = get_price(
stock,
start_date=date + " 09:30:00",
end_date=date + " 15:00:00",
frequency="1m",
fields=["close"],
skip_paused=True,
panel=False
)
if df.empty:
return None
df = df.reset_index()
df.rename(columns={df.columns[0]: "time"}, inplace=True)
df["time"] = pd.to_datetime(df["time"])
return df
def get_prev_close(date):
d = get_price(
stock,
end_date=date,
count=2,
frequency="daily",
fields=["close"],
panel=False
)
if len(d) < 2:
return None
return d.iloc[-2]["close"]
# =============================
# 4. 主循环
# =============================
current = datetime.strptime(start_date, "%Y-%m-%d")
end = datetime.strptime(end_date, "%Y-%m-%d")
while current <= end:
date_str = current.strftime("%Y-%m-%d")
df = get_intraday(date_str)
if df is None or len(df) < 5:
print(f"📅 {date_str} 休市")
current += timedelta(days=1)
continue
prev_close = get_prev_close(date_str)
if prev_close is None:
current += timedelta(days=1)
continue
prices = df["close"].values
buy = sell = None
buy_price = sell_price = None
# =============================
# 情况 A:高于昨收 → 先卖后买
# =============================
if prices[0] > prev_close:
for i in range(1, len(prices)-1):
# 第一个波峰
if prices[i] > prices[i-1] and prices[i] > prices[i+1]:
sell = df.iloc[i]
sell_price = prices[i]
break
if sell is not None:
for j in range(i+1, len(prices)):
if prices[j] <= sell_price * (1 - m):
buy = df.iloc[j]
buy_price = prices[j]
break
# =============================
# 情况 B:低于昨收 → 先买后卖
# =============================
else:
for i in range(1, len(prices)-1):
# 第一个波谷
if prices[i] < prices[i-1] and prices[i] < prices[i+1]:
buy = df.iloc[i]
buy_price = prices[i]
break
if buy is not None:
for j in range(i+1, len(prices)):
if prices[j] >= buy_price * (1 + m):
sell = df.iloc[j]
sell_price = prices[j]
break
# =============================
# 补齐未完成交易
# =============================
close_time = df.iloc[-1]["time"]
close_price = df.iloc[-1]["close"]
if buy is None:
buy = pd.Series({"time": close_time, "close": close_price})
if sell is None:
sell = pd.Series({"time": close_time, "close": close_price})
# =============================
# 输出
# =============================
print(f"\n📅 {date_str}")
print(f"昨收价:{prev_close:.2f}")
print(f"🔺 买点:{buy['time']} 价格 {buy['close']:.2f}")
print(f"🔻 卖点:{sell['time']} 价格 {sell['close']:.2f}")
# =============================
# 绘图
# =============================
plt.figure(figsize=(14, 6))
plt.plot(df["time"], df["close"], label="分钟价格")
plt.axhline(prev_close, linestyle="--", label="昨收价")
plt.axhline(buy["close"], linestyle=":", color="green", label="买入线")
plt.axhline(sell["close"], linestyle=":", color="red", label="卖出线")
plt.scatter(buy["time"], buy["close"], color="green", s=80)
plt.scatter(sell["time"], sell["close"], color="red", s=80)
plt.title(f"平安银行 日内波峰/波谷策略({date_str})")
plt.xlabel("时间")
plt.ylabel("价格")
plt.legend()
plt.grid(alpha=0.3)
plt.show()
current += timedelta(days=1)
|
|