下载地址【已上传】:https://www.pan38.com/share.php?code=JCnzE 提取码:6666
声明:所下载的文件以及如下所示代码仅供学习参考用途,作者并不提供软件的相关服务。
股票模拟系统开发指南
一、系统架构设计
本系统包含三大核心模块:假图生成器、持仓可视化工具和虚拟交易引擎。采用Python+Flask+Vue技术栈实现前后端分离架构。
二、核心代码实现
- 股票数据模拟引擎
import random
import time
from threading import Thread
from flask import Flask, jsonify
app = Flask(name)
class StockSimulator:
def init(self):
self.stocks = {
'600519': {'name': '贵州茅台', 'price': 1800.0},
'000858': {'name': '五粮液', 'price': 150.0},
'601318': {'name': '中国平安', 'price': 45.0}
}
self.volatility = 0.02 # 波动率
def generate_market_data(self):
while True:
for code in self.stocks:
change = random.uniform(-self.volatility, self.volatility)
self.stocks[code]['price'] *= (1 + change)
self.stocks[code]['price'] = round(self.stocks[code]['price'], 2)
time.sleep(3)
@app.route('/api/stocks')
def get_stocks():
return jsonify(simulator.stocks)
if name == 'main':
simulator = StockSimulator()
Thread(target=simulator.generate_market_data).start()
app.run(port=5000)
- 持仓图生成器(前端Vue实现)
{ { stock.code }}
{ { stock.name }}
¥{ { stock.currentPrice.toFixed(2) }}
{ { stock.profit > 0 ? '+' : '' }}{ { stock.profit.toFixed(2) }}%
持仓: { { stock.amount }}股
市值: ¥{ { (stock.amount * stock.currentPrice).toFixed(2) }}
- 虚拟交易API(Python实现)
from flask import request, jsonify
from datetime import datetime
class VirtualExchange:
def init(self):
self.accounts = {}
self.order_id = 100000
def create_account(self, user_id, capital=1000000):
self.accounts[user_id] = {
'cash': capital,
'positions': {},
'orders': []
}
def place_order(self, user_id, code, direction, price, amount):
if user_id not in self.accounts:
return {'error': '账户不存在'}
account = self.accounts[user_id]
stock = simulator.stocks.get(code)
if not stock:
return {'error': '股票不存在'}
total_value = price * amount
if direction == 'buy' and account['cash'] < total_value:
return {'error': '资金不足'}
order = {
'order_id': self.order_id,
'code': code,
'name': stock['name'],
'direction': direction,
'price': price,
'amount': amount,
'status': 'filled',
'time': datetime.now().strftime('%Y-%m-%d %H:%M:%S')
}
self.order_id += 1
if direction == 'buy':
account['cash'] -= total_value
if code in account['positions']:
account['positions'][code]['amount'] += amount
account['positions'][code]['cost'] += total_value
else:
account['positions'][code] = {
'amount': amount,
'cost': total_value,
'current_price': price
}
else: # sell
if code not in account['positions']:
return {'error': '持仓不足'}
if account['positions'][code]['amount'] < amount:
return {'error': '持仓数量不足'}
account['cash'] += total_value
account['positions'][code]['amount'] -= amount
account['positions'][code]['cost'] -= amount * account['positions'][code]['cost'] / account['positions'][code]['amount']
account['orders'].append(order)
return {'success': True, 'order': order}
@app.route('/api/trade', methods=['POST'])
def trade():
data = request.json
return jsonify(exchange.place_order(
data['user_id'],
data['code'],
data['direction'],
float(data['price']),
int(data['amount'])
))
exchange = VirtualExchange()
三、系统扩展功能
- 历史回测引擎
import pandas as pd
import numpy as np
class BacktestEngine:
def init(self, data_path):
self.history_data = pd.read_csv(data_path)
self.history_data['date'] = pd.to_datetime(self.history_data['date'])
def run_strategy(self, strategy_func, initial_capital=100000):
capital = initial_capital
positions = {}
trades = []
for idx, row in self.history_data.iterrows():
signal = strategy_func(row)
if signal['action'] == 'buy':
cost = signal['price'] * signal['amount']
if cost > capital:
continue
capital -= cost
if signal['code'] in positions:
positions[signal['code']]['amount'] += signal['amount']
positions[signal['code']]['cost'] += cost
else:
positions[signal['code']] = {
'amount': signal['amount'],
'cost': cost,
'entry_price': signal['price']
}
trades.append({
'date': row['date'],
'code': signal['code'],
'action': 'buy',
'price': signal['price'],
'amount': signal['amount']
})
elif signal['action'] == 'sell' and signal['code'] in positions:
position = positions[signal['code']]
if position['amount'] < signal['amount']:
continue
profit = signal['amount'] * (signal['price'] - position['cost']/position['amount'])
capital += signal['price'] * signal['amount']
position['amount'] -= signal['amount']
position['cost'] -= signal['amount'] * position['cost']/position['amount']
if position['amount'] == 0:
del positions[signal['code']]
trades.append({
'date': row['date'],
'code': signal['code'],
'action': 'sell',
'price': signal['price'],
'amount': signal['amount'],
'profit': profit
})
return {
'final_capital': capital,
'return_rate': (capital - initial_capital) / initial_capital,
'trades': pd.DataFrame(trades),
'positions': positions
}
- 假图生成增强功能
from PIL import Image, ImageDraw, ImageFont
import random
def generate_fake_screenshot():
# 创建空白图片
img = Image.new('RGB', (800, 1400), (255, 255, 255))
draw = ImageDraw.Draw(img)
# 添加状态栏
draw.rectangle([0, 0, 800, 80], fill=(30, 30, 30))
draw.text((40, 30), "9:41", fill=(255,255,255), font=ImageFont.load_default(30))
# 添加账户信息
draw.rectangle([20, 100, 780, 200], fill=(240,240,240))
draw.text((40, 120), "总资产: ¥1,256,789.23", fill=(0,0,0), font=ImageFont.load_default(28))
draw.text((40, 160), "当日盈亏: +¥25,678.90 (+2.05%)", fill=(255,0,0), font=ImageFont.load_default(28))
# 生成随机持仓
stocks = [
('600519', '贵州茅台', 1850.0, 100, 1800.0, 2.78),
('000858', '五粮液', 145.0, 500, 150.0, -3.33),
('601318', '中国平安', 45.5, 1000, 42.0, 8.33)
]
y_pos = 240
for code, name, price, amount, cost, profit in stocks:
draw.rectangle([20, y_pos, 780, y_pos+120], fill=(250,250,250))
draw.text((40, y_pos+20), f"{name} {code}", fill=(0,0,0), font=ImageFont.load_default(26))
draw.text((40, y_pos+60), f"持仓: {amount}股 成本: ¥{cost:.2f}", fill=(100,100,100), font=ImageFont.load_default(24))
color = (255,0,0) if profit > 0 else (0,200,0)
draw.text((500, y_pos+20), f"¥{price:.2f}", fill=color, font=ImageFont.load_default(30))
draw.text((500, y_pos+60), f"{'+' if profit > 0 else ''}{profit:.2f}%", fill=color, font=ImageFont.load_default(28))
y_pos += 140
# 保存图片
img.save('fake_holdings.png')
return img
四、部署方案
- Docker部署配置
FROM python:3.9-slim
WORKDIR /app
COPY . .
RUN pip install -r requirements.txt
EXPOSE 5000
CMD ["gunicorn", "-b :5000", "app:app"]
- 系统依赖文件
requirements.txt
flask==2.3.2
gunicorn==20.1.0
pandas==2.0.3
pillow==10.0.0
numpy==1.24.3
五、安全与合规建议
所有模拟数据需标注"仿真测试"水印
禁止将生成图片用于虚假宣传
建议增加数据验证机制防止注入攻击
虚拟交易系统应明确免责声明