import pandas as pd
import numpy as np
import talib as ta
import mplfinance as mpf
from matplotlib import pyplot as plt
from matplotlib.collections import LineCollection, PolyCollection
def calculate_indicators(df):
# 基础计算
df['VAR1'] = (df['Close'] + df['High'] + df['Open'] + df['Low']) / 4
df['卖出'] = ta.EMA(df['VAR1'], 20) * 1.08
df['买入'] = ta.EMA(df['VAR1'], 32) * 0.90
df['幅度'] = 100 * (df['卖出'] - df['买入']) / df['买入']
df['菩提'] = df['买入'] + (df['卖出'] - df['买入']) * 2 / 3
# 均线系统
df['般'] = ta.EMA(df['Close'], 7)
df['若'] = ta.EMA(df['Close'], 3)
df['M1'] = ta.EMA(df['Close'], 5)
df['M2'] = ta.EMA(df['Close'], 13)
df['M3'] = ta.EMA(df['Close'], 34)
df['MC1'] = ta.EMA(df['Close'], 55)
df['MC2'] = ta.EMA(df['Close'], 89)
df['MA4'] = ta.EMA(df['Close'], 144)
df['买线1'] = df['M3'].shift(1) # 简化处理
# 动量指标
llv = df['Low'].rolling(12).min()
hhv = df['High'].rolling(12).max()
df['RSVL'] = (df['Close'] - llv) / (hhv - llv) * 100
df['KL'] = ta.SMA(df['RSVL'], 3)
df['DL'] = ta.SMA(df['KL'], 3)
df['NL'] = df['KL'] + df['DL']
# 买卖信号
df['买入L'] = (df['NL'] > 50) & (df['NL'].shift(1) <= 50)
df['卖出K'] = (df['NL'] 160) & (df['NL'].shift(1) >= 160
# 高级趋势指标
df['TM'] = df['Close']
df['SL1M'] = (df['TM'] / df['TM'].shift(1) - 1) * 1000
df['趋势5'] = ta.EMA(ta.EMA(ta.EMA(df['SL1M'], 20), 20)
df['趋势6'] = ta.EMA(ta.EMA(ta.EMA(df['SL1M'], 10), 10)
df['QA9'] = df['趋势6'] - df['趋势5']
df['QA10'] = ta.EMA(df['QA9'], 89)
df['买入M'] = (df['QA9'] - df['QA10']) * 2
# 支撑阻力位
df['高1'] = df['High'].rolling(150).max().shift(3)
df['低1'] = df['Low'].rolling(150).min().shift(3)
df['中线'] = (df['卖出'] + df['买入']) / 2
# 形态识别
conditions = []
for i in range(1, 13):
cond = (df['Close'] > df['Close'].shift(i)) & (df['Close'] > df['Close'].shift(i+1))
conditions.append(cond)
df['形态'] = pd.concat(conditions, axis=1).any(axis=1)
return df
def create_plot(df):
# 创建专业K线图
apds = [
mpf.make_addplot(df['卖出'], color='green', linestyle=':', width=3
, panel=0),
mpf.make_addplot(df['买入'], color='magenta', linestyle=':', width=3, panel=0),
mpf.make_addplot(df['中线'], color='white', width=4, panel=0),
mpf.make_addplot(df['M3'], color='blue', width=2, panel=0),
mpf.make_addplot(df['NL'], color='purple', panel=1),
mpf.make_addplot(df['买入M'], type='bar', color='gray', panel=2)
]
# 标记买卖信号
buy_signals = df[df['买入L']]
sell_signals = df[df['卖出K']]
if not buy_signals.empty:
apds.append(mpf.make_addplot(buy_signals['低1']*0.96, type='scatter', marker='^', markersize=100, color='yellow', panel=0))
if not sell_signals.empty:
apds.append(mpf.make_addplot(sell_signals['低1']*0.96, type='scatter', marker='v', markersize=100, color='cyan', panel=0))
# 多空趋势彩带
sma6 = ta.SMA(df['Close'], 6)
sma13 = ta.SMA(df['Close'], 13)
df['sma6'] = sma6
df['sma13'] = sma13
# 创建图形
fig, axes = mpf.plot(df, type='candle', addplot=apds,
fill_between=dict(y1=df['sma6'].values,
y2=df['sma13'].values,
alpha=0.2,
color=['orange','green']),
style='charles',
volume_panel=2,
figratio=(12, 8),
returnfig=True)
# 添加标题和网格
axes[0].set_title('高级交易系统', fontsize=16)
axes[0].grid(True, linestyle='--', alpha=0.7)
axes[2].grid(True, linestyle='--', alpha=0.7)
# 添加图例
axes[0].legend(['卖出线', '买入线'
, '中线', '34日均线'], loc='upper left')
return fig
# 主程序
if __name__ == "__main__":
data = pd.read_csv('your_stock_data.csv', index_col=0, parse_dates=True)
# 计算指标
df = calculate_indicators(data)
# 生成专业图表
fig = create_plot(df[-200:]) # 展示最近200个交易日
# 保存结果
plt.savefig('trading_system.png', dpi=300, bbox_inches='tight')
plt.show()