Advertisement
Guest User

Untitled

a guest
Nov 23rd, 2023
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Julia 5.93 KB | None | 0 0
  1. using Revise
  2. using Random
  3. using Dates
  4. using Random
  5. using Printf
  6.  
  7. struct ParamsResult
  8.     short_term::Int
  9.     long_term::Int
  10.     performance::Float64
  11. end
  12. mutable struct MarsagliaRng
  13.     q::Vector{UInt32}
  14.     carry::UInt32
  15.     mwc256_initialized::Bool
  16.     mwc256_seed::Int32
  17.     i::UInt8
  18.  
  19.     function MarsagliaRng(seed::Vector{UInt8})
  20.         q = zeros(UInt32, 256)
  21.         carry = 362436
  22.         mwc256_initialized = false
  23.         mwc256_seed = reinterpret(Int32, seed)[1]
  24.         i = 255
  25.         new(q, carry, mwc256_initialized, mwc256_seed, i)
  26.     end
  27. end
  28.  
  29. # Default constructor using system time for seeding
  30. function MarsagliaRng()
  31.     ts_nano = UInt8(nanosecond(now()))
  32.     seed = [ts_nano, ts_nano >>> 8, ts_nano >>> 16, ts_nano >>> 24]
  33.     MarsagliaRng(seed)
  34. end
  35.  
  36. # Random number generator functions
  37. function next_u32(rng::MarsagliaRng)::UInt32
  38.     a = UInt64(809430660)
  39.  
  40.     if !rng.mwc256_initialized
  41.         j = UInt32(rng.mwc256_seed)
  42.         c1 = UInt32(69069)
  43.         c2 = UInt32(12345)
  44.         rng.mwc256_initialized = true
  45.         for k in 1:256
  46.             j = (c1 * j + c2) % UInt32
  47.             rng.q[k] = j
  48.         end
  49.     end
  50.  
  51.     rng.i = (rng.i + 1) % 256
  52.     t = a * UInt64(rng.q[rng.i+1]) + UInt64(rng.carry)
  53.     rng.carry = (t >> 32)
  54.     rng.q[rng.i+1] = t % UInt32
  55.  
  56.     return rng.q[rng.i+1]
  57. end
  58.  
  59.  
  60.  
  61. function next_u64(rng::MarsagliaRng)::UInt64
  62.     UInt64(next_u32(rng))
  63. end
  64.  
  65. # Sample function for generating a Float64
  66. function rand(rng::MarsagliaRng)::Float64
  67.     mult = 1.0 / typemax(UInt32)
  68.     mult * next_u32(rng)
  69. end
  70.  
  71.  
  72.  
  73. function opt_params(which::Int, ncases::Int, x::Vector{Float64})
  74.     best_perf = -Inf
  75.     ibestshort = 0
  76.     ibestlong = 0
  77.  
  78.     for ilong in 2:199
  79.         for ishort in 1:(ilong-1)
  80.             total_return = 0.0
  81.             win_sum = 1e-60
  82.             lose_sum = 1e-60
  83.             sum_squares = 1e-60
  84.             short_sum = 0.0
  85.             long_sum = 0.0
  86.  
  87.             for i in (ilong-1:ncases-2)
  88.                 if i == ilong-1
  89.                     short_sum = sum(x[(i-ishort+2):i+1])
  90.                     long_sum = sum(x[(i-ilong+2):i+1])
  91.                 else
  92.                     short_sum += x[i+1] - x[i-ishort+1]
  93.                     long_sum += x[i+1] - x[i-ilong+1]
  94.                 end
  95.  
  96.  
  97.                 short_mean = short_sum / ishort
  98.                 long_mean = long_sum / ilong
  99.  
  100.                 ret = (short_mean > long_mean) ? x[i+2] - x[i+1] :
  101.                       (short_mean < long_mean) ? x[i+1] - x[i+2] : 0.0
  102.  
  103.                 total_return += ret
  104.                 sum_squares += ret^2
  105.                 if ret > 0.0
  106.                     win_sum += ret
  107.                 else
  108.                     lose_sum -= ret
  109.                 end
  110.             end
  111.  
  112.             if which == 0
  113.                 total_return /= (ncases - ilong)
  114.                 if total_return > best_perf
  115.                     best_perf = total_return
  116.                     ibestshort = ishort
  117.                     ibestlong = ilong
  118.                 end
  119.             elseif which == 1
  120.                 pf = win_sum / lose_sum
  121.                 if pf > best_perf
  122.                     best_perf = pf
  123.                     ibestshort = ishort
  124.                     ibestlong = ilong
  125.                 end
  126.             elseif which == 2
  127.                 total_return /= (ncases - ilong)
  128.                 sum_squares /= (ncases - ilong)
  129.                 sum_squares -= total_return^2
  130.                 sr = total_return / (sqrt(sum_squares) + 1e-8)
  131.                 if sr > best_perf
  132.                     best_perf = sr
  133.                     ibestshort = ishort
  134.                     ibestlong = ilong
  135.                 end
  136.             end
  137.         end
  138.     end
  139.  
  140.     ParamsResult(ibestshort, ibestlong, best_perf)
  141. end
  142.  
  143. function test_system(ncases::Int, x::Vector{Float64}, short_term::Int, long_term::Int)
  144.     sum1 = 0.0
  145.  
  146.     for i in (long_term-1:ncases-2)
  147.         short_mean = sum(x[i-short_term+2:i+1]) / short_term
  148.         long_mean = sum(x[i-long_term+2:i+1]) / long_term
  149.  
  150.         if short_mean > long_mean
  151.             sum1 += x[i+2] - x[i+1]
  152.         elseif short_mean < long_mean
  153.             sum1 -= x[i+2] - x[i+1]
  154.         end
  155.  
  156.     end
  157.     sum1 / (ncases - long_term)
  158. end
  159.  
  160. function main()
  161.     if length(ARGS) < 4
  162.         println("Usage: julia script.jl <which> <ncases> <trend> <nreps>")
  163.         return
  164.     end
  165.  
  166.     println("sikeinanan")
  167.  
  168.     which = parse(Int, ARGS[1])
  169.     ncases = parse(Int, ARGS[2])
  170.     save_trend = parse(Float64, ARGS[3])
  171.     nreps = parse(Int, ARGS[4])
  172.  
  173.     optimize(which, ncases, save_trend, nreps)
  174. end
  175.  
  176. function optimize(which::Int, ncases::Int, save_trend::Float64, nreps::Int)
  177.     x = zeros(Float64, ncases)
  178.  
  179.     is_mean = 0.0
  180.     oos_mean = 0.0
  181.  
  182.     rng = MarsagliaRng(UInt8.([33, 0, 0, 0]))
  183.  
  184.     for irep in 1:nreps
  185.         # Generate in-sample
  186.         trend = save_trend
  187.         x[1] = 0.0
  188.         for i in 2:ncases
  189.             if (i - 1) % 50 == 0
  190.                 trend = -trend
  191.             end
  192.             x[i] = x[i-1] + trend + rand(rng) + rand(rng) - rand(rng) - rand(rng)
  193.         end
  194.  
  195.         params_result = opt_params(which, ncases, x)
  196.  
  197.         # Generate out-of-sample
  198.         trend = save_trend
  199.         x[1] = 0.0
  200.         for i in 2:ncases
  201.             if (i - 1) % 50 == 0
  202.                 trend = -trend
  203.             end
  204.             x[i] = x[i-1] + trend + rand(rng) + rand(rng) - rand(rng) - rand(rng)
  205.         end
  206.  
  207.  
  208.         oos_perf = test_system(ncases, x, params_result.short_term, params_result.long_term)
  209.  
  210.         is_mean += params_result.performance
  211.         oos_mean += oos_perf
  212.         @printf("%3d: %3d %3d  %8.4f %8.4f (%8.4f)\n",
  213.             irep, params_result.short_term, params_result.long_term, params_result.performance, oos_perf, params_result.performance - oos_perf)
  214.  
  215.     end
  216.  
  217.     is_mean /= nreps
  218.     oos_mean /= nreps
  219.  
  220.     println("Mean IS=$is_mean  OOS=$oos_mean  Bias=$(is_mean - oos_mean)")
  221.  
  222. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement