韭菜收割项目

最近在玩股票,被人当成韭菜收割了一顿。高点追涨,第二天直接跌停。以为是低点,想抄底,结果别人直接抄家,血亏!!!
作为一个程序员,还是好好敲代码赚钱好了,一步一步。想不劳而获是不可能的。
我写了个实时监控我购买的股票涨跌的小页面,用于上班在电脑上可以实时关注【毕竟一直拿着手机总是不太好,会被抓典型,很恐怖】
这个小页面我前端用了个vue3构建,后端使用python flask框架,总共耗时20分钟,效果还行,丑就丑点吧,后面慢慢改进。

前端

在这里插入图片描述
长这个鸟样,毕竟是韭菜收割表,这样很形象。每隔5s刷新一次,涨了标红,跌了标绿。

前端代码

Stock.vue

<template>
  <div>
    <h2>韭菜收割表</h2>
    <table>
      <thead>
        <tr>
          <th>代号</th>
          <th>名称</th>
          <th>总收益</th>
          <th>收益率%</th>
          <th>当前价格</th>
          <th>买入价格</th>
          <th>数量</th>
          <th>佣金</th>
        </tr>
      </thead>
      <tbody>
        <tr
          v-for="(stock, index) in stocks"
          :key="index"
          :class="{'positive-profit': stock.total_income > 0, 'negative-profit': stock.total_income <= 0}"
        >
          <td>{{ stock.symbol }}</td>
          <td>{{ stock.stock_name }}</td>
          <td>{{ stock.total_income }}</td>
          <td>{{ stock.return_rate }}</td>
          <td>{{ stock.current_price }}</td>
          <td>{{ stock.buy_price }}</td>
          <td>{{ stock.quantity }}</td>
          <td>{{ stock.commission }}</td>
        </tr>
      </tbody>
    </table>
  </div>
</template>

<script>
import axios from 'axios';

export default {
  data() {
    return {
      stocks: []
    };
  },
  created() {
    this.fetchStocks();
    // 每隔 10 秒刷新股票数据
    setInterval(this.fetchStocks, 5000);
  },
  methods: {
    async fetchStocks() {
      try {
        const response = await axios.get('http://127.0.0.1:5000/stock');
        this.stocks = response.data;
      } catch (error) {
        console.error('Failed to fetch stocks:', error);
      }
    }
  }
};
</script>

<style scoped>
table {
  width: 100%;
  border-collapse: collapse;
  margin: 20px 0;
}
th, td {
  padding: 10px;
  border: 1px solid #ddd;
  text-align: left;
}
th {
  background-color: #f4f4f4;
}
.positive-profit {
  background-color: #ffcccc; /* 红色背景 */
}
.negative-profit {
  background-color: #ccffcc; /* 绿色背景 */
}
</style>

App.vue

<template>
<!--  <img alt="Vue logo" src="./assets/logo.png" />-->
<!--  <HelloWorld msg="Hello Vue 3.0 + Vite" />-->
  <Stock />
</template>

<script>
import HelloWorld from './components/HelloWorld.vue'
import Stock from './components/Stock.vue';
export default {
  name: 'App',
  components: {
    HelloWorld,
    Stock
  }
}
</script>


后端

目录结构

在这里插入图片描述
结构如上,spiders内使用的是爬虫获取每个股票对应的实时价格。

main.py

main.py 这个是接口服务文件,使用flask构建

# coding=utf-8

'''
股票实时收益服务
'''

from flask import Flask, request, jsonify
from spiders.stock_price_detail import income_statement
from spiders.config import stock_list
from flask_cors import CORS
app = Flask(__name__)
CORS(app)

# @app.route('/stock', methods=['GET','POST'])
@app.route('/stock', methods=['GET'])
def stock():
    result = []
    for stock in stock_list:
        print("===================================================================================")
        current_data = income_statement(
            **stock
        )
        print(current_data)
        result.append(current_data)

    return jsonify(result)


if __name__ == '__main__':
    app.run(debug=True,use_reloader=False)

config.py

这个是配置文件,你可以自己修改为自己购买的
cookies自己复制粘贴,我这里不提供了

# coding=utf-8

cookies = {
    
}

headers = {
    'accept': '*/*',
    'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8',
    'origin': 'https://xueqiu.com',
    'priority': 'u=1, i',
    'referer': 'https://xueqiu.com/S/SZ002074',
    'sec-ch-ua': '"Google Chrome";v="125", "Chromium";v="125", "Not.A/Brand";v="24"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"Windows"',
    'sec-fetch-dest': 'empty',
    'sec-fetch-mode': 'cors',
    'sec-fetch-site': 'same-site',
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36',
}


stock_list = [
    {
        "symbol": "SZ002074",
        "buy_price": 21.850,
        "quantity": 100,
        "commission": 10,
        "stock_name": "国轩高科"
    },
    {
        "symbol": "SH603220",
        "buy_price": 28.8503,
        "quantity": 100,
        "commission": 10,
        "stock_name": "中贝通信"
    },
    {
        "symbol": "SZ002889",
        "buy_price": 23.03,
        "quantity": 100,
        "commission": 10,
        "stock_name": "东方嘉盛"
    },
    {
        "symbol": "SZ300637",
        "buy_price": 9.79,
        "quantity": 200,
        "commission": 10,
        "stock_name": "扬帆新材"
    }
]

stock_price_detail

这个文件是用于获取实时价格以及收益计算的

# coding=utf-8

import requests
import json
from .config import cookies, headers
import time


def request_for_stock_info(symbol):
    '''
    获取股票价格信息
    :param symbol: 股票代号
    :return: 响应结果
    '''
    params = {
        'symbol': symbol,
        'extend': 'detail',
    }

    response = requests.get('https://stock.xueqiu.com/v5/stock/quote.json', params=params, cookies=cookies,
                            headers=headers)

    if response.status_code == 200:
        return response.json()
    else:
        return None


def get_current_price(symbol):
    '''
    获取股票实时价格
    :param symbol: 股票代号
    :return: 实时价格
    '''
    data = request_for_stock_info(symbol)
    if data is None:
        print("请求失败!", symbol)
        return None

    quote = data['data']['quote']
    current_price = quote["current"]
    print("get_current_price", symbol, current_price)
    return current_price


# 计算收益
def income_statement(symbol, buy_price, quantity, commission=10, **kwargs):
    # 获取当前价格
    current_price = get_current_price(symbol)
    stock_name = kwargs.get('stock_name', 'Unknown')
    # 检查是否成功获取当前价格
    if current_price is None:
        print(f"无法获取股票 {symbol} 的当前价格")
        return

    # 计算差价并保留三位小数
    price_difference = round(current_price - buy_price, 3)

    # 计算总的收益数
    total_income = round(price_difference * quantity, 3)

    # 输出收益率,收益/买入总成本+佣金
    # 计算总成本(买入价格 * 股数 + 佣金)
    total_cost = round(buy_price * quantity + commission, 3)

    # 计算收益率(总收益 / 总成本)
    return_rate = round((total_income / total_cost) * 100, 3)

    # 输出差价、总收益和收益率
    print(f"股票 {symbol} 当前价格: {current_price:.3f}")
    print(f"买入价格: {buy_price:.3f}")
    print(f"差价: {price_difference:.3f}")
    print(f"总收益: {total_income:.3f}")
    print(f"总成本: {total_cost:.3f}")
    print(f"收益率: {return_rate:.3f}%")

    current_stock_info = {
        "symbol": symbol,
        "stock_name": stock_name,
        "total_income": total_income,
        "return_rate": return_rate,
        "buy_price": buy_price,
        "quantity": quantity,
        "commission": commission,
        "current_price": current_price,
    }

    return current_stock_info

# if __name__ == '__main__':
#     for stock in stock_list:
#         print("===================================================================================")
#         current_data = income_statement(
#             **stock
#         )
#         print(current_data)
#         print("===================================================================================")
#         print()

总结

这个暂时这么搞吧,以后每天更新一点点内容,稍微完善美观一点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jesse_Kyrie

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值