동전 던지기 전략 (●''●)

저자:, 날짜: 2020-04-21 17:39:52
태그:

이 글은 전 T 신 공개자명으로, 신 특별 전략으로 번역되었습니다. 이 글은 이쪽에서 본 것입니다. "천만의 양적 세계"에 더 많은 관심을 기울여 더 많은 전략 소스 코드를 얻으세요! 그리고 자신의 광고를 만들기도 합니다. "산화콩의 양적 기록" 인터넷에 있는 모든 사람들이 매일 공개적으로 벌받을 수 있는 더 많은 혜택, 더 많은 혜택을 받으세요.


은 오리지널 洋洋 千千 量化世界 3일 전 량화 전략의 연구개발은 실제로 두 가지 측면이 있으며, 처음 시작하는 사람들에게는 매우 어렵습니다. 수준 코드뿐만 아니라 수준 전략적 논리적 사고도 똑같이 어렵습니다. 둘 다 중요합니다.

, , , , !

이 기사는 특집 문서의 두 번째 부문입니다. 우리는 양양대신 (LE_CHIFFRE1 마이크로 신호) 에 초대되어 매우 영광입니다.

신은 전통적인 양 투자 기관에서 왔으며, 동전 동전 거래소 사업에 깊이 참여했으며, 양량화 분야에서 풍부한 경험과 독특한 통찰력을 가지고 있습니다. 신의 내용은 아이디어 계시, 코딩 구현 및 개인 깨달음 등을 포함합니다.

아래의 박수와 함께, 신 ( 신) 이 변동율 전략을 소개합니다.

01

문장

안녕하세요, 오늘 천만 명의 양자화 공중보호에 기사를 게시할 수 있는 특권을 얻었습니다. 또한 T 사장 (천만 명의 외계자 중 한 명) 의 초청에 감사합니다. 처음으로 T 사장에게 기사를 작성하고, 완전히 자유롭게 플레이하고, 작업 후의 여분의 시간, 품질 및 오류를 빌려서 기사에 올바르게 표시하고 포함하십시오. 감사합니다.

T 사장은 양적, 그리고 어떤 범위를 제공하지 않고, 실제로 어디서 쓰는지 모르겠다고 말합니다. 그러면 자신의 좋아하는 주제와 다른 사람들과 토론하기 시작하십시오. 양적 지표와 전략 (보조 할 수도 있고 자동화 할 수도 있습니다), 물론, 마지막으로 우리는 또한 오래된 말을 추가해야합니다: 양적 투자가 위험하고, 시장에 진출하는 것은 신중해야합니다. 전략은 단지 생각과 교훈을 제공하고, 자손을 얻습니다. 이 전략을 사용하는 모든 이익과 이익은 나와 수천의 양적 세계 의 대중 주체와 관련이 없습니다.

이 문헌은 이 문헌의 내용을 담고 있습니다.

02

그리고 그 다음에는,

저를 아는 사람들은 사실 제가 개인적으로는 알파 게임을 별로 좋아하지 않는다는 것을 알고 있습니다. 저는 비교적 베타를 더 믿고, 베타를 더 많이 연구합니다. 왜, e.........mmmmm, 모르겠어요.

정량화 전략의 연구개발은 실제로는 두 가지 측면이 있으며, 처음 입문하는 사람들에게는 매우 어렵고 어렵습니다. 문법적 요법 수준의 코드뿐만 아니라 조리법적 요법 수준의 전략적 논리적 사고도 똑같이 어렵습니다. 둘 다 중요합니다. 오늘 여러분에게 소개하는 전략은 사실 수년 전에 HuaThai의 한 연구 보고서에서 영감을 받았습니다.

이 전략 알고리즘은 로그램 가격의 특정 주기 경사 하락의 굴러 수익률 변동의 원리를 사용하며, 이 변동 범위를 계산하여 특정 주기 굴러 최고와 최소를 찾습니다. 최고가 상승 파이프로, 최소가 하락 파이프로, 상승 파이프를 돌파하고, 거래를 개시합니다. 상승 및 하락 파이프 굴러 평균은 평평한 거래 라인으로.

구체적인 그래픽 시각화 인터페이스는 아래의 PPT를 참조하십시오. 이 그래픽은 직접 Pyecharts로 그려졌습니다. 구체적인 코드는 T 대장입니다.

img

사실 이 전략은 그가 이전엔 브로드 베이스 ETF에서 사용했던 전략이고, 물론 지수 선택 때 주식을 사거나 팔기 위해 사용되기도 했으며, 나중에 직접 동전에 옮겼습니다.

