作者归档:ning

用GPT写个代码来模拟仓位管理

运行结果如下

胜率设置:35.0%
胜利赔率:2.5倍
最大下注比例:50.0%
下注降低比例:70.0%
下注增长比例:1.3倍
最小下注金额:1

马丁格尔策略:
平均最终资金: 0.00
最高最终资金: 0.00
最低最终资金: 0.00
爆仓次数: 100 次,爆仓率: 100.00%

反马丁格尔策略:
平均最终资金: 3137.26
最高最终资金: 3904.19
最低最终资金: 2352.77
爆仓次数: 0 次,爆仓率: 0.00%

代码如下

"""
"""
马丁格尔策略 vs 反马丁格尔策略模拟程序

需求说明:
1. 模拟两种博彩策略的效果对比
   - 马丁格尔策略:输了就加倍下注,赢了降低下注(而不是重置为初始赌注)
   - 反马丁格尔策略:赢了就加倍下注,输了降低下注(而不是重置为初始赌注)

2. 核心参数:
   - 初始资金:100
   - 初始赌注:1
   - 每线程游戏次数:10000次
   - 线程数量:100个
   - 胜率:可调整(默认40%)
   - 赔率:可调整(默认1.5倍)
   - 最大下注比例:资金的20%
   - 降低下注比例:示例降低50%
   - 加倍下注比例:示例2倍
   - 最小下注金额:0.1

3. 风险控制:
   - 单次下注不超过当前资金的指定比例
   - 资金为0时停止游戏并记录为爆仓

4. 统计输出:
   - 平均最终资金
   - 最高/最低最终资金
   - 爆仓次数和爆仓率
   - 支持多线程并发模拟
"""

import threading
import random

# 参数配置
INITIAL_CAPITAL = 100     # 初始资金
INITIAL_BET = 1           # 初始赌注
COIN_FLIP_TIMES = 10000   # 每线程抛硬币次数
THREAD_COUNT = 100        # 线程数量
WIN_PROB = 0.35            # 胜率,示例40%
WIN_ODDS = 2.5            # 胜利赔率,示例1.5倍
MAX_BET_RATIO = 0.5       # 最大下注比例,示例20%
BET_REDUCTION_RATIO = 0.7 # 降低下注比例,示例降低30%
BET_INCREASE_RATIO = 1.3  # 加倍下注比例,示例1.3倍
MIN_BET = 1             # 最小下注金额

# 结果存储
results_martingale = []
results_anti_martingale = []

martingale_busts = 0
anti_martingale_busts = 0

lock = threading.Lock()   # 多线程锁,保护共享变量
def simulate(strategy_type):
    global martingale_busts, anti_martingale_busts

    capital = INITIAL_CAPITAL
    bet = INITIAL_BET

    for _ in range(COIN_FLIP_TIMES):
        # 检查是否有足够资金继续游戏
        if capital < MIN_BET:
            with lock:
                if strategy_type == 'martingale':
                    martingale_busts += 1
                else:
                    anti_martingale_busts += 1
            capital = 0
            break

        # 应用最大下注比例限制
        max_bet = capital * MAX_BET_RATIO
        bet = min(bet, max_bet)

        # 确保下注不超过当前资金
        actual_bet = min(bet, capital)

        win = random.random() < WIN_PROB

        if win:
            capital += actual_bet * WIN_ODDS
            if strategy_type == 'anti_martingale':
                bet *= BET_INCREASE_RATIO
            else:  # martingale策略
                bet = max(bet * BET_REDUCTION_RATIO, MIN_BET)
        else:
            capital -= actual_bet
            if strategy_type == 'martingale':
                bet *= BET_INCREASE_RATIO
            else:  # anti_martingale策略
                bet = max(bet * BET_REDUCTION_RATIO, MIN_BET)

    # 无论是否爆仓,都记录最终资金
    with lock:
        if strategy_type == 'martingale':
            results_martingale.append(capital)
        else:
            results_anti_martingale.append(capital)

threads = []

for _ in range(THREAD_COUNT):
    t1 = threading.Thread(target=simulate, args=('martingale',))
    t2 = threading.Thread(target=simulate, args=('anti_martingale',))
    threads.extend([t1, t2])

for t in threads:
    t.start()

for t in threads:
    t.join()

print(f"胜率设置:{WIN_PROB*100:.1f}%")
print(f"胜利赔率:{WIN_ODDS}倍")
print(f"最大下注比例:{MAX_BET_RATIO*100:.1f}%")
print(f"下注降低比例:{BET_REDUCTION_RATIO*100:.1f}%")
print(f"下注增长比例:{BET_INCREASE_RATIO}倍")
print(f"最小下注金额:{MIN_BET}\n")

print("马丁格尔策略:")
if results_martingale:
    print(f"平均最终资金: {sum(results_martingale) / THREAD_COUNT:.2f}")
    print(f"最高最终资金: {max(results_martingale):.2f}")
    print(f"最低最终资金: {min(results_martingale):.2f}")
else:
    print("无数据")
print(f"爆仓次数: {martingale_busts} 次,爆仓率: {martingale_busts / THREAD_COUNT * 100:.2f}%")

print("\n反马丁格尔策略:")
if results_anti_martingale:
    print(f"平均最终资金: {sum(results_anti_martingale) / THREAD_COUNT:.2f}")
    print(f"最高最终资金: {max(results_anti_martingale):.2f}")
    print(f"最低最终资金: {min(results_anti_martingale):.2f}")
else:
    print("无数据")
print(f"爆仓次数: {anti_martingale_busts} 次,爆仓率: {anti_martingale_busts / THREAD_COUNT * 100:.2f}%")

postgresql慢查询中止

查询慢查询

SELECT
    pid,
    usename,
    application_name,
    client_addr,
    query_start,
    state,
    query
FROM
    pg_stat_activity
WHERE
    state = 'active' -- 只查询正在执行的查询
    AND query_start < NOW() - INTERVAL '5 minutes' -- 筛选出执行时间超过5分钟的查询
ORDER BY
    query_start;

中止慢查询

SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE
    state = 'active'
    AND query_start < NOW() - INTERVAL '5 minutes'; 

rye使用镜像下载python和pypi包

rye使用镜像下载python

echo 'export PYTHON_BUILD_MIRROR_URL=https://registry.npmmirror.com/-/binary/python' >> ~/.bashrc
source ~/.bashrc

让rye默认使用阿里云镜像下载包

rye可以自定义源,自定义源有限官方源,参考:https://rye.astral.sh/guide/sources,所以:

code ~/.rye/config.toml

[[sources]]
name = "aliyun"
url = "https://mirrors.aliyun.com/pypi/simple"

浏览器跨域,就是这么简单!

首先,你得理解为什么浏览器要限制跨域:

  1. 比如我公司的静态 js 和图片,被某大流量网站直接引用了,我流量不直接被刷爆?
  2. 某域名直接 iframe 之类嵌套,或者引用我的资料,打着李逵的名号,其实是李鬼。

所以,浏览器限制了跨域请求。

问:那么,我们开发时,想要访问线上接口怎么办?

答:我们可以用 vite 之类 nodejs 的代理功能,通过代理访问线上接口,代理一词的意思是我们访问本地的接口,代理服务器通过本地程序(非浏览器)转发到线上接口。

问:如果我们确实有线上项目的跨域请求的需求怎么办?

答:我们可以在服务器设置 Access-Control-Allow-Origin ,将我们自己人加入白名单。

建立安全边际后,手里股票越跌越开心

最近反思自己为什么老亏?以下为反思内容:

为什么大家在下跌的时候会焦虑,而有些人反而开心?根本可能在于自己的投资是否建立在安全边际之内。

如何通过资金管理建立安全边际?

举一个例子,假设投资以上证指数为参照,上证的筑底点位为 2400-3600 点,我们可以在 3000 点建立 70%,如果下降到 2400 时逐步升级到 90%,如果下降到 2400 以下的时候观望等待复苏,始终保持 10%的现金。如果逐步上升到 3600 点时降低到 50%仓位。股市到 3600 点以上时,我们逐步抛出剩余 50%。这样我们至少有 50%的仓位是能获取 600 点的收益的。

安全边际还有很多,比如现金流,股息,国资,垄断,品牌,创始人等等。

结论:我们大部分的投资都应该构建在安全边际之内。

群友问:

“如果你买的是个股,大部分人大盘 3000 到 2400 时亏的不止 600 点,大盘 2400 回到 3000 赚不到 600 点,所以“至少有 50%的仓位是能获取 600 点的收益”这个概率得降低。”

答:

所以需要结合其他几条,选择有安全边际的位置和投资标的。思路差不多。

比如我通过技术分析,发现化工行业可能已经达到筑底区域,那么我接下来继续重点选择化工行业的股票,为了提高安全边际,那么我选择股息率大于 3%(不涨就继续持有吃股息),近三年 roe 都大于 8%(保证有钱能吃股息),最好是国资(老板卖公司概率降低),现金流充沛(能持续发展,发股息),行业趋向回暖(比如煤炭石油降价受益标的),然后首先投入 50%的资金,等待发展下跌持续加仓,这时候越跌你是越开心的,因为可以吃到更多的低位筹码了。最后,能不能赚钱,就靠老天爷赏口饭吃了。。。

以上只是思考的思路,未经验证。请勿作为投资依据。

个人量化入门(第二篇):个人量化的序言 — 量化与狩猎

小时候最有意思的事情莫过于跟着堂哥抓鱼捉兔,堂哥是我们那一片丘陵中这个领域数一数二的好手,每次跟他出去都能有收获,哪怕我这完全啥都不懂的小白,也能跟着涨点见识,吃点荤。

农忙过后的秋天是狩猎野兔的好时机,我和堂哥会翻过一座由一座丘陵的山,寻找兔子踪迹。

在山谷的池塘边的山路上,听堂哥分析野兔的脚印应该是几天内还是几天前留下的;

在一片被啃过的菜地边,听堂哥分析野兔的家在哪里,通过哪里来到这里,是不是经常来;

在一堆沙土上,看着一堆圆圆的粪便,我们猜测这个兔子是今年的头窝,还是一条可能有四五斤的老兔子,年轻的往往往大说,年长的只是笑笑,可能还会偶尔用特殊的音调回一句“还不止”。。。

而这些分析完后,剩下的就简单了,我们就会在野兔的必经之路上,装上手工打造的套子或则买来的夹子,装好后做一些掩盖,然后奔赴下一个可能的山谷。。。

========故事结束============

“但凡经过,必留下痕迹”

这是我当前总结的量化的基础原理,个人没有强大的计算资源,无法像气象台预测天气一样预测经济,也没有精力通过高频交易加以对冲,我们只能通过那些小兔子留下来的痕迹,抓些倒霉的小兔子。

我们可以选择在气象台警告台风即将降临时不出海,
我们可以选择在禁渔期过后立马跑出去捞第一网,
我们可以选择只在我们熟习的海域撒网;
我们可以选择寻找一片还没有人到达的海域。。。

“市场和狩猎不同的是,这里我们即是猎人,更可能是小野兔子。”

"我们也不能守株待兔,历史往往不是简单的重复。"

个人量化入门(第一篇):工具篇

量化回测

通达性公式(入门级)

通达信公式非常简单,可以做日线和分钟线级别测试,一次可以测试多个品种,但是不支持组合测试。支持结果可视化以及分析报告,使用步骤:

  • 电脑下载通达信金融终端;
  • 依次点击右上角:公式 》程序交易系统测评

backtesting.py (Python,超级简单,需要自己下数据)

https://github.com/kernc/backtesting.py

vn.py,backtrader,vectorbt (Python,较容易,需要自己下数据)

同花顺supermind(简单,无需下数据,基于云,速度一般,支持组合和问财,有社区,支持实盘)

掘金量化(简单,数据在本地日线以下需要付费,基于云,社区一般,支持实盘)

聚宽量化(简单,基于云,社区较好,速度一般,,支持实盘)

果仁网

提供选股回测

同花顺问财

基于自然语言的选股工具

 实盘交易

TradingView

可交易美股,虚拟币,货币等。提供 web 回测,图形化。
可自己编写指标,交易策略,脚本类似 python

MetaTrader 4/5

可交易美股,虚拟币,货币等。提供 web 回测,图形化。
可自己编写指标,交易策略,脚本类似 c++

QMT

支持:股票、两融、ETF申赎、可转债、期权、期货
Tick级、分钟级、五分钟级、十分钟级、日线、周线、月线等等

Ptrade

支持:股票、两融、ETF申赎、可转债

只支持分钟级和日线级别的频率

数据下载

一个简单的价值投资系统

股市价投军规股市价投军规

  • 必须在大盘、板块、个股百分之五十百分位之下增仓(增加外部资金入市);
  • 必须为5年内不用的余钱投资;
  • 只在大盘、板块、个股都达到压力或支撑位时买卖;
  • 必须分为多次买入,每次买入间隔大于15个点;
  • 买入的股票长期和短期的价值和发展都是同类最优秀的;
  • 买入时需要结合消息面、基本面、资金面共振。

波段操作要点波段操作要点

  • 上升的压力位是下降时的支撑位和前高。
  • 下降的支撑位是上升时的压力位和前低。
  • 大盘优于行业,行业优于个股,所以优先选择与大盘及行业共振的标的,结合基本面、消息面、情绪面、资金面以及仓位管理得出最佳买卖标的和买卖点。

局域网访问WSL2

开启端口转发

netsh interface portproxy add v4tov4 listenport=80 listenaddress=0.0.0.0 connectport=80 connectaddress=172.17.30.220

connectaddress后面为虚拟机的ip地址

查看已转发端口

netsh interface portproxy show all

删除已转发端口

netsh interface portproxy delete v4tov4  listenport=80 listenaddress=0.0.0.0