img

아래 그림은 그 해에 대한 재검토 성과를 보여줍니다. 특정 부분의 코드 로직 스크린은 다음과 같습니다.

img

위쪽은 실제로 데이터를 읽고 판다를 통해 지표 데이터를 계산하는 것입니다.

img

계산이 완료되면 pd.to_csv () 함수와 위의 스크린에서 사용된 pyecharts () 를 시각화하여 데이터를 출력할 수 있습니다.

모든 전략, 시각화, 그리고 성과 지표 코드는 T-Dragon (T-Dragon) 이라고 합니다.

03

수량화

다음으로 제가 가장 중요하게 언급하는 두 가지 사항입니다. 첫째: 많은 사람들이 의문을 품거나 왜 여러분들이 실제의 전략을 공개할 수 있는지, 가짜 사기꾼입니까? 아니면 정말로 만연한 존재입니까? 하하. 첫째, 좋은 전략은 공개를 두려워하지 않습니다. 이것은 전쟁 수준 대립의 무기 개발이 아니라 삶과 죽음을 결정하는 것입니다. 따라서 자신과 다른 기관 또는 개인은 비밀이라고 불리는 어떤 전략도 두려워하지 않습니다. 왜냐하면 CTA는 비밀이 없다고 생각합니다.

두 번째: 많은 사람들이 새로운 사람이든, 이미 입문한 사람이든, 심지어 오래된 플레이어를 포함하여, 영감을 필요로합니다. 주식의 요인 채굴, 시간 전략 아이디어 등이 포함됩니다. 이러한 사람들은 종종 주관적 경험, 연구 보고서, 서클 내 커뮤니케이션 교류 등을 원천으로합니다.

마지막으로 요약하자면, 정량화라는 것은 원래는 유래한 제품이고, 프로그래밍 거래는 정량화 속의 하위 집합에 속한다. 그 당시의 대학 시절 (약 2009년) 에 TB, 피라미드 등 프로그래밍에 관여한 사람들이 있었다. 만약 오늘날에도 계속한다면, 이 부분의 초기 예언자 10년 전이라고 말할 수 있다. 이 부분에는 월 스트리트 에서 을 가져온 고주파 전략과 시스템이 포함되지 않았다. 따라서, 정량화라는 전략은 중국에서는 이미 오래전부터 지속되어 왔지만, 현재 시장 점유율과 주체, 정책 지원의 부분에서는 여전히 소규모로 존재하고 있다.

마지막으로, 제 전문성에 대한 신뢰와 기사에 대한 초대에 대한 수천 명의 양자화 대중에게 감사 드립니다. 여러분께 구체적인 코드 및 전략 문제가 있다면, 저에게 또는 T 대장에게 개인 이메일을 보내십시오.

그리고 마지막으로 다시 한 번 의 훌륭한 설명에 감사드립니다!

아직 양적 토론 그룹에 가입하지 않은 친구들은 빠르게 그룹에 가입하여 학습 자료를 얻을 수 있습니다!

천천천왕타운!

img

위크멘트 스파이 이 문제에 대한 관심


/*backtest
start: 2020-01-20 00:00:00
end: 2021-01-19 23:59:00
period: 15m
basePeriod: 5m
exchanges: [{"eid":"Futures_BitMEX","currency":"XBT_USD","fee":[0.008,0.1]}]
args: [["st",0.1]]
*/

// 初始化
exchange.SetContractType('XBTUSD')
_CDelay(100)
// 止盈止损
var TP_status = false // 是否触发追踪止盈 
var TP_HH = 0
var TP_LL = 0
var B = 1

// 获取交易所信息
function UpdateInfo() {
    account = exchange.GetAccount()
    pos = exchange.GetPosition()
    records = exchange.GetRecords()
    ticker = exchange.GetTicker()
}

// 定制本次盈亏
function Onept() {
    // 更新用户信息
    UpdateInfo()
    // 如果现在余额 大于 之前的余额, 那么 盈利次数+1, 且pt_1设为现在余额
    if (account.Stocks - pt_1 > 0) {
        pt_times = pt_times + 1
        Log('这回赚钱啦~~~~ (^U^)ノ~YO', account.Stocks - pt_1)
        B = 1
        pt_1 = account.Stocks
    }
    // 如果现在余额 小于 之前的余额, 那么 亏损次数+1, 且pt_1设为现在余额
    if (account.Stocks - pt_1 < 0) {
        st_times = st_times + 1
        Log('这回亏掉了.... /(ㄒoㄒ)/~~', account.Stocks - pt_1)
        B = B * 1.618
        pt_1 = account.Stocks
    }
}

// 画线
function PlotMA_Kline(records) {
    $.PlotRecords(records, "K")
}

// 追踪止盈 初始%, 追踪U
function TP() {
    var TP_first_long = pos[0].Price + tp_first * ticker.Last
    var TP_trailing_long = TP_HH - trailing_tp * ticker.Last
    var TP_first_short = pos[0].Price - tp_first * ticker.Last
    var TP_trailing_short = TP_LL + trailing_tp * ticker.Last
    // 当多仓时, 现价大于开仓+初始止赢价 -> 触发追踪止盈 
    if ((pos[0].Type == 0) && (ticker.Last > TP_first_long)) {
        // Log('当多仓时, 现价大于开仓+初始止赢价 -> 触发追踪止盈', TP_HH)
        TP_status = true
        // 触发追踪止盈, 未初始化开仓最大价格 -> 开仓后最大价格更新为现价
        if (TP_status === true && TP_HH == 0) {
            Log('触发追踪止盈, 未初始化开仓最大价格 -> 开仓后最大价格更新为现价', TP_HH)
            TP_HH = ticker.Last
        }
        // 触发追踪止盈, 已有开仓后最大价格, 现价大于开仓后最大价格 -> 开仓后最大价格更新为现价
        else if (TP_status === true && TP_HH != 0 && ticker.Last > TP_HH) {
            Log('触发追踪止盈, 已有开仓后最大价格, 现价大于开仓后最大价格 -> 开仓后最大价格更新为现价', TP_HH)
            TP_HH = ticker.Last
        }
        // 触发追踪止盈, 已有开仓后最大价格, 现价小于 (开仓后最大价格减 - 回撤USD) -> 开空平仓止盈
        else if (TP_status === true && TP_HH != 0 && ticker.Last < TP_trailing_long) {
            Log('触发追踪止盈, 已有开仓后最大价格, 现价小于 (开仓后最大价格减 - 回撤USD) -> 开空平仓止盈', TP_HH)
            exchange.SetDirection("closebuy")
            exchange.Sell(ticker.Buy, pos[0].Amount, "在" + ticker.Last + "止赢平多仓!! 开仓价格: " + pos[0].Price + "数量: " + pos[0].Amount)
            $.PlotFlag(new Date().getTime(), 'Sell', 'PT_BK' + ticker.Sell)
            Onept()
            TP_status = false
            TP_HH = 0
        }
    }
    // 当空仓时, 现价小于开仓-初始止赢价 -> 触发追踪止盈
    else if ((pos[0].Type == 1) && (ticker.Last < TP_first_short)) {
        // Log('当空仓时, 现价小于开仓-初始止赢价 -> 触发追踪止盈', TP_LL)
        TP_status = true
        // 触发追踪止盈, 未初始化开仓最大价格 -> 开仓后最小价格更新为现价
        if (TP_status === true && TP_LL == 0) {
            Log('触发追踪止盈, 未初始化开仓最大价格 -> 开仓后最小价格更新为现价', TP_LL)
            TP_LL = ticker.Last
        }
        // 触发追踪止盈, 已有开仓后最小价格, 现价小于开仓后最小价格 -> 开仓后最小价格更新为现价
        else if (TP_status === true && TP_LL != 0 && ticker.Last < TP_LL) {
            Log('触发追踪止盈, 已有开仓后最小价格, 现价小于开仓后最小价格 -> 开仓后最小价格更新为现价', TP_LL)
            TP_LL = ticker.Last
        }
        // 触发追踪止盈, 已有开仓后最小价格, 现价大于 (开仓后最小价格减 + 回撤USD) -> 开多平仓止盈
        else if (TP_status === true && TP_LL != 0 && ticker.Last > TP_trailing_short) {
            Log('触发追踪止盈, 已有开仓后最小价格, 现价大于 (开仓后最小价格减 + 回撤USD) -> 开多平仓止盈', TP_LL)
            exchange.SetDirection("closesell")
            exchange.Buy(ticker.Sell, pos[0].Amount, "在" + ticker.Last + "止赢平空仓!! 开仓价格: " + pos[0].Price + "数量: " + pos[0].Amount)
            $.PlotFlag(new Date().getTime(), 'Buy', 'PT_SK' + ticker.Sell)
            Onept()
            TP_status = false
            TP_LL = 0
        }
    }
}

// 止损 %
function Stoploss() {
    // 当多仓时, 现价小于开仓-止损价, 做空平多
    if ((pos[0].Type == 0) && (ticker.Last < pos[0].Price - st * ticker.Last)) {
        Log('当多仓时, 现价小于开仓-止损价, 做空平多')
        exchange.SetDirection("closebuy")
        exchange.Sell(ticker.Buy, pos[0].Amount, "在" + ticker.Last + "止损平多仓!! 开仓价格: " + pos[0].Price + "数量: " + pos[0].Amount)
        $.PlotFlag(new Date().getTime(), 'Sell', 'ST_BK' + ticker.Buy)
        Onept()
    }
    // 当空仓时, 现价大于开仓+止损价, 做多平空
    else if ((pos[0].Type == 1) && (ticker.Last > pos[0].Price + st * ticker.Last)) {
        Log('当空仓时, 现价大于开仓+止损价, 做多平空')
        exchange.SetDirection("closesell")
        exchange.Buy(ticker.Sell, pos[0].Amount, "在" + ticker.Last + "止损平空仓!! 开仓价格: " + pos[0].Price + "数量: " + pos[0].Amount)
        $.PlotFlag(new Date().getTime(), 'Buy', 'ST_SK' + ticker.Sell)
        Onept()
    }
}

// 计算凯利公式 仓位
function PriceAmount() {
    // 赢可以赢多少 
    y = tp_first
    // 输会输多少 
    s = st
    //赔率
    b = y / s
    // 赢的概率
    if (total_times < 10) {
        p = 0.382
    } else {
        p = pt_times / total_times
    }
    // 输的概率
    q = 1 - p
    // 凯莉公式
    f = (b * p - q) / b
    // 限制B最大值
    if (B > 16.18) {
        B = 16.18
    }
    //Amount = _N(Math.abs(f) * account.Stocks * ticker.Last * B, 0)
    Amount = _N(0.618 * account.Stocks * ticker.Last, 0)
    //Log(Amount)
}

// 交易逻辑
function onTick() {
    // 获取均匀分布 0-9 随机数
    ToTheMoon = Math.floor(Math.random() * 10)
    // 无仓位时
    if (pos.length == 0) {
        // Long 
        if (ToTheMoon > 5) {
            exchange.SetDirection("buy")
            exchange.Buy(ticker.Sell, Amount)
            $.PlotFlag(new Date().getTime(), 'Buy', 'BK' + ticker.Sell)
            total_times = total_times + 1
        }
        // Short 
        if (ToTheMoon < 4) {
            exchange.SetDirection("sell")
            exchange.Sell(ticker.Buy, Amount)
            $.PlotFlag(new Date().getTime(), 'Sell', 'SK' + ticker.Buy)
            total_times = total_times + 1
        }
    }
        // 多仓时
    if (pos.length > 0 && pos[0].Type == 0) {
        // 平多 
        if (ToTheMoon < 1) {
            exchange.SetDirection("closebuy")
            exchange.Sell(ticker.Buy, pos[0].Amount)
            $.PlotFlag(new Date().getTime(), 'Sell', 'PBK')
            Onept()
        }
    }
    // 空仓时
    if (pos.length > 0 && pos[0].Type == 1) {
        // 平空 
        if (ToTheMoon > 8) {
            exchange.SetDirection("closesell")
            exchange.Buy(ticker.Sell, pos[0].Amount)
            $.PlotFlag(new Date().getTime(), 'Buy', 'PSK')
            Onept()
        }
    }
}


function main() {
    UpdateInfo()
    // 统计
    pt_1 = account.Stocks
    total_times = 0
    pt_times = 0
    st_times = 0
    while (1) {
        UpdateInfo()
        PriceAmount()
        onTick()
        PlotMA_Kline(records)
        if (pos.length > 0) {
            TP()
        }
        if (pos.length > 0) {
            Stoploss()
        }
        LogStatus("总余额: " + _N(ticker.Last * account.Stocks, 2), " 下单量: " + Amount, " 下单倍数: " + B, " ToTheMoon: " + ToTheMoon, " 下单量比: " + _N(Amount * 100 / _N(ticker.Last * account.Stocks, 2), 2), "% 胜率: " + _N(p * 100, 2), "%", total_times, pos)
    }
}

더 많은

알레콩나판으로 바꿀 수 있을까요